Newer
Older
##########################################################################
# #
# Copyright (C) 2007-2017 #
# CEA (Commissariat à l'énergie atomique et aux énergies #
# alternatives) #
# #
# you can redistribute it and/or modify it under the terms of the GNU #
# Lesser General Public License as published by the Free Software #
# Foundation, version 2.1. #
# #
# It is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU Lesser General Public License for more details. #
# #
# See the GNU Lesser General Public License version 2.1 #
# for more details (enclosed in the file licenses/LGPLv2.1). #
# #
##########################################################################
Kostyantyn Vorobyov
committed
#!/bin/sh -e
# Convenience wrapper for small runs of E-ACSL Frama-C plugin
# Print a message to STDERR and exit. If the second argument (exit code)
Kostyantyn Vorobyov
committed
error () {
if [ -z "$2" ] || ! [ "$2" = 0 ]; then
echo "e-acsl-gcc: fatal error: $1" 1>&2
exit 1;
fi
Kostyantyn Vorobyov
committed
}
# Check whether the first line reported by running command $1 has an identifier
required_tool() {
"$1" --version 2>&1 | head -1 | grep "$2" > /dev/null
error "$1 is not $2" $?
}
Kostyantyn Vorobyov
committed
# Check if a given executable name can be found by in the PATH
Kostyantyn Vorobyov
committed
has_tool() {
which "$@" >/dev/null 2>&1 && return 0 || return 1
}
Kostyantyn Vorobyov
committed
# Check if a given executable name is indeed an executable or can be found
# in the $PATH. Abort the execution if not.
Kostyantyn Vorobyov
committed
check_tool() {
Kostyantyn Vorobyov
committed
{ has_tool "$1" || test -e "$1"; } || error "No executable $1 found";
Kostyantyn Vorobyov
committed
}
# Portable realpath using pwd
realpath() {
if [ -e "$1" ]; then
if [ -d "$1" ]; then
(cd "$1" && pwd)
else
local name=$(basename "$1")
local dir=$(cd $(dirname "$1") && pwd)
echo $dir/$name
fi
return 0
else
echo "realpath: no such file or directory: '$1'" 1>&2
return 1
fi
}
Kostyantyn Vorobyov
committed
# Split a comma-separated string into a space-separated string, remove
# all duplicates and trailing, leading or multiple spaces
tokenize() {
echo -n "$@" \
| sed -e 's/\s//g' -e 's/,/ /g' -e 's/\s\+/\n/g' \
| sort -u \
| tr '\n' ' ' \
| sed 's/\s*$//'
}
# Given a token (first argument) and a list (remaining arguments)
# evaluate to true if the token is in the list, and to false otherwise
has_token() {
local token="$1"
Kostyantyn Vorobyov
committed
local opt
shift
for opt in $@; do
[ "$opt" = "$token" ] && return 0
done
return 1
}
# Filter out a token given by the first argument from the list of tokens
# given by the remaining arguments
shift_token() {
local token="$1"
shift
for opt in $@; do
[ "$opt" = "$token" ] && true || echo $opt
done
}
Kostyantyn Vorobyov
committed
# Generate option string for RTE plugin based on the value given via --rte
# and --rte-select flags
Kostyantyn Vorobyov
committed
# Frama-C assertions
local fc_options="signed-overflow unsigned-overflow \
signed-downcast unsigned-downcast"
# RTE assertions
local rte_options="div float-to-int mem pointer-call shift \
Kostyantyn Vorobyov
committed
trivial-annotations"
# RTE assertions which are negated in all cases except when
# explicitly specified
# Option supported by RTE but unsupported in E-ACSL, should
# always be negated
local rte_options_unsupported="precond"
local rte_options_explicit="trivial-annotations"
Kostyantyn Vorobyov
committed
local generated="-rte" # Generated Frama-C options
# Clean-up option strings
Kostyantyn Vorobyov
committed
local full_options="$fc_options $rte_options"
local input_asserts="$(tokenize "$1")"
Kostyantyn Vorobyov
committed
local fselect="$2"
# If there is 'all' keyword found enable all assertions
if has_token all $input_asserts; then
Kostyantyn Vorobyov
committed
asserts="$full_options"
for opt in $rte_options_explicit; do
if ! has_token $opt $input_asserts; then
asserts="$(shift_token $opt $asserts)"
fi
done
else
asserts="$input_asserts"
fi
Kostyantyn Vorobyov
committed
if [ -n "$asserts" ]; then
# Check input options
local opt
for opt in $asserts; do
# Check whether a given input option exists, i.e., found in $full_options
if ! has_token $opt $full_options; then
echo "$opt"
return 1
fi
done
Kostyantyn Vorobyov
committed
local prefix
# Generate assertion options for Frama-C (i.e., -warn-* or -no-warn-*)
for opt in $fc_options; do
has_token $opt $asserts && prefix="-warn" || prefix="-no-warn"
generated="$generated $prefix-$opt"
done
Kostyantyn Vorobyov
committed
# Generate assertion options for RTE (i.e., -rte-* or -rte-no-*)
for opt in $rte_options $rte_options_unsupported; do
Kostyantyn Vorobyov
committed
has_token $opt $asserts && prefix="-rte" || prefix="-rte-no"
generated="$generated $prefix-$opt"
done
Kostyantyn Vorobyov
committed
# Pass -rte-select option of RTE
if [ -n "$fselect" ]; then
fselect="$(echo $fselect | sed 's/\s//g')"
generated="$generated -rte-select=$fselect"
fi
Kostyantyn Vorobyov
committed
echo $generated -then
fi
return 0
# Output -D flags enabling a given E_ACSL memory model
eacsl_mmodel() {
local model="$1"
case $model in
bittree) flags="-DE_ACSL_BITTREE_MMODEL" ;;
segment) flags="-DE_ACSL_SEGMENT_MMODEL" ;;
*) error "Memory model '$model' is not available in this distribution" ;;
esac
Kostyantyn Vorobyov
committed
if [ -n "$OPTION_RT_DEBUG" ]; then
flags="$flags -DE_ACSL_DEBUG"
local extra="-DE_ACSL_IDENTIFY"
echo $flags $extra
# Check if the following tools are GNU and abort otherwise
required_tool find "GNU findutils"
Kostyantyn Vorobyov
committed
# Getopt options
LONGOPTIONS="help,compile,compile-only,debug:,ocode:,oexec:,verbose:,
frama-c-only,extra-cpp-args:,frama-c-stdlib,full-mmodel,gmp,quiet,logfile:,
ld-flags:,cpp-flags:,frama-c-extra:,memory-model:,
frama-c:,gcc:,e-acsl-share:,instrumented-only,rte:,oexec-e-acsl:,check
Virgile Prevosto
committed
print-mmodels,rt-debug,rte-select:,then,e-acsl-extra:"
SHORTOPTIONS="h,c,C,d:,D,o:,O:,v:,f,E:,L,M,l:,e:,g,q,s:,F:,m:,I:,G:,X,a:,V"
Kostyantyn Vorobyov
committed
# Prefix for an error message due to wrong arguments
ERROR="ERROR parsing arguments:"
# Variables holding getopt options
OPTION_CFLAGS= # Compiler flags
OPTION_CPPFLAGS= # Preprocessor flags
OPTION_LDFLAGS= # Linker flags
Kostyantyn Vorobyov
committed
OPTION_FRAMAC="frama-c" # Frama-C executable name
OPTION_CC="gcc" # GCC executable name
Kostyantyn Vorobyov
committed
OPTION_ECHO="set -x" # Echo executed commands to STDOUT
Kostyantyn Vorobyov
committed
OPTION_INSTRUMENT=1 # Perform E-ACSL instrumentation
Kostyantyn Vorobyov
committed
OPTION_DEBUG= # Set Frama-C debug flag
OPTION_VERBOSE= # Set Frama-C verbose flag
Kostyantyn Vorobyov
committed
OPTION_COMPILE= # Compile instrumented program
Kostyantyn Vorobyov
committed
OPTION_RT_DEBUG= # Enable runtime debug features
Kostyantyn Vorobyov
committed
OPTION_OUTPUT_CODE="a.out.frama.c" # Name of the translated file
OPTION_OUTPUT_EXEC="a.out" # Generated executable name
OPTION_EACSL_OUTPUT_EXEC="" # Name of E-ACSL executable
OPTION_EACSL="-e-acsl" # Specifies E-ACSL run
Kostyantyn Vorobyov
committed
OPTION_FRAMA_STDLIB="-no-frama-c-stdlib" # Use Frama-C stdlib
OPTION_FULL_MMODEL= # Instrument as much as possible
OPTION_GMP= # Use GMP integers everywhere
OPTION_FRAMAC_CPP_EXTRA="-D__NO_CTYPE" # Extra CPP flags for Frama-C*
OPTION_EACSL_MMODELS="segment" # Memory model used
OPTION_EACSL_SHARE= # Custom E-ACSL share directory
Kostyantyn Vorobyov
committed
OPTION_INSTRUMENTED_ONLY= # Do not compile original code
OPTION_RTE= # Enable assertion generation
OPTION_CHECK= # Check AST integrity
Kostyantyn Vorobyov
committed
OPTION_RTE_SELECT= # Generate assertions for these functions only
Virgile Prevosto
committed
OPTION_THEN= # Adds -then in front of -e-acsl in FC command.
Kostyantyn Vorobyov
committed
# Supported memory model names
SUPPORTED_MMODELS="bittree,segment"
Kostyantyn Vorobyov
committed
manpage() {
printf "e-acsl-gcc.sh - instrument and compile C files with E-ACSL
Usage: e-acsl-gcc.sh [options] files
Options:
-h show this help page
-c compile instrumented code
-l pass additional options to the linker
-e pass additional options to the prepreprocessor
-E pass additional arguments to the Frama-C preprocessor
-p output the generated code to STDOUT
-o <file> output the generated code to <file> [a.out.frama.c]
-O <file> output the generated executables to <file> [a.out, a.out.e-acsl]
-M maximize memory-related instrumentation
-g always use GMP integers instead of C integral types
-q suppress any output except for errors and warnings
-s <file> redirect all output to <file>
-I <file> specify Frama-C executable [frama-c]
-G <file> specify C compiler executable [gcc]
Kostyantyn Vorobyov
committed
This help page shows only basic options.
See man (1) e-acsl-gcc.sh for full up-to-date documentation.\n"
Kostyantyn Vorobyov
committed
exit 1
}
BASEDIR="$(realpath `dirname $0`)"
# Directory with contrib libraries of E-ACSL
LIBDIR="$BASEDIR/../lib"
Kostyantyn Vorobyov
committed
# Run getopt
ARGS=`getopt -n "$ERROR" -l "$LONGOPTIONS" -o "$SHORTOPTIONS" -- "$@"`
# Print and exit if getopt fails
if [ $? != 0 ]; then
exit 1;
fi
# Set all options in $@ before -- and other after
eval set -- "$ARGS"
# Switch statements for other options
for i in $@
do
case "$i" in
# Do compile instrumented code
--help|-h)
shift;
manpage;
;;
Kostyantyn Vorobyov
committed
# Do not echo commands to STDOUT
# Set log and debug flags to minimal verbosity levels
Kostyantyn Vorobyov
committed
--quiet|-q)
shift;
OPTION_ECHO=
OPTION_DEBUG="-e-acsl-debug 0"
OPTION_VERBOSE="-e-acsl-verbose 0"
Kostyantyn Vorobyov
committed
;;
# Redirect all output to a given file
--logfile|-s)
shift;
exec > $1
exec 2> $1
shift;
Kostyantyn Vorobyov
committed
# Enable runtime debug features, i.e., compile unoptimized executable
# with assertions, extra checks and other debug features
--rt-debug|-D)
shift
OPTION_RT_DEBUG=1
OPTION_CHECK=1
Kostyantyn Vorobyov
committed
;;
Kostyantyn Vorobyov
committed
# Pass an option to a Frama-C invocation
shift;
FRAMAC_FLAGS="$FRAMAC_FLAGS $1"
shift;
Kostyantyn Vorobyov
committed
# Do compile instrumented code
--compile|-c)
shift;
OPTION_COMPILE=1
;;
# Set Frama-C debug flag
--debug|-d)
shift;
if [ "$1" -eq "$1" ] 2>/dev/null; then
OPTION_DEBUG="-e-acsl-debug $1"
Kostyantyn Vorobyov
committed
else
error "-d|--debug option requires integer argument"
fi
shift;
;;
# Set Frama-C verbose flag
--verbose|-v)
shift;
if [ "$1" -eq "$1" ] 2>/dev/null; then
OPTION_VERBOSE="-e-acsl-verbose $1"
Kostyantyn Vorobyov
committed
else
error "-v|--verbose option requires integer argument"
fi
shift;
;;
# Specify the name of the default source file where instrumented
# code is to be written
--ocode|-o)
shift;
Kostyantyn Vorobyov
committed
OPTION_OUTPUT_CODE="$1"
Kostyantyn Vorobyov
committed
shift
;;
# Specify the base name of the executable generated from the
# instrumented and non-instrumented sources.
--oexec|-O)
shift;
Kostyantyn Vorobyov
committed
OPTION_OUTPUT_EXEC="$1"
Kostyantyn Vorobyov
committed
shift
;;
# Specify the output name of the E-ACSL generated executable
--oexec-e-acsl)
shift;
OPTION_EACSL_OUTPUT_EXEC="$1"
shift;
;;
Kostyantyn Vorobyov
committed
# Additional CPP arguments
--extra-cpp-args|-E)
shift;
OPTION_FRAMAC_CPP_EXTRA="$OPTION_FRAMAC_CPP_EXTRA $1"
Kostyantyn Vorobyov
committed
shift;
;;
# Additional flags passed to the linker
--ld-flags|-l)
shift;
OPTION_LDFLAGS="$OPTION_LDFLAGS $1"
Kostyantyn Vorobyov
committed
shift;
;;
# Additional flags passed to the pre-processor (compile-time)
--cpp-flags|-e)
shift;
OPTION_CPPFLAGS="$OPTION_CPPFLAGS $1"
Kostyantyn Vorobyov
committed
shift;
;;
# Do not perform the instrumentation, only compile the provided sources
# This option assumes that the source files provided at input have
# already been instrumented
--compile-only|-C)
shift;
OPTION_INSTRUMENT=
OPTION_COMPILE="1"
;;
Kostyantyn Vorobyov
committed
# Run only Frama-C related instrumentation
Kostyantyn Vorobyov
committed
--frama-c-only|-f)
shift;
OPTION_EACSL=
;;
Kostyantyn Vorobyov
committed
# Do not compile original source file
--instrumented-only|-X)
shift;
OPTION_INSTRUMENTED_ONLY=1
;;
Kostyantyn Vorobyov
committed
# Do use Frama-C stdlib, which is the default behaviour of Frama-C
--frama-c-stdlib|-L)
shift;
OPTION_FRAMA_STDLIB="-frama-c-stdlib"
Kostyantyn Vorobyov
committed
;;
# Use as much memory-related instrumentation as possible
-M|--full-mmodel)
shift;
OPTION_FULL_MMODEL="-e-acsl-full-mmodel"
;;
# Use GMP everywhere
-g|--gmp)
shift;
OPTION_GMP="-e-acsl-gmp-only"
;;
Kostyantyn Vorobyov
committed
# Supply Frama-C executable name
-I|--frama-c)
OPTION_FRAMAC="$(which $1)"
Kostyantyn Vorobyov
committed
;;
# Supply GCC executable name
-G|--gcc)
OPTION_CC="$(which $1)"
Kostyantyn Vorobyov
committed
;;
# Specify EACSL_SHARE directory (where C runtime library lives) by hand
# rather than compute it
--e-acsl-share)
shift;
OPTION_EACSL_SHARE="$1"
shift;
;;
# Runtime assertion generation
Kostyantyn Vorobyov
committed
OPTION_RTE="$1"
shift;
;;
# Runtime assertion generation for given functions only
--rte-select|-A)
shift;
OPTION_RTE_SELECT="$1"
# Check AST integrity (mostly for developers of E-ACSL)
--check|-V)
OPTION_CHECK=1
FRAMAC_FLAGS="-check $FRAMAC_FLAGS"
shift;
;;
# A memory model (or models) to link against
-m|--memory-model)
shift;
# Convert comma-separated string into white-space separated string
OPTION_EACSL_MMODELS="`echo $1 | sed -s 's/,/ /g'`"
shift;
;;
Kostyantyn Vorobyov
committed
# Print names of the supported memody models.
--print-mmodels)
shift;
echo $SUPPORTED_MMODELS
Kostyantyn Vorobyov
committed
;;
Virgile Prevosto
committed
#Separate extra Frama-C flags from e-acsl launch with -then.
--then)
shift;
OPTION_THEN=-then
FRAMAC_FLAGS="-e-acsl-prepare $FRAMAC_FLAGS"
;;
--e-acsl-extra)
shift;
OPTION_EACSL="$1 $OPTION_EACSL"
shift;
;;
Kostyantyn Vorobyov
committed
esac
done
shift;
# Bail if no files to translate are given
if [ -z "$1" ]; then
error "no input files";
fi
# Check Frama-C and GCC executable names
check_tool "$OPTION_FRAMAC"
check_tool "$OPTION_CC"
# Frama-C directories
FRAMAC="$OPTION_FRAMAC"
: ${FRAMAC_SHARE:="`$FRAMAC -print-share-path`"}
: ${FRAMAC_PLUGIN:="`$FRAMAC -print-plugin-path`"}
# Check if this is a development or an installed version
# Development version
DEVELOPMENT="$(realpath "$BASEDIR/..")"
# Check if the project has been built, as if this is a non-installed
# version that has not been built Frama-C will fallback to an installed one
# for instrumentation but still use local RTL
error "Plugin in $DEVELOPMENT not compiled" \
`test -f "$DEVELOPMENT/META.frama-c-e_acsl" -o \
-f "$FRAMAC_PLUGIN/META.frama-c-e_acsl"; echo $?`
EACSL_SHARE="$DEVELOPMENT/share/e-acsl"
# Add the project directory to FRAMAC_PLUGINS,
# otherwise Frama-C uses an installed version
if test -f "$DEVELOPMENT/META.frama-c-e_acsl"; then
FRAMAC_FLAGS="-add-path=$DEVELOPMENT/top -add-path=$DEVELOPMENT $FRAMAC_FLAGS";
else
# Installed version. FRAMAC_SHARE should not be used here as Frama-C
# and E-ACSL may not be installed to the same location
EACSL_SHARE="$BASEDIR/../share/frama-c/e-acsl/"
Kostyantyn Vorobyov
committed
# Architecture-dependent flags. Since by default Frama-C uses 32-bit
# architecture we need to make sure that same architecture is used for
# instrumentation and for compilation.
MACHDEPFLAGS="`getconf LONG_BIT`"
# Check if getconf gives out the value accepted by Frama-C/GCC
echo "$MACHDEPFLAGS" | grep '16\|32\|64' 2>&1 >/dev/null \
|| error "$MACHDEPFLAGS-bit architecture not supported"
# -machdep option sent to Frama-C
MACHDEP="-machdep gcc_x86_$MACHDEPFLAGS"
# Macro for correct preprocessing of Frama-C generated code
CPPMACHDEP="-D__FC_MACHDEP_X86_$MACHDEPFLAGS"
# GCC machine option
GCCMACHDEP="-m$MACHDEPFLAGS"
Kostyantyn Vorobyov
committed
# RTE flags
RTE_FLAGS="$(rte_options "$OPTION_RTE" "$OPTION_RTE_SELECT")"
error "Invalid argument $1 to --rte|-a option" $?
# Frama-C and related flags
FRAMAC_CPP_EXTRA="$OPTION_FRAMAC_CPP_EXTRA $CPPMACHDEP"
EACSL_MMODEL="$OPTION_EACSL_MMODEL"
# Re-set EACSL_SHARE directory is it has been given by the user
if [ -n "$OPTION_EACSL_SHARE" ]; then
EACSL_SHARE="$OPTION_EACSL_SHARE"
fi
Virgile Prevosto
committed
if [ -n "$OPTION_THEN" ]; then
FRAMAC_FLAGS="-e-acsl-share=$EACSL_SHARE $FRAMAC_FLAGS";
fi
# Select optimization flags for both instrumented and noon-instrumented code
# compilation
if [ -n "$OPTION_RT_DEBUG" ]; then
OPT_CFLAGS="-g3 -O0 -fno-omit-frame-pointer"
else
OPT_CFLAGS="-g -O2"
fi
# Gcc and related flags
Kostyantyn Vorobyov
committed
CC="$OPTION_CC"
CFLAGS="$OPTION_CFLAGS
-std=c99 $GCCMACHDEP $OPT_CFLAGS
-fno-builtin -fno-merge-constants
-Wall \
-Wno-long-long \
-Wno-attributes \
-Wno-unused \
-Wno-unused-function \
-Wno-unused-result \
-Wno-unused-value \
-Wno-unused-function \
-Wno-unused-variable \
-Wno-unused-but-set-variable \
-Wno-implicit-function-declaration \
-Wno-empty-body"
if [ "`basename $CC`" = 'clang' ]; then
CFLAGS="-Wno-unknown-warning-option \
-Wno-extra-semi \
-Wno-tautological-compare \
-Wno-gnu-empty-struct \
-Wno-incompatible-pointer-types-discards-qualifiers"
fi
CPPFLAGS="$OPTION_CPPFLAGS"
LDFLAGS="$OPTION_LDFLAGS"
# Extra Frama-C Flags E-ACSL needs
FRAMAC_FLAGS="$FRAMAC_FLAGS -variadic-no-translation"
# C, CPP and LD flags for compilation of E-ACSL-generated sources
EACSL_CFLAGS=""
EACSL_CPPFLAGS="-I$EACSL_SHARE"
EACSL_LDFLAGS="$LIBDIR/libeacsl-jemalloc.a $LIBDIR/libeacsl-gmp.a -lm -lpthread"
Kostyantyn Vorobyov
committed
# Output file names
Kostyantyn Vorobyov
committed
OUTPUT_CODE="$OPTION_OUTPUT_CODE" # E-ACSL instrumented source
OUTPUT_EXEC="$OPTION_OUTPUT_EXEC" # Output name of the original executable
# Output name of E-ACSL-modified executable
if [ -z "$OPTION_EACSL_OUTPUT_EXEC" ]; then
EACSL_OUTPUT_EXEC="$OPTION_OUTPUT_EXEC.e-acsl"
else
EACSL_OUTPUT_EXEC="$OPTION_EACSL_OUTPUT_EXEC"
fi
# Build E-ACSL plugin argument string
if [ -n "$OPTION_EACSL" ]; then
EACSL_FLAGS="
Virgile Prevosto
committed
$OPTION_THEN
$OPTION_EACSL
$OPTION_GMP
$OPTION_FULL_MMODEL
$OPTION_VERBOSE
$OPTION_DEBUG
-e-acsl-share="$EACSL_SHARE"
-then-last"
fi
Kostyantyn Vorobyov
committed
# Instrument
if [ -n "$OPTION_INSTRUMENT" ]; then
Kostyantyn Vorobyov
committed
($OPTION_ECHO; \
Kostyantyn Vorobyov
committed
$FRAMAC \
$FRAMAC_FLAGS \
$MACHDEP \
-cpp-extra-args="$FRAMAC_CPP_EXTRA" \
$OPTION_FRAMA_STDLIB \
Kostyantyn Vorobyov
committed
"$@" \
Kostyantyn Vorobyov
committed
$RTE_FLAGS \
$EACSL_FLAGS \
Kostyantyn Vorobyov
committed
error "aborted by Frama-C" $?;
Kostyantyn Vorobyov
committed
fi
# Compile
if [ -n "$OPTION_COMPILE" ]; then
# Compile original source code
# $OPTION_INSTRUMENT is set -- both, instrumented and original, sources are
# available. Do compile the original program unless instructed to not do so
# by a user
if [ -n "$OPTION_INSTRUMENT" ]; then
if [ -z "$OPTION_INSTRUMENTED_ONLY" ]; then
($OPTION_ECHO; $CC $CPPFLAGS $CFLAGS "$@" -o "$OUTPUT_EXEC" $LDFLAGS);
error "fail to compile/link un-instrumented code" $?;
fi
# If $OPTION_INSTRUMENT is unset then the sources are assumed to be already
# instrumented, so skip compilation of the original files
Kostyantyn Vorobyov
committed
else
Kostyantyn Vorobyov
committed
OUTPUT_CODE="$@"
Kostyantyn Vorobyov
committed
fi
# Compile and link E-ACSL-instrumented file with all models specified
for model in $OPTION_EACSL_MMODELS; do
# If multiple models are specified then the generated executable
# is appended a '-MODEL' suffix, where MODEL is the name of the memory
# model used
if ! [ "`echo $OPTION_EACSL_MMODELS | wc -w`" = 1 ]; then
OUTPUT_EXEC="$EACSL_OUTPUT_EXEC-$model"
else
OUTPUT_EXEC="$EACSL_OUTPUT_EXEC"
fi
# Sources of the selected memory model
EACSL_RTL="$EACSL_SHARE/e_acsl_mmodel.c"
EACSL_MMODEL="$(eacsl_mmodel $model)"
($OPTION_ECHO;
$CC \
$CFLAGS $CPPFLAGS \
$EACSL_CFLAGS $EACSL_CPPFLAGS \
-o "$OUTPUT_EXEC" \
"$OUTPUT_CODE" \
$EACSL_RTL \
$LDFLAGS \
$EACSL_LDFLAGS)
error "fail to compile/link instrumented code" $?
done
Kostyantyn Vorobyov
committed
fi