| #!/bin/bash -e |
| |
| # |
| # This script is used to compile and test a single file with SAFECode. |
| # |
| |
| expect_error=1 |
| test_llvm_code=0 |
| |
| usage() |
| { |
| echo 'usage: test.sh [args] file.c/file.ll' |
| echo 'arguments:' |
| echo ' -t dir directory to use for testing' |
| echo ' -s string generated llvm code must contain string for |
| echo ' the test to pass. |
| echo ' -p expect no SAFEcode errors from the test case' |
| echo ' -e expect a SAFEcode error from the test case' |
| echo ' -l file link in file when linking the executable' |
| } |
| |
| # Process the arguments. |
| link_files='' |
| while getopts hepl:t:cfs: option |
| do |
| case $option in |
| s) test_llvm_code=1 |
| llvm_test_string=$OPTARG;; |
| e) expect_error=1;; |
| l) link_files=$link_files' '$OPTARG;; |
| p) expect_error=0;; |
| t) testdir=$OPTARG;; |
| h) usage |
| exit 1;; |
| \?) exit 1;; |
| esac |
| done |
| |
| # Get the file argument. |
| shift $((OPTIND-1)) |
| |
| # If there is no file, print usage information and exit. |
| if [ $# -lt 1 ] |
| then |
| usage |
| exit 1 |
| fi |
| |
| sc=@SC@ |
| sc_lib=@SC_LIB@ |
| |
| filename=$1 |
| # Directory to use for temporary files. |
| testdir=${testdir:-$(dirname $filename)} |
| filebase=$(basename $filename) |
| case $filebase in |
| *.ll) prefix=${filebase%%.ll} |
| filetype=ll;; |
| *.c) prefix=${filebase%%.c} |
| filetype=c;; |
| *) echo "unknown file type" |
| exit 1;; |
| esac |
| # SAFECode-compiled bitcode |
| llfile=$testdir/${prefix}.sc.ll |
| # Compiled executable |
| scfile=$testdir/${prefix}.sc |
| # SAFECode compilation log |
| sclog=$testdir/${prefix}.sc.log |
| # Executable output |
| scout=$testdir/${prefix}.sc.output |
| # grep pattern file |
| patternfile=$testdir/${prefix}.sc.pattern |
| |
| # Prepare the testing directory. |
| setupdir() |
| { |
| # Add temporary directory. |
| mkdir -p $testdir |
| } |
| |
| # Compile the bitcode of the test. |
| compile() |
| { |
| # Create bitcode file with SAFECode passes. |
| $sc -g -S -emit-llvm -fmemsafety -fmemsafety-terminate -o $llfile $filename 2>&1 | tee $sclog |
| # Compile and link bitcode. |
| $sc -o $scfile $llfile $link_files $sc_lib/libsc_dbg_rt.a $sc_lib/libpoolalloc_bitmap.a $sc_lib/libgdtoa.a -lstdc++ |
| } |
| |
| # If requested, verify that the llvm code contains the |
| # expected string. |
| codecheck() |
| { |
| code_ok=1 |
| if [ $test_llvm_code -eq 1 ] |
| then |
| # don't exit if grep fails |
| set +e |
| echo $llvm_test_string > $patternfile |
| grep -q -f $patternfile $llfile |
| if [ $? -ne 0 ] |
| then |
| code_ok=0 |
| fi |
| set -e |
| fi |
| } |
| |
| # Run test and check results. |
| runtest() |
| { |
| # Don't exit immediately on failure of below commands. |
| set +e |
| $scfile >& $scout |
| retval=$? |
| error_count=$(grep -c SAFECode $scout) |
| # increment the error count if code check failed |
| if [ $code_ok -eq 0 ] |
| then |
| error_count=$((1 + $error_count )) |
| fi |
| set -e |
| if [ $error_count -gt 0 ] |
| then |
| if [ $expect_error -eq 1 ] |
| then |
| exit 0 # An error was expected and caught. |
| else |
| exit 1 # An unexpected error occurred. |
| fi |
| else |
| if [ $retval -eq 0 -a $expect_error -eq 0 ] |
| then |
| exit 0 # No error was expected, none was caught, program ran as expected. |
| else |
| exit 1 # Some non-SAFECode related error occurred, or a SAFECode error |
| # was expected. |
| fi |
| fi |
| } |
| |
| setupdir |
| compile |
| codecheck |
| runtest |