161 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			161 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash
 | |
| 
 | |
| ############################
 | |
| #
 | |
| # Author: Koustubha Bhat
 | |
| # Date  : 3-April-2014
 | |
| # VU University, Amsterdam.
 | |
| #
 | |
| ############################
 | |
| 
 | |
| set -o errexit
 | |
| 
 | |
| MYPWD=`pwd`
 | |
| MINIX_ROOT=
 | |
| MINIX_LLVM_DIR=
 | |
| LLVMPASS=
 | |
| LLVMARGS=
 | |
| LLVMPASS_PATHS=
 | |
| TARGET_MODULES=
 | |
| MINIX_MODS=
 | |
| 
 | |
| # Set default values for essential variables
 | |
| : ${GENERATE_MAP="no"}
 | |
| : ${C="servers,drivers"}
 | |
| 
 | |
| function usage()
 | |
| {
 | |
|    echo "C=<target Minix module(s)> $0 [<LLVM-pass name> ...]"
 | |
|    echo 
 | |
|    echo "Examples:"
 | |
|    echo "C=pm,vfs ./$0 dummy"
 | |
|    echo "C=drivers ./$0 dummy"
 | |
|    echo 
 | |
|    echo "Additional arguments to the passes may be passed through \${LLVM_PASS_ARGS}."
 | |
|    echo
 | |
| }
 | |
| 
 | |
| function check_current_dir()
 | |
| {
 | |
|    #Make sure we are running from the root dir of the Minix sources
 | |
|    if [ -d ./minix/drivers ] && [ -d ./minix/servers ] ; then
 | |
|         MINIX_ROOT="${MYPWD}"
 | |
|    elif [ -d ../../minix/drivers ] && [ -d ../../minix/servers ]; then
 | |
|         MINIX_ROOT="${MYPWD}/../.."
 | |
|    else
 | |
|         echo "Please run the script from either of the following locations:"
 | |
|         echo "> Root of the Minix sources."
 | |
|         echo "          OR"
 | |
|         echo "> minix/llvm directory of the Minix sources."
 | |
|         exit 1
 | |
|    fi
 | |
| 
 | |
|    MINIX_LLVM_DIR="${MINIX_ROOT}/minix/llvm"
 | |
| }
 | |
| 
 | |
| function check_args()
 | |
| {
 | |
|    local llvmpass=
 | |
|    local llvmpass_path=
 | |
|    local exit_flag=0
 | |
| 
 | |
|    if [ $# -ge 1 ]; then
 | |
| 
 | |
| 	if [ "$1" == "--help" ] || [ "$1" == "-h" ]; then
 | |
| 		usage
 | |
| 		exit 1
 | |
| 	fi
 | |
| 
 | |
| 	for p in "$@" ; 
 | |
|         do
 | |
| 		llvmpass=$p
 | |
| 		# Default value for llvmargs not specified deliberately
 | |
| 
 | |
| 		if [ -f "${INSTALL_DIR}/${llvmpass}.so" ]; then
 | |
| 			llvmpass_path="${INSTALL_DIR}/${llvmpass}.so"
 | |
| 		elif [ -f "${MINIX_LLVM_BIN_DIR}/${llvmpass}.so" ]; then
 | |
| 			llvmpass_path="${MINIX_LLVM_BIN_DIR}/${llvmpass}.so"
 | |
| 		else
 | |
| 			llvmpass_path=""
 | |
| 		fi
 | |
| 		if [ "$llvmpass_path" != "" ]; then
 | |
| 			LLVMPASS_PATHS+=" -load=${llvmpass_path}"
 | |
| 		fi
 | |
| 		LLVMPASS_PATHS+=" -${llvmpass}"
 | |
| 	done
 | |
| 
 | |
| 	if [ ${exit_flag} == 1 ]; then
 | |
| 		echo "Searched in the following location(s):"
 | |
| 		echo "  ${INSTALL_DIR}" 
 | |
| 		echo "  ${MINIX_LLVM_BIN_DIR}"
 | |
| 		exit 1
 | |
| 	fi
 | |
| 
 | |
| 	LLVMARGS=" ${LLVM_PASS_ARGS}"	
 | |
|   fi
 | |
| }
 | |
|   
 | |
| #Make sure we are running from the root dir of the Minix sources
 | |
| check_current_dir
 | |
| 
 | |
| # set up the bridge to llvm-apps repository and initialize
 | |
| . ${MINIX_LLVM_DIR}/minix.inc
 | |
| [ ! -f ${ROOT}/apps/scripts/include/configure.llvm.inc ] || . ${ROOT}/apps/scripts/include/configure.llvm.inc
 | |
| 
 | |
| # Arguments check
 | |
| check_args "$@"
 | |
| 
 | |
| if [ "$C" == "" ]; then
 | |
| 	C="hello"
 | |
| fi 
 | |
| 
 | |
| if [ "${GENERATE_MAP}" != "" ] && [[ ${GENERATE_MAP} =~ [yY][eE][sS] ]]; then
 | |
|         generate_modules_map
 | |
| fi
 | |
| 
 | |
| : ${OPTFLAGS="-disable-opt -disable-internalize -disable-inlining -load ${MINIX_LLVM_DIR}/bin/weak-alias-module-override.so -weak-alias-module-override"}
 | |
| 
 | |
| # If we are really instrumenting with some pass...
 | |
| if [ "${LLVMPASS_PATHS}" != "" ]; then
 | |
| 	OPTFLAGS=" ${OPTFLAGS} ${LLVMPASS_PATHS} ${LLVMARGS}"
 | |
| fi
 | |
| 
 | |
| TARGET_MODULES=`echo $C | sed -e "s/,/ /g"`
 | |
| 
 | |
| for m in ${TARGET_MODULES}
 | |
| do
 | |
| 	for p in `get_modules_path $m`
 | |
| 	do 
 | |
| 		MINIX_MODS="${MINIX_MODS} $p"
 | |
| 	done 
 | |
| done
 | |
| 
 | |
| # Show info
 | |
| echo "Build.llvm: Executing with following parameters..."
 | |
| echo "LLVM pass		:	${LLVMPASS}"
 | |
| echo "LLVM pass arguments	: 	${LLVMARGS}"
 | |
| echo "Target Minix modules	:	${MINIX_MODS}"
 | |
| echo "OPTFLAGS value		:	${OPTFLAGS}"
 | |
| echo
 | |
| 
 | |
| cd ${MINIX_ROOT}
 | |
| 
 | |
| for m in ${MINIX_MODS}
 | |
| do 
 | |
| 	echo "Instrumenting $m ..."
 | |
| 	n=`get_module_name $m`
 | |
| 	if [ "" == "$n" ]; then
 | |
|                 echo "Error: Couldn't fetch the module name for $m"
 | |
|                 continue
 | |
|         fi
 | |
| 	clean_module $n $m
 | |
| 	OPTFLAGS=`echo ${OPTFLAGS} | sed -e "s/\ /\\\ /g"`
 | |
| 	OPTFLAGS_PLACEHOLDER="OPTFLAGS.$n=${OPTFLAGS}"
 | |
| 	
 | |
| 	(env "`echo ${OPTFLAGS_PLACEHOLDER}`" MKBITCODE=yes \
 | |
| 	${TOOLDIR}/nbmake-${ARCH} -C $m all install && echo "INFO: $m successfully instrumented." ) || echo "ERROR: Failed instrumenting $m"
 | |
| 	echo 
 | |
| done
 | |
| 
 | |
| cd ${MYPWD}
 | 
