From 16d511f3bb0da60dff1a7117fa19eec8e2fc0547 Mon Sep 17 00:00:00 2001 From: Kostyantyn Vorobyov <kostyantyn.vorobyov@cea.fr> Date: Thu, 4 Feb 2016 09:39:39 +0100 Subject: [PATCH] e-acscl wrapper: - Added man page - Fixed memory model option --- src/plugins/e-acsl/Makefile.in | 4 + src/plugins/e-acsl/man/e-acsl-gcc.sh.1 | 162 +++++++++++++++++++++++ src/plugins/e-acsl/scripts/e-acsl-gcc.sh | 112 ++++------------ 3 files changed, 192 insertions(+), 86 deletions(-) create mode 100644 src/plugins/e-acsl/man/e-acsl-gcc.sh.1 diff --git a/src/plugins/e-acsl/Makefile.in b/src/plugins/e-acsl/Makefile.in index e41aa41b752..8874c6b9bb5 100644 --- a/src/plugins/e-acsl/Makefile.in +++ b/src/plugins/e-acsl/Makefile.in @@ -138,6 +138,7 @@ install:: $(PRINT_INSTALL) E-ACSL scripts $(MKDIR) $(BINDIR) $(CP) $(E_ACSL_DIR)/scripts/e-acsl-gcc.sh $(BINDIR)/ + $(CP) $(E_ACSL_DIR)/man/e-acsl-gcc.sh.1 $(MANDIR)/man1/ uninstall:: $(PRINT_RM) E-ACSL share files @@ -148,6 +149,7 @@ uninstall:: $(FRAMAC_SHARE)/manuals/e-acsl-manual.pdf $(PRINT_RM) E-ACSL scripts $(RM) $(BINDIR)/e-acsl-gcc.sh + $(RM) $(MANDIR)/man1/e-acsl-gcc.sh.1 ################################ # Building source distribution # @@ -165,6 +167,8 @@ EACSL_DISTRIB_FILES=\ configure.ac Makefile.in \ doc/Changelog \ $(DOC_FILES) \ + scripts/e-acsl-gcc.sh \ + man/e-acsl-gcc.sh.1 \ share/e-acsl/*.[ch] \ share/e-acsl/memory_model/e_acsl_bittree.[ch] \ share/e-acsl/memory_model/e_acsl_mmodel*.[ch] \ diff --git a/src/plugins/e-acsl/man/e-acsl-gcc.sh.1 b/src/plugins/e-acsl/man/e-acsl-gcc.sh.1 new file mode 100644 index 00000000000..67d45782fcd --- /dev/null +++ b/src/plugins/e-acsl/man/e-acsl-gcc.sh.1 @@ -0,0 +1,162 @@ +.\" +.\" +.\" This file is part of Frama-C. +.\" +.\" Copyright (C) 2007-2015 +.\" 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). +.\" +.\" + +.TH E-ACSL-GCC.SH 1 2016-02-02 + +.SH NAME +.B e-acsl-gcc.sh +\- instrument and compile C files with E-ACSL +.SH SYNOPSIS +.B e-acsl-gcc.sh +[ +.I options +] +.I files +.SH DESCRIPTION +.B e-acsl-gcc.sh +is convenience wrapper for instrumentation of C programs using the +E-ACSL Frama-C plugin and their subsequent compilation using the GNU compiler +collection (GCC). +.SH OPTIONS +.B -h, --help +show help page. +.TP +.B -c, --compile +compile generated and original files. +.TP +.B -C, --compile-only +compile input files as if they were generated by E-ACSL. +.TP +.B -p, --print +output the code generated by E-ACSL to \fISTDOUT\fP. +.TP \fI \fP +.B -d, --debug=\fI<N> +pass a value to Frama-C -debug option. +.TP +.B -o, --ocode=\fI<FILENAME> +name of the output source file. Defaults to \fIa.out.frama.c\fP. +.TP +.B -O, --oexec=\fI<FILENAME> +name of the executable generated from the un-instrumented code. +Executable compiled from the E-ACSL instrumented sources is +appended \fI.e.acsl\fP suffix. +Unless specified, the +names of the executables generated from the original +and the modified programs are +\fIa.out\fP and \fIa.out.e-acsl\fP respectively. +.TP +.B -v, --verbose=\fI<N> +pass a value to the Frama-C -verbose option. +.TP +.B -f, --frama-c-only +run input source files through Frama-C without E-ACSL instrumentations. +.TP +.B -E, --extra-cpp-args=\fI<FLAGS> +pass additional arguments to the Frama-C pre-processor. +.TP +.B -L, --frama-c-stdlib +use Frama-C standard library instead of the system-wide one. +.TP +.B -M, --full-mmodel +maximise memory-related instrumentation. +.TP +.B -g, --gmp +always use GMP integers instead of C integral types. +.TP +.B -l, --ld-flags=\fI<FLAGS> +pass the specified flags to the linker. +.TP +.B -e, --cpp-flags=\fI<FLAGS> +pass the specified flags to the pre-processor at compile-time. +For instrumentation-time proprocessor flags see \fB--extra-cpp-args\fP option. +.TP +.B -q, --quiet +suppress any output except errors and warnings. +.TP +.B -s, --logfile=\fI<FILE> +redirect all output to a given file. +.TP +.B -F, --frama-c-extra=\fI<OPTION> +pass an extra option to frama-c invocation. +.TP +.B -m, --memory-model=\fI<bittree|tree|list|splaytree> +memory model (i.e., runtime library for checking memory related annotations) +to be linked against the instrumented file. + +Valid arguments are: + bittree \- memory modelling using a Patricie trie ADT. + splaytree \- memory modelling using a splay tree ADT. + list \- memory modelling using a linked-list ADT. + tree \- memory modelling using a binary tree ADT. + +By default Patricia trie memory model is used. +.TP +.B -P, --production +Compile optimized executatle without debug features. +Note that un-optimized executables may lead to significant +performance slowdown. +.TP +.B -N, --no-stdlib +If specified the E-ACSL run-time library uses custom +implementations of standard library functions (such as memset). +By default GCC builtins are used (e.g., \fB__builtin_memset\fP). +.TP +.B -D, --debug-log=\fI<FILE> +Specify the name of the file for logging of debugging output of +modified modified executables. If '-' is specified then the +output is redirected to the \fISTDERR\fP. By default +\fI/tmp/e-acsl.log\fP file is used. Note that this option is meaningful +in the absence of the -P flag, which diables debug logging for +performance reasons. + +.SH EXIT STATUS +.TP +.B 0 +Successful execution +.TP +.B 1 +Invalid user input +.TP +.B frama-c or gcc error code +Instrumentation- or compile-time error + +.SH EXAMPLES + +Instrument foo.c and output the instrumented code to \fIa.out.frama.c\fP + +.B e-acsl-gcc.sh foo.c + +Instrument \fIfoo.c\fP, output the instrumented code to \fIgen_foo.c\fP and +compile \fIfoo.c\fP into \fIfoo\fP and \fIgen_foo.c\fP into \fIfoo.e-acsl\fP. +The \fB-P\fP option specifies that the instrumentation should omit debug +functionality. + +.B e-acsl-gcc.sh -P -c -ogen_foo.c -Ofoo foo.c + +Assume \fIgen_foo.c\fP has been instrumented by E-ACSL and compile it into +\fIa.out.e-acsl\fP using \fBsplaytree\fB memory model instead of the default +one. + +.B e-acsl-gcc.sh --memory-model=splaytree -C gen_foo.c + +.SH SEE ALSO +\fBgcc\fP(1), \fBcpp\fP(1), \fBld\fP(1), \fBframa-c\fP(1) diff --git a/src/plugins/e-acsl/scripts/e-acsl-gcc.sh b/src/plugins/e-acsl/scripts/e-acsl-gcc.sh index c481794321d..5b4db819505 100755 --- a/src/plugins/e-acsl/scripts/e-acsl-gcc.sh +++ b/src/plugins/e-acsl/scripts/e-acsl-gcc.sh @@ -53,11 +53,6 @@ SHORTOPTIONS="h,c,C,p,d:,o:,O:,v:,f,E:,L,M,l:,e:,g,q,s:,F:,m:,P,N,D:" # Prefix for an error message due to wrong arguments ERROR="ERROR parsing arguments:" -# Frama-C -FRAMAC="`check_tool 'frama-c'`" -FRAMAC_FLAGS="" -FRAMAC_SHARE="`$FRAMAC -print-share-path`" - # 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. @@ -72,6 +67,13 @@ CPPMACHDEP="-D__FC_MACHDEP_X86_$MACHDEPFLAGS" # GCC machine option GCCMACHDEP="-m$MACHDEPFLAGS" +# Frama-C +FRAMAC="`check_tool 'frama-c'`" +FRAMAC_FLAGS="" +FRAMAC_SHARE="`$FRAMAC -print-share-path`" +EACSL_SHARE="$FRAMAC_SHARE/e-acsl" +EACSL_MMODEL="bittree" + # Macro that identifies E-ACSL compilation. Passed to Framac and GCC runs # but not to the original compilation EACSL_MACRO_ID="__E_ACSL__" @@ -123,83 +125,21 @@ OPTION_BUILTINS="-DE_ACSL_BUILTINS" OPTION_EXTRA_CPP="-D$EACSL_MACRO_ID -I$FRAMAC_SHARE/libc $CPPMACHDEP" manpage() { - echo "NAME" - echo " e-acsl-gcc -- convenience wrapper for instrumentation of C files with" - echo " the E-ACSL Frama-C plugin and their subsequent compilation using" - echo " GNU compiler collection (GCC)" - echo "" - echo "SYNOPSIS" - echo " e-acsl-gcc <OPTIONS> <C-FILES>" - echo "" - echo "OPTIONS" - echo " -h, --help" - echo " show this help page" - echo " -c, --compile" - echo " compile generated and original files" - echo " -C, --compile-only" - echo " compile input files as if they were generated by E-ACSL" - echo " -p, --print" - echo " output the code generated by E-ACSL to STDOUT" - echo " -d, --debug=<N>" - echo " pass a value to Frama-C -debug option" - echo " -o, --ocode=<FILENAME>" - echo " name of the output source file, defaults to a.out.frama.c" - echo " -O, --oexec=<FILENAME>" - echo " name of the executable generated from the un-instrumented code." - echo " Executable compiled from the E-ACSL instrumented sources is" - echo " appended .e.acsl suffix. Defaults to a.out and a.out.e-acsl" - echo " -v, --verbose=<N>" - echo " pass a value to Frama-C -verbose option" - echo " -f, --frama-c-only" - echo " run input source files through Frama-C without E-ACSL" - echo " -E, --extra-cpp-args=<FLAGS>" - echo " pass additional arguments to the Frama-C pre-processor" - echo " -L, --frama-c-stdlib" - echo " use Frama-C standard library" - echo " -M, --full-mmodel" - echo " maximise memory-related instrumentation" - echo " -g, --gmp" - echo " always use GMP integers instead of C integral types" - echo " -l, --ld-flags=<FLAGS>" - echo " pass the specified flags to the linker" - echo " -e, --cpp-flags=<FLAGS>" - echo " pass the specified flags to the pre-processor (compile-time)" - echo " -q, --quiet" - echo " suppress any output except for errors and warnings" - echo " -s, --logfile=<FILE>" - echo " redirect all output to a given log file" - echo " -F, --frama-c-extra <OPTION>" - echo " pass an extra option to frama-c invocation" - echo " -m, --memory-model=<bittree|tree|list|splaytree>" - echo " memory model (i.e., runtime library) to be used at compile time." - echo " Valid arguments are:" - echo " bittree - memory modelling using a Patricie trie ADT" - echo " splay_tree - memory modelling using a splay tree ADT" - echo " list - memory modelling using a linked-list ADT" - echo " tree - memory modelling using a binary tree ADT" - echo " -P, --production" - echo " Compile optimized executatle without debug features" - echo " -N, --no-stdlib" - echo " If specified the E-ACSL run-time library uses custom " - echo " implementations of standard library functions (such as memset)." - echo " By default GCC builtins are used (e.g., __builtin_memset)." - echo " -D, --debug-log=<FILE>" - echo " Specify the name of the file for logging of debugging output of" - echo " modified modified executables. If '-' is specified then the" - echo " output is redirected to the standard error stream. By default " - echo " /tmp/e-acsl.log file is used. Note that this option is meaningful" - echo " in the absence of the -P flag, which diables debug logging for " - echo " performance reasons." - echo "" - echo "EXAMPLES:" - echo " # Instrument foo.c and output the instrumented code to a.out.frama.c" - echo " e-acsl-gcc.sh foo.c" - echo " # Instrument foo.c, output the instrumented code to gen_foo.c and" - echo " # compile foo.c into foo and gen_foo.c into foo.e-acsl" - echo " e-acsl-gcc.sh -c -ogen_foo.c -Ofoo foo.c" - echo " # Assume gen_foo.c has been instrumented by E-ACSL and compile it" - echo " # into a.out.e-acsl" - echo " e-acsl-gcc.sh -C gen_foo.c" + 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 + -p output the generated code to STDOUT + -O <file> output the generated executable to <file> + -M maximise memory-related instrumentation + -q suppress any output except for errors and warnings + -s <file> redirect all output to <file> + -P compile executatle without debug features + +Notes: + This manual page shows only basic options. + See man (1) e-acsl-gcc.sh for full up-to-date documentation.\n" exit 1 } @@ -357,9 +297,9 @@ do ;; -m|--memory-model) shift; - OPTION_MMODEL="$1" - echo $OPTION_MMODEL | grep "\(tree\|bittree\|splay_tree\|list\)" - error "no such memory model: $OPTION_MMODEL" $? + EACSL_MMODEL="$1" + echo $EACSL_MMODEL | grep "\(tree\|bittree\|splay_tree\|list\)" + error "no such memory model: $EACSL_MMODEL" $? shift; ;; esac @@ -376,7 +316,7 @@ if [ -n "$OPTION_INSTRUMENT" ]; then # Memory model sources RTL="$EACSL_SHARE/e_acsl.c \ $EACSL_SHARE/memory_model/e_acsl_mmodel.c \ - $EACSL_SHARE/memory_model/e_acsl_$OPTION_MMODEL.c" + $EACSL_SHARE/memory_model/e_acsl_$EACSL_MMODEL.c" ($OPTION_ECHO; \ $FRAMAC \ -- GitLab