diff --git a/.travis.yml b/.travis.yml index 162fd52dc30..145920a37de 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,20 +39,6 @@ jobs: # env: COMPILER=g++-5 SAN_FLAGS="-fsanitize=undefined -fno-sanitize-recover -fno-omit-frame-pointer" env: COMPILER="ccache g++-5" - # Alpine Linux with musl-libc using g++ - - stage: Test different OS/CXX/Flags - os: linux - sudo: required - compiler: gcc - cache: ccache - services: - - docker - before_install: - - docker pull diffblue/cbmc-builder:alpine-0.0.3 - env: - - PRE_COMMAND="docker run -v ${TRAVIS_BUILD_DIR}:/cbmc -v ${HOME}/.ccache:/root/.ccache diffblue/cbmc-builder:alpine-0.0.3" - - COMPILER="ccache g++" - # OS X using g++ - stage: Test different OS/CXX/Flags os: osx @@ -151,29 +137,50 @@ jobs: - EXTRA_CXXFLAGS="-DDEBUG" script: echo "Not running any tests for a debug build." + - stage: Test different OS/CXX/Flags + os: linux + cache: ccache + env: + - BUILD_SYSTEM=cmake + addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - g++-5 + install: + - cmake -H. -Bbuild '-DCMAKE_BUILD_TYPE=Release' '-DCMAKE_CXX_COMPILER=g++-5' + - cmake --build build -- -j4 + script: (cd build; ctest -V -L CORE) + + - stage: Test different OS/CXX/Flags + os: osx + cache: ccache + env: + - BUILD_SYSTEM=cmake + - CCACHE_CPP2=yes + install: + - cmake -H. -Bbuild '-DCMAKE_BUILD_TYPE=Release' '-DCMAKE_OSX_ARCHITECTURES=x86_64' + - cmake --build build -- -j4 + script: (cd build; ctest -V -L CORE) + + allow_failures: - <<: *linter-stage install: - ccache --max-size=1G - - COMMAND="make -C src minisat2-download" && - eval ${PRE_COMMAND} ${COMMAND} - - COMMAND="make -C src boost-download" && - eval ${PRE_COMMAND} ${COMMAND} - - COMMAND="make -C src/ansi-c library_check" && - eval ${PRE_COMMAND} ${COMMAND} - - COMMAND="make -C src CXX=\"$COMPILER\" CXXFLAGS=\"-Wall -Werror -pedantic -O2 -g -DUSE_BOOST $EXTRA_CXXFLAGS\" -j2" && - eval ${PRE_COMMAND} ${COMMAND} - - COMMAND="make -C src CXX=\"$COMPILER\" CXXFLAGS=\"$FLAGS $EXTRA_CXXFLAGS\" -j2 clobber.dir memory-models.dir musketeer.dir" && - eval ${PRE_COMMAND} ${COMMAND} + - make -C src minisat2-download + - make -C src boost-download + - make -C src/ansi-c library_check + - make -C src "CXX=${COMPILER}" "CXXFLAGS=-Wall -Werror -pedantic -O2 -g -DUSE_BOOST ${EXTRA_CXXFLAGS}" -j2 + - make -C src "CXX=${COMPILER}" "CXXFLAGS=-Wall -Werror -pedantic -O2 -g ${EXTRA_CXXFLAGS}" -j2 clobber.dir memory-models.dir script: - if [ -e bin/gcc ] ; then export PATH=$PWD/bin:$PATH ; fi ; - COMMAND="env UBSAN_OPTIONS=print_stacktrace=1 make -C regression test CXX=\"$COMPILER\" CXXFLAGS=\"-Wall -Werror -pedantic -O2 -g $EXTRA_CXXFLAGS\"" && - eval ${PRE_COMMAND} ${COMMAND} - - COMMAND="make -C unit CXX=\"$COMPILER\" CXXFLAGS=\"-Wall -Werror -pedantic -O2 -g $EXTRA_CXXFLAGS\" -j2" && - eval ${PRE_COMMAND} ${COMMAND} - - COMMAND="make -C unit test" && eval ${PRE_COMMAND} ${COMMAND} + - env UBSAN_OPTIONS=print_stacktrace=1 make -C regression test "CXX=${COMPILER}" "CXXFLAGS=-Wall -Werror -pedantic -O2 -g ${EXTRA_CXXFLAGS}" + - make -C unit "CXX=${COMPILER}" "CXXFLAGS=-Wall -Werror -pedantic -O2 -g ${EXTRA_CXXFLAGS}" -j2 + - make -C unit test before_cache: - ccache -s diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000000..99a97066cde --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,41 @@ +cmake_minimum_required(VERSION 3.2) + +find_program(CCACHE_PROGRAM ccache) +if(CCACHE_PROGRAM) + set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}") + message(STATUS "Rule launch compile: ${CCACHE_PROGRAM}") + endif() + +set(CMAKE_OSX_DEPLOYMENT_TARGET 10.9) + +include(GNUInstallDirs) + +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) + +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR + "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" +) + # Ensure NDEBUG is not set for release builds + set(CMAKE_CXX_FLAGS_RELEASE "-O2") + # Enable lots of warnings + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wpedantic -Werror") +elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + # This would be the place to enable warnings for Windows builds, although + # config.inc doesn't seem to do that currently +endif() + +set(enable_cbmc_tests on CACHE BOOL "Whether CBMC tests should be enabled") + +set(sat_impl "minisat2" CACHE STRING + "This setting controls the SAT library which is used. Valid values are 'minisat2' and 'glucose'" +) + +add_subdirectory(src) + +if(${enable_cbmc_tests}) + enable_testing() +endif() +add_subdirectory(unit) +add_subdirectory(regression) diff --git a/COMPILING b/COMPILING index 3df46849022..2ec4c482bba 100644 --- a/COMPILING +++ b/COMPILING @@ -171,7 +171,7 @@ Follow these instructions: BUILD_ENV = MSVC Open the Visual Studio Command prompt, and then bash.exe -login from - Cygwin from in there. + Cygwin from in there. 3) Type cd src; make - that should do it. @@ -183,6 +183,53 @@ can be used for building with MSBuild. Note that you still need to run flex/bison using "make generated_files" before opening the project. +WORKING WITH CMAKE (EXPERIMENTAL) +--------------------------------- + +There is an experimental build based on CMake instead of hand-written +makefiles. It should work on a wider variety of systems than the standard +makefile build, and can integrate better with IDEs and static-analysis tools. + +0) Run `cmake --version`. If you get a command-not-found error, or the installed + version is lower than 3.2, go and install a new version. Most Linux + distributions have a package for CMake, and Mac users can get it through + Homebrew. Windows users should download it manually from cmake.org. + +1) Create a directory to store your build: + `mkdir build` + Run this from the *top level* folder of the project. This is different from + the other builds, which require you to `cd src` first. + +2) Generate build files with CMake: + `cmake -H. -Bbuild` + This command tells CMake to use the configuration in the current directory, + and to generate build files into the `build` directory. + This is the point to specify custom build settings, such as compilers and + build back-ends. You can use clang (for example) by adding the argument + `-DCMAKE_CXX_COMPILER=clang++` to the command line. You can also tell + CMake to generate IDE projects by supplying the `-G` flag. + Run `cmake -G` for a comprehensive list of supported back-ends. + + Generally it is not necessary to manually specify individual compiler or + linker flags, as CMake defines a number of "build modes" including Debug + and Release modes. To build in a particular mode, add the flag + `-DCMAKE_BUILD_TYPE=Debug` (or `Release`) to the initial invocation. + + If you *do* need to manually add flags, use `-DCMAKE_CXX_FLAGS=...` and + `-DCMAKE_EXE_LINKER_FLAGS=...`. This is useful for enabling clang's + sanitizers. + + Finally, to enable building universal binaries on macOS, you can pass the + flag `-DCMAKE_OSX_ARCHITECTURES=i386;x86_64`. If you don't supply this flag, + the build will just be for the architecture of your machine. + +3) Run the build: + `cmake --build build` + This command tells CMake to invoke the correct tool to run the build in the + `build` directory. You can also use the build back-end directly by invoking + `make`, `ninja`, or opening the generated IDE project as appropriate. + + WORKING WITH ECLIPSE -------------------- diff --git a/appveyor.yml b/appveyor.yml index 2efea4e75c2..22fd0d6968e 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -60,19 +60,21 @@ build_script: test_script: - cmd: | cd regression - sed -i "s/goto-cc\/goto-cc/goto-cc\/goto-cl/" ansi-c/Makefile - sed -i "s/goto-cc\/goto-cc/goto-cc\/goto-cl/" cpp/Makefile - sed -i "s/goto-cc\/goto-cc/goto-cc\/goto-cl/" goto-instrument/chain.sh - sed -i "15s/.*/$goto_cc $name.c/" goto-instrument/chain.sh - sed -i "16i mv $name.exe $name.gb" goto-instrument/chain.sh - sed -i "23s/.*/ $goto_cc ${name}-mod.c/" goto-instrument/chain.sh - sed -i "24i mv ${name}-mod.exe $name-mod.gb" goto-instrument/chain.sh - cat goto-instrument/chain.sh - sed -i "s/goto-cc\/goto-cc/goto-cc\/goto-cl/" goto-instrument-typedef/chain.sh || true - sed -i "12s/.*/$GC $NAME.c --function fun/" goto-instrument-typedef/chain.sh || true - sed -i "13i mv $NAME.exe $NAME.gb" goto-instrument-typedef/chain.sh || true - cat goto-instrument-typedef/chain.sh || true + sed -i "s/goto-cc\/goto-cc/goto-cc\/goto-cl/" goto-cc-cbmc/chain.sh || true + sed -i "11s/.*/$GC $NAME.c/" goto-cc-cbmc/chain.sh || true + sed -i "12i mv $NAME.exe $NAME.gb" goto-cc-cbmc/chain.sh || true + cat goto-cc-cbmc/chain.sh || true + + sed -i "s/goto-cc\/goto-cc/goto-cc\/goto-cl/" goto-cc-goto-analyzer/chain.sh || true + sed -i "11s/.*/$gc $name.c/" goto-cc-goto-analyzer/chain.sh || true + sed -i "12i mv $name.exe $name.gb" goto-cc-goto-analyzer/chain.sh || true + cat goto-cc-goto-analyzer/chain.sh || true + + sed -i "s/goto-cc\/goto-cc/goto-cc\/goto-cl/" goto-cc-symex/chain.sh || true + sed -i "11s/.*/$gc $name.c/" goto-cc-symex/chain.sh || true + sed -i "12i mv $name.exe $name.gb" goto-cc-symex/chain.sh || true + cat goto-cc-symex/chain.sh || true rem HACK disable failing tests rmdir /s /q ansi-c\arch_flags_mcpu_bad @@ -111,6 +113,11 @@ test_script: rmdir /s /q cbmc-java\tableswitch2 rmdir /s /q goto-gcc rmdir /s /q goto-instrument\slice08 + rmdir /s /q symex\va_args_10 + rmdir /s /q symex\va_args_2 + rmdir /s /q symex\va_args_3 + rmdir /s /q symex\va_args_5 + rmdir /s /q symex\va_args_6 make test diff --git a/regression/CMakeLists.txt b/regression/CMakeLists.txt new file mode 100644 index 00000000000..245e8611246 --- /dev/null +++ b/regression/CMakeLists.txt @@ -0,0 +1,36 @@ +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED true) + +set(test_pl_path "${CMAKE_CURRENT_SOURCE_DIR}/test.pl") + +macro(add_test_pl_profile name cmdline flag profile) + add_test( + NAME "${name}-${profile}" + COMMAND ${test_pl_path} -c ${cmdline} ${flag} + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + ) + set_tests_properties("${name}-${profile}" PROPERTIES + LABELS "${profile}" + ) +endmacro(add_test_pl_profile) + +macro(add_test_pl_tests name cmdline) + add_test_pl_profile("${name}" "${cmdline}" -C CORE) + add_test_pl_profile("${name}" "${cmdline}" -T THOROUGH) + add_test_pl_profile("${name}" "${cmdline}" -F FUTURE) + add_test_pl_profile("${name}" "${cmdline}" -K KNOWNBUG) +endmacro(add_test_pl_tests) + +add_subdirectory(ansi-c) +add_subdirectory(cbmc) +add_subdirectory(cbmc-java) +add_subdirectory(cbmc-java-inheritance) +add_subdirectory(cpp) +add_subdirectory(goto-analyzer) +add_subdirectory(goto-diff) +add_subdirectory(goto-instrument) +add_subdirectory(goto-instrument-typedef) +add_subdirectory(invariants) +add_subdirectory(strings) +add_subdirectory(strings-smoke-tests) +add_subdirectory(test-script) diff --git a/regression/Makefile b/regression/Makefile index d47df3994cc..0e791995ec2 100644 --- a/regression/Makefile +++ b/regression/Makefile @@ -5,6 +5,9 @@ DIRS = ansi-c \ cbmc-java-inheritance \ cpp \ goto-analyzer \ + goto-cc-cbmc \ + goto-cc-goto-analyzer \ + goto-cc-goto-symex \ goto-diff \ goto-gcc \ goto-instrument \ @@ -12,6 +15,7 @@ DIRS = ansi-c \ invariants \ strings \ strings-smoke-tests \ + symex \ test-script \ # Empty last line diff --git a/regression/ansi-c/CMakeLists.txt b/regression/ansi-c/CMakeLists.txt new file mode 100644 index 00000000000..027ec188f71 --- /dev/null +++ b/regression/ansi-c/CMakeLists.txt @@ -0,0 +1,4 @@ +add_test_pl_tests( + "ansi-c" + "$" +) diff --git a/regression/ansi-c/Initializer_cast2/main.c b/regression/ansi-c/Initializer_cast2/main.c new file mode 100644 index 00000000000..710bbdc0683 --- /dev/null +++ b/regression/ansi-c/Initializer_cast2/main.c @@ -0,0 +1,6 @@ +int main() +{ + int A[(sizeof((int[]){1, 2, 3})==3*sizeof(int))?1:-1]; + + return 0; +} diff --git a/regression/ansi-c/Initializer_cast2/test.desc b/regression/ansi-c/Initializer_cast2/test.desc new file mode 100644 index 00000000000..854d67addcf --- /dev/null +++ b/regression/ansi-c/Initializer_cast2/test.desc @@ -0,0 +1,7 @@ +CORE +main.c + +^EXIT=0$ +^SIGNAL=0$ +-- +^CONVERSION ERROR$ diff --git a/regression/ansi-c/Makefile b/regression/ansi-c/Makefile index 87af55e3306..c770b3b3ed7 100644 --- a/regression/ansi-c/Makefile +++ b/regression/ansi-c/Makefile @@ -1,13 +1,22 @@ default: tests.log +include ../../src/config.inc +include ../../src/common + +ifeq ($(BUILD_ENV_),MSVC) + exe=../../../src/goto-cc/goto-cl +else + exe=../../../src/goto-cc/goto-cc +endif + test: - @if ! ../test.pl -c ../../../src/goto-cc/goto-cc ; then \ + @if ! ../test.pl -c $(exe) ; then \ ../failed-tests-printer.pl ; \ exit 1 ; \ fi tests.log: ../test.pl - @if ! ../test.pl -c ../../../src/goto-cc/goto-cc ; then \ + @if ! ../test.pl -c $(exe) ; then \ ../failed-tests-printer.pl ; \ exit 1 ; \ fi diff --git a/regression/ansi-c/arch_flags_mcpu_bad/object.intel b/regression/ansi-c/arch_flags_mcpu_bad/object.intel index cc6ea40a25e..e32d04e4c56 100644 Binary files a/regression/ansi-c/arch_flags_mcpu_bad/object.intel and b/regression/ansi-c/arch_flags_mcpu_bad/object.intel differ diff --git a/regression/ansi-c/arch_flags_mcpu_good/object.arm b/regression/ansi-c/arch_flags_mcpu_good/object.arm index 7c14d169f62..f0a1397b8d6 100644 Binary files a/regression/ansi-c/arch_flags_mcpu_good/object.arm and b/regression/ansi-c/arch_flags_mcpu_good/object.arm differ diff --git a/regression/ansi-c/arch_flags_mcpu_good/test.desc b/regression/ansi-c/arch_flags_mcpu_good/test.desc index c02992dcb8d..c7daf68b878 100644 --- a/regression/ansi-c/arch_flags_mcpu_good/test.desc +++ b/regression/ansi-c/arch_flags_mcpu_good/test.desc @@ -14,6 +14,10 @@ command line: goto-cc --native-compiler=arm-none-eabi-gcc -mcpu=cortex-a15 -c source.c +On Ubuntu, you can get a suitable compiler using: + + sudo apt install gcc-arm-none-eabi + preproc.i is already pre-processed so that it can be linked in without needing to invoke a pre-processor from a cross-compile toolchain on your local machine. Linking it together with the ARM object file, while diff --git a/regression/ansi-c/arch_flags_mthumb_bad/object.intel b/regression/ansi-c/arch_flags_mthumb_bad/object.intel index cc6ea40a25e..72136c8ae3c 100644 Binary files a/regression/ansi-c/arch_flags_mthumb_bad/object.intel and b/regression/ansi-c/arch_flags_mthumb_bad/object.intel differ diff --git a/regression/ansi-c/arch_flags_mthumb_good/object.arm b/regression/ansi-c/arch_flags_mthumb_good/object.arm index 7c14d169f62..eb41c683911 100644 Binary files a/regression/ansi-c/arch_flags_mthumb_good/object.arm and b/regression/ansi-c/arch_flags_mthumb_good/object.arm differ diff --git a/regression/ansi-c/arch_flags_mthumb_good/test.desc b/regression/ansi-c/arch_flags_mthumb_good/test.desc index 02a5c7389e3..9f56b40997e 100644 --- a/regression/ansi-c/arch_flags_mthumb_good/test.desc +++ b/regression/ansi-c/arch_flags_mthumb_good/test.desc @@ -14,6 +14,10 @@ line: goto-cc --native-compiler=arm-none-eabi-gcc -mthumb -c source.c +On Ubuntu, you can get a suitable compiler using: + + sudo apt install gcc-arm-none-eabi + preproc.i is already pre-processed so that it can be linked in without needing to invoke a pre-processor from a cross-compile toolchain on your local machine. Linking it together with the ARM object file, while diff --git a/regression/ansi-c/array_initialization3/main.c b/regression/ansi-c/array_initialization3/main.c new file mode 100644 index 00000000000..6e7fb047488 --- /dev/null +++ b/regression/ansi-c/array_initialization3/main.c @@ -0,0 +1,13 @@ +#define STATIC_ASSERT_sizeof(condition) \ + int[(condition) ? 1 : -1] + +int A[]; +int B[]; + +int A[1]={sizeof(A)}; +int B[1]={sizeof(STATIC_ASSERT_sizeof(sizeof(B)==sizeof(int)))}; + +int main() +{ + return 0; +} diff --git a/regression/ansi-c/array_initialization3/test.desc b/regression/ansi-c/array_initialization3/test.desc new file mode 100644 index 00000000000..466da18b2b5 --- /dev/null +++ b/regression/ansi-c/array_initialization3/test.desc @@ -0,0 +1,8 @@ +CORE +main.c + +^EXIT=0$ +^SIGNAL=0$ +-- +^warning: ignoring +^CONVERSION ERROR$ diff --git a/regression/ansi-c/sizeof5/main.c b/regression/ansi-c/sizeof5/main.c new file mode 100644 index 00000000000..7149902ced6 --- /dev/null +++ b/regression/ansi-c/sizeof5/main.c @@ -0,0 +1,15 @@ +#define STATIC_ASSERT(condition) \ + int some_array##__LINE__[(condition) ? 1 : -1]; + +struct S +{ + int x; +}; + +int main() +{ + struct S s; + __typeof__(*((void *)&s.x)) *_s=&s.x; + STATIC_ASSERT(sizeof(*_s)==1); + return 0; +} diff --git a/regression/ansi-c/sizeof5/test.desc b/regression/ansi-c/sizeof5/test.desc new file mode 100644 index 00000000000..466da18b2b5 --- /dev/null +++ b/regression/ansi-c/sizeof5/test.desc @@ -0,0 +1,8 @@ +CORE +main.c + +^EXIT=0$ +^SIGNAL=0$ +-- +^warning: ignoring +^CONVERSION ERROR$ diff --git a/regression/cbmc-java-inheritance/CMakeLists.txt b/regression/cbmc-java-inheritance/CMakeLists.txt new file mode 100644 index 00000000000..cf949e080b8 --- /dev/null +++ b/regression/cbmc-java-inheritance/CMakeLists.txt @@ -0,0 +1,4 @@ +add_test_pl_tests( + "cbmc-java-inheritance" + "$" +) diff --git a/regression/cbmc-java/CMakeLists.txt b/regression/cbmc-java/CMakeLists.txt new file mode 100644 index 00000000000..37252add85e --- /dev/null +++ b/regression/cbmc-java/CMakeLists.txt @@ -0,0 +1,4 @@ +add_test_pl_tests( + "cbmc-java" + "$" +) diff --git a/regression/cbmc-java/exceptions25/main.c b/regression/cbmc-java/exceptions25/main.c new file mode 100644 index 00000000000..ab24eded4f8 --- /dev/null +++ b/regression/cbmc-java/exceptions25/main.c @@ -0,0 +1,7 @@ +int main(void) +{ + int x; + __CPROVER_assume(x < 10); + __CPROVER_assert(x != 0, ""); + return 0; +} diff --git a/regression/cbmc-java/exceptions25/test.desc b/regression/cbmc-java/exceptions25/test.desc new file mode 100644 index 00000000000..f8823e7d524 --- /dev/null +++ b/regression/cbmc-java/exceptions25/test.desc @@ -0,0 +1,14 @@ +CORE +main.c + +^EXIT=10$ +^SIGNAL=0$ +VERIFICATION FAILED +-- +^warning: ignoring +-- +When compiling CBMC with -DDEBUG uncaught exception analysis prints an +exceptions map per function. This test ensures that meta-functions which are +replaced by explicit GOTO instructions (e.g. __CPROVER_assert, __CPROVER_assume) +and thus do not occur as explicit function calls in the final GOTO program are +handled correctly. diff --git a/regression/cbmc/CMakeLists.txt b/regression/cbmc/CMakeLists.txt new file mode 100644 index 00000000000..ee9f8f2e90f --- /dev/null +++ b/regression/cbmc/CMakeLists.txt @@ -0,0 +1,4 @@ +add_test_pl_tests( + "cbmc" + "$" +) diff --git a/regression/cbmc/pointer-function-parameters-2/test.desc b/regression/cbmc/pointer-function-parameters-2/test.desc index c67211d7387..be81dbdc393 100644 --- a/regression/cbmc/pointer-function-parameters-2/test.desc +++ b/regression/cbmc/pointer-function-parameters-2/test.desc @@ -4,9 +4,9 @@ main.c ^\*\* 7 of 7 covered \(100.0%\)$ ^\*\* Used 4 iterations$ ^Test suite:$ -^a=\(\(signed int \*\*\)NULL\), tmp\$1=[^,]*, tmp\$2=[^,]*$ -^a=&tmp\$1!0, tmp\$1=\(\(signed int \*\)NULL\), tmp\$2=[^,]*$ -^a=&tmp\$1!0, tmp\$1=&tmp\$2!0, tmp\$2=([012356789][0-9]*|4[0-9]+)$ -^a=&tmp\$1!0, tmp\$1=&tmp\$2!0, tmp\$2=4$ +^a=\(\(signed int \*\*\)NULL\), tmp\$\d+=[^,]*, tmp\$\d+=[^,]*$ +^a=&tmp\$\d+!0, tmp\$\d+=\(\(signed int \*\)NULL\), tmp\$\d+=[^,]*$ +^a=&tmp\$\d+!0, tmp\$\d+=&tmp\$\d+!0, tmp\$\d+=([012356789][0-9]*|4[0-9]+)$ +^a=&tmp\$\d+!0, tmp\$\d+=&tmp\$\d+!0, tmp\$\d+=4$ -- ^warning: ignoring diff --git a/regression/cbmc/pointer-function-parameters/test.desc b/regression/cbmc/pointer-function-parameters/test.desc index b9aa6240dea..89fbd70531a 100644 --- a/regression/cbmc/pointer-function-parameters/test.desc +++ b/regression/cbmc/pointer-function-parameters/test.desc @@ -4,8 +4,8 @@ main.c ^\*\* 5 of 5 covered \(100\.0%\)$ ^\*\* Used 3 iterations$ ^Test suite:$ -^a=\(\(signed int \*\)NULL\), tmp\$1=[^,]*$ -^a=&tmp\$1!0, tmp\$1=4$ -^a=&tmp\$1!0, tmp\$1=([012356789][0-9]*|4[0-9]+)$ +^a=\(\(signed int \*\)NULL\), tmp\$\d+=[^,]*$ +^a=&tmp\$\d+!0, tmp\$\d+=4$ +^a=&tmp\$\d+!0, tmp\$\d+=([012356789][0-9]*|4[0-9]+)$ -- ^warning: ignoring diff --git a/regression/cpp/CMakeLists.txt b/regression/cpp/CMakeLists.txt new file mode 100644 index 00000000000..c6eea89555b --- /dev/null +++ b/regression/cpp/CMakeLists.txt @@ -0,0 +1,4 @@ +add_test_pl_tests( + "cpp" + "$" +) diff --git a/regression/cpp/Makefile b/regression/cpp/Makefile index 87af55e3306..c770b3b3ed7 100644 --- a/regression/cpp/Makefile +++ b/regression/cpp/Makefile @@ -1,13 +1,22 @@ default: tests.log +include ../../src/config.inc +include ../../src/common + +ifeq ($(BUILD_ENV_),MSVC) + exe=../../../src/goto-cc/goto-cl +else + exe=../../../src/goto-cc/goto-cc +endif + test: - @if ! ../test.pl -c ../../../src/goto-cc/goto-cc ; then \ + @if ! ../test.pl -c $(exe) ; then \ ../failed-tests-printer.pl ; \ exit 1 ; \ fi tests.log: ../test.pl - @if ! ../test.pl -c ../../../src/goto-cc/goto-cc ; then \ + @if ! ../test.pl -c $(exe) ; then \ ../failed-tests-printer.pl ; \ exit 1 ; \ fi diff --git a/regression/goto-analyzer/CMakeLists.txt b/regression/goto-analyzer/CMakeLists.txt new file mode 100644 index 00000000000..3d5daac5b92 --- /dev/null +++ b/regression/goto-analyzer/CMakeLists.txt @@ -0,0 +1,4 @@ +add_test_pl_tests( + "goto-analyzer" + "$" +) diff --git a/regression/goto-analyzer/regenerate-entry-function/main.c b/regression/goto-analyzer/regenerate-entry-function/main.c new file mode 100644 index 00000000000..6a035127022 --- /dev/null +++ b/regression/goto-analyzer/regenerate-entry-function/main.c @@ -0,0 +1,16 @@ +#include + +int fun(int x) +{ + int i; + if(i>=20) + assert(i>=10); +} + +int main(int argc, char** argv) +{ + int i; + + if(i>=5) + assert(i>=10); +} diff --git a/regression/goto-analyzer/regenerate-entry-function/test.desc b/regression/goto-analyzer/regenerate-entry-function/test.desc new file mode 100644 index 00000000000..289b7cbd276 --- /dev/null +++ b/regression/goto-analyzer/regenerate-entry-function/test.desc @@ -0,0 +1,8 @@ +CORE +main.c +--function fun --show-goto-functions +^\s*fun\(x\);$ +^EXIT=6$ +^SIGNAL=0$ +-- +^warning: ignoring diff --git a/regression/goto-cc-cbmc/Makefile b/regression/goto-cc-cbmc/Makefile new file mode 100644 index 00000000000..191f99fcba1 --- /dev/null +++ b/regression/goto-cc-cbmc/Makefile @@ -0,0 +1,30 @@ +default: tests.log + +test: + @if ! ../test.pl -c ../chain.sh ; then \ + ../failed-tests-printer.pl ; \ + exit 1; \ + fi + +tests.log: + @if ! ../test.pl -c ../chain.sh ; then \ + ../failed-tests-printer.pl ; \ + exit 1; \ + fi + +show: + @for dir in *; do \ + if [ -d "$$dir" ]; then \ + vim -o "$$dir/*.c" "$$dir/*.out"; \ + fi; \ + done; + +clean: + @for dir in *; do \ + $(RM) tests.log; \ + if [ -d "$$dir" ]; then \ + cd "$$dir"; \ + $(RM) *.out *.gb; \ + cd ..; \ + fi \ + done diff --git a/regression/goto-cc-cbmc/chain.sh b/regression/goto-cc-cbmc/chain.sh new file mode 100755 index 00000000000..1440e03272d --- /dev/null +++ b/regression/goto-cc-cbmc/chain.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +SRC=../../../src + +GC=$SRC/goto-cc/goto-cc +CBMC=$SRC/cbmc/cbmc + +OPTS=$1 +NAME=${2%.c} + +$GC $NAME.c -o $NAME.gb +$CBMC $NAME.gb $OPTS diff --git a/regression/goto-cc-cbmc/regenerate-entry-function/main.c b/regression/goto-cc-cbmc/regenerate-entry-function/main.c new file mode 100644 index 00000000000..644ef1eb086 --- /dev/null +++ b/regression/goto-cc-cbmc/regenerate-entry-function/main.c @@ -0,0 +1,23 @@ +int fun(int x) +{ + if(x > 0) + { + return x * x; + } + else + { + return x; + } +} + +int main(int argc, char** argv) +{ + if(argc>4) + { + return 0; + } + else + { + return 1; + } +} diff --git a/regression/goto-cc-cbmc/regenerate-entry-function/test.desc b/regression/goto-cc-cbmc/regenerate-entry-function/test.desc new file mode 100644 index 00000000000..ced965563f8 --- /dev/null +++ b/regression/goto-cc-cbmc/regenerate-entry-function/test.desc @@ -0,0 +1,8 @@ +CORE +main.c +"--function fun --cover branch" +^EXIT=0$ +^SIGNAL=0$ +^x= +-- +^warning: ignoring diff --git a/regression/goto-cc-goto-analyzer/Makefile b/regression/goto-cc-goto-analyzer/Makefile new file mode 100644 index 00000000000..18f4d370eb8 --- /dev/null +++ b/regression/goto-cc-goto-analyzer/Makefile @@ -0,0 +1,32 @@ + +default: tests.log + +test: + @if ! ../test.pl -c ../chain.sh ; then \ + ../failed-tests-printer.pl ; \ + exit 1; \ + fi + +tests.log: + pwd + @if ! ../test.pl -c ../chain.sh ; then \ + ../failed-tests-printer.pl ; \ + exit 1; \ + fi + +show: + @for dir in *; do \ + if [ -d "$$dir" ]; then \ + vim -o "$$dir/*.c" "$$dir/*.out"; \ + fi; \ + done; + +clean: + @for dir in *; do \ + rm -f tests.log; \ + if [ -d "$$dir" ]; then \ + cd "$$dir"; \ + rm -f *.out *.gb; \ + cd ..; \ + fi \ + done diff --git a/regression/goto-cc-goto-analyzer/chain.sh b/regression/goto-cc-goto-analyzer/chain.sh new file mode 100755 index 00000000000..b34d0e7750e --- /dev/null +++ b/regression/goto-cc-goto-analyzer/chain.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +src=../../../src + +gc=$src/goto-cc/goto-cc +goto_analyzer=$src/goto-analyzer/goto-analyzer + +options=$1 +name=${2%.c} + +$gc $name.c -o $name.gb +$goto_analyzer $name.gb $options diff --git a/regression/goto-cc-goto-analyzer/regenerate-entry-function/main.c b/regression/goto-cc-goto-analyzer/regenerate-entry-function/main.c new file mode 100644 index 00000000000..6a035127022 --- /dev/null +++ b/regression/goto-cc-goto-analyzer/regenerate-entry-function/main.c @@ -0,0 +1,16 @@ +#include + +int fun(int x) +{ + int i; + if(i>=20) + assert(i>=10); +} + +int main(int argc, char** argv) +{ + int i; + + if(i>=5) + assert(i>=10); +} diff --git a/regression/goto-cc-goto-analyzer/regenerate-entry-function/test.desc b/regression/goto-cc-goto-analyzer/regenerate-entry-function/test.desc new file mode 100644 index 00000000000..0dd59956634 --- /dev/null +++ b/regression/goto-cc-goto-analyzer/regenerate-entry-function/test.desc @@ -0,0 +1,8 @@ +CORE +main.c +"--function fun --show-goto-functions" +^\s*fun\(x\);$ +^EXIT=6$ +^SIGNAL=0$ +-- +^warning: ignoring diff --git a/regression/goto-cc-symex/Makefile b/regression/goto-cc-symex/Makefile new file mode 100644 index 00000000000..18f4d370eb8 --- /dev/null +++ b/regression/goto-cc-symex/Makefile @@ -0,0 +1,32 @@ + +default: tests.log + +test: + @if ! ../test.pl -c ../chain.sh ; then \ + ../failed-tests-printer.pl ; \ + exit 1; \ + fi + +tests.log: + pwd + @if ! ../test.pl -c ../chain.sh ; then \ + ../failed-tests-printer.pl ; \ + exit 1; \ + fi + +show: + @for dir in *; do \ + if [ -d "$$dir" ]; then \ + vim -o "$$dir/*.c" "$$dir/*.out"; \ + fi; \ + done; + +clean: + @for dir in *; do \ + rm -f tests.log; \ + if [ -d "$$dir" ]; then \ + cd "$$dir"; \ + rm -f *.out *.gb; \ + cd ..; \ + fi \ + done diff --git a/regression/goto-cc-symex/chain.sh b/regression/goto-cc-symex/chain.sh new file mode 100755 index 00000000000..25217b24e2a --- /dev/null +++ b/regression/goto-cc-symex/chain.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +src=../../../src + +gc=$src/goto-cc/goto-cc +symex=$src/symex/symex + +options=$1 +name=${2%.c} + +$gc $name.c -o $name.gb +$symex $name.gb $options diff --git a/regression/goto-cc-symex/regenerate-entry-function/main.c b/regression/goto-cc-symex/regenerate-entry-function/main.c new file mode 100644 index 00000000000..6a035127022 --- /dev/null +++ b/regression/goto-cc-symex/regenerate-entry-function/main.c @@ -0,0 +1,16 @@ +#include + +int fun(int x) +{ + int i; + if(i>=20) + assert(i>=10); +} + +int main(int argc, char** argv) +{ + int i; + + if(i>=5) + assert(i>=10); +} diff --git a/regression/goto-cc-symex/regenerate-entry-function/test.desc b/regression/goto-cc-symex/regenerate-entry-function/test.desc new file mode 100644 index 00000000000..709ad39e859 --- /dev/null +++ b/regression/goto-cc-symex/regenerate-entry-function/test.desc @@ -0,0 +1,8 @@ +CORE +main.c +"--function fun --show-goto-functions" +^\s*return.=fun\(x\);$ +^EXIT=6$ +^SIGNAL=0$ +-- +^warning: ignoring diff --git a/regression/goto-diff/CMakeLists.txt b/regression/goto-diff/CMakeLists.txt new file mode 100644 index 00000000000..9f0957a1386 --- /dev/null +++ b/regression/goto-diff/CMakeLists.txt @@ -0,0 +1,4 @@ +add_test_pl_tests( + "goto-diff" + "$" +) diff --git a/regression/goto-gcc/run_diagnostic/main.i b/regression/goto-gcc/run_diagnostic/main.i new file mode 100644 index 00000000000..f8b643afbf2 --- /dev/null +++ b/regression/goto-gcc/run_diagnostic/main.i @@ -0,0 +1,4 @@ +int main() +{ + return 0; +} diff --git a/regression/goto-gcc/run_diagnostic/test.desc b/regression/goto-gcc/run_diagnostic/test.desc new file mode 100644 index 00000000000..e3a632f65f2 --- /dev/null +++ b/regression/goto-gcc/run_diagnostic/test.desc @@ -0,0 +1,10 @@ +CORE +main.i +--native-compiler /no/such/tool +^EXIT=1$ +^SIGNAL=0$ +^execvp /no/such/tool failed: No such file or directory$ +-- +^Remove failed +^warning: ignoring +^CONVERSION ERROR$ diff --git a/regression/goto-instrument-typedef/CMakeLists.txt b/regression/goto-instrument-typedef/CMakeLists.txt new file mode 100644 index 00000000000..63a842ccec9 --- /dev/null +++ b/regression/goto-instrument-typedef/CMakeLists.txt @@ -0,0 +1,10 @@ +if(WIN32) + set(is_windows true) +else() + set(is_windows false) +endif() + +add_test_pl_tests( + "goto-instrument-typedef" + "${CMAKE_CURRENT_SOURCE_DIR}/chain.sh $ $ ${is_windows}" +) diff --git a/regression/goto-instrument-typedef/Makefile b/regression/goto-instrument-typedef/Makefile index 08fe97ae88c..56de781ae2c 100644 --- a/regression/goto-instrument-typedef/Makefile +++ b/regression/goto-instrument-typedef/Makefile @@ -1,14 +1,24 @@ - default: tests.log +include ../../src/config.inc +include ../../src/common + +ifeq ($(BUILD_ENV_),MSVC) + exe=../../../src/goto-cc/goto-cl + is_windows="true" +else + exe=../../../src/goto-cc/goto-cc + is_windows="false" +endif + test: - @if ! ../test.pl -c ../chain.sh ; then \ + @if ! ../test.pl -c '../chain.sh $(exe) ../../../src/goto-instrument/goto-instrument $(is_windows)' ; then \ ../failed-tests-printer.pl ; \ exit 1; \ fi tests.log: - @if ! ../test.pl -c ../chain.sh ; then \ + @if ! ../test.pl -c '../chain.sh $(exe) ../../../src/goto-instrument/goto-instrument $(is_windows)' ; then \ ../failed-tests-printer.pl ; \ exit 1; \ fi diff --git a/regression/goto-instrument-typedef/chain.sh b/regression/goto-instrument-typedef/chain.sh index 9cef4ffdfa4..d53833cccd9 100755 --- a/regression/goto-instrument-typedef/chain.sh +++ b/regression/goto-instrument-typedef/chain.sh @@ -1,14 +1,21 @@ #!/bin/bash -SRC=../../../src +GC=$1 +GI=$2 +is_windows=$3 -GC=$SRC/goto-cc/goto-cc -GI=$SRC/goto-instrument/goto-instrument +name=${*:$#} +name=${name%.c} -OPTS=$1 -NAME=${2%.c} +args=${*:4:$#-4} -rm $NAME.gb -$GC $NAME.c --function fun -o $NAME.gb -echo $GI $OPTS $NAME.gb -$GI $OPTS $NAME.gb +rm "${name}.gb" +if [[ "${is_windows}" == "true" ]]; then + "$GC" "${name}.c" --function fun + mv "${name}.exe" "${name}.gb" +else + "$GC" "${name}.c" --function fun -o "${name}.gb" +fi + +echo "$GI" ${args} "${name}.gb" +"$GI" ${args} "${name}.gb" diff --git a/regression/goto-instrument/CMakeLists.txt b/regression/goto-instrument/CMakeLists.txt new file mode 100644 index 00000000000..088fcab9651 --- /dev/null +++ b/regression/goto-instrument/CMakeLists.txt @@ -0,0 +1,10 @@ +if(WIN32) + set(is_windows true) +else() + set(is_windows false) +endif() + +add_test_pl_tests( + "goto-instrument" + "${CMAKE_CURRENT_SOURCE_DIR}/chain.sh $ $ $ ${is_windows}" +) diff --git a/regression/goto-instrument/Makefile b/regression/goto-instrument/Makefile index 94605814b4a..a8d54370285 100644 --- a/regression/goto-instrument/Makefile +++ b/regression/goto-instrument/Makefile @@ -1,14 +1,24 @@ - default: tests.log +include ../../src/config.inc +include ../../src/common + +ifeq ($(BUILD_ENV_),MSVC) + exe=../../../src/goto-cc/goto-cl + is_windows="true" +else + exe=../../../src/goto-cc/goto-cc + is_windows="false" +endif + test: - @if ! ../test.pl -c ../chain.sh ; then \ + @if ! ../test.pl -c '../chain.sh $(exe) ../../../src/goto-instrument/goto-instrument ../../../src/cbmc/cbmc $(is_windows)' ; then \ ../failed-tests-printer.pl ; \ exit 1; \ fi tests.log: - @if ! ../test.pl -c ../chain.sh ; then \ + @if ! ../test.pl -c '../chain.sh $(exe) ../../../src/goto-instrument/goto-instrument ../../../src/cbmc/cbmc $(is_windows)' ; then \ ../failed-tests-printer.pl ; \ exit 1; \ fi diff --git a/regression/goto-instrument/chain.sh b/regression/goto-instrument/chain.sh index 68f50b095bc..2656ea4488f 100755 --- a/regression/goto-instrument/chain.sh +++ b/regression/goto-instrument/chain.sh @@ -2,26 +2,37 @@ set -e -src=../../../src -goto_cc=$src/goto-cc/goto-cc -goto_instrument=$src/goto-instrument/goto-instrument -cbmc=$src/cbmc/cbmc +goto_cc=$1 +goto_instrument=$2 +cbmc=$3 +is_windows=$4 -name=${@:$#} +name=${*:$#} name=${name%.c} -args=${@:1:$#-1} - -$goto_cc -o $name.gb $name.c -# $goto_instrument --show-goto-functions $name.gb -$goto_instrument $args $name.gb ${name}-mod.gb -if [ ! -e ${name}-mod.gb ] ; then - cp $name.gb ${name}-mod.gb -elif echo "$args" | grep -q -- "--dump-c" ; then - mv ${name}-mod.gb ${name}-mod.c - $goto_cc ${name}-mod.c -o ${name}-mod.gb - rm ${name}-mod.c +args=${*:5:$#-5} + +if [[ "${is_windows}" == "true" ]]; then + $goto_cc "${name}.c" + mv "${name}.exe" "${name}.gb" +else + $goto_cc -o "${name}.gb" "${name}.c" fi -$goto_instrument --show-goto-functions ${name}-mod.gb -$cbmc ${name}-mod.gb +$goto_instrument ${args} "${name}.gb" "${name}-mod.gb" +if [ ! -e "${name}-mod.gb" ] ; then + cp "$name.gb" "${name}-mod.gb" +elif echo $args | grep -q -- "--dump-c" ; then + mv "${name}-mod.gb" "${name}-mod.c" + + if [[ "${is_windows}" == "true" ]]; then + $goto_cc "${name}-mod.c" + mv "${name}-mod.exe" "${name}-mod.gb" + else + $goto_cc -o "${name}-mod.gb" "${name}-mod.c" + fi + + rm "${name}-mod.c" +fi +$goto_instrument --show-goto-functions "${name}-mod.gb" +$cbmc "${name}-mod.gb" diff --git a/regression/invariants/CMakeLists.txt b/regression/invariants/CMakeLists.txt new file mode 100644 index 00000000000..467e2b13950 --- /dev/null +++ b/regression/invariants/CMakeLists.txt @@ -0,0 +1,7 @@ +add_executable(driver driver.cpp) +target_link_libraries(driver big-int util) + +add_test_pl_tests( + "invariants" + "$" +) diff --git a/regression/strings-smoke-tests/CMakeLists.txt b/regression/strings-smoke-tests/CMakeLists.txt new file mode 100644 index 00000000000..6e8a19a9796 --- /dev/null +++ b/regression/strings-smoke-tests/CMakeLists.txt @@ -0,0 +1,4 @@ +add_test_pl_tests( + "strings-smoke-test" + "$" +) diff --git a/regression/strings/CMakeLists.txt b/regression/strings/CMakeLists.txt new file mode 100644 index 00000000000..846e65ae00d --- /dev/null +++ b/regression/strings/CMakeLists.txt @@ -0,0 +1,4 @@ +add_test_pl_tests( + "strings" + "$" +) diff --git a/regression/symex/Makefile b/regression/symex/Makefile index 120e9a347c0..006aaf3a346 100644 --- a/regression/symex/Makefile +++ b/regression/symex/Makefile @@ -1,10 +1,16 @@ default: tests.log test: - @../test.pl -c ../../../src/symex/symex + @if ! ../test.pl -c ../../../src/symex/symex ; then \ + ../failed-tests-printer.pl ; \ + exit 1 ; \ + fi tests.log: ../test.pl - @../test.pl -c ../../../src/symex/symex + @if ! ../test.pl -c ../../../src/symex/symex ; then \ + ../failed-tests-printer.pl ; \ + exit 1 ; \ + fi show: @for dir in *; do \ diff --git a/regression/symex/regenerate-entry-function/main.c b/regression/symex/regenerate-entry-function/main.c new file mode 100644 index 00000000000..6a035127022 --- /dev/null +++ b/regression/symex/regenerate-entry-function/main.c @@ -0,0 +1,16 @@ +#include + +int fun(int x) +{ + int i; + if(i>=20) + assert(i>=10); +} + +int main(int argc, char** argv) +{ + int i; + + if(i>=5) + assert(i>=10); +} diff --git a/regression/symex/regenerate-entry-function/test.desc b/regression/symex/regenerate-entry-function/test.desc new file mode 100644 index 00000000000..722900f544e --- /dev/null +++ b/regression/symex/regenerate-entry-function/test.desc @@ -0,0 +1,8 @@ +CORE +main.c +--function fun --show-goto-functions +fun\(x\);$ +^EXIT=6$ +^SIGNAL=0$ +-- +^warning: ignoring diff --git a/regression/symex/show-trace1/main.c b/regression/symex/show-trace1/main.c index e5a7ae24717..3b216553005 100644 --- a/regression/symex/show-trace1/main.c +++ b/regression/symex/show-trace1/main.c @@ -4,12 +4,12 @@ int main() { int i, j, k; - i=input(); - j=input(); - k=input(); + i=input(); // expect 2 + j=input(); // expect 3 + k=input(); // expect 6 if(i==2) if(j==i+1) if(k==i*j) - assert(0); + __CPROVER_assert(0, ""); } diff --git a/regression/symex/show-trace1/test.desc b/regression/symex/show-trace1/test.desc index d38b0c9289d..23a9f62e3ae 100644 --- a/regression/symex/show-trace1/test.desc +++ b/regression/symex/show-trace1/test.desc @@ -1,6 +1,6 @@ -CORE +KNOWNBUG main.c ---show-trace +--trace ^EXIT=10$ ^SIGNAL=0$ ^VERIFICATION FAILED$ @@ -9,3 +9,5 @@ main.c ^ k=6 .*$ -- ^warning: ignoring +-- +diffblue/cbmc#1361 \ No newline at end of file diff --git a/regression/test-script/CMakeLists.txt b/regression/test-script/CMakeLists.txt new file mode 100644 index 00000000000..00ad3a848d6 --- /dev/null +++ b/regression/test-script/CMakeLists.txt @@ -0,0 +1,4 @@ +add_test_pl_tests( + "test-script" + "${CMAKE_CURRENT_SOURCE_DIR}/program_runner.sh" +) diff --git a/regression/test.pl b/regression/test.pl index 3118fd375f6..c9a90edc333 100755 --- a/regression/test.pl +++ b/regression/test.pl @@ -59,8 +59,8 @@ ($) return @data; } -sub test($$$$$) { - my ($name, $test, $t_level, $cmd, $ign) = @_; +sub test($$$$$$) { + my ($name, $test, $t_level, $cmd, $ign, $dry_run) = @_; my ($level, $input, $options, $grep_options, @results) = load("$test"); # If the 4th line is activate-multi-line-match we enable multi-line checks @@ -106,6 +106,11 @@ ($$$$$) my $failed = 2; if($level & $t_level) { + + if ($dry_run) { + return 0; + } + $failed = run($name, $input, $cmd, $options, $output); if(!$failed) { @@ -211,6 +216,7 @@ ($$$$) -c CMD run tests on CMD - required option -i options in test.desc matching the specified perl regex are ignored -j run tests in parallel (requires Thread::Pool::Simple) + -n dry-run: print the tests that would be run, but don't actually run them -h show this help and exit -C core: run all essential tests (default if none of C/T/F/K are given) -T thorough: run expensive tests @@ -249,9 +255,9 @@ ($$$$) use Getopt::Std; $main::VERSION = 0.1; $Getopt::Std::STANDARD_HELP_VERSION = 1; -our ($opt_c, $opt_i, $opt_j, $opt_h, $opt_C, $opt_T, $opt_F, $opt_K); # the variables for getopt +our ($opt_c, $opt_i, $opt_j, $opt_n, $opt_h, $opt_C, $opt_T, $opt_F, $opt_K); # the variables for getopt $opt_j = 0; -getopts('c:i:j:hCTFK') or &main::HELP_MESSAGE(\*STDOUT, "", $main::VERSION, ""); +getopts('c:i:j:nhCTFK') or &main::HELP_MESSAGE(\*STDOUT, "", $main::VERSION, ""); $opt_c or &main::HELP_MESSAGE(\*STDOUT, "", $main::VERSION, ""); (!$opt_j || $has_thread_pool) or &main::HELP_MESSAGE(\*STDOUT, "", $main::VERSION, ""); $opt_h and &main::HELP_MESSAGE(\*STDOUT, "", $main::VERSION, ""); @@ -260,7 +266,7 @@ ($$$$) $t_level += 4 if($opt_F); $t_level += 8 if($opt_K); $t_level += 1 if($opt_C || 0 == $t_level); - +my $dry_run = $opt_n; open LOG,">tests.log"; @@ -287,7 +293,7 @@ ($) my @files = glob "$test/*.desc"; for (0..$#files){ defined($pool) or print " Running $files[$_]"; - $failed_skipped = test($test, $files[$_], $t_level, $opt_c, $opt_i); + $failed_skipped = test($test, $files[$_], $t_level, $opt_c, $opt_i, $dry_run); lock($skips); defined($pool) and print " Running $test $files[$_]"; diff --git a/scripts/glucose_CMakeLists.txt b/scripts/glucose_CMakeLists.txt new file mode 100644 index 00000000000..862fc8ba675 --- /dev/null +++ b/scripts/glucose_CMakeLists.txt @@ -0,0 +1,30 @@ +cmake_minimum_required(VERSION 3.2) + +# CBMC only uses part of glucose. +# This CMakeLists is designed to build just the parts that are needed. + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9") +set(CMAKE_OSX_ARCHITECTURES "i386;x86_64") +set(CMAKE_BUILD_TYPE RelWithDebInfo) + +add_library(glucose-condensed + simp/SimpSolver.cc + core/Solver.cc +) + +target_include_directories(glucose-condensed + PUBLIC + $ + $ +) + +install(TARGETS glucose-condensed EXPORT glucose-condensed-targets + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib + RUNTIME DESTINATION bin + INCLUDES DESTINATION include +) + +install(DIRECTORY . DESTINATION include FILES_MATCHING PATTERN "*.h") + +install(EXPORT glucose-condensed-targets DESTINATION lib/cmake/glucose-condensed) diff --git a/scripts/minisat2_CMakeLists.txt b/scripts/minisat2_CMakeLists.txt new file mode 100644 index 00000000000..c749d0e4c8f --- /dev/null +++ b/scripts/minisat2_CMakeLists.txt @@ -0,0 +1,33 @@ +cmake_minimum_required(VERSION 3.2) + +# CBMC only uses part of minisat2. +# This CMakeLists is designed to build just the parts that are needed. + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9") +set(CMAKE_OSX_ARCHITECTURES "i386;x86_64") +set(CMAKE_BUILD_TYPE RelWithDebInfo) + +add_library(minisat2-condensed + minisat/simp/SimpSolver.cc + minisat/core/Solver.cc +) + +set(CBMC_INCLUDE_DIR "" CACHE PATH "The path to CBMC util headers") + +target_include_directories(minisat2-condensed + PUBLIC + $ + $ + $ +) + +install(TARGETS minisat2-condensed EXPORT minisat-condensed-targets + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib + RUNTIME DESTINATION bin + INCLUDES DESTINATION include +) + +install(DIRECTORY . DESTINATION include FILES_MATCHING PATTERN "*.h") + +install(EXPORT minisat-condensed-targets DESTINATION lib/cmake/minisat-condensed) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 00000000000..13c6d0045b5 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,174 @@ +cmake_minimum_required(VERSION 3.2) + +# TODO +# -[ ] Install profiles. +# -[ ] Specify one of many different solver libraries. + +project(CBMC) + +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED true) + +set(CMAKE_EXPORT_COMPILE_COMMANDS true) + +find_package(BISON) +find_package(FLEX) + +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) + +include(CPack) + +find_package(Doxygen) +if(DOXYGEN_FOUND) + add_custom_target(doc + "${DOXYGEN_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/doxygen.cfg" + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" + ) +endif(DOXYGEN_FOUND) + +# Add a bison target named 'parser'. +macro(generic_bison name) + bison_target( + parser + "${CMAKE_CURRENT_SOURCE_DIR}/parser.y" + "${CMAKE_CURRENT_BINARY_DIR}/${name}_y.tab.cpp" + COMPILE_FLAGS "-pyy${name}" + ) + set(renamed_parser_header "${CMAKE_CURRENT_BINARY_DIR}/${name}_y.tab.h") + add_custom_command(OUTPUT "${renamed_parser_header}" + COMMAND "${CMAKE_COMMAND}" -E copy "${BISON_parser_OUTPUT_HEADER}" "${renamed_parser_header}" + MAIN_DEPENDENCY "${BISON_parser_OUTPUT_HEADER}" + ) + list(REMOVE_ITEM BISON_parser_OUTPUTS "${BISON_parser_OUTPUT_HEADER}") + list(APPEND BISON_parser_OUTPUTS "${renamed_parser_header}") +endmacro(generic_bison) + +# Add a flex target named 'scanner' +macro(generic_flex name) + flex_target( + scanner + "${CMAKE_CURRENT_SOURCE_DIR}/scanner.l" + "${CMAKE_CURRENT_BINARY_DIR}/${name}_lex.yy.cpp" + COMPILE_FLAGS "-Pyy${name}" + ) +endmacro(generic_flex) + +# Set the public include locations for a target. +macro(generic_includes name) + target_include_directories(${name} + PUBLIC + ${CBMC_BINARY_DIR} + ${CBMC_SOURCE_DIR} + ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR} + ) +endmacro(generic_includes) + +# Link optional modules. +# Target is the name of the target with optional components. +# Name is the name of the optional target. +# Also adds a compile flag signalling to the preprocessor that the library is +# used. +macro(add_if_library target name) + if(TARGET ${name}) + target_link_libraries(${target} ${name}) + + string(TOUPPER ${name} upper_name) + string(REGEX REPLACE "-" "_" define ${upper_name}) + + target_compile_definitions(${target} PUBLIC HAVE_${define}) + endif() +endmacro(add_if_library) + +# EXTERNAL PROJECTS +include(ExternalProject) +set(extern_location ${CMAKE_CURRENT_BINARY_DIR}/extern) + +set(extern_include_directory ${extern_location}/include) +file(MAKE_DIRECTORY ${extern_include_directory}) + +################################################################################ + +set(minisat_lib ${extern_location}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}minisat2-condensed${CMAKE_STATIC_LIBRARY_SUFFIX}) + +# minisat download: This downloads minisat2, then patches it. Then, it +# injects a minimal CMakeLists.txt so that we can build just the bits we +# actually want, without having to update the provided makefile. + +ExternalProject_Add(minisat2-extern + PREFIX ${extern_location} + URL http://ftp.debian.org/debian/pool/main/m/minisat2/minisat2_2.2.1.orig.tar.gz + PATCH_COMMAND patch -p1 -i ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/minisat-2.2.1-patch + COMMAND cmake -E copy ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/minisat2_CMakeLists.txt CMakeLists.txt + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH= -DCBMC_INCLUDE_DIR:path=${CMAKE_CURRENT_SOURCE_DIR} + BUILD_BYPRODUCTS ${minisat_lib} +) + +add_library(minisat2-condensed STATIC IMPORTED) +set_target_properties(minisat2-condensed PROPERTIES + IMPORTED_LOCATION ${minisat_lib} + INTERFACE_INCLUDE_DIRECTORIES "${extern_include_directory}" +) +add_dependencies(minisat2-condensed minisat2-extern) + +################################################################################ + +set(glucose_lib ${extern_location}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}glucose-condensed${CMAKE_STATIC_LIBRARY_SUFFIX}) + +# glucose download: This downloads glucose, then patches it. Then, it +# injects a minimal CMakeLists.txt so that we can build just the bits we +# actually want, without having to update the provided makefile. + +ExternalProject_Add(glucose-extern + PREFIX ${extern_location} + URL http://www.labri.fr/perso/lsimon/downloads/softwares/glucose-syrup.tgz + PATCH_COMMAND patch -p1 -i ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/glucose-syrup-patch + COMMAND cmake -E copy ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/glucose_CMakeLists.txt CMakeLists.txt + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH= + BUILD_BYPRODUCTS ${glucose_lib} +) + +add_library(glucose-condensed STATIC IMPORTED) +set_target_properties(glucose-condensed PROPERTIES + IMPORTED_LOCATION ${glucose_lib} + INTERFACE_INCLUDE_DIRECTORIES "${extern_include_directory}" +) +add_dependencies(glucose-condensed glucose-extern) + +################################################################################ + +# Override add_executable to automatically sign the target on OSX. +function(add_executable name) + _add_executable(${name} ${ARGN}) + set_target_properties(${name} PROPERTIES XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY + "Developer ID Application: Daniel Kroening") +endfunction(add_executable) + +add_subdirectory(analyses) +add_subdirectory(ansi-c) +add_subdirectory(assembler) +add_subdirectory(big-int) +add_subdirectory(cpp) +add_subdirectory(goto-programs) +add_subdirectory(goto-symex) +add_subdirectory(jsil) +add_subdirectory(json) +add_subdirectory(langapi) +add_subdirectory(linking) +add_subdirectory(memory-models) +add_subdirectory(path-symex) +add_subdirectory(pointer-analysis) +add_subdirectory(solvers) +add_subdirectory(util) +add_subdirectory(xmllang) +add_subdirectory(java_bytecode) +add_subdirectory(miniz) +add_subdirectory(clobber) +add_subdirectory(cbmc) +add_subdirectory(goto-cc) +add_subdirectory(goto-instrument) +add_subdirectory(symex) +add_subdirectory(goto-analyzer) +add_subdirectory(goto-diff) diff --git a/src/Makefile b/src/Makefile index e90c402c819..c88fc51501d 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,6 +1,6 @@ DIRS = ansi-c big-int cbmc cpp goto-cc goto-instrument goto-programs \ goto-symex langapi pointer-analysis solvers util linking xmllang \ - assembler analyses java_bytecode path-symex musketeer \ + assembler analyses java_bytecode path-symex \ json goto-analyzer jsil symex goto-diff clobber \ memory-models miniz @@ -26,8 +26,6 @@ goto-instrument.dir: languages goto-programs.dir pointer-analysis.dir \ goto-symex.dir linking.dir analyses.dir solvers.dir \ json.dir -musketeer.dir: goto-instrument.dir - cbmc.dir: languages solvers.dir goto-symex.dir analyses.dir \ pointer-analysis.dir goto-programs.dir linking.dir \ goto-instrument.dir diff --git a/src/analyses/CMakeLists.txt b/src/analyses/CMakeLists.txt new file mode 100644 index 00000000000..70922ac2d71 --- /dev/null +++ b/src/analyses/CMakeLists.txt @@ -0,0 +1,7 @@ +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +add_library(analyses ${sources} ${headers}) + +generic_includes(analyses) + +target_link_libraries(analyses util pointer-analysis) diff --git a/src/analyses/call_graph.cpp b/src/analyses/call_graph.cpp index 91b8c3e6a15..cf8cc784e35 100644 --- a/src/analyses/call_graph.cpp +++ b/src/analyses/call_graph.cpp @@ -19,6 +19,11 @@ call_grapht::call_grapht() { } +call_grapht::call_grapht(const goto_modelt &goto_model): + call_grapht(goto_model.goto_functions) +{ +} + call_grapht::call_grapht(const goto_functionst &goto_functions) { forall_goto_functions(f_it, goto_functions) diff --git a/src/analyses/call_graph.h b/src/analyses/call_graph.h index f3e5b581883..667dbc5e8f3 100644 --- a/src/analyses/call_graph.h +++ b/src/analyses/call_graph.h @@ -17,12 +17,13 @@ Author: Daniel Kroening, kroening@kroening.com #include #include -#include +#include class call_grapht { public: call_grapht(); + explicit call_grapht(const goto_modelt &); explicit call_grapht(const goto_functionst &); void output_dot(std::ostream &out) const; diff --git a/src/analyses/constant_propagator.h b/src/analyses/constant_propagator.h index 0b54c79bdb8..0e2e65383a3 100644 --- a/src/analyses/constant_propagator.h +++ b/src/analyses/constant_propagator.h @@ -110,11 +110,11 @@ class constant_propagator_ait:public ait { public: constant_propagator_ait( - goto_functionst &goto_functions, - const namespacet &ns) + goto_modelt &goto_model) { - operator()(goto_functions, ns); - replace(goto_functions, ns); + const namespacet ns(goto_model.symbol_table); + operator()(goto_model.goto_functions, ns); + replace(goto_model.goto_functions, ns); } constant_propagator_ait( diff --git a/src/analyses/custom_bitvector_analysis.cpp b/src/analyses/custom_bitvector_analysis.cpp index a81a08e6e67..b241150d7ba 100644 --- a/src/analyses/custom_bitvector_analysis.cpp +++ b/src/analyses/custom_bitvector_analysis.cpp @@ -682,14 +682,13 @@ void custom_bitvector_analysist::instrument(goto_functionst &) } void custom_bitvector_analysist::check( - const namespacet &ns, - const goto_functionst &goto_functions, + const goto_modelt &goto_model, bool use_xml, std::ostream &out) { unsigned pass=0, fail=0, unknown=0; - forall_goto_functions(f_it, goto_functions) + forall_goto_functions(f_it, goto_model.goto_functions) { if(!f_it->second.body.has_assertion()) continue; @@ -715,6 +714,7 @@ void custom_bitvector_analysist::check( continue; exprt tmp=eval(i_it->guard, i_it); + const namespacet ns(goto_model.symbol_table); result=simplify_expr(tmp, ns); description=i_it->source_location.get_comment(); @@ -744,6 +744,7 @@ void custom_bitvector_analysist::check( if(!description.empty()) out << ", " << description; out << ": "; + const namespacet ns(goto_model.symbol_table); out << from_expr(ns, f_it->first, result); out << '\n'; } diff --git a/src/analyses/custom_bitvector_analysis.h b/src/analyses/custom_bitvector_analysis.h index 5ef03adbaf2..f0c298f84d6 100644 --- a/src/analyses/custom_bitvector_analysis.h +++ b/src/analyses/custom_bitvector_analysis.h @@ -128,8 +128,7 @@ class custom_bitvector_analysist:public ait public: void instrument(goto_functionst &); void check( - const namespacet &, - const goto_functionst &, + const goto_modelt &, bool xml, std::ostream &); exprt eval(const exprt &src, locationt loc) diff --git a/src/analyses/escape_analysis.cpp b/src/analyses/escape_analysis.cpp index a9b7c71db08..b0129dfd0a6 100644 --- a/src/analyses/escape_analysis.cpp +++ b/src/analyses/escape_analysis.cpp @@ -436,10 +436,11 @@ void escape_analysist::insert_cleanup( } void escape_analysist::instrument( - goto_functionst &goto_functions, - const namespacet &ns) + goto_modelt &goto_model) { - Forall_goto_functions(f_it, goto_functions) + const namespacet ns(goto_model.symbol_table); + + Forall_goto_functions(f_it, goto_model.goto_functions) { Forall_goto_program_instructions(i_it, f_it->second.body) { diff --git a/src/analyses/escape_analysis.h b/src/analyses/escape_analysis.h index 00f865b45e4..7a4c606e1d4 100644 --- a/src/analyses/escape_analysis.h +++ b/src/analyses/escape_analysis.h @@ -95,9 +95,7 @@ class escape_domaint:public ai_domain_baset class escape_analysist:public ait { public: - void instrument( - goto_functionst &, - const namespacet &); + void instrument(goto_modelt &); protected: virtual void initialize(const goto_functionst &_goto_functions) diff --git a/src/analyses/goto_rw.h b/src/analyses/goto_rw.h index 38bc4d2e61a..02f17a7af16 100644 --- a/src/analyses/goto_rw.h +++ b/src/analyses/goto_rw.h @@ -19,7 +19,7 @@ Date: April 2010 #include -#include +#include #define forall_rw_range_set_r_objects(it, rw_set) \ for(rw_range_sett::objectst::const_iterator it=(rw_set).get_r_set().begin(); \ @@ -30,15 +30,15 @@ Date: April 2010 it!=(rw_set).get_w_set().end(); ++it) class rw_range_sett; -class goto_functionst; +class goto_modelt; void goto_rw(goto_programt::const_targett target, rw_range_sett &rw_set); -void goto_rw(const goto_programt &goto_program, +void goto_rw(const goto_programt &, rw_range_sett &rw_set); -void goto_rw(const goto_functionst &goto_functions, +void goto_rw(const goto_functionst &, const irep_idt &function, rw_range_sett &rw_set); diff --git a/src/analyses/interval_analysis.cpp b/src/analyses/interval_analysis.cpp index c6d739c8bfd..f3c0247a9bb 100644 --- a/src/analyses/interval_analysis.cpp +++ b/src/analyses/interval_analysis.cpp @@ -76,14 +76,13 @@ void instrument_intervals( } } -void interval_analysis( - const namespacet &ns, - goto_functionst &goto_functions) +void interval_analysis(goto_modelt &goto_model) { ait interval_analysis; - interval_analysis(goto_functions, ns); + const namespacet ns(goto_model.symbol_table); + interval_analysis(goto_model.goto_functions, ns); - Forall_goto_functions(f_it, goto_functions) + Forall_goto_functions(f_it, goto_model.goto_functions) instrument_intervals(interval_analysis, f_it->second); } diff --git a/src/analyses/interval_analysis.h b/src/analyses/interval_analysis.h index 1c85fc9a193..1b1b7c07e79 100644 --- a/src/analyses/interval_analysis.h +++ b/src/analyses/interval_analysis.h @@ -12,11 +12,8 @@ Author: Daniel Kroening, kroening@kroening.com #ifndef CPROVER_ANALYSES_INTERVAL_ANALYSIS_H #define CPROVER_ANALYSES_INTERVAL_ANALYSIS_H -#include -#include +class goto_modelt; -void interval_analysis( - const namespacet &ns, - goto_functionst &goto_functions); +void interval_analysis(goto_modelt &); #endif // CPROVER_ANALYSES_INTERVAL_ANALYSIS_H diff --git a/src/analyses/is_threaded.h b/src/analyses/is_threaded.h index 5a3823b867e..c5cf48a559c 100644 --- a/src/analyses/is_threaded.h +++ b/src/analyses/is_threaded.h @@ -16,7 +16,7 @@ Date: October 2012 #include -#include +#include class is_threadedt { @@ -27,6 +27,12 @@ class is_threadedt compute(goto_functions); } + explicit is_threadedt( + const goto_modelt &goto_model) + { + compute(goto_model.goto_functions); + } + bool operator()(const goto_programt::const_targett t) const { return is_threaded_set.find(t)!=is_threaded_set.end(); diff --git a/src/analyses/natural_loops.cpp b/src/analyses/natural_loops.cpp index 7101613e417..00ece2cf213 100644 --- a/src/analyses/natural_loops.cpp +++ b/src/analyses/natural_loops.cpp @@ -13,9 +13,9 @@ Author: Georg Weissenbacher, georg@weissenbacher.name #include -void show_natural_loops(const goto_functionst &goto_functions) +void show_natural_loops(const goto_modelt &goto_model) { - forall_goto_functions(it, goto_functions) + forall_goto_functions(it, goto_model.goto_functions) { std::cout << "*** " << it->first << '\n'; diff --git a/src/analyses/natural_loops.h b/src/analyses/natural_loops.h index 9eb24ccc0ed..8fb41d7e1d2 100644 --- a/src/analyses/natural_loops.h +++ b/src/analyses/natural_loops.h @@ -16,8 +16,7 @@ Author: Georg Weissenbacher, georg@weissenbacher.name #include #include -#include -#include +#include #include "cfg_dominators.h" @@ -70,7 +69,7 @@ class natural_loopst: typedef natural_loops_templatet natural_loops_mutablet; -void show_natural_loops(const goto_functionst &goto_functions); +void show_natural_loops(const goto_modelt &); /// Finds all back-edges and computes the natural loops #ifdef DEBUG diff --git a/src/analyses/uncaught_exceptions_analysis.cpp b/src/analyses/uncaught_exceptions_analysis.cpp index 65baa49e082..dfd0d9a51ca 100644 --- a/src/analyses/uncaught_exceptions_analysis.cpp +++ b/src/analyses/uncaught_exceptions_analysis.cpp @@ -186,19 +186,24 @@ void uncaught_exceptions_analysist::collect_uncaught_exceptions( /// Prints the exceptions map that maps each method to the set of exceptions /// that may escape it void uncaught_exceptions_analysist::output( - const goto_functionst &goto_functions) + const goto_functionst &goto_functions) const { #ifdef DEBUG forall_goto_functions(it, goto_functions) { - if(exceptions_map[it->first].size()>0) + const auto fn=it->first; + const exceptions_mapt::const_iterator found=exceptions_map.find(fn); + // Functions like __CPROVER_assert and __CPROVER_assume are replaced by + // explicit GOTO instructions and will not show up in exceptions_map. + if(found==exceptions_map.end()) + continue; + + const auto &fs=found->second; + if(!fs.empty()) { std::cout << "Uncaught exceptions in function " << - it->first << ": " << std::endl; - INVARIANT( - exceptions_map.find(it->first)!=exceptions_map.end(), - "each function expected to be recorded in `exceptions_map`"); - for(auto exc_id : exceptions_map[it->first]) + fn << ": " << std::endl; + for(const auto exc_id : fs) std::cout << id2string(exc_id) << " "; std::cout << std::endl; } diff --git a/src/analyses/uncaught_exceptions_analysis.h b/src/analyses/uncaught_exceptions_analysis.h index a53998b4bd2..aef256afba0 100644 --- a/src/analyses/uncaught_exceptions_analysis.h +++ b/src/analyses/uncaught_exceptions_analysis.h @@ -64,7 +64,7 @@ class uncaught_exceptions_analysist const goto_functionst &, const namespacet &); - void output(const goto_functionst &); + void output(const goto_functionst &) const; void operator()( const goto_functionst &, diff --git a/src/ansi-c/CMakeLists.txt b/src/ansi-c/CMakeLists.txt new file mode 100644 index 00000000000..1e95d1e1e72 --- /dev/null +++ b/src/ansi-c/CMakeLists.txt @@ -0,0 +1,97 @@ +generic_bison(ansi_c) +generic_flex(ansi_c) + +add_executable(converter library/converter.cpp) + +add_custom_command(OUTPUT converter_input.txt + COMMAND cat ${CMAKE_CURRENT_SOURCE_DIR}/library/*.c > converter_input.txt +) + +add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/cprover_library.inc + COMMAND converter < converter_input.txt > ${CMAKE_CURRENT_BINARY_DIR}/cprover_library.inc + DEPENDS converter_input.txt +) + +add_executable(file_converter file_converter.cpp) + +function(make_inc name) + add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${name}.inc + COMMAND file_converter < ${CMAKE_CURRENT_SOURCE_DIR}/${name}.h > ${CMAKE_CURRENT_BINARY_DIR}/${name}.inc + ) +endfunction(make_inc) + +################################################################################ + +if(MINGW) + set(platform_unavail + ${CMAKE_CURRENT_SOURCE_DIR}/library/java.io.c + ${CMAKE_CURRENT_SOURCE_DIR}/library/err.c + ${CMAKE_CURRENT_SOURCE_DIR}/library/threads.c + ) +else() + set(platform_unavail + ${CMAKE_CURRENT_SOURCE_DIR}/library/java.io.c + ${CMAKE_CURRENT_SOURCE_DIR}/library/threads.c + ) +endif() + +file(GLOB library_check_sources "library/*.c") +list(REMOVE_ITEM library_check_sources ${platform_unavail}) + +add_custom_target(library_check + ${CMAKE_CURRENT_SOURCE_DIR}/library_check.sh ${library_check_sources} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} +) + +################################################################################ + +make_inc(arm_builtin_headers) +make_inc(clang_builtin_headers) +make_inc(cw_builtin_headers) +make_inc(gcc_builtin_headers_alpha) +make_inc(gcc_builtin_headers_arm) +make_inc(gcc_builtin_headers_generic) +make_inc(gcc_builtin_headers_ia32) +make_inc(gcc_builtin_headers_ia32-2) +make_inc(gcc_builtin_headers_ia32-3) +make_inc(gcc_builtin_headers_ia32-4) +make_inc(gcc_builtin_headers_math) +make_inc(gcc_builtin_headers_mem_string) +make_inc(gcc_builtin_headers_mips) +make_inc(gcc_builtin_headers_omp) +make_inc(gcc_builtin_headers_power) +make_inc(gcc_builtin_headers_tm) +make_inc(gcc_builtin_headers_ubsan) + +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +add_library(ansi-c + ${sources} + ${headers} + ${BISON_parser_OUTPUTS} + ${FLEX_scanner_OUTPUTS} + ${CMAKE_CURRENT_BINARY_DIR}/arm_builtin_headers.inc + ${CMAKE_CURRENT_BINARY_DIR}/clang_builtin_headers.inc + ${CMAKE_CURRENT_BINARY_DIR}/cprover_library.inc + ${CMAKE_CURRENT_BINARY_DIR}/cw_builtin_headers.inc + ${CMAKE_CURRENT_BINARY_DIR}/gcc_builtin_headers_alpha.inc + ${CMAKE_CURRENT_BINARY_DIR}/gcc_builtin_headers_arm.inc + ${CMAKE_CURRENT_BINARY_DIR}/gcc_builtin_headers_generic.inc + ${CMAKE_CURRENT_BINARY_DIR}/gcc_builtin_headers_ia32-2.inc + ${CMAKE_CURRENT_BINARY_DIR}/gcc_builtin_headers_ia32-3.inc + ${CMAKE_CURRENT_BINARY_DIR}/gcc_builtin_headers_ia32-4.inc + ${CMAKE_CURRENT_BINARY_DIR}/gcc_builtin_headers_ia32.inc + ${CMAKE_CURRENT_BINARY_DIR}/gcc_builtin_headers_math.inc + ${CMAKE_CURRENT_BINARY_DIR}/gcc_builtin_headers_mem_string.inc + ${CMAKE_CURRENT_BINARY_DIR}/gcc_builtin_headers_mips.inc + ${CMAKE_CURRENT_BINARY_DIR}/gcc_builtin_headers_omp.inc + ${CMAKE_CURRENT_BINARY_DIR}/gcc_builtin_headers_power.inc + ${CMAKE_CURRENT_BINARY_DIR}/gcc_builtin_headers_tm.inc + ${CMAKE_CURRENT_BINARY_DIR}/gcc_builtin_headers_ubsan.inc +) + +generic_includes(ansi-c) + +target_link_libraries(ansi-c util linking goto-programs assembler) + +add_dependencies(ansi-c library_check) diff --git a/src/ansi-c/Makefile b/src/ansi-c/Makefile index f251dc3910c..1cfc9b01385 100644 --- a/src/ansi-c/Makefile +++ b/src/ansi-c/Makefile @@ -14,7 +14,6 @@ SRC = anonymous_member.cpp \ c_nondet_symbol_factory.cpp \ c_preprocess.cpp \ c_qualifiers.cpp \ - c_sizeof.cpp \ c_storage_spec.cpp \ c_typecast.cpp \ c_typecheck_argc_argv.cpp \ @@ -93,20 +92,7 @@ else platform_unavail = library/java.io.c library/threads.c endif library_check: library/*.c - for f in $(filter-out $(platform_unavail), $^) ; do \ - echo "Checking $$f" ; \ - cp $$f __libcheck.c ; \ - perl -p -i -e 's/(__builtin_[^v])/s$$1/' __libcheck.c ; \ - perl -p -i -e 's/(__sync_)/s$$1/' __libcheck.c ; \ - perl -p -i -e 's/(__noop)/s$$1/' __libcheck.c ; \ - $(CC) -std=gnu99 -E -include library/cprover.h -D__CPROVER_bool=_Bool \ - -D__CPROVER_thread_local=__thread -DLIBRARY_CHECK -o __libcheck.i __libcheck.c ; \ - $(CC) -S -Wall -Werror -pedantic -Wextra -std=gnu99 __libcheck.i -o __libcheck.s \ - -Wno-unused-label ; \ - ec=$$? ; \ - $(RM) __libcheck.s __libcheck.i __libcheck.c ; \ - [ $$ec -eq 0 ] || exit $$ec ; \ - done + ./library_check.sh $(filter-out $(platform_unavail), $^) touch $@ cprover_library.inc: library/converter$(EXEEXT) library/*.c diff --git a/src/ansi-c/ansi_c_entry_point.cpp b/src/ansi-c/ansi_c_entry_point.cpp index af1f6c1cb51..fc25290079a 100644 --- a/src/ansi-c/ansi_c_entry_point.cpp +++ b/src/ansi-c/ansi_c_entry_point.cpp @@ -18,6 +18,7 @@ Author: Daniel Kroening, kroening@kroening.com #include #include #include +#include #include #include @@ -120,7 +121,6 @@ void record_function_outputs( bool ansi_c_entry_point( symbol_tablet &symbol_table, - const std::string &standard_main, message_handlert &message_handler) { // check if entry point is already there @@ -167,7 +167,7 @@ bool ansi_c_entry_point( main_symbol=matches.front(); } else - main_symbol=standard_main; + main_symbol=ID_main; // look it up symbol_tablet::symbolst::const_iterator s_it= @@ -190,6 +190,23 @@ bool ansi_c_entry_point( if(static_lifetime_init(symbol_table, symbol.location, message_handler)) return true; + return generate_ansi_c_start_function(symbol, symbol_table, message_handler); +} + + +/// Generate a _start function for a specific function +/// \param symbol: The symbol for the function that should be +/// used as the entry point +/// \param symbol_table: The symbol table for the program. The new _start +/// function symbol will be added to this table +/// \param message_handler: The message handler +/// \return Returns false if the _start method was generated correctly +bool generate_ansi_c_start_function( + const symbolt &symbol, + symbol_tablet &symbol_table, + message_handlert &message_handler) +{ + PRECONDITION(!symbol.value.is_nil()); code_blockt init_code; // build call to initialization function @@ -237,7 +254,7 @@ bool ansi_c_entry_point( const code_typet::parameterst ¶meters= to_code_type(symbol.type).parameters(); - if(symbol.name==standard_main) + if(symbol.name==ID_main) { if(parameters.empty()) { diff --git a/src/ansi-c/ansi_c_entry_point.h b/src/ansi-c/ansi_c_entry_point.h index 835dd31845d..fe0ed04a2c1 100644 --- a/src/ansi-c/ansi_c_entry_point.h +++ b/src/ansi-c/ansi_c_entry_point.h @@ -15,7 +15,11 @@ Author: Daniel Kroening, kroening@kroening.com bool ansi_c_entry_point( symbol_tablet &symbol_table, - const std::string &standard_main, + message_handlert &message_handler); + +bool generate_ansi_c_start_function( + const symbolt &symbol, + symbol_tablet &symbol_table, message_handlert &message_handler); #endif // CPROVER_ANSI_C_ANSI_C_ENTRY_POINT_H diff --git a/src/ansi-c/ansi_c_language.cpp b/src/ansi-c/ansi_c_language.cpp index b262b46d7d5..5e9675381de 100644 --- a/src/ansi-c/ansi_c_language.cpp +++ b/src/ansi-c/ansi_c_language.cpp @@ -37,6 +37,22 @@ void ansi_c_languaget::modules_provided(std::set &modules) modules.insert(get_base_name(parse_path, true)); } +/// Generate a _start function for a specific function +/// \param entry_function_symbol_id: The symbol for the function that should be +/// used as the entry point +/// \param symbol_table: The symbol table for the program. The new _start +/// function symbol will be added to this table +/// \return Returns false if the _start method was generated correctly +bool ansi_c_languaget::generate_start_function( + const irep_idt &entry_function_symbol_id, + symbol_tablet &symbol_table) +{ + return generate_ansi_c_start_function( + symbol_table.symbols.at(entry_function_symbol_id), + symbol_table, + *message_handler); +} + /// ANSI-C preprocessing bool ansi_c_languaget::preprocess( std::istream &instream, @@ -127,13 +143,13 @@ bool ansi_c_languaget::typecheck( bool ansi_c_languaget::final( symbol_tablet &symbol_table, - bool generate_start_function) + bool create_start_function) { generate_opaque_method_stubs(symbol_table); - if(generate_start_function) + if(create_start_function) { - if(ansi_c_entry_point(symbol_table, "main", get_message_handler())) + if(ansi_c_entry_point(symbol_table, get_message_handler())) return true; } diff --git a/src/ansi-c/ansi_c_language.h b/src/ansi-c/ansi_c_language.h index a06cf4d3645..d6a7c5d4ac0 100644 --- a/src/ansi-c/ansi_c_language.h +++ b/src/ansi-c/ansi_c_language.h @@ -37,7 +37,7 @@ class ansi_c_languaget:public languaget bool final( symbol_tablet &symbol_table, - bool generate_start_function) override; + bool create_start_function) override; void show_parse(std::ostream &out) override; @@ -77,6 +77,10 @@ class ansi_c_languaget:public languaget void modules_provided(std::set &modules) override; + virtual bool generate_start_function( + const irep_idt &entry_function_symbol_id, + class symbol_tablet &symbol_table) override; + protected: ansi_c_parse_treet parse_tree; std::string parse_path; diff --git a/src/ansi-c/c_sizeof.cpp b/src/ansi-c/c_sizeof.cpp deleted file mode 100644 index fad6d00ce9f..00000000000 --- a/src/ansi-c/c_sizeof.cpp +++ /dev/null @@ -1,320 +0,0 @@ -/*******************************************************************\ - -Module: Conversion of sizeof Expressions - -Author: Daniel Kroening, kroening@kroening.com - -\*******************************************************************/ - -/// \file -/// Conversion of sizeof Expressions - -#include "c_sizeof.h" - -#include -#include -#include -#include -#include - -#include "c_typecast.h" - -exprt c_sizeoft::sizeof_rec(const typet &type) -{ - // this implementation will eventually be replaced - // by size_of_expr in util/pointer_offset_size.h - exprt dest; - - if(type.id()==ID_signedbv || - type.id()==ID_unsignedbv || - type.id()==ID_floatbv || - type.id()==ID_fixedbv || - type.id()==ID_c_bool) - { - // We round up to bytes. - // See special treatment for bit-fields below. - std::size_t bits=to_bitvector_type(type).get_width(); - std::size_t bytes=bits/8; - if((bits%8)!=0) - bytes++; - dest=from_integer(bytes, size_type()); - } - else if(type.id()==ID_incomplete_c_enum) - { - // refuse to give a size - return nil_exprt(); - } - else if(type.id()==ID_c_enum) - { - // check the subtype - dest=sizeof_rec(type.subtype()); - } - else if(type.id()==ID_c_enum_tag) - { - // follow the tag - dest=sizeof_rec(ns.follow_tag(to_c_enum_tag_type(type))); - } - else if(type.id()==ID_pointer) - { - // the following is an MS extension - if(type.get_bool(ID_C_ptr32)) - return from_integer(4, size_type()); - - std::size_t bits=config.ansi_c.pointer_width; - std::size_t bytes=bits/8; - if((bits%8)!=0) - bytes++; - dest=from_integer(bytes, size_type()); - } - else if(type.id()==ID_bool) - { - // We fit booleans into a byte. - // Don't confuse with c_bool, which is a bit-vector type. - dest=from_integer(1, size_type()); - } - else if(type.id()==ID_array) - { - const exprt &size_expr= - to_array_type(type).size(); - - if(size_expr.is_nil()) - { - // treated like an empty array - dest=from_integer(0, size_type()); - } - else - { - exprt tmp_dest=sizeof_rec(type.subtype()); - - if(tmp_dest.is_nil()) - return tmp_dest; - - mp_integer a, b; - - if(!to_integer(tmp_dest, a) && - !to_integer(size_expr, b)) - { - dest=from_integer(a*b, size_type()); - } - else - { - dest.id(ID_mult); - dest.type()=size_type(); - dest.copy_to_operands(size_expr); - dest.move_to_operands(tmp_dest); - c_implicit_typecast(dest.op0(), dest.type(), ns); - c_implicit_typecast(dest.op1(), dest.type(), ns); - } - } - } - else if(type.id()==ID_struct) - { - const struct_typet::componentst &components= - to_struct_type(type).components(); - - dest=from_integer(0, size_type()); - - mp_integer bit_field_width=0; - - for(const auto &comp : components) - { - const typet &sub_type=ns.follow(comp.type()); - - if(comp.get_bool(ID_is_type)) - { - } - else if(sub_type.id()==ID_code) - { - } - else if(sub_type.id()==ID_c_bit_field) - { - // We just sum them up. - // This assumes they are properly padded. - bit_field_width+=to_c_bit_field_type(sub_type).get_width(); - } - else - { - exprt tmp=sizeof_rec(sub_type); - - if(tmp.is_nil()) - return tmp; - - dest=plus_exprt(dest, tmp); - } - } - - if(bit_field_width!=0) - dest=plus_exprt(dest, from_integer(bit_field_width/8, size_type())); - } - else if(type.id()==ID_union) - { - // the empty union will have size 0 - exprt max_size=from_integer(0, size_type()); - - const union_typet::componentst &components= - to_union_type(type).components(); - - for(const auto &comp : components) - { - if(comp.get_bool(ID_is_type) || comp.type().id()==ID_code) - continue; - - const typet &sub_type=comp.type(); - - exprt tmp; - - if(sub_type.id()==ID_c_bit_field) - { - std::size_t width=to_c_bit_field_type(sub_type).get_width(); - tmp= - from_integer(width/8, size_type()); - } - else - { - tmp=sizeof_rec(sub_type); - - if(tmp.is_nil()) - return nil_exprt(); - } - - max_size=if_exprt( - binary_relation_exprt(max_size, ID_lt, tmp), - tmp, max_size); - - simplify(max_size, ns); - } - - dest=max_size; - } - else if(type.id()==ID_symbol) - { - return sizeof_rec(ns.follow(type)); - } - else if(type.id()==ID_empty) - { - // gcc says that sizeof(void)==1, ISO C doesn't - dest=from_integer(1, size_type()); - } - else if(type.id()==ID_vector) - { - // simply multiply - const exprt &size_expr= - to_vector_type(type).size(); - - exprt tmp_dest=sizeof_rec(type.subtype()); - - if(tmp_dest.is_nil()) - return tmp_dest; - - mp_integer a, b; - - if(!to_integer(tmp_dest, a) && - !to_integer(size_expr, b)) - { - dest=from_integer(a*b, size_type()); - } - else - { - dest.id(ID_mult); - dest.type()=size_type(); - dest.copy_to_operands(size_expr); - dest.move_to_operands(tmp_dest); - c_implicit_typecast(dest.op0(), dest.type(), ns); - c_implicit_typecast(dest.op1(), dest.type(), ns); - } - } - else if(type.id()==ID_complex) - { - // this is a pair - - exprt tmp_dest=sizeof_rec(type.subtype()); - - if(tmp_dest.is_nil()) - return tmp_dest; - - mp_integer a; - - if(!to_integer(tmp_dest, a)) - dest=from_integer(a*2, size_type()); - else - return nil_exprt(); - } - else - { - // We give up; this shouldn't really happen on 'proper' C types, - // but we do have some artificial ones that simply have no - // meaningful size. - dest.make_nil(); - } - - return dest; -} - -exprt c_sizeoft::c_offsetof( - const struct_typet &type, - const irep_idt &component_name) -{ - const struct_typet::componentst &components= - type.components(); - - exprt dest=from_integer(0, size_type()); - - mp_integer bit_field_width=0; - - for(const auto &comp : components) - { - if(comp.get_name()==component_name) - { - // done - if(bit_field_width!=0) - dest=plus_exprt(dest, from_integer(bit_field_width/8, size_type())); - return dest; - } - - if(comp.get_bool(ID_is_type)) - continue; - - const typet &sub_type=ns.follow(comp.type()); - - if(sub_type.id()==ID_code) - { - } - else if(sub_type.id()==ID_c_bit_field) - { - // We just sum them up. - // This assumes they are properly padded. - bit_field_width+=to_c_bit_field_type(sub_type).get_width(); - } - else - { - exprt tmp=sizeof_rec(sub_type); - - if(tmp.is_nil()) - return tmp; - - exprt sum=plus_exprt(dest, tmp); - dest=sum; - } - } - - return nil_exprt(); -} - -exprt c_sizeof(const typet &src, const namespacet &ns) -{ - c_sizeoft c_sizeof_inst(ns); - exprt tmp=c_sizeof_inst(src); - simplify(tmp, ns); - return tmp; -} - -exprt c_offsetof( - const struct_typet &src, - const irep_idt &component_name, - const namespacet &ns) -{ - c_sizeoft c_sizeof_inst(ns); - exprt tmp=c_sizeof_inst.c_offsetof(src, component_name); - simplify(tmp, ns); - return tmp; -} diff --git a/src/ansi-c/c_sizeof.h b/src/ansi-c/c_sizeof.h deleted file mode 100644 index de5421c0510..00000000000 --- a/src/ansi-c/c_sizeof.h +++ /dev/null @@ -1,51 +0,0 @@ -/*******************************************************************\ - -Module: - -Author: Daniel Kroening, kroening@kroening.com - -\*******************************************************************/ - - -#ifndef CPROVER_ANSI_C_C_SIZEOF_H -#define CPROVER_ANSI_C_C_SIZEOF_H - -#include -#include - -class c_sizeoft -{ -public: - explicit c_sizeoft(const namespacet &_ns):ns(_ns) - { - } - - virtual ~c_sizeoft() - { - } - - exprt operator()(const typet &type) - { - return sizeof_rec(type); - } - - exprt c_offsetof( - const struct_typet &type, - const irep_idt &component_name); - -protected: - const namespacet &ns; - - virtual exprt sizeof_rec(const typet &type); -}; - -exprt c_sizeof( - const typet &src, - const namespacet &ns); - -exprt c_offsetof( - const struct_typet &src, - const irep_idt &component_name, - const namespacet &ns); - -#endif // CPROVER_ANSI_C_C_SIZEOF_H diff --git a/src/ansi-c/c_typecast.cpp b/src/ansi-c/c_typecast.cpp index edf95e5379e..0be52dae81c 100644 --- a/src/ansi-c/c_typecast.cpp +++ b/src/ansi-c/c_typecast.cpp @@ -372,8 +372,7 @@ void c_typecastt::implicit_typecast_arithmetic( case PTR: if(expr_type.id()==ID_array) { - new_type.id(ID_pointer); - new_type.subtype()=expr_type.subtype(); + new_type=pointer_type(expr_type.subtype()); break; } return; diff --git a/src/ansi-c/c_typecheck_base.cpp b/src/ansi-c/c_typecheck_base.cpp index 0d18016602d..b0a8f1734c3 100644 --- a/src/ansi-c/c_typecheck_base.cpp +++ b/src/ansi-c/c_typecheck_base.cpp @@ -11,6 +11,7 @@ Author: Daniel Kroening, kroening@kroening.com #include "c_typecheck_base.h" +#include #include #include #include @@ -256,6 +257,16 @@ void c_typecheck_baset::typecheck_redefinition_non_type( // this is ok, just use old type new_symbol.type=old_symbol.type; } + else if(final_old.id()==ID_array && + to_array_type(final_old).size().is_nil() && + initial_new.id()==ID_array && + to_array_type(initial_new).size().is_not_nil() && + final_old.subtype()==initial_new.subtype()) + { + // update the type to enable the use of sizeof(x) on the + // right-hand side of a definition of x + old_symbol.type=new_symbol.type; + } // do initializer, this may change the type if(follow(new_symbol.type).id()!=ID_code && @@ -386,36 +397,14 @@ void c_typecheck_baset::typecheck_redefinition_non_type( if(final_old!=final_new) { if(final_old.id()==ID_array && - to_array_type(final_old).size().is_nil() && - final_new.id()==ID_array && - to_array_type(final_new).size().is_not_nil() && - final_old.subtype()==final_new.subtype()) + to_array_type(final_old).size().is_nil() && + final_new.id()==ID_array && + to_array_type(final_new).size().is_not_nil() && + final_old.subtype()==final_new.subtype()) { - // this is also ok - if(old_symbol.type.id()==ID_symbol) - { - // fix the symbol, not just the type - const irep_idt identifier= - to_symbol_type(old_symbol.type).get_identifier(); - - symbol_tablet::symbolst::iterator s_it= - symbol_table.symbols.find(identifier); - - if(s_it==symbol_table.symbols.end()) - { - error().source_location=old_symbol.location; - error() << "typecheck_redefinition_non_type: " - << "failed to find symbol `" << identifier << "'" - << eom; - throw 0; - } - - symbolt &symbol=s_it->second; - - symbol.type=final_new; - } - else - old_symbol.type=new_symbol.type; + // we don't do symbol types for arrays anymore + PRECONDITION(old_symbol.type.id()!=ID_symbol); + old_symbol.type=new_symbol.type; } else if((final_old.id()==ID_incomplete_c_enum || final_old.id()==ID_c_enum) && diff --git a/src/ansi-c/c_typecheck_expr.cpp b/src/ansi-c/c_typecheck_expr.cpp index 54eab363d7b..59c684de00b 100644 --- a/src/ansi-c/c_typecheck_expr.cpp +++ b/src/ansi-c/c_typecheck_expr.cpp @@ -26,7 +26,6 @@ Author: Daniel Kroening, kroening@kroening.com #include #include "c_typecast.h" -#include "c_sizeof.h" #include "c_qualifiers.h" #include "string_constant.h" #include "anonymous_member.h" @@ -556,7 +555,9 @@ void c_typecheck_baset::typecheck_expr_builtin_offsetof(exprt &expr) if(type.id()==ID_struct) { - exprt o=c_offsetof(to_struct_type(type), component_name, *this); + exprt o= + member_offset_expr( + to_struct_type(type), component_name, *this); if(o.is_nil()) { @@ -597,7 +598,8 @@ void c_typecheck_baset::typecheck_expr_builtin_offsetof(exprt &expr) if(type.id()==ID_struct) { exprt o= - c_offsetof(to_struct_type(type), c_it->get_name(), *this); + member_offset_expr( + to_struct_type(type), c_it->get_name(), *this); if(o.is_nil()) { @@ -649,7 +651,7 @@ void c_typecheck_baset::typecheck_expr_builtin_offsetof(exprt &expr) // still need to typecheck index typecheck_expr(index); - exprt sub_size=c_sizeof(type.subtype(), *this); + exprt sub_size=size_of_expr(type.subtype(), *this); if(index.type()!=size_type()) index.make_typecast(size_type()); result=plus_exprt(result, mult_exprt(sub_size, index)); @@ -946,7 +948,13 @@ void c_typecheck_baset::typecheck_expr_sizeof(exprt &expr) throw 0; } - exprt new_expr=c_sizeof(type, *this); + if(type.id()==ID_empty && + expr.operands().size()==1 && + expr.op0().id()==ID_dereference && + expr.op0().op0().type()==pointer_type(void_type())) + type=char_type(); + + exprt new_expr=size_of_expr(type, *this); if(new_expr.is_nil()) { @@ -1092,7 +1100,14 @@ void c_typecheck_baset::typecheck_expr_typecast(exprt &expr) // or an expression for a pointer or scalar. // We produce a compound_literal expression. exprt tmp(ID_compound_literal, expr.type()); - tmp.move_to_operands(op); + tmp.copy_to_operands(op); + + // handle the case of TYPE being an array with unspecified size + if(op.id()==ID_array && + expr.type().id()==ID_array && + to_array_type(expr.type()).size().is_nil()) + tmp.type()=op.type(); + expr=tmp; expr.set(ID_C_lvalue, true); // these are l-values return; @@ -1579,8 +1594,7 @@ void c_typecheck_baset::typecheck_expr_trinary(if_exprt &expr) { // Make it void *. // gcc and clang issue a warning for this. - expr.type()=typet(ID_pointer); - expr.type().subtype()=typet(ID_empty); + expr.type()=pointer_type(empty_typet()); implicit_typecast(operands[1], expr.type()); implicit_typecast(operands[2], expr.type()); } diff --git a/src/ansi-c/c_typecheck_type.cpp b/src/ansi-c/c_typecheck_type.cpp index 1a3998de19d..88ca770c4bf 100644 --- a/src/ansi-c/c_typecheck_type.cpp +++ b/src/ansi-c/c_typecheck_type.cpp @@ -21,7 +21,6 @@ Author: Daniel Kroening, kroening@kroening.com #include #include -#include "c_sizeof.h" #include "c_qualifiers.h" #include "ansi_c_declaration.h" #include "padding.h" @@ -661,7 +660,7 @@ void c_typecheck_baset::typecheck_vector_type(vector_typet &type) } // the subtype must have constant size - exprt size_expr=c_sizeof(type.subtype(), *this); + exprt size_expr=size_of_expr(type.subtype(), *this); simplify(size_expr, *this); @@ -1493,7 +1492,7 @@ void c_typecheck_baset::adjust_function_parameter(typet &type) const { if(type.id()==ID_array) { - type.id(ID_pointer); + type=pointer_type(type.subtype()); type.remove(ID_size); type.remove(ID_C_constant); } diff --git a/src/ansi-c/library/pthread_lib.c b/src/ansi-c/library/pthread_lib.c index 71af169c91b..97194052a54 100644 --- a/src/ansi-c/library/pthread_lib.c +++ b/src/ansi-c/library/pthread_lib.c @@ -523,10 +523,10 @@ extern __CPROVER_thread_local unsigned long __CPROVER_thread_id; extern unsigned long __CPROVER_next_thread_id; inline int pthread_create( - pthread_t *thread, - const pthread_attr_t *attr, - void * (*start_routine)(void *), - void *arg) + pthread_t *thread, // must not be null + const pthread_attr_t *attr, // may be null + void * (*start_routine)(void *), // must not be null + void *arg) // may be null { __CPROVER_HIDE:; unsigned long this_thread_id; @@ -534,11 +534,8 @@ inline int pthread_create( this_thread_id=++__CPROVER_next_thread_id; __CPROVER_atomic_end(); - if(thread) - { - // pthread_t is a pointer type on some systems - *thread=(pthread_t)this_thread_id; - } + // pthread_t is a pointer type on some systems + *thread=(pthread_t)this_thread_id; #ifdef __CPROVER_CUSTOM_BITVECTOR_ANALYSIS __CPROVER_set_must(thread, "pthread-id"); diff --git a/src/ansi-c/library/string.c b/src/ansi-c/library/string.c index 35cf46f7f66..0dabca6ebc5 100644 --- a/src/ansi-c/library/string.c +++ b/src/ansi-c/library/string.c @@ -298,12 +298,6 @@ inline char *strncat(char *dst, const char *src, size_t n) inline int strcmp(const char *s1, const char *s2) { __CPROVER_HIDE:; - #if !defined(__linux__) || defined(__GLIBC__) - if(s1!=0 && s1==s2) return 0; - #else - // musl guarantees non-null of s1 - if(s1==s2) return 0; - #endif #ifdef __CPROVER_STRING_ABSTRACTION int retval; __CPROVER_assert(__CPROVER_is_zero_string(s1), "strcmp zero-termination of 1st argument"); @@ -345,12 +339,6 @@ inline int strcmp(const char *s1, const char *s2) inline int strcasecmp(const char *s1, const char *s2) { __CPROVER_HIDE:; - #if !defined(__linux__) || defined(__GLIBC__) - if(s1!=0 && s1==s2) return 0; - #else - // musl guarantees non-null of s1 - if(s1==s2) return 0; - #endif #ifdef __CPROVER_STRING_ABSTRACTION int retval; __CPROVER_assert(__CPROVER_is_zero_string(s1), "strcasecmp zero-termination of 1st argument"); @@ -395,12 +383,6 @@ inline int strcasecmp(const char *s1, const char *s2) inline int strncmp(const char *s1, const char *s2, size_t n) { __CPROVER_HIDE:; - #if !defined(__linux__) || defined(__GLIBC__) - if(s1!=0 && s1==s2) return 0; - #else - // musl guarantees non-null of s1 - if(s1==s2) return 0; - #endif #ifdef __CPROVER_STRING_ABSTRACTION __CPROVER_assert(__CPROVER_is_zero_string(s1) || __CPROVER_buffer_size(s1)>=n, "strncmp zero-termination of 1st argument"); __CPROVER_assert(__CPROVER_is_zero_string(s2) || __CPROVER_buffer_size(s2)>=n, "strncmp zero-termination of 2nd argument"); @@ -439,12 +421,6 @@ inline int strncmp(const char *s1, const char *s2, size_t n) inline int strncasecmp(const char *s1, const char *s2, size_t n) { __CPROVER_HIDE:; - #if !defined(__linux__) || defined(__GLIBC__) - if(s1!=0 && s1==s2) return 0; - #else - // musl guarantees non-null of s1 - if(s1==s2) return 0; - #endif #ifdef __CPROVER_STRING_ABSTRACTION int retval; __CPROVER_assert(__CPROVER_is_zero_string(s1), "strncasecmp zero-termination of 1st argument"); diff --git a/src/ansi-c/library_check.sh b/src/ansi-c/library_check.sh new file mode 100755 index 00000000000..c65dcd8919e --- /dev/null +++ b/src/ansi-c/library_check.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +for f in "$@"; do + echo "Checking ${f}" + cp "${f}" __libcheck.c + perl -p -i -e 's/(__builtin_[^v])/s$1/' __libcheck.c + perl -p -i -e 's/(__sync_)/s$1/' __libcheck.c + perl -p -i -e 's/(__noop)/s$1/' __libcheck.c + cc -std=gnu99 -E -include library/cprover.h -D__CPROVER_bool=_Bool -D__CPROVER_thread_local=__thread -DLIBRARY_CHECK -o __libcheck.i __libcheck.c + cc -S -Wall -Werror -pedantic -Wextra -std=gnu99 __libcheck.i -o __libcheck.s -Wno-unused-label + ec="${?}" + rm __libcheck.s __libcheck.i __libcheck.c + [ "${ec}" -eq 0 ] || exit "${ec}" +done diff --git a/src/ansi-c/parser.y b/src/ansi-c/parser.y index bddccced310..ba7ab7a0bb1 100644 --- a/src/ansi-c/parser.y +++ b/src/ansi-c/parser.y @@ -3065,8 +3065,7 @@ unary_identifier_declarator: { // the type_qualifier_list is for the pointer, // and not the identifier_declarator - stack_type($1).id(ID_pointer); - stack_type($1).subtype()=typet(ID_abstract); + stack_type($1)=pointer_type(typet(ID_abstract)); $2=merge($2, $1); // dest=$2 make_subtype($3, $2); // dest=$3 $$=$3; @@ -3250,15 +3249,13 @@ unary_abstract_declarator: '*' { $$=$1; - set($$, ID_pointer); - stack_type($$).subtype()=typet(ID_abstract); + stack_type($$)=pointer_type(typet(ID_abstract)); } | '*' attribute_type_qualifier_list { // The type_qualifier_list belongs to the pointer, // not to the (missing) abstract declarator. - set($1, ID_pointer); - stack_type($1).subtype()=typet(ID_abstract); + stack_type($1)=pointer_type(typet(ID_abstract)); $$=merge($2, $1); } | '*' abstract_declarator @@ -3270,8 +3267,7 @@ unary_abstract_declarator: { // The type_qualifier_list belongs to the pointer, // not to the abstract declarator. - stack_type($1).id(ID_pointer); - stack_type($1).subtype()=typet(ID_abstract); + stack_type($1)=pointer_type(typet(ID_abstract)); $2=merge($2, $1); // dest=$2 make_subtype($3, $2); // dest=$3 $$=$3; @@ -3290,15 +3286,13 @@ parameter_unary_abstract_declarator: '*' { $$=$1; - set($$, ID_pointer); - stack_type($$).subtype()=typet(ID_abstract); + stack_type($$)=pointer_type(typet(ID_abstract)); } | '*' attribute_type_qualifier_list { // The type_qualifier_list belongs to the pointer, // not to the (missing) abstract declarator. - set($1, ID_pointer); - stack_type($1).subtype()=typet(ID_abstract); + stack_type($1)=pointer_type(typet(ID_abstract)); $$=merge($2, $1); } | '*' parameter_abstract_declarator @@ -3310,8 +3304,7 @@ parameter_unary_abstract_declarator: { // The type_qualifier_list belongs to the pointer, // not to the (missing) abstract declarator. - stack($1).id(ID_pointer); - stack_type($1).subtype()=typet(ID_abstract); + stack_type($1)=pointer_type(typet(ID_abstract)); $2=merge($2, $1); // dest=$2 make_subtype($3, $2); // dest=$3 $$=$3; diff --git a/src/ansi-c/parser_static.inc b/src/ansi-c/parser_static.inc index e0c8385998d..6f0b3f41b1d 100644 --- a/src/ansi-c/parser_static.inc +++ b/src/ansi-c/parser_static.inc @@ -290,8 +290,7 @@ Function: make_pointer static void make_pointer(const YYSTYPE dest) { - set(dest, ID_pointer); - stack_type(dest).subtype()=typet(ID_abstract); + stack_type(dest)=pointer_type(typet(ID_abstract)); } /*******************************************************************\ diff --git a/src/assembler/CMakeLists.txt b/src/assembler/CMakeLists.txt new file mode 100644 index 00000000000..991bcb8fbf6 --- /dev/null +++ b/src/assembler/CMakeLists.txt @@ -0,0 +1,13 @@ +generic_flex(assembler) + +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +add_library(assembler + ${sources} + ${headers} + ${FLEX_scanner_OUTPUTS} +) + +generic_includes(assembler) + +target_link_libraries(assembler util) diff --git a/src/big-int/CMakeLists.txt b/src/big-int/CMakeLists.txt new file mode 100644 index 00000000000..865a8d5edb4 --- /dev/null +++ b/src/big-int/CMakeLists.txt @@ -0,0 +1,6 @@ +set(SRC bigint-func.cc bigint.cc) + +add_executable(test-bigint ${SRC} bigint-test.cc) +add_library(big-int ${SRC}) + +generic_includes(big-int) diff --git a/src/cbmc/CMakeLists.txt b/src/cbmc/CMakeLists.txt new file mode 100644 index 00000000000..6777249c8d9 --- /dev/null +++ b/src/cbmc/CMakeLists.txt @@ -0,0 +1,39 @@ +# Library +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +list(REMOVE_ITEM sources + ${CMAKE_CURRENT_SOURCE_DIR}/cbmc_main.cpp +) +add_library(cbmc-lib ${sources} ${headers}) + +generic_includes(cbmc-lib) + +target_link_libraries(cbmc-lib + ansi-c + cpp + linking + big-int + goto-programs + goto-symex + pointer-analysis + goto-instrument-lib + analyses + langapi + xml + assembler + solvers + util + json +) + +add_if_library(cbmc-lib bv_refinement) +add_if_library(cbmc-lib java_bytecode) +add_if_library(cbmc-lib jsil) +add_if_library(cbmc-lib specc) +add_if_library(cbmc-lib php) + +# Executable +add_executable(cbmc cbmc_main.cpp) +target_link_libraries(cbmc cbmc-lib) + +install(TARGETS cbmc DESTINATION bin) diff --git a/src/cbmc/bmc.h b/src/cbmc/bmc.h index 4c69fab527c..c1896935460 100644 --- a/src/cbmc/bmc.h +++ b/src/cbmc/bmc.h @@ -16,6 +16,7 @@ Author: Daniel Kroening, kroening@kroening.com #include #include +#include #include #include @@ -23,7 +24,7 @@ Author: Daniel Kroening, kroening@kroening.com #include #include #include -#include + #include #include @@ -56,7 +57,7 @@ class bmct:public safety_checkert // additional stuff expr_listt bmc_constraints; - void set_ui(language_uit::uit _ui) { ui=_ui; } + void set_ui(ui_message_handlert::uit _ui) { ui=_ui; } // the safety_checkert interface virtual resultt operator()( @@ -74,7 +75,7 @@ class bmct:public safety_checkert prop_convt &prop_conv; // use gui format - language_uit::uit ui; + ui_message_handlert::uit ui; virtual decision_proceduret::resultt run_decision_procedure(prop_convt &prop_conv); diff --git a/src/cbmc/cbmc_parse_options.cpp b/src/cbmc/cbmc_parse_options.cpp index ed6f3f081a2..265759fc698 100644 --- a/src/cbmc/cbmc_parse_options.cpp +++ b/src/cbmc/cbmc_parse_options.cpp @@ -25,7 +25,14 @@ Author: Daniel Kroening, kroening@kroening.com #include +#include +#include #include +#include +#include +#include +#include +#include #include #include #include @@ -35,20 +42,16 @@ Author: Daniel Kroening, kroening@kroening.com #include #include #include +#include #include -#include -#include -#include +#include #include -#include +#include +#include +#include #include #include -#include -#include -#include -#include -#include -#include +#include #include #include @@ -71,7 +74,7 @@ Author: Daniel Kroening, kroening@kroening.com cbmc_parse_optionst::cbmc_parse_optionst(int argc, const char **argv): parse_options_baset(CBMC_OPTIONS, argc, argv), xml_interfacet(cmdline), - language_uit(cmdline, ui_message_handler), + messaget(ui_message_handler), ui_message_handler(cmdline, "CBMC " CBMC_VERSION) { } @@ -82,7 +85,7 @@ ::cbmc_parse_optionst::cbmc_parse_optionst( const std::string &extra_options): parse_options_baset(CBMC_OPTIONS+extra_options, argc, argv), xml_interfacet(cmdline), - language_uit(cmdline, ui_message_handler), + messaget(ui_message_handler), ui_message_handler(cmdline, "CBMC " CBMC_VERSION) { } @@ -470,7 +473,7 @@ int cbmc_parse_optionst::doit() register_languages(); if(cmdline.isset("test-preprocessor")) - return test_c_preprocessor(ui_message_handler)?8:0; + return test_c_preprocessor(get_message_handler())?8:0; if(cmdline.isset("preprocess")) { @@ -478,12 +481,56 @@ int cbmc_parse_optionst::doit() return 0; // should contemplate EX_OK from sysexits.h } - goto_functionst goto_functions; + if(cmdline.isset("show-parse-tree")) + { + if(cmdline.args.size()!=1 || + is_goto_binary(cmdline.args[0])) + { + error() << "Please give exactly one source file" << eom; + return 6; + } + + std::string filename=cmdline.args[0]; + + #ifdef _MSC_VER + std::ifstream infile(widen(filename)); + #else + std::ifstream infile(filename); + #endif + + if(!infile) + { + error() << "failed to open input file `" + << filename << "'" << eom; + return 6; + } + + std::unique_ptr language= + get_language_from_filename(filename); + + if(language==nullptr) + { + error() << "failed to figure out type of file `" + << filename << "'" << eom; + return 6; + } + + language->get_language_options(cmdline); + language->set_message_handler(get_message_handler()); + + status() << "Parsing " << filename << eom; + + if(language->parse(infile, filename)) + { + error() << "PARSING ERROR" << eom; + return 6; + } - expr_listt bmc_constraints; + language->show_parse(std::cout); + return 0; + } - int get_goto_program_ret= - get_goto_program(options, bmc_constraints, goto_functions); + int get_goto_program_ret=get_goto_program(options); if(get_goto_program_ret!=-1) return get_goto_program_ret; @@ -491,26 +538,24 @@ int cbmc_parse_optionst::doit() if(cmdline.isset("show-claims") || // will go away cmdline.isset("show-properties")) // use this one { - const namespacet ns(symbol_table); - show_properties(ns, get_ui(), goto_functions); + show_properties(goto_model, ui_message_handler.get_ui()); return 0; // should contemplate EX_OK from sysexits.h } - if(set_properties(goto_functions)) + if(set_properties()) return 7; // should contemplate EX_USAGE from sysexits.h // unwinds loops to number of enum elements // side effect: add this as explicit unwind to unwind set if(options.get_bool_option("java-unwind-enum-static")) - remove_static_init_loops( - symbol_table, - goto_functions, - options, - ui_message_handler); + remove_static_init_loops(goto_model, options, get_message_handler()); // get solver - cbmc_solverst cbmc_solvers(options, symbol_table, ui_message_handler); - cbmc_solvers.set_ui(get_ui()); + cbmc_solverst cbmc_solvers( + options, + goto_model.symbol_table, + get_message_handler()); + cbmc_solvers.set_ui(ui_message_handler.get_ui()); std::unique_ptr cbmc_solver; @@ -527,21 +572,25 @@ int cbmc_parse_optionst::doit() prop_convt &prop_conv=cbmc_solver->prop_conv(); - bmct bmc(options, symbol_table, ui_message_handler, prop_conv); + bmct bmc( + options, + goto_model.symbol_table, + get_message_handler(), + prop_conv); // do actual BMC - return do_bmc(bmc, goto_functions); + return do_bmc(bmc); } -bool cbmc_parse_optionst::set_properties(goto_functionst &goto_functions) +bool cbmc_parse_optionst::set_properties() { try { if(cmdline.isset("claim")) // will go away - ::set_properties(goto_functions, cmdline.get_values("claim")); + ::set_properties(goto_model, cmdline.get_values("claim")); if(cmdline.isset("property")) // use this one - ::set_properties(goto_functions, cmdline.get_values("property")); + ::set_properties(goto_model, cmdline.get_values("property")); } catch(const char *e) @@ -565,9 +614,7 @@ bool cbmc_parse_optionst::set_properties(goto_functionst &goto_functions) } int cbmc_parse_optionst::get_goto_program( - const optionst &options, - expr_listt &bmc_constraints, // for get_modules - goto_functionst &goto_functions) + const optionst &options) { if(cmdline.args.empty()) { @@ -577,97 +624,20 @@ int cbmc_parse_optionst::get_goto_program( try { - if(cmdline.isset("show-parse-tree")) - { - if(cmdline.args.size()!=1 || - is_goto_binary(cmdline.args[0])) - { - error() << "Please give exactly one source file" << eom; - return 6; - } - - std::string filename=cmdline.args[0]; - - #ifdef _MSC_VER - std::ifstream infile(widen(filename)); - #else - std::ifstream infile(filename); - #endif - - if(!infile) - { - error() << "failed to open input file `" - << filename << "'" << eom; - return 6; - } - - std::unique_ptr language=get_language_from_filename(filename); - language->get_language_options(cmdline); - - if(language==nullptr) - { - error() << "failed to figure out type of file `" - << filename << "'" << eom; - return 6; - } - - language->set_message_handler(get_message_handler()); - - status() << "Parsing " << filename << eom; - - if(language->parse(infile, filename)) - { - error() << "PARSING ERROR" << eom; - return 6; - } - - language->show_parse(std::cout); - return 0; - } - - cmdlinet::argst binaries; - binaries.reserve(cmdline.args.size()); - - for(cmdlinet::argst::iterator - it=cmdline.args.begin(); - it!=cmdline.args.end(); - ) // no ++it - { - if(is_goto_binary(*it)) - { - binaries.push_back(*it); - it=cmdline.args.erase(it); - continue; - } - - ++it; - } - - if(!cmdline.args.empty()) - { - if(parse()) - return 6; - if(typecheck()) - return 6; - int get_modules_ret=get_modules(bmc_constraints); - if(get_modules_ret!=-1) - return get_modules_ret; - if(binaries.empty() && final()) - return 6; - - // we no longer need any parse trees or language files - clear_parse(); - } + if(initialize_goto_model(goto_model, cmdline, get_message_handler())) + // Remove all binaries from the command line as they + // are already compiled + return 6; - for(const auto &bin : binaries) + if(cmdline.isset("function")) { - status() << "Reading GOTO program from file " << eom; + const std::string &function_id=cmdline.get_value("function"); + rebuild_goto_start_functiont start_function_rebuilder( + get_message_handler(), + goto_model.symbol_table, + goto_model.goto_functions); - if(read_object_and_link( - bin, - symbol_table, - goto_functions, - get_message_handler())) + if(start_function_rebuilder(function_id)) { return 6; } @@ -675,29 +645,24 @@ int cbmc_parse_optionst::get_goto_program( if(cmdline.isset("show-symbol-table")) { - show_symbol_table(); + show_symbol_table(goto_model, ui_message_handler.get_ui()); return 0; } - status() << "Generating GOTO Program" << eom; - - goto_convert(symbol_table, goto_functions, ui_message_handler); - - if(process_goto_program(options, goto_functions)) + if(process_goto_program(options)) return 6; // show it? if(cmdline.isset("show-loops")) { - show_loop_ids(get_ui(), goto_functions); + show_loop_ids(ui_message_handler.get_ui(), goto_model); return 0; } // show it? if(cmdline.isset("show-goto-functions")) { - namespacet ns(symbol_table); - show_goto_functions(ns, get_ui(), goto_functions); + show_goto_functions(goto_model, ui_message_handler.get_ui()); return 0; } @@ -786,49 +751,44 @@ void cbmc_parse_optionst::preprocessing() } bool cbmc_parse_optionst::process_goto_program( - const optionst &options, - goto_functionst &goto_functions) + const optionst &options) { try { - namespacet ns(symbol_table); - // Remove inline assembler; this needs to happen before // adding the library. - remove_asm(symbol_table, goto_functions); + remove_asm(goto_model); // add the library - link_to_library(symbol_table, goto_functions, ui_message_handler); + link_to_library(goto_model, get_message_handler()); if(cmdline.isset("string-abstraction")) - string_instrumentation( - symbol_table, get_message_handler(), goto_functions); + string_instrumentation(goto_model, get_message_handler()); // remove function pointers status() << "Removal of function pointers and virtual functions" << eom; remove_function_pointers( get_message_handler(), - symbol_table, - goto_functions, + goto_model, cmdline.isset("pointer-check")); // Java virtual functions -> explicit dispatch tables: - remove_virtual_functions(symbol_table, goto_functions); + remove_virtual_functions(goto_model); // remove catch and throw (introduces instanceof) - remove_exceptions(symbol_table, goto_functions); + remove_exceptions(goto_model); // Similar removal of RTTI inspection: - remove_instanceof(symbol_table, goto_functions); + remove_instanceof(goto_model); - mm_io(symbol_table, goto_functions); + mm_io(goto_model); // do partial inlining status() << "Partial Inlining" << eom; - goto_partial_inline(goto_functions, ns, ui_message_handler); + goto_partial_inline(goto_model, get_message_handler()); // remove returns, gcc vectors, complex - remove_returns(symbol_table, goto_functions); - remove_vector(symbol_table, goto_functions); - remove_complex(symbol_table, goto_functions); - rewrite_union(goto_functions, ns); + remove_returns(goto_model); + remove_vector(goto_model); + remove_complex(goto_model); + rewrite_union(goto_model); // Similar removal of java nondet statements: // TODO Should really get this from java_bytecode_language somehow, but we @@ -841,20 +801,21 @@ bool cbmc_parse_optionst::process_goto_program( cmdline.isset("java-max-input-tree-depth") ? std::stoul(cmdline.get_value("java-max-input-tree-depth")) : MAX_NONDET_TREE_DEPTH; - replace_java_nondet(goto_functions); + + replace_java_nondet(goto_model); + convert_nondet( - goto_functions, - symbol_table, - ui_message_handler, + goto_model, + get_message_handler(), max_nondet_array_length, max_nondet_tree_depth); // add generic checks status() << "Generic Property Instrumentation" << eom; - goto_check(ns, options, goto_functions); + goto_check(options, goto_model); // checks don't know about adjusted float expressions - adjust_float_expressions(goto_functions, ns); + adjust_float_expressions(goto_model); // ignore default/user-specified initialization // of variables with static lifetime @@ -862,46 +823,44 @@ bool cbmc_parse_optionst::process_goto_program( { status() << "Adding nondeterministic initialization " "of static/global variables" << eom; - nondet_static(ns, goto_functions); + nondet_static(goto_model); } if(cmdline.isset("string-abstraction")) { status() << "String Abstraction" << eom; string_abstraction( - symbol_table, - get_message_handler(), - goto_functions); + goto_model, + get_message_handler()); } // add failed symbols // needs to be done before pointer analysis - add_failed_symbols(symbol_table); + add_failed_symbols(goto_model.symbol_table); // recalculate numbers, etc. - goto_functions.update(); + goto_model.goto_functions.update(); // add loop ids - goto_functions.compute_loop_numbers(); + goto_model.goto_functions.compute_loop_numbers(); if(cmdline.isset("drop-unused-functions")) { // Entry point will have been set before and function pointers removed status() << "Removing unused functions" << eom; - remove_unused_functions(goto_functions, ui_message_handler); + remove_unused_functions(goto_model, get_message_handler()); } // remove skips such that trivial GOTOs are deleted and not considered // for coverage annotation: - remove_skip(goto_functions); + remove_skip(goto_model); // instrument cover goals if(cmdline.isset("cover")) { if(instrument_cover_goals( cmdline, - symbol_table, - goto_functions, + goto_model, get_message_handler())) return true; } @@ -911,21 +870,21 @@ bool cbmc_parse_optionst::process_goto_program( // before using the argument of the "property" option. // Do not re-label after using the property slicer because // this would cause the property identifiers to change. - label_properties(goto_functions); + label_properties(goto_model); // full slice? if(cmdline.isset("full-slice")) { status() << "Performing a full slice" << eom; if(cmdline.isset("property")) - property_slicer(goto_functions, ns, cmdline.get_values("property")); + property_slicer(goto_model, cmdline.get_values("property")); else - full_slicer(goto_functions, ns); + full_slicer(goto_model); } // remove any skips introduced since coverage instrumentation - remove_skip(goto_functions); - goto_functions.update(); + remove_skip(goto_model); + goto_model.goto_functions.update(); } catch(const char *e) @@ -955,16 +914,14 @@ bool cbmc_parse_optionst::process_goto_program( } /// invoke main modules -int cbmc_parse_optionst::do_bmc( - bmct &bmc, - const goto_functionst &goto_functions) +int cbmc_parse_optionst::do_bmc(bmct &bmc) { - bmc.set_ui(get_ui()); + bmc.set_ui(ui_message_handler.get_ui()); int result=6; // do actual BMC - switch(bmc.run(goto_functions)) + switch(bmc.run(goto_model.goto_functions)) { case safety_checkert::resultt::SAFE: result=0; @@ -1052,7 +1009,7 @@ void cbmc_parse_optionst::help() " --round-to-plus-inf rounding towards plus infinity\n" " --round-to-minus-inf rounding towards minus infinity\n" " --round-to-zero rounding towards zero\n" - " --function name set main function name\n" + HELP_FUNCTIONS "\n" "Program representations:\n" " --show-parse-tree show parse tree\n" diff --git a/src/cbmc/cbmc_parse_options.h b/src/cbmc/cbmc_parse_options.h index ef91683ee0e..85461fef191 100644 --- a/src/cbmc/cbmc_parse_options.h +++ b/src/cbmc/cbmc_parse_options.h @@ -14,8 +14,7 @@ Author: Daniel Kroening, kroening@kroening.com #include #include - -#include +#include #include @@ -28,7 +27,8 @@ class goto_functionst; class optionst; #define CBMC_OPTIONS \ - "(program-only)(function):(preprocess)(slice-by-trace):" \ + "(program-only)(preprocess)(slice-by-trace):" \ + OPT_FUNCTIONS \ "(no-simplify)(unwind):(unwindset):(slice-formula)(full-slice)" \ "(debug-level):(no-propagation)(no-simplify-if)" \ "(document-subgoals)(outfile):(test-preprocessor)" \ @@ -74,7 +74,7 @@ class optionst; class cbmc_parse_optionst: public parse_options_baset, public xml_interfacet, - public language_uit + public messaget { public: virtual int doit() override; @@ -87,35 +87,17 @@ class cbmc_parse_optionst: const std::string &extra_options); protected: + goto_modelt goto_model; ui_message_handlert ui_message_handler; - virtual void register_languages(); - - virtual void get_command_line_options(optionst &options); - - virtual int do_bmc( - bmct &bmc, - const goto_functionst &goto_functions); - - virtual int get_goto_program( - const optionst &options, - expr_listt &bmc_constraints, - goto_functionst &goto_functions); - - virtual bool process_goto_program( - const optionst &options, - goto_functionst &goto_functions); - - bool set_properties(goto_functionst &goto_functions); void eval_verbosity(); - - // get any additional stuff before finalizing the goto program - virtual int get_modules(expr_listt &bmc_constraints) - { - return -1; // continue - } - + void register_languages(); + void get_command_line_options(optionst &); void preprocessing(); + int get_goto_program(const optionst &); + bool process_goto_program(const optionst &); + bool set_properties(); + int do_bmc(bmct &); }; #endif // CPROVER_CBMC_CBMC_PARSE_OPTIONS_H diff --git a/src/cbmc/cbmc_solvers.h b/src/cbmc/cbmc_solvers.h index 02bbb8b5db9..2245ff59b70 100644 --- a/src/cbmc/cbmc_solvers.h +++ b/src/cbmc/cbmc_solvers.h @@ -17,6 +17,7 @@ Author: Daniel Kroening, kroening@kroening.com #include #include +#include #include #include @@ -25,7 +26,6 @@ Author: Daniel Kroening, kroening@kroening.com #include #include #include -#include #include #include "bv_cbmc.h" @@ -123,7 +123,7 @@ class cbmc_solverst:public messaget { } - void set_ui(language_uit::uit _ui) { ui=_ui; } + void set_ui(ui_message_handlert::uit _ui) { ui=_ui; } protected: const optionst &options; @@ -131,7 +131,7 @@ class cbmc_solverst:public messaget namespacet ns; // use gui format - language_uit::uit ui; + ui_message_handlert::uit ui; std::unique_ptr get_default(); std::unique_ptr get_dimacs(); diff --git a/src/cbmc/fault_localization.h b/src/cbmc/fault_localization.h index 008bb819b1e..dd0227327e6 100644 --- a/src/cbmc/fault_localization.h +++ b/src/cbmc/fault_localization.h @@ -15,7 +15,6 @@ Author: Peter Schrammel #include #include #include -#include #include diff --git a/src/clobber/CMakeLists.txt b/src/clobber/CMakeLists.txt new file mode 100644 index 00000000000..3d7a43ec9ca --- /dev/null +++ b/src/clobber/CMakeLists.txt @@ -0,0 +1,36 @@ +# Library +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +list(REMOVE_ITEM sources + ${CMAKE_CURRENT_SOURCE_DIR}/clobber_main.cpp +) +add_library(clobber-lib ${sources} ${headers}) + +generic_includes(clobber-lib) + +target_link_libraries(clobber-lib + ansi-c + cpp + linking + big-int + goto-programs + analyses + langapi + xml + assembler + solvers + util + goto-symex + pointer-analysis + goto-instrument-lib +) + +add_if_library(clobber-lib bv_refinement) +add_if_library(clobber-lib java_bytecode) +add_if_library(clobber-lib specc) +add_if_library(clobber-lib php) + +# Executable +add_executable(clobber clobber_main.cpp) +target_link_libraries(clobber clobber-lib) + diff --git a/src/clobber/clobber_parse_options.cpp b/src/clobber/clobber_parse_options.cpp index b0859362be9..5a926a71eee 100644 --- a/src/clobber/clobber_parse_options.cpp +++ b/src/clobber/clobber_parse_options.cpp @@ -24,7 +24,7 @@ Author: Daniel Kroening, kroening@kroening.com #include #include -#include +#include #include #include #include @@ -120,34 +120,33 @@ int clobber_parse_optionst::doit() eval_verbosity(); - goto_functionst goto_functions; + goto_modelt goto_model; try { - if(get_goto_program(options, goto_functions)) + if(initialize_goto_model(goto_model, cmdline, get_message_handler())) return 6; - label_properties(goto_functions); + label_properties(goto_model); if(cmdline.isset("show-properties")) { - const namespacet ns(symbol_table); - show_properties(ns, get_ui(), goto_functions); + show_properties(goto_model, get_ui()); return 0; } - set_properties(goto_functions); + set_properties(goto_model.goto_functions); // do instrumentation - const namespacet ns(symbol_table); + const namespacet ns(goto_model.symbol_table); std::ofstream out("simulator.c"); if(!out) throw std::string("failed to create file simulator.c"); - dump_c(goto_functions, true, false, false, ns, out); + dump_c(goto_model.goto_functions, true, false, false, ns, out); status() << "instrumentation complete; compile and execute simulator.c" << eom; @@ -189,165 +188,42 @@ bool clobber_parse_optionst::set_properties(goto_functionst &goto_functions) return false; } -bool clobber_parse_optionst::get_goto_program( - const optionst &options, - goto_functionst &goto_functions) -{ - if(cmdline.args.empty()) - { - error() << "Please provide a program to verify" << eom; - return true; - } - - { - if(cmdline.args.size()==1 && - is_goto_binary(cmdline.args[0])) - { - status() << "Reading GOTO program from file" << eom; - - if(read_goto_binary(cmdline.args[0], - symbol_table, goto_functions, get_message_handler())) - return true; - - if(cmdline.isset("show-symbol-table")) - { - show_symbol_table(); - return true; - } - - irep_idt entry_point=goto_functions.entry_point(); - - if(symbol_table.symbols.find(entry_point)==symbol_table.symbols.end()) - { - error() << "The goto binary has no entry point; please complete linking" - << eom; - return true; - } - } - else if(cmdline.isset("show-parse-tree")) - { - if(cmdline.args.size()!=1) - { - error() << "Please give one source file only" << eom; - return true; - } - - std::string filename=cmdline.args[0]; - - #ifdef _MSC_VER - std::ifstream infile(widen(filename)); - #else - std::ifstream infile(filename); - #endif - - if(!infile) - { - error() << "failed to open input file `" << filename << "'" << eom; - return true; - } - - std::unique_ptr language=get_language_from_filename(filename); - language->get_language_options(cmdline); - - if(language==nullptr) - { - error() << "failed to figure out type of file `" << filename << "'" - << eom; - return true; - } - - language->set_message_handler(get_message_handler()); - - status() << "Parsing " << filename << eom; - - if(language->parse(infile, filename)) - { - error() << "PARSING ERROR" << eom; - return true; - } - - language->show_parse(std::cout); - return true; - } - else - { - if(parse() || - typecheck() || - final()) - return true; - - // we no longer need any parse trees or language files - clear_parse(); - - if(cmdline.isset("show-symbol-table")) - { - show_symbol_table(); - return true; - } - - irep_idt entry_point=goto_functions.entry_point(); - - if(symbol_table.symbols.find(entry_point)==symbol_table.symbols.end()) - { - error() << "No entry point; please provide a main function" << eom; - return true; - } - - status() << "Generating GOTO Program" << eom; - - goto_convert(symbol_table, goto_functions, ui_message_handler); - } - - // finally add the library - #if 0 - link_to_library(symbol_table, goto_functions, ui_message_handler); - #endif - - if(process_goto_program(options, goto_functions)) - return true; - } - - return false; -} - bool clobber_parse_optionst::process_goto_program( const optionst &options, - goto_functionst &goto_functions) + goto_modelt &goto_model) { { - namespacet ns(symbol_table); - // do partial inlining status() << "Partial Inlining" << eom; - goto_partial_inline(goto_functions, ns, ui_message_handler); + goto_partial_inline(goto_model, get_message_handler()); // add generic checks status() << "Generic Property Instrumentation" << eom; - goto_check(ns, options, goto_functions); + goto_check(options, goto_model); // recalculate numbers, etc. - goto_functions.update(); + goto_model.goto_functions.update(); // add loop ids - goto_functions.compute_loop_numbers(); + goto_model.goto_functions.compute_loop_numbers(); // if we aim to cover, replace // all assertions by false to prevent simplification if(cmdline.isset("cover-assertions")) - make_assertions_false(goto_functions); + make_assertions_false(goto_model); // show it? if(cmdline.isset("show-loops")) { - show_loop_ids(get_ui(), goto_functions); + show_loop_ids(get_ui(), goto_model); return true; } // show it? if(cmdline.isset("show-goto-functions")) { - show_goto_functions(ns, get_ui(), goto_functions); + show_goto_functions(goto_model, get_ui()); return true; } } diff --git a/src/clobber/clobber_parse_options.h b/src/clobber/clobber_parse_options.h index 5148bc759af..eb543f60138 100644 --- a/src/clobber/clobber_parse_options.h +++ b/src/clobber/clobber_parse_options.h @@ -54,17 +54,13 @@ class clobber_parse_optionst: protected: ui_message_handlert ui_message_handler; - void get_command_line_options(optionst &options); - - bool get_goto_program( - const optionst &options, - goto_functionst &goto_functions); + void get_command_line_options(optionst &); bool process_goto_program( const optionst &options, - goto_functionst &goto_functions); + goto_modelt &); - bool set_properties(goto_functionst &goto_functions); + bool set_properties(goto_functionst &); void report_success(); void report_failure(); diff --git a/src/common b/src/common index d410f999a36..58e5bc3c1f2 100644 --- a/src/common +++ b/src/common @@ -36,11 +36,11 @@ endif CP_CFLAGS = -MMD -MP CXXFLAGS ?= -Wall -O2 ifeq ($(filter-out OSX OSX_Universal,$(BUILD_ENV_)),) - CP_CXXFLAGS = -MMD -MP -mmacosx-version-min=10.9 -std=c++11 -stdlib=libc++ + CP_CXXFLAGS += -MMD -MP -mmacosx-version-min=10.9 -std=c++11 -stdlib=libc++ LINKFLAGS += -mmacosx-version-min=10.9 -stdlib=libc++ LINKNATIVE += -mmacosx-version-min=10.9 -stdlib=libc++ else - CP_CXXFLAGS = -MMD -MP -std=c++11 + CP_CXXFLAGS += -MMD -MP -std=c++11 endif ifeq ($(filter -O%,$(CXXFLAGS)),) CP_CXXFLAGS += -O2 @@ -103,7 +103,7 @@ else ifeq ($(BUILD_ENV_),Cygwin) CFLAGS ?= -Wall -O2 CXXFLAGS ?= -Wall -O2 CP_CFLAGS = -MMD -MP - CP_CXXFLAGS = -MMD -MP -std=c++11 -U__STRICT_ANSI__ + CP_CXXFLAGS += -MMD -MP -std=c++11 -U__STRICT_ANSI__ LINKFLAGS = -static -std=c++11 LINKLIB = ar rcT $@ $^ LINKBIN = $(CXX) $(LINKFLAGS) -o $@ -Wl,--start-group $^ -Wl,--end-group $(LIBS) -static @@ -133,7 +133,7 @@ else ifeq ($(BUILD_ENV_),MSVC) CFLAGS ?= /W3 /O2 /GF CXXFLAGS ?= /W3 /D_CRT_SECURE_NO_WARNINGS /O2 /GF CP_CFLAGS = - CP_CXXFLAGS = + CP_CXXFLAGS += LINKLIB = lib /NOLOGO /OUT:$@ $^ LINKBIN = $(CXX) $(LINKFLAGS) /Fe$@ $^ $(LIBS) LINKNATIVE = $(HOSTCXX) /Fe$@ $^ diff --git a/src/config.inc b/src/config.inc index 90b58f07b4e..643efa07d8d 100644 --- a/src/config.inc +++ b/src/config.inc @@ -34,6 +34,42 @@ MINISAT2 = ../../minisat-2.2.1 #GLUCOSE = ../../glucose-syrup #SMVSAT = +ifneq ($(PRECOSAT),) + CP_CXXFLAGS += -DSATCHECK_PRECOSAT +endif + +ifneq ($(PICOSAT),) + CP_CXXFLAGS += -DSATCHECK_PICOSAT +endif + +ifneq ($(LINGELING),) + CP_CXXFLAGS += -DSATCHECK_LINGELING +endif + +ifneq ($(CHAFF),) + CP_CXXFLAGS += -DSATCHECK_CHAFF +endif + +ifneq ($(BOOLEFORCE),) + CP_CXXFLAGS += -DSATCHECK_BOOLEFORCE +endif + +ifneq ($(MINISAT),) + CP_CXXFLAGS += -DSATCHECK_MINISAT +endif + +ifneq ($(MINISAT2),) + CP_CXXFLAGS += -DSATCHECK_MINISAT2 +endif + +ifneq ($(GLUCOSE),) + CP_CXXFLAGS += -DSATCHECK_GLUCOSE +endif + +ifneq ($(SMVSAT),) + CP_CXXFLAGS += -DSATCHECK_SMVSAT +endif + # Signing identity for MacOS Gatekeeper OSX_IDENTITY="Developer ID Application: Daniel Kroening" diff --git a/src/cpp/CMakeLists.txt b/src/cpp/CMakeLists.txt new file mode 100644 index 00000000000..740c600641b --- /dev/null +++ b/src/cpp/CMakeLists.txt @@ -0,0 +1,7 @@ +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +add_library(cpp ${sources} ${headers}) + +generic_includes(cpp) + +target_link_libraries(cpp util ansi-c) diff --git a/src/cpp/cpp_language.cpp b/src/cpp/cpp_language.cpp index 3d6efd64f71..6a5c75197f9 100644 --- a/src/cpp/cpp_language.cpp +++ b/src/cpp/cpp_language.cpp @@ -54,6 +54,22 @@ void cpp_languaget::modules_provided(std::set &modules) modules.insert(get_base_name(parse_path, true)); } +/// Generate a _start function for a specific function +/// \param entry_function_symbol_id: The symbol for the function that should be +/// used as the entry point +/// \param symbol_table: The symbol table for the program. The new _start +/// function symbol will be added to this table +/// \return Returns false if the _start method was generated correctly +bool cpp_languaget::generate_start_function( + const irep_idt &entry_function_symbol_id, + symbol_tablet &symbol_table) +{ + return generate_ansi_c_start_function( + symbol_table.lookup(entry_function_symbol_id), + symbol_table, + *message_handler); +} + /// ANSI-C preprocessing bool cpp_languaget::preprocess( std::istream &instream, @@ -137,11 +153,11 @@ bool cpp_languaget::typecheck( bool cpp_languaget::final( symbol_tablet &symbol_table, - bool generate_start_function) + bool create_start_function) { - if(generate_start_function) + if(create_start_function) { - if(ansi_c_entry_point(symbol_table, "main", get_message_handler())) + if(ansi_c_entry_point(symbol_table, get_message_handler())) return true; } diff --git a/src/cpp/cpp_language.h b/src/cpp/cpp_language.h index 0cce6c0f7dd..13902e6a923 100644 --- a/src/cpp/cpp_language.h +++ b/src/cpp/cpp_language.h @@ -45,7 +45,7 @@ class cpp_languaget:public languaget bool final( symbol_tablet &symbol_table, - bool generate_start_function) override; + bool create_start_function) override; void show_parse(std::ostream &out) override; @@ -89,6 +89,10 @@ class cpp_languaget:public languaget void modules_provided(std::set &modules) override; + virtual bool generate_start_function( + const irep_idt &entry_function_symbol_id, + class symbol_tablet &symbol_table) override; + protected: cpp_parse_treet cpp_parse_tree; std::string parse_path; diff --git a/src/cpp/cpp_typecheck_constructor.cpp b/src/cpp/cpp_typecheck_constructor.cpp index 40b0fe18afd..2ec3a686c2d 100644 --- a/src/cpp/cpp_typecheck_constructor.cpp +++ b/src/cpp/cpp_typecheck_constructor.cpp @@ -41,17 +41,17 @@ static void copy_parent( exprt &op0=code.op0().op0(); op0.operands().push_back(exprt("cpp-this")); - op0.type().id(ID_pointer); - op0.type().subtype()=cpp_namet(parent_base_name, source_location).as_type(); + op0.type()= + pointer_type(cpp_namet(parent_base_name, source_location).as_type()); op0.add_source_location()=source_location; code.operands().push_back(exprt("explicit-typecast")); exprt &op1=code.op1(); - op1.type().id(ID_pointer); + op0.type()= + pointer_type(cpp_namet(parent_base_name, source_location).as_type()); op1.type().set(ID_C_reference, true); op1.type().subtype().set(ID_C_constant, true); - op1.type().subtype()=cpp_namet(parent_base_name, source_location).as_type(); op1.operands().push_back(exprt(ID_cpp_name)); op1.op0().get_sub().push_back(irept(ID_name)); @@ -420,9 +420,8 @@ void cpp_typecheckt::default_assignop( args_decl_declor.name().get_sub().back().add(ID_identifier).id(arg_name); args_decl_declor.add_source_location()=source_location; - args_decl_declor.type().id(ID_pointer); + args_decl_declor.type()=pointer_type(typet(ID_nil)); args_decl_declor.type().set(ID_C_reference, true); - args_decl_declor.type().subtype().make_nil(); args_decl_declor.value().make_nil(); } diff --git a/src/cpp/cpp_typecheck_expr.cpp b/src/cpp/cpp_typecheck_expr.cpp index cac26bd5dc3..dec8510eb7b 100644 --- a/src/cpp/cpp_typecheck_expr.cpp +++ b/src/cpp/cpp_typecheck_expr.cpp @@ -13,6 +13,7 @@ Author: Daniel Kroening, kroening@cs.cmu.edu #include +#include #include #include #include @@ -22,7 +23,6 @@ Author: Daniel Kroening, kroening@cs.cmu.edu #include #include -#include #include @@ -856,8 +856,8 @@ void cpp_typecheckt::typecheck_expr_new(exprt &expr) // runtime library exprt &sizeof_expr=static_cast(expr.add(ID_sizeof)); - sizeof_expr=c_sizeof(expr.type().subtype(), *this); - sizeof_expr.add("#c_sizeof_type")=expr.type().subtype(); + sizeof_expr=size_of_expr(expr.type().subtype(), *this); + sizeof_expr.add(ID_C_c_sizeof_type)=expr.type().subtype(); } static exprt collect_comma_expression(const exprt &src) diff --git a/src/cpp/cpp_typecheck_initializer.cpp b/src/cpp/cpp_typecheck_initializer.cpp index 7795b71e4c0..013f861886d 100644 --- a/src/cpp/cpp_typecheck_initializer.cpp +++ b/src/cpp/cpp_typecheck_initializer.cpp @@ -12,11 +12,11 @@ Author: Daniel Kroening, kroening@cs.cmu.edu #include "cpp_typecheck.h" #include +#include +#include #include #include -#include -#include #include "cpp_util.h" @@ -228,8 +228,6 @@ void cpp_typecheckt::zero_initializer( } else if(final_type.id()==ID_union) { - c_sizeoft c_sizeof(*this); - // Select the largest component for zero-initialization mp_integer max_comp_size=0; @@ -244,7 +242,7 @@ void cpp_typecheckt::zero_initializer( if(component.type().id()==ID_code) continue; - exprt component_size=c_sizeof(component.type()); + exprt component_size=size_of_expr(component.type(), *this); mp_integer size_int; if(!to_integer(component_size, size_int)) diff --git a/src/cpp/parse.cpp b/src/cpp/parse.cpp index ee399b8af8d..1cb4bfbe651 100644 --- a/src/cpp/parse.cpp +++ b/src/cpp/parse.cpp @@ -18,6 +18,7 @@ Author: Daniel Kroening, kroening@cs.cmu.edu #include #include #include +#include #include @@ -3015,7 +3016,7 @@ bool Parser::optPtrOperator(typet &ptrs) if(t=='*') { - typet op(ID_pointer); + typet op=pointer_type(typet(ID_nil)); cpp_tokent tk; lex.get_token(tk); set_location(op, tk); @@ -3078,7 +3079,7 @@ bool Parser::optPtrOperator(typet &ptrs) { cpp_tokent tk; lex.get_token(tk); - typet op(ID_pointer); + typet op=pointer_type(typet(ID_nil)); op.set(ID_C_reference, true); set_location(op, tk); t_list.push_front(op); @@ -3087,7 +3088,7 @@ bool Parser::optPtrOperator(typet &ptrs) { cpp_tokent tk; lex.get_token(tk); - typet op(ID_pointer); + typet op=pointer_type(typet(ID_nil)); op.set(ID_C_rvalue_reference, true); set_location(op, tk); t_list.push_front(op); @@ -3530,7 +3531,7 @@ bool Parser::rPtrToMember(irept &ptr_to_mem) std::cout << std::string(__indent, ' ') << "Parser::rPtrToMember 0\n"; #endif - irept ptm(ID_pointer); + typet ptm=pointer_type(typet(ID_nil)); irept &name = ptm.add("to-member"); name=cpp_namet(); irept::subt &components=name.get_sub(); @@ -6477,7 +6478,7 @@ bool Parser::rPrimaryExpr(exprt &exp) case TOK_NULLPTR: lex.get_token(tk); - exp=constant_exprt(ID_NULL, typet(ID_pointer, typet(ID_nullptr))); + exp=constant_exprt(ID_NULL, pointer_type(typet(ID_nullptr))); set_location(exp, tk); #ifdef DEBUG std::cout << std::string(__indent, ' ') << "Parser::rPrimaryExpr 6\n"; diff --git a/src/goto-analyzer/CMakeLists.txt b/src/goto-analyzer/CMakeLists.txt new file mode 100644 index 00000000000..1e07f53afbe --- /dev/null +++ b/src/goto-analyzer/CMakeLists.txt @@ -0,0 +1,32 @@ +# Library +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +list(REMOVE_ITEM sources + ${CMAKE_CURRENT_SOURCE_DIR}/goto_analyzer_main.cpp +) +add_library(goto-analyzer-lib ${sources} ${headers}) + +generic_includes(goto-analyzer-lib) + +target_link_libraries(goto-analyzer-lib + ansi-c + cpp + linking + big-int + goto-programs + analyses + pointer-analysis + langapi + json + assembler + util +) + +add_if_library(goto-analyzer-lib java_bytecode) +add_if_library(goto-analyzer-lib jsil) +add_if_library(goto-analyzer-lib specc) +add_if_library(goto-analyzer-lib php) + +# Executable +add_executable(goto-analyzer goto_analyzer_main.cpp) +target_link_libraries(goto-analyzer goto-analyzer-lib) diff --git a/src/goto-analyzer/goto_analyzer_parse_options.cpp b/src/goto-analyzer/goto_analyzer_parse_options.cpp index 66d31053220..033dfddd025 100644 --- a/src/goto-analyzer/goto_analyzer_parse_options.cpp +++ b/src/goto-analyzer/goto_analyzer_parse_options.cpp @@ -58,7 +58,7 @@ goto_analyzer_parse_optionst::goto_analyzer_parse_optionst( int argc, const char **argv): parse_options_baset(GOTO_ANALYSER_OPTIONS, argc, argv), - language_uit(cmdline, ui_message_handler), + messaget(ui_message_handler), ui_message_handler(cmdline, "GOTO-ANALYZER " CBMC_VERSION) { } @@ -494,6 +494,7 @@ void goto_analyzer_parse_optionst::help() " --classpath dir/jar set the classpath\n" " --main-class class-name set the name of the main class\n" JAVA_BYTECODE_LANGUAGE_OPTIONS_HELP + HELP_FUNCTIONS "\n" "Program representations:\n" " --show-parse-tree show parse tree\n" diff --git a/src/goto-analyzer/goto_analyzer_parse_options.h b/src/goto-analyzer/goto_analyzer_parse_options.h index 5d61256b1f2..62a5932cdb2 100644 --- a/src/goto-analyzer/goto_analyzer_parse_options.h +++ b/src/goto-analyzer/goto_analyzer_parse_options.h @@ -15,10 +15,9 @@ Author: Daniel Kroening, kroening@kroening.com #include #include -#include - #include #include +#include #include @@ -29,7 +28,7 @@ class goto_functionst; class optionst; #define GOTO_ANALYSER_OPTIONS \ - "(function):" \ + OPT_FUNCTIONS \ "D:I:(std89)(std99)(std11)" \ "(classpath):(cp):(main-class):" \ "(16)(32)(64)(LP64)(ILP64)(LLP64)(ILP32)(LP32)" \ @@ -52,7 +51,7 @@ class optionst; class goto_analyzer_parse_optionst: public parse_options_baset, - public language_uit + public messaget { public: virtual int doit() override; @@ -72,6 +71,11 @@ class goto_analyzer_parse_optionst: bool set_properties(); void eval_verbosity(); + + ui_message_handlert::uit get_ui() + { + return ui_message_handler.get_ui(); + } }; #endif // CPROVER_GOTO_ANALYZER_GOTO_ANALYZER_PARSE_OPTIONS_H diff --git a/src/goto-cc/CMakeLists.txt b/src/goto-cc/CMakeLists.txt new file mode 100644 index 00000000000..7d7a2d579da --- /dev/null +++ b/src/goto-cc/CMakeLists.txt @@ -0,0 +1,32 @@ +# Library +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +list(REMOVE_ITEM sources + ${CMAKE_CURRENT_SOURCE_DIR}/goto_cc_main.cpp +) +add_library(goto-cc-lib ${sources} ${headers}) + +generic_includes(goto-cc-lib) + +target_link_libraries(goto-cc-lib + big-int + goto-programs + util + linking + ansi-c + cpp + xml + assembler + langapi +) + +add_if_library(goto-cc-lib java_bytecode) +add_if_library(goto-cc-lib jsil) + +# Executable +add_executable(goto-cc goto_cc_main.cpp) +target_link_libraries(goto-cc goto-cc-lib) + +if(WIN32) + set_target_properties(goto-cc PROPERTIES OUTPUT_NAME goto-cl) +endif() diff --git a/src/goto-cc/compile.cpp b/src/goto-cc/compile.cpp index 71f0d81160e..03cdd8544f6 100644 --- a/src/goto-cc/compile.cpp +++ b/src/goto-cc/compile.cpp @@ -368,7 +368,7 @@ bool compilet::link() symbol_table.remove(goto_functionst::entry_point()); compiled_functions.function_map.erase(goto_functionst::entry_point()); - if(ansi_c_entry_point(symbol_table, "main", get_message_handler())) + if(ansi_c_entry_point(symbol_table, get_message_handler())) return true; // entry_point may (should) add some more functions. diff --git a/src/goto-cc/compile.h b/src/goto-cc/compile.h index b0c61d137a3..4ae2a2eb0e0 100644 --- a/src/goto-cc/compile.h +++ b/src/goto-cc/compile.h @@ -18,7 +18,7 @@ Date: June 2006 #include #include -#include +#include class compilet:public language_uit { @@ -67,6 +67,7 @@ class compilet:public language_uit const std::string &, const symbol_tablet &, goto_functionst &); + bool write_bin_object_file( const std::string &, const symbol_tablet &, diff --git a/src/goto-cc/gcc_mode.h b/src/goto-cc/gcc_mode.h index 8d77ed29af1..e0a5fc9f4dd 100644 --- a/src/goto-cc/gcc_mode.h +++ b/src/goto-cc/gcc_mode.h @@ -14,12 +14,12 @@ Date: June 2006 #ifndef CPROVER_GOTO_CC_GCC_MODE_H #define CPROVER_GOTO_CC_GCC_MODE_H -#include - #include "compile.h" #include "goto_cc_mode.h" -class compilet; +#include + +#include class gcc_modet:public goto_cc_modet { diff --git a/src/goto-cc/goto_cc_mode.h b/src/goto-cc/goto_cc_mode.h index a0b6ea47a96..6dbad84d3ce 100644 --- a/src/goto-cc/goto_cc_mode.h +++ b/src/goto-cc/goto_cc_mode.h @@ -14,10 +14,10 @@ Date: June 2006 #ifndef CPROVER_GOTO_CC_GOTO_CC_MODE_H #define CPROVER_GOTO_CC_GOTO_CC_MODE_H -#include - #include "goto_cc_cmdline.h" +#include + class goto_cc_modet:public messaget { public: diff --git a/src/goto-cc/xml_binaries/read_goto_object.cpp b/src/goto-cc/xml_binaries/read_goto_object.cpp deleted file mode 100644 index 24dde49bec9..00000000000 --- a/src/goto-cc/xml_binaries/read_goto_object.cpp +++ /dev/null @@ -1,135 +0,0 @@ -/*******************************************************************\ - -Module: Read goto object files. - -Author: CM Wintersteiger - -Date: June 2006 - -\*******************************************************************/ - -/// \file -/// Read goto object files. - -#include "read_goto_object.h" - -#include -#include -#include -#include - -#define XML_VERSION "1.4" - -#include - -#include "xml_goto_function_hashing.h" -#include "xml_irep_hashing.h" -#include "xml_symbol_hashing.h" - -/// reads a goto object xml file back into a symbol and a function table -/// \par parameters: input stream, symbol_table, functions -/// \return true on error, false otherwise -bool read_goto_object( - std::istream &in, - const std::string &filename, - symbol_tablet &symbol_table, - goto_functionst &functions, - message_handlert &message_handler) -{ - messaget message(message_handler); - - xml_parser.clear(); - xml_parser.filename = filename; - xml_parser.in = ∈ - xml_parser.set_message_handler(message_handler); - - if(xml_parser.parse()) - return true; - - xmlt &top = xml_parser.parse_tree.element; - - if(top.get_attribute("version")!=XML_VERSION) - { - message.error() << - "The input was compiled with a different version of " - "goto-cc, please recompile." << messaget::eom; - return true; - } - - xml_irep_convertt::ireps_containert ic; - xml_irep_convertt irepconverter(ic); - xml_symbol_convertt symbolconverter(ic); - xml_goto_function_convertt gfconverter(ic); - - if(top.name.substr(0, 11)=="goto-object") - { - for(xmlt::elementst::const_iterator - sec_it=top.elements.begin(); - sec_it != top.elements.end(); - sec_it++) - { - xmlt sec = *sec_it; - if(sec.name=="irep_hash_map") - { - for(xmlt::elementst::const_iterator - irep_it = sec.elements.begin(); - irep_it != sec.elements.end(); - irep_it++) - { - irept i; - irepconverter.convert(*irep_it, i); - irepconverter.insert(irep_it->get_attribute("id"), i); - } - } - else if(sec.name=="symbols") - { - for(xmlt::elementst::const_iterator - sym_it = sec.elements.begin(); - sym_it != sec.elements.end(); - sym_it++) - { - symbolt symbol; - symbolconverter.convert(*sym_it, symbol); - // std::cout << "Adding Symbol: " << symbol.name << '\n'; - if(!symbol.is_type && - symbol.type.id()=="code") - { - // makes sure there is an empty function - // for this symbol. if we got code for it, - // it will be added later on. - functions.function_map[symbol.name].type= - to_code_type(symbol.type); - } - symbol_table.add(symbol); - } - } - else if(sec.name=="functions") - { - for(xmlt::elementst::const_iterator - fun_it = sec.elements.begin(); - fun_it != sec.elements.end(); - fun_it++) - { - std::string fname = fun_it->get_attribute("name"); - // std::cout << "Adding function body: " << fname << '\n'; - goto_functionst::goto_functiont &f = functions.function_map[fname]; - gfconverter.convert(*fun_it, f); - } - } - else - { - message.error() << "Unknown Section '" << sec.name - << "' in object file." << messaget::eom; - return true; - } - } - } - else - { - message.error() << "no goto-object" << messaget::eom; - return true; - } - - xml_parser.clear(); - return false; -} diff --git a/src/goto-cc/xml_binaries/read_goto_object.h b/src/goto-cc/xml_binaries/read_goto_object.h deleted file mode 100644 index 36981051008..00000000000 --- a/src/goto-cc/xml_binaries/read_goto_object.h +++ /dev/null @@ -1,28 +0,0 @@ -/*******************************************************************\ - -Module: Read goto object files. - -Author: CM Wintersteiger - -Date: June 2006 - -\*******************************************************************/ - -/// \file -/// Read goto object files. - -#ifndef CPROVER_GOTO_CC_XML_BINARIES_READ_GOTO_OBJECT_H -#define CPROVER_GOTO_CC_XML_BINARIES_READ_GOTO_OBJECT_H - -#include -#include -#include - -bool read_goto_object( - std::istream &in, - const std::string &filename, - symbol_tablet &symbol_table, - goto_functionst &functions, - message_handlert &msg_hndlr); - -#endif // CPROVER_GOTO_CC_XML_BINARIES_READ_GOTO_OBJECT_H diff --git a/src/goto-cc/xml_binaries/xml_goto_function.cpp b/src/goto-cc/xml_binaries/xml_goto_function.cpp deleted file mode 100644 index 7475a990a4b..00000000000 --- a/src/goto-cc/xml_binaries/xml_goto_function.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/*******************************************************************\ - -Module: Convert goto functions to xml structures and back. - -Author: CM Wintersteiger - -Date: June 2006 - -\*******************************************************************/ - -/// \file -/// Convert goto functions to xml structures and back. - -#include "xml_goto_function.h" - -#include - -#include "xml_goto_program.h" - -/// takes a goto_function and creates an according xml structure -/// \par parameters: goto_function and an xml node -/// \return none -void convert(const goto_functionst::goto_functiont &function, xmlt &xml) -{ - if(function.body_available) - convert(function.body, xml); -} - -/// constructs the goto_function according to the information in the xml -/// structure. -/// \par parameters: xml structure and a goto_function to fill -/// \return none -void convert(const xmlt &xml, goto_functionst::goto_functiont &function) -{ - function.body.clear(); - convert(xml, function.body); - // don't forget to fix the functions type via the symbol table! -} diff --git a/src/goto-cc/xml_binaries/xml_goto_function.h b/src/goto-cc/xml_binaries/xml_goto_function.h deleted file mode 100644 index b15722976b8..00000000000 --- a/src/goto-cc/xml_binaries/xml_goto_function.h +++ /dev/null @@ -1,23 +0,0 @@ -/*******************************************************************\ - -Module: Convert goto functions into xml structures and back - -Author: CM Wintersteiger - -Date: June 2006 - -\*******************************************************************/ - -/// \file -/// Convert goto functions into xml structures and back - -#ifndef CPROVER_GOTO_CC_XML_BINARIES_XML_GOTO_FUNCTION_H -#define CPROVER_GOTO_CC_XML_BINARIES_XML_GOTO_FUNCTION_H - -#include -#include - -void convert(const xmlt&, goto_functionst::goto_functiont&); -void convert(const goto_functionst::goto_functiont&, xmlt&); - -#endif // CPROVER_GOTO_CC_XML_BINARIES_XML_GOTO_FUNCTION_H diff --git a/src/goto-cc/xml_binaries/xml_goto_function_hashing.cpp b/src/goto-cc/xml_binaries/xml_goto_function_hashing.cpp deleted file mode 100644 index a0a2f428dab..00000000000 --- a/src/goto-cc/xml_binaries/xml_goto_function_hashing.cpp +++ /dev/null @@ -1,43 +0,0 @@ -/*******************************************************************\ - -Module: Convert goto functions to xml structures and back (with irep - hashing) - -Author: CM Wintersteiger - -Date: July 2006 - -\*******************************************************************/ - -/// \file -/// Convert goto functions to xml structures and back (with irep hashing) - -#include "xml_goto_function_hashing.h" - -#include "xml_goto_program_hashing.h" - -/// takes a goto_function and creates an according xml structure -/// \par parameters: goto_function and an xml node -/// \return none -void xml_goto_function_convertt::convert( - const goto_functionst::goto_functiont &function, - xmlt &xml) -{ - xml_goto_program_convertt gpconverter(ireps_container); - if(function.body_available) - gpconverter.convert(function.body, xml); -} - -/// constructs the goto_function according to the information in the xml -/// structure. -/// \par parameters: xml structure and a goto_function to fill -/// \return none -void xml_goto_function_convertt::convert( - const xmlt &xml, - goto_functionst::goto_functiont &function) -{ - xml_goto_program_convertt gpconverter(ireps_container); - function.body.clear(); - gpconverter.convert(xml, function.body); - // don't forget to fix the functions type via the symbol table! -} diff --git a/src/goto-cc/xml_binaries/xml_goto_function_hashing.h b/src/goto-cc/xml_binaries/xml_goto_function_hashing.h deleted file mode 100644 index e558a702c68..00000000000 --- a/src/goto-cc/xml_binaries/xml_goto_function_hashing.h +++ /dev/null @@ -1,38 +0,0 @@ -/*******************************************************************\ - -Module: Convert goto functions into xml structures and back (with irep - hashing). - -Author: CM Wintersteiger - -Date: July 2006 - -\*******************************************************************/ - -/// \file -/// Convert goto functions into xml structures and back (with irep hashing). - -#ifndef CPROVER_GOTO_CC_XML_BINARIES_XML_GOTO_FUNCTION_HASHING_H -#define CPROVER_GOTO_CC_XML_BINARIES_XML_GOTO_FUNCTION_HASHING_H - -#include -#include - -#include "xml_irep_hashing.h" - -class xml_goto_function_convertt -{ -private: - xml_irep_convertt::ireps_containert &ireps_container; - -public: - explicit xml_goto_function_convertt(xml_irep_convertt::ireps_containert &ic): - ireps_container(ic) - { - } - - void convert(const xmlt&, goto_functionst::goto_functiont&); - void convert(const goto_functionst::goto_functiont&, xmlt&); -}; - -#endif // CPROVER_GOTO_CC_XML_BINARIES_XML_GOTO_FUNCTION_HASHING_H diff --git a/src/goto-cc/xml_binaries/xml_goto_program.cpp b/src/goto-cc/xml_binaries/xml_goto_program.cpp deleted file mode 100644 index 1f12fcff98f..00000000000 --- a/src/goto-cc/xml_binaries/xml_goto_program.cpp +++ /dev/null @@ -1,405 +0,0 @@ -/*******************************************************************\ - -Module: Convert goto programs to xml structures and back. - -Author: CM Wintersteiger - -Date: June 2006 - -\*******************************************************************/ - -/// \file -/// Convert goto programs to xml structures and back. - -#include "xml_goto_program.h" - -#include -#include - -#include - -/// constructs the xml structure according to the goto program and the namespace -/// into the given xml object. -/// \par parameters: goto program, namespace and an xml structure to fill -/// \return none -void convert(const goto_programt &goto_program, - xmlt &xml) -{ - std::stringstream tmp; - // std::cout << "TNO: " << goto_program.target_numbers.size() << '\n'; - - for(const auto &inst : goto_program.instructions) - { - xmlt &ins=xml.new_element("instruction"); - - if(!inst.location.is_nil()) - { - convert(inst.location, ins.new_element("location")); - } - - if(!inst.labels.empty()) - { - xmlt &lbl=ins.new_element("labels"); - for(goto_programt::instructiont::labelst::const_iterator - l_it=inst.labels.begin(); - l_it!=inst.labels.end(); - l_it++) - { - lbl.new_element("label").set_attribute("name", id2string(*l_it)); - } - } - - - if(inst.target_number!=0) - { - // std::cout << "Targetlabel found!\n"; - tmp.str(""); - tmp << inst.target_number; - ins.set_attribute("targetlabel", tmp.str()); - } - - switch(inst.type) - { - case GOTO: - { - ins.name="goto"; - if(!inst.guard.is_true()) - { - xmlt &g=ins.new_element("guard"); - convert(inst.guard, g); - } - xmlt &tgt=ins.new_element("targets"); - for(goto_programt::instructiont::targetst::const_iterator - gt_it=inst.targets.begin(); - gt_it!=inst.targets.end(); - gt_it++) - { - tmp.str(""); - tmp << (*gt_it)->target_number; - tgt.new_element("target").data=tmp.str(); - } - break; - } - - case ASSUME: - { - ins.name="assume"; - xmlt &g=ins.new_element("guard"); - convert(inst.guard, g); - - const irep_idt &comment=inst.location.get("comment"); - - if(comment!="") - ins.new_element("comment").data=id2string(comment); - - break; - } - - case ASSERT: - { - ins.name="assert"; - xmlt &g=ins.new_element("guard"); - convert(inst.guard, g); - const irep_idt &comment=inst.location.get("comment"); - - if(comment!="") - ins.new_element("comment").data=id2string(comment); - - break; - } - - case SKIP: - ins.name="skip"; - break; - - case END_FUNCTION: - ins.name="end_function"; - break; - - case LOCATION: - ins.name="location"; - break; - - case DEAD: - ins.name="dead"; - break; - - case ATOMIC_BEGIN: - ins.name="atomic_begin"; - break; - - case ATOMIC_END: - ins.name="atomic_end"; - break; - - case RETURN: - { - ins.name="return"; - xmlt &c=ins.new_element("code"); - convert(inst.code, c); - break; - } - - case OTHER: - { - ins.name="instruction"; - xmlt &c=ins.new_element("code"); - convert(inst.code, c); - break; - } - - case ASSIGN: - { - ins.name="assign"; - xmlt &c=ins.new_element("code"); - convert(inst.code, c); - break; - } - - case FUNCTION_CALL: - { - ins.name="functioncall"; - xmlt &c=ins.new_element("code"); - convert(inst.code, c); - break; - } - - case START_THREAD: - { - ins.name="thread_start"; - xmlt &tgt=ins.new_element("targets"); - if(inst.targets.size()==1) - { - tmp.str(""); - tmp << inst.targets.front()->target_number; - tgt.new_element("target").data=tmp.str(); - } - break; - } - - case END_THREAD: - ins.name="thread_end"; - break; - - default: - ins.name="unknown"; - break; - } - - if(inst.function!="") - { - xmlt &fnc=ins.new_element("function"); - fnc.data=id2string(inst.function); - } - } -} - -/// constructs the goto program according to the xml structure and the namespace -/// into the given goto program object. -/// \par parameters: an xml structure, namespace, function symbol -/// and a goto program to fill -/// \return none -void convert(const xmlt &xml, goto_programt &goto_program) -{ - goto_program.clear(); - goto_programt::instructionst &instructions = goto_program.instructions; - - xmlt::elementst::const_iterator it = xml.elements.begin(); - for(; it != xml.elements.end(); it++) - { - goto_programt::targett inst = goto_program.add_instruction(); - inst->targets.clear(); - - if(it->name=="goto") - { - inst->type = GOTO; - } - else if(it->name=="assume") - { - inst->type = ASSUME; - } - else if(it->name=="assert") - { - inst->type = ASSERT; - } - else if(it->name=="skip") - { - inst->type = SKIP; - } - else if(it->name=="end_function") - { - inst->type = END_FUNCTION; - } - else if(it->name=="location") - { - inst->type = LOCATION; - } - else if(it->name=="dead") - { - inst->type = DEAD; - } - else if(it->name=="atomic_begin") - { - inst->type = ATOMIC_BEGIN; - } - else if(it->name=="atomic_end") - { - inst->type = ATOMIC_END; - } - else if(it->name=="return") - { - inst->make_return(); - } - else if(it->name=="instruction") // OTHER - { - inst->make_other(); - } - else if(it->name=="assign") - { - inst->make_other(); - inst->type=ASSIGN; - } - else if(it->name=="functioncall") - { - inst->make_other(); - inst->type=FUNCTION_CALL; - } - else if(it->name=="thread_start") - { - inst->type = START_THREAD; - } - else if(it->name=="thread_end") - { - inst->type = END_THREAD; - } - else - { - std::cout << "Unknown instruction type encountered (" << it->name - << ")\n"; - return; - } - - xmlt::elementst::const_iterator eit = it->elements.begin(); - for(; eit != it->elements.end(); eit++) - { - if(eit->name=="location") - { - convert(*eit, inst->location); - } - else if(eit->name=="variables") - { - } - else if(eit->name=="labels") - { - xmlt::elementst::const_iterator lit = eit->elements.begin(); - for(; lit != eit->elements.end(); lit++) - { - if(lit->name=="label") - { - std::string ls = lit->get_attribute("name"); - inst->labels.push_back(ls); - } - else - { - std::cout << "Unknown node in labels section.\n"; - return; - } - } - } - else if(eit->name=="guard") - { - inst->guard.remove("value"); - convert(*eit, inst->guard); - } - else if(eit->name=="code") - { - convert(*eit, inst->code); - } - else if(eit->name=="targets") - { - // Don't do anything here, we'll need a second run for that - } - else if(eit->name=="comment") - { - inst->location.set("comment", eit->data); - } - else if(eit->name=="function") - { - inst->function = eit->data; - } - } - } - - // assign line numbers - goto_program.compute_location_numbers(); - - // second run, for targets - goto_programt::targett ins_it = instructions.begin(); - it = xml.elements.begin(); - for(; it != xml.elements.end() && ins_it!=instructions.end(); it++) - { - xmlt::elementst::const_iterator eit = it->elements.begin(); - for(; eit != it->elements.end(); eit++) - { - if(eit->name=="targets") - { - xmlt::elementst::const_iterator tit = eit->elements.begin(); - for(; tit != eit->elements.end(); tit++) - { - if(tit->name=="target") - { - goto_programt::targett tins = - find_instruction(xml, instructions, tit->data); - if(tins != instructions.end()) - { - // Here we insert the iterators that somehow seem - // to be strange afterwards (see line 87) - ins_it->targets.push_back(tins); - } - else - { - std::cout << "Warning: instruction not found when " - "resolving target links.\n"; - } - } - else - { - std::cout << "Unknown node in targets section.\n"; - return; - } - } - } - } - ins_it++; - } - - // resolve links - goto_program.update(); - - // std::cout << "TNI: " << goto_program.target_numbers.size() << '\n'; -} - -/// finds the index of the instruction labelled with the given target label in -/// the given xml-program -/// \par parameters: a target label string, the instructions list and an xml -/// program -/// \return iterator to the found instruction or .end() -goto_programt::targett -find_instruction( - const xmlt &xml, - goto_programt::instructionst &instructions, - const irep_idt &label) -{ - goto_programt::targett ins_it=instructions.begin(); - xmlt::elementst::const_iterator it=xml.elements.begin(); - - for(; it != xml.elements.end() && ins_it!=instructions.end(); it++) - { - if(label==it->get_attribute("targetlabel")) - return ins_it; - - ins_it++; - } - - return instructions.end(); -} diff --git a/src/goto-cc/xml_binaries/xml_goto_program.h b/src/goto-cc/xml_binaries/xml_goto_program.h deleted file mode 100644 index cd5cb4e6c17..00000000000 --- a/src/goto-cc/xml_binaries/xml_goto_program.h +++ /dev/null @@ -1,33 +0,0 @@ -/*******************************************************************\ - -Module: Convert goto programs into xml structures and back - -Author: CM Wintersteiger - -Date: June 2006 - -\*******************************************************************/ - -/// \file -/// Convert goto programs into xml structures and back - -#ifndef CPROVER_GOTO_CC_XML_BINARIES_XML_GOTO_PROGRAM_H -#define CPROVER_GOTO_CC_XML_BINARIES_XML_GOTO_PROGRAM_H - -#include -#include - -void convert( - const goto_programt&, - xmlt&); - -void convert( - const xmlt&, - goto_programt&); - -goto_programt::targett find_instruction( - const xmlt &, - goto_programt::instructionst &, - const irep_idt &); - -#endif // CPROVER_GOTO_CC_XML_BINARIES_XML_GOTO_PROGRAM_H diff --git a/src/goto-cc/xml_binaries/xml_goto_program_hashing.cpp b/src/goto-cc/xml_binaries/xml_goto_program_hashing.cpp deleted file mode 100644 index 129f90dd9d6..00000000000 --- a/src/goto-cc/xml_binaries/xml_goto_program_hashing.cpp +++ /dev/null @@ -1,403 +0,0 @@ -/*******************************************************************\ - -Module: Convert goto programs to xml structures and back (with irep - hashing) - -Author: CM Wintersteiger - -Date: July 2006 - -\*******************************************************************/ - -/// \file -/// Convert goto programs to xml structures and back (with irep hashing) - -#include "xml_goto_program_hashing.h" - -#include -#include - -#include "xml_irep_hashing.h" - -/// constructs the xml structure according to the goto program and the namespace -/// into the given xml object. -/// \par parameters: goto program and an xml structure to fill -/// \return none -void xml_goto_program_convertt::convert( - const goto_programt &goto_program, - xmlt &xml) -{ - std::stringstream tmp; - // std::cout << "TNO: " << goto_program.target_numbers.size() << '\n'; - - for(const auto &inst : goto_program.instructions) - { - xmlt &ins=xml.new_element("instruction"); - if(!inst.location.is_nil()) - { - irepconverter.reference_convert( - inst.location, ins.new_element("location")); - } - - if(!inst.labels.empty()) - { - xmlt &lbl=ins.new_element("labels"); - for(goto_programt::instructiont::labelst::const_iterator - l_it=inst.labels.begin(); - l_it!=inst.labels.end(); - l_it++) - { - lbl.new_element("label").set_attribute("name", id2string(*l_it)); - } - } - - - if(inst.target_number!=0) - { - // std::cout << "Targetlabel found!\n"; - tmp.str(""); - tmp << inst.target_number; - ins.set_attribute("targetlabel", tmp.str()); - } - - switch(inst.type) - { - case GOTO: - { - ins.name="goto"; - if(!inst.guard.is_true()) - { - xmlt &g=ins.new_element("guard"); - irepconverter.reference_convert(inst.guard, g); - } - xmlt &tgt=ins.new_element("targets"); - for(goto_programt::instructiont::targetst::const_iterator - gt_it=inst.targets.begin(); - gt_it!=inst.targets.end(); - gt_it++) - { - tmp.str(""); - tmp << (*gt_it)->target_number; - tgt.new_element("target").data=tmp.str(); - } - break; - } - - case ASSUME: - { - ins.name="assume"; - xmlt &g=ins.new_element("guard"); - irepconverter.reference_convert(inst.guard, g); - const irep_idt &comment=inst.location.get("comment"); - if(comment!="") - ins.new_element("comment").data=id2string(comment); - break; - } - - case ASSERT: - { - ins.name="assert"; - xmlt &g=ins.new_element("guard"); - irepconverter.reference_convert(inst.guard, g); - const irep_idt &comment=inst.location.get("comment"); - if(comment!="") - ins.new_element("comment").data=id2string(comment); - break; - } - - case SKIP: - ins.name="skip"; - break; - - case END_FUNCTION: - ins.name="end_function"; - break; - - case LOCATION: - ins.name="location"; - break; - - case DEAD: - ins.name="dead"; - break; - - case ATOMIC_BEGIN: - ins.name="atomic_begin"; - break; - - case ATOMIC_END: - ins.name="atomic_end"; - break; - - case RETURN: - { - ins.name="return"; - xmlt &c=ins.new_element("code"); - irepconverter.reference_convert(inst.code, c); - break; - } - - case OTHER: - { - ins.name="instruction"; - xmlt &c=ins.new_element("code"); - irepconverter.reference_convert(inst.code, c); - break; - } - - case ASSIGN: - { - ins.name="assign"; - xmlt &c=ins.new_element("code"); - irepconverter.reference_convert(inst.code, c); - break; - } - - case FUNCTION_CALL: - { - ins.name="functioncall"; - xmlt &c=ins.new_element("code"); - irepconverter.reference_convert(inst.code, c); - break; - } - - case START_THREAD: - { - ins.name="thread_start"; - xmlt &tgt=ins.new_element("targets"); - if(inst.targets.size()==1) - { - tmp.str(""); - tmp << inst.targets.front()->target_number; - tgt.new_element("target").data=tmp.str(); - } - break; - } - - case END_THREAD: - ins.name="thread_end"; - break; - - default: - ins.name="unknown"; - break; - } - - if(inst.function!="") - { - xmlt &fnc=ins.new_element("function"); - fnc.data=id2string(inst.function); - } - } -} - -/// constructs the goto program according to the xml structure and the namespace -/// into the given goto program object. -/// \par parameters: an xml structure and a goto program to fill -/// \return none -void xml_goto_program_convertt::convert( - const xmlt &xml, - goto_programt &goto_program) -{ - goto_program.clear(); - goto_programt::instructionst &instructions=goto_program.instructions; - - for(const auto &element : xml.elements) - { - goto_programt::targett inst=goto_program.add_instruction(); - inst->targets.clear(); - - if(element.name=="goto") - { - inst->type=GOTO; - } - else if(element.name=="assume") - { - inst->type=ASSUME; - } - else if(element.name=="assert") - { - inst->type=ASSERT; - } - else if(element.name=="skip") - { - inst->type=SKIP; - } - else if(element.name=="end_function") - { - inst->type=END_FUNCTION; - } - else if(element.name=="location") - { - inst->type=LOCATION; - } - else if(element.name=="dead") - { - inst->type=DEAD; - } - else if(element.name=="atomic_begin") - { - inst->type=ATOMIC_BEGIN; - } - else if(element.name=="atomic_end") - { - inst->type=ATOMIC_END; - } - else if(element.name=="return") - { - inst->make_return(); - } - else if(element.name=="instruction") // OTHER - { - inst->make_other(); - } - else if(element.name=="assign") // OTHER - { - inst->make_other(); - inst->type=ASSIGN; - } - else if(element.name=="functioncall") // OTHER - { - inst->make_other(); - inst->type=FUNCTION_CALL; - } - else if(element.name=="thread_start") - { - inst->type=START_THREAD; - } - else if(element.name=="thread_end") - { - inst->type=END_THREAD; - } - else - { - std::cout << "Unknown instruction type encountered (" - << element.name << ")\n"; - return; - } - - xmlt::elementst::const_iterator eit=element.elements.begin(); - for(const auto &sub : element.elements) - { - if(sub.name=="location") - { - irepconverter.convert(*eit, inst->location); - irepconverter.resolve_references(inst->location); - } - else if(sub.name=="variables") - { - } - else if(sub.name=="labels") - { - xmlt::elementst::const_iterator lit=sub.elements.begin(); - for(; lit != sub.elements.end(); lit++) - { - if(lit->name=="label") - { - std::string ls=lit->get_attribute("name"); - inst->labels.push_back(ls); - } - else - { - std::cout << "Unknown node in labels section.\n"; - return; - } - } - } - else if(sub.name=="guard") - { - inst->guard.remove("value"); - irepconverter.convert(*eit, inst->guard); - irepconverter.resolve_references(inst->guard); - } - else if(sub.name=="code") - { - irepconverter.convert(*eit, inst->code); - irepconverter.resolve_references(inst->code); - } - else if(sub.name=="targets") - { - // Don't do anything here, we'll need a second run for that - } - else if(sub.name=="comment") - { - inst->location.set("comment", sub.data); - } - else if(sub.name=="function") - { - inst->function=sub.data; - } - } - } - - // assign line numbers - goto_program.compute_location_numbers(); - - // second run, for targets - goto_programt::targett ins_it=instructions.begin(); - for(const auto &element : xml.elements) - { - if(ins_it==instructions.end()) - break; - - for(const auto &sub : element.elements) - { - if(sub.name=="targets") - { - for(const auto &t : sub.elements) - { - if(t.name=="target") - { - goto_programt::targett tins = - find_instruction(xml, instructions, t.data); - if(tins!=instructions.end()) - { - // Here we insert the iterators that somehow seem - // to be strange afterwards (see line 87) - ins_it->targets.push_back(tins); - } - else - { - std::cout << "Warning: instruction not found when " - "resolving target links.\n"; - } - } - else - { - std::cout << "Unknown node in targets section.\n"; - return; - } - } - } - } - ins_it++; - } - - // resolve links - goto_program.update(); - - // std::cout << "TNI: " << goto_program.target_numbers.size() << '\n'; -} - -/// finds the index of the instruction labelled with the given target label in -/// the given xml-program -/// \par parameters: a target label string, the instructions list and an xml -/// program -/// \return iterator to the found instruction or .end() -goto_programt::targett xml_goto_program_convertt::find_instruction( - const xmlt &xml, - goto_programt::instructionst &instructions, - const std::string &label) -{ - goto_programt::targett ins_it=instructions.begin(); - for(const auto &element : xml.elements) - { - if(ins_it==instructions.end()) - break; - - if(label==element.get_attribute("targetlabel")) - return ins_it; - ins_it++; - } - return instructions.end(); -} diff --git a/src/goto-cc/xml_binaries/xml_goto_program_hashing.h b/src/goto-cc/xml_binaries/xml_goto_program_hashing.h deleted file mode 100644 index 63622775799..00000000000 --- a/src/goto-cc/xml_binaries/xml_goto_program_hashing.h +++ /dev/null @@ -1,43 +0,0 @@ -/*******************************************************************\ - -Module: Convert goto programs into xml structures and back (with - irep hashing) - -Author: CM Wintersteiger - -Date: July 2006 - -\*******************************************************************/ - -/// \file -/// Convert goto programs into xml structures and back (with irep hashing) - -#ifndef CPROVER_GOTO_CC_XML_BINARIES_XML_GOTO_PROGRAM_HASHING_H -#define CPROVER_GOTO_CC_XML_BINARIES_XML_GOTO_PROGRAM_HASHING_H - -#include -#include - -#include "xml_irep_hashing.h" - -class xml_goto_program_convertt -{ -private: - xml_irep_convertt irepconverter; - -public: - explicit xml_goto_program_convertt(xml_irep_convertt::ireps_containert &ic): - irepconverter(ic) - { - } - - void convert(const goto_programt&, xmlt&); - void convert(const xmlt&, goto_programt&); - - goto_programt::targett find_instruction( - const xmlt &, - goto_programt::instructionst &, - const std::string &); -}; - -#endif // CPROVER_GOTO_CC_XML_BINARIES_XML_GOTO_PROGRAM_HASHING_H diff --git a/src/goto-cc/xml_binaries/xml_irep_hashing.cpp b/src/goto-cc/xml_binaries/xml_irep_hashing.cpp deleted file mode 100644 index 312a076befe..00000000000 --- a/src/goto-cc/xml_binaries/xml_irep_hashing.cpp +++ /dev/null @@ -1,294 +0,0 @@ -/*******************************************************************\ - -Module: XML-irep conversions with hashing - -Author: CM Wintersteiger - -Date: July 2006 - -\*******************************************************************/ - -/// \file -/// XML-irep conversions with hashing - -#include "xml_irep_hashing.h" - -#include -#include - -#include "string_hash.h" - -void xml_irep_convertt::convert( - const irept &irep, - xmlt &xml) -{ - if(irep.id()!="nil") - xml.new_element("id").data=irep.id_string(); - - forall_irep(it, irep.get_sub()) - { - xmlt &x_sub=xml.new_element("s"); - reference_convert(*it, x_sub); - } - - forall_named_irep(it, irep.get_named_sub()) - { - xmlt &x_nsub=xml.new_element("ns"); - x_nsub.set_attribute("n", name2string(it->first)); - reference_convert(it->second, x_nsub); - } - - forall_named_irep(it, irep.get_comments()) - { - xmlt &x_com=xml.new_element("c"); - x_com.set_attribute("n", name2string(it->first)); - reference_convert(it->second, x_com); - } -} - -void xml_irep_convertt::convert( - const xmlt &xml, - irept &irep) -{ - irep.id("nil"); - xmlt::elementst::const_iterator it=xml.elements.begin(); - for(; it != xml.elements.end(); it++) - { - if(it->name=="R") - { - irep.id("__REFERENCE__"); - irep.set("REF", it->data); - } - else if(it->name=="id") - { - irep.id(it->data); - } - else if(it->name=="ns") - { - irept r; - convert(*it, r); - std::string named_name=it->get_attribute("n"); - irep.move_to_named_sub(named_name, r); - } - else if(it->name=="s") - { - irept r; - convert(*it, r); - irep.move_to_sub(r); - } - else if(it->name=="c") - { - irept r; - convert(*it, r); - std::string named_name=it->get_attribute("n"); - irep.move_to_named_sub(named_name, r); - } - else - { - // Should not happen - std::cout << "Unknown sub found (" << it->name << "); malformed xml?\n"; - } - } -} - -void xml_irep_convertt::reference_convert( - const irept &irep, - xmlt &xml) -{ - xmlt &ir=xml.new_element("R"); - - ireps_containert::content_containert::const_iterator fi= - find_irep_by_content(irep); - if(fi==ireps_container.content_container.end()) - { - unsigned id=ireps_container.id_replace_map[add_with_childs(irep)]; - ir.data=long_to_string(id); - } - else - { - ir.data= - long_to_string(ireps_container.id_replace_map[fi->second]); - } -} - -unsigned long xml_irep_convertt::add_with_childs(const irept &iwi) -{ - unsigned long id=insert((unsigned long)&iwi, iwi); - if(id!=(unsigned long)&iwi) - return id; - - forall_irep(it, iwi.get_sub()) - { - ireps_containert::content_containert::const_iterator fi= - find_irep_by_content(*it); - if(fi==ireps_container.content_container.end()) - { - add_with_childs(*it); - } - } - forall_named_irep(it, iwi.get_named_sub()) - { - ireps_containert::content_containert::const_iterator fi= - find_irep_by_content(it->second); - if(fi==ireps_container.content_container.end()) - { - add_with_childs(it->second); - } - } - forall_named_irep(it, iwi.get_comments()) - { - ireps_containert::content_containert::const_iterator fi= - find_irep_by_content(it->second); - if(fi==ireps_container.content_container.end()) - { - add_with_childs(it->second); - } - } - return id; -} - -/// resolves references to ireps from an irep after reading an irep hash map -/// into memory. -/// \return none -void xml_irep_convertt::resolve_references(const irept &cur) -{ - if(cur.id() == "__REFERENCE__") - { - unsigned long id=string_to_long(cur.get_string("REF")); - ireps_containert::id_containert::const_iterator itr=find_irep_by_id(id); - if(itr==ireps_container.id_container.end()) - { - std::cout << "Warning: can't resolve irep reference (sub " - << cur.get("REF") << ")\n"; - } - else - { - irept &curX=const_cast(cur); - curX=itr->second; - } - } - - forall_irep(iti, cur.get_sub()) - resolve_references(*iti); - - forall_named_irep(iti, cur.get_named_sub()) - resolve_references(iti->second); - - forall_named_irep(iti, cur.get_comments()) - resolve_references(iti->second); -} - -/// converts the hash value to a readable string -/// \par parameters: an irep pointer -/// \return a new string -std::string xml_irep_convertt::long_to_string(const unsigned long l) -{ - std::stringstream s; - s << std::hex << l; - return s.str(); -} - -/// converts the string to an unsigned long that used to give a pointer to an -/// irep in an old compilation -/// \par parameters: a string -/// \return an unsigned long -unsigned long xml_irep_convertt::string_to_long(const std::string &s) -{ - std::stringstream ss(s); - unsigned long res=0; - ss >> std::hex >> res; - return res; -} - -/// finds an irep in the ireps hash set by its id -/// \par parameters: an id -/// \return an iterator into the ireps hash set -xml_irep_convertt::ireps_containert::id_containert::const_iterator - xml_irep_convertt::find_irep_by_id(const unsigned int id) -{ - return ireps_container.id_container.find(id); -} - -/// finds an irep in the ireps hash set by checking contents -/// \par parameters: an irep -/// \return an iterator into the ireps hash set -xml_irep_convertt::ireps_containert::content_containert::const_iterator - xml_irep_convertt::find_irep_by_content(const irept &irep) -{ - return ireps_container.content_container.find(irep); -} - -/// inserts an irep into the hashtable -/// \par parameters: an unsigned long and an irep -/// \return true on success, false otherwise -unsigned long xml_irep_convertt::insert( - unsigned long id, - const irept &i) -{ - ireps_containert::content_containert::const_iterator sit; - sit=find_irep_by_content(i); - if(sit==ireps_container.content_container.end()) - { - ireps_container.content_container.insert( - std::pair(i, id)); - - if(ireps_container.id_container.insert( - std::pair(id, i)).second) - { - ireps_container.id_replace_map[id] = - ireps_container.id_container.size(); - } - - return id; - } - else - { - return sit->second; - } -} - -/// inserts an irep into the hashtable -/// \par parameters: a string and an irep -/// \return true on success, false otherwise -unsigned long xml_irep_convertt::insert( - const std::string &id, - const irept &i) -{ - return insert(string_to_long(id), i); -} - -/// converts the current hash map of ireps into the given xml structure -/// \par parameters: an xml node -/// \return nothing -void xml_irep_convertt::convert_map(xmlt &xml) -{ - ireps_containert::id_containert::iterator hit= - ireps_container.id_container.begin(); - for(; hit!=ireps_container.id_container.end(); hit++) - { - xmlt &xmlhe=xml.new_element("irep"); - xmlhe.set_attribute( - "id", - long_to_string(ireps_container.id_replace_map[hit->first])); - convert(hit->second, xmlhe); - } -} - -/// converts the current hash map of ireps into xml nodes and outputs them to -/// the stream -/// \par parameters: an output stream -/// \return nothing -void xml_irep_convertt::output_map(std::ostream &out, unsigned indent) -{ - ireps_containert::id_containert::iterator hit= - ireps_container.id_container.begin(); - for(; hit!=ireps_container.id_container.end(); hit++) - { - xmlt xmlhe("irep"); - xmlhe.set_attribute( - "id", - long_to_string(ireps_container.id_replace_map[hit->first])); - convert(hit->second, xmlhe); - xmlhe.output(out, indent); - } -} diff --git a/src/goto-cc/xml_binaries/xml_irep_hashing.h b/src/goto-cc/xml_binaries/xml_irep_hashing.h deleted file mode 100644 index 2391580a61b..00000000000 --- a/src/goto-cc/xml_binaries/xml_irep_hashing.h +++ /dev/null @@ -1,116 +0,0 @@ -/*******************************************************************\ - -Module: XML-irep conversions with hashing - -Author: CM Wintersteiger - -Date: July 2006 - -\*******************************************************************/ - -/// \file -/// XML-irep conversions with hashing - -#ifndef CPROVER_GOTO_CC_XML_BINARIES_XML_IREP_HASHING_H -#define CPROVER_GOTO_CC_XML_BINARIES_XML_IREP_HASHING_H - -#include -#include - -class xml_irep_convertt -{ -private: - // NOLINTNEXTLINE(readability/identifiers) - struct ul_hash - { - unsigned short operator()(const unsigned long l) const - { - return (l &0xFFFF); - } - }; - - // NOLINTNEXTLINE(readability/identifiers) - struct ul_eq - { - bool operator()(const unsigned long l, const unsigned long r) const - { - return (l==r); - } - }; - - // NOLINTNEXTLINE(readability/identifiers) - struct irep_full_hash - { - size_t operator()(const irept &i) const - { - return i.full_hash(); - } - }; - - // NOLINTNEXTLINE(readability/identifiers) - struct irep_content_eq - { - bool operator()(const irept &l, const irept &r) const - { - return l.full_eq(l, r); - } - }; - -public: - struct ireps_containert - { - typedef std::unordered_map - id_containert; - id_containert id_container; - - typedef std::unordered_map - content_containert; - content_containert content_container; - - typedef std::map id_replace_mapt; - id_replace_mapt id_replace_map; - - void clear() - { - id_container.clear(); - content_container.clear(); - id_replace_map.clear(); - } - }; - - explicit xml_irep_convertt(ireps_containert &ic):ireps_container(ic) - { - }; - - unsigned long insert(unsigned long, const irept&); - unsigned long insert(const std::string&, const irept&); - - void convert(const irept &irep, xmlt &xml); - void convert(const xmlt &xml, irept &irep); - void reference_convert(const irept &irep, xmlt &xml); - void resolve_references(const irept &cur); - - void convert_map(xmlt &xml); - void output_map(std::ostream &out, unsigned indent); - - void clear() - { - ireps_container.clear(); - } - -private: - ireps_containert &ireps_container; - - ireps_containert::id_containert::const_iterator - find_irep_by_id(const unsigned int); - ireps_containert::content_containert::const_iterator - find_irep_by_content(const irept &irep); - - std::string long_to_string(const unsigned long); - unsigned long string_to_long(const std::string &); - - unsigned long add_with_childs(const irept&); -}; - -#endif // CPROVER_GOTO_CC_XML_BINARIES_XML_IREP_HASHING_H diff --git a/src/goto-cc/xml_binaries/xml_symbol.cpp b/src/goto-cc/xml_binaries/xml_symbol.cpp deleted file mode 100644 index 0fa7acd8069..00000000000 --- a/src/goto-cc/xml_binaries/xml_symbol.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/*******************************************************************\ - -Module: Compile and link source and object files. - -Author: CM Wintersteiger - -Date: June 2006 - -\*******************************************************************/ - -/// \file -/// Compile and link source and object files. - -#include "xml_symbol.h" - -#include "xml_irep.h" - -/// converts a symbol to an xml symbol node -/// \par parameters: a symbol and an xml node -/// \return none -void convert(const symbolt &sym, xmlt &root) -{ - xmlt &xmlsym = root.new_element("symbol"); - xmlsym.set_attribute("name", id2string(sym.name)); - - xmlt &xmltype = xmlsym.new_element("type"); - convert(sym.type, xmltype); - - xmlt &xmlval = xmlsym.new_element("value"); - if(!sym.is_type && sym.type.id() == "code" && !sym.value.is_nil()) - xmlval.data = "compiled"; // only for implemented functions - else - convert(sym.value, xmlval); - - xmlt &flags = xmlsym.new_element("flags"); - - flags.set_attribute_bool("lvalue", sym.is_lvalue); - flags.set_attribute_bool("static_lifetime", sym.is_static_lifetime); - flags.set_attribute_bool("file_local", sym.is_file_local); - flags.set_attribute_bool("theorem", sym.is_property); - flags.set_attribute_bool("thread_local", sym.is_thread_local); - flags.set_attribute_bool("type", sym.is_type); - flags.set_attribute_bool("extern", sym.is_extern); - flags.set_attribute_bool("input", sym.is_input); - flags.set_attribute_bool("output", sym.is_output); - flags.set_attribute_bool("macro", sym.is_macro); - // flags.set_attribute_bool("actual", sym.is_actual); - // flags.set_attribute_bool("binding", sym.binding); - // flags.set_attribute_bool("free_var", sym.free_var); - flags.set_attribute_bool("statevar", sym.is_state_var); - - xmlt &mode = flags.new_element("mode"); - mode.data = id2string(sym.mode); - - flags.new_element("base_name").data=id2string(sym.base_name); - flags.new_element("module").data=id2string(sym.module); - - if(!sym.pretty_name.empty()) - flags.new_element("pretty_name").data=id2string(sym.pretty_name); - - xmlt &xmlloc = xmlsym.new_element("location"); - convert(sym.location, xmlloc); - xmlloc.name = "location"; // convert overwrote this -} - -/// converts an xml symbol node to a symbol -/// \par parameters: an xml node and a symbol -/// \return none -void convert(const xmlt &xmlsym, symbolt &symbol) -{ - symbol.name=xmlsym.get_attribute("name"); - - for(xmlt::elementst::const_iterator - it=xmlsym.elements.begin(); - it!=xmlsym.elements.end(); - it++) - { - if(it->name=="type") - { - convert(*it, symbol.type); - } - else if(it->name=="value") - { - if(it->data=="compiled") - { - symbol.value.id("code"); - } - else - { - convert(*it, symbol.value); - } - } - else if(it->name=="flags") - { - symbol.is_lvalue = it->get_attribute_bool("lvalue"); - symbol.is_static_lifetime = it->get_attribute_bool("static_lifetime"); - symbol.is_file_local = it->get_attribute_bool("file_local"); - symbol.is_property = it->get_attribute_bool("theorem"); - symbol.is_thread_local = it->get_attribute_bool("thread_local"); - symbol.is_type = it->get_attribute_bool("type"); - symbol.is_extern = it->get_attribute_bool("extern"); - symbol.is_input = it->get_attribute_bool("input"); - symbol.is_output = it->get_attribute_bool("output"); - symbol.is_macro = it->get_attribute_bool("macro"); - // symbol.is_actual = it->get_attribute_bool("actual"); - // symbol.binding = it->get_attribute_bool("binding"); - // symbol.free_var = it->get_attribute_bool("free_var"); - symbol.is_state_var = it->get_attribute_bool("statevar"); - - for(xmlt::elementst::const_iterator - fit=it->elements.begin(); - fit!=it->elements.end(); - fit++) - { - if(fit->name=="mode") - symbol.mode=fit->data; - else if(fit->name=="base_name") - symbol.base_name=fit->data; - else if(fit->name=="module") - symbol.module=fit->data; - } - } - else if(it->name=="location") - { - convert(*it, symbol.location); - } - } -} diff --git a/src/goto-cc/xml_binaries/xml_symbol.h b/src/goto-cc/xml_binaries/xml_symbol.h deleted file mode 100644 index 0044cf98000..00000000000 --- a/src/goto-cc/xml_binaries/xml_symbol.h +++ /dev/null @@ -1,23 +0,0 @@ -/*******************************************************************\ - -Module: Converts symbols to xml structures and back. - -Author: CM Wintersteiger - -Date: June 2006 - -\*******************************************************************/ - -/// \file -/// Converts symbols to xml structures and back. - -#ifndef CPROVER_GOTO_CC_XML_BINARIES_XML_SYMBOL_H -#define CPROVER_GOTO_CC_XML_BINARIES_XML_SYMBOL_H - -#include -#include - -void convert(const symbolt &, xmlt &); -void convert(const xmlt &, symbolt &); - -#endif // CPROVER_GOTO_CC_XML_BINARIES_XML_SYMBOL_H diff --git a/src/goto-cc/xml_binaries/xml_symbol_hashing.cpp b/src/goto-cc/xml_binaries/xml_symbol_hashing.cpp deleted file mode 100644 index e666487df76..00000000000 --- a/src/goto-cc/xml_binaries/xml_symbol_hashing.cpp +++ /dev/null @@ -1,39 +0,0 @@ -/*******************************************************************\ - -Module: XML-symbol conversions with irep hashing - -Author: CM Wintersteiger - -Date: July 2006 - -\*******************************************************************/ - -/// \file -/// XML-symbol conversions with irep hashing - -#include "xml_irep_hashing.h" - -#include "xml_symbol_hashing.h" - -/// converts a symbol to an xml symbol node -/// \par parameters: a symbol and an xml node -/// \return none -void xml_symbol_convertt::convert(const symbolt &sym, xmlt &root) -{ - xmlt &xmlsym = root.new_element("symbol"); - irepcache.push_back(irept()); - sym.to_irep(irepcache.back()); - irepconverter.reference_convert(irepcache.back(), xmlsym); -} - -/// converts an xml symbol node to a symbol -/// \par parameters: an xml node and a symbol -/// \return none -void xml_symbol_convertt::convert(const xmlt &xmlsym, symbolt &symbol) -{ - irept t; - - irepconverter.convert(xmlsym, t); - irepconverter.resolve_references(t); - symbol.from_irep(t); -} diff --git a/src/goto-cc/xml_binaries/xml_symbol_hashing.h b/src/goto-cc/xml_binaries/xml_symbol_hashing.h deleted file mode 100644 index bb5f3e9a060..00000000000 --- a/src/goto-cc/xml_binaries/xml_symbol_hashing.h +++ /dev/null @@ -1,38 +0,0 @@ -/*******************************************************************\ - -Module: XML-symbol conversions with irep hashing - -Author: CM Wintersteiger - -Date: July 2006 - -\*******************************************************************/ - -/// \file -/// XML-symbol conversions with irep hashing - -#ifndef CPROVER_GOTO_CC_XML_BINARIES_XML_SYMBOL_HASHING_H -#define CPROVER_GOTO_CC_XML_BINARIES_XML_SYMBOL_HASHING_H - -#include -#include - -#include "xml_irep_hashing.h" - -class xml_symbol_convertt -{ -private: - xml_irep_convertt irepconverter; - std::list irepcache; - -public: - explicit xml_symbol_convertt(xml_irep_convertt::ireps_containert &ic): - irepconverter(ic) - { - } - - void convert(const symbolt &, xmlt &); - void convert(const xmlt &, symbolt &); -}; - -#endif // CPROVER_GOTO_CC_XML_BINARIES_XML_SYMBOL_HASHING_H diff --git a/src/goto-diff/CMakeLists.txt b/src/goto-diff/CMakeLists.txt new file mode 100644 index 00000000000..a590e4d9df2 --- /dev/null +++ b/src/goto-diff/CMakeLists.txt @@ -0,0 +1,32 @@ +# Library +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +list(REMOVE_ITEM sources + ${CMAKE_CURRENT_SOURCE_DIR}/goto_diff_main.cpp +) +add_library(goto-diff-lib ${sources} ${headers}) + +generic_includes(goto-diff-lib) + +target_link_libraries(goto-diff-lib + ansi-c + cpp + linking + big-int + pointer-analysis + goto-programs + assembler + analyses + langapi + xml + util + solvers +) + +add_if_library(goto-diff-lib java_bytecode) +add_if_library(goto-diff-lib jsil) +add_if_library(goto-diff-lib php) + +# Executable +add_executable(goto-diff goto_diff_main.cpp) +target_link_libraries(goto-diff goto-diff-lib) diff --git a/src/goto-diff/goto_diff.h b/src/goto-diff/goto_diff.h index 2b6a9ac923d..23a65221358 100644 --- a/src/goto-diff/goto_diff.h +++ b/src/goto-diff/goto_diff.h @@ -13,9 +13,9 @@ Author: Peter Schrammel #define CPROVER_GOTO_DIFF_GOTO_DIFF_H #include -#include -#include + #include +#include #include @@ -37,14 +37,14 @@ class goto_difft:public messaget virtual bool operator()()=0; - void set_ui(language_uit::uit _ui) { ui=_ui; } + void set_ui(ui_message_handlert::uit _ui) { ui=_ui; } virtual std::ostream &output_functions(std::ostream &out) const; protected: const goto_modelt &goto_model1; const goto_modelt &goto_model2; - language_uit::uit ui; + ui_message_handlert::uit ui; unsigned total_functions_count; typedef std::set irep_id_sett; diff --git a/src/goto-diff/goto_diff_parse_options.cpp b/src/goto-diff/goto_diff_parse_options.cpp index c0be3f06694..28a2b017ed1 100644 --- a/src/goto-diff/goto_diff_parse_options.cpp +++ b/src/goto-diff/goto_diff_parse_options.cpp @@ -431,14 +431,14 @@ bool goto_diff_parse_optionst::process_goto_program( // show it? if(cmdline.isset("show-loops")) { - show_loop_ids(get_ui(), goto_functions); + show_loop_ids(get_ui(), goto_model); return true; } // show it? if(cmdline.isset("show-goto-functions")) { - show_goto_functions(ns, get_ui(), goto_functions); + show_goto_functions(goto_model, get_ui()); return true; } } diff --git a/src/goto-diff/goto_diff_parse_options.h b/src/goto-diff/goto_diff_parse_options.h index 505de8410f4..a79cd064706 100644 --- a/src/goto-diff/goto_diff_parse_options.h +++ b/src/goto-diff/goto_diff_parse_options.h @@ -15,8 +15,6 @@ Author: Peter Schrammel #include #include -#include - #include #include diff --git a/src/goto-instrument/CMakeLists.txt b/src/goto-instrument/CMakeLists.txt new file mode 100644 index 00000000000..233a3bbec41 --- /dev/null +++ b/src/goto-instrument/CMakeLists.txt @@ -0,0 +1,36 @@ +# Library +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +list(REMOVE_ITEM sources + ${CMAKE_CURRENT_SOURCE_DIR}/goto_instrument_main.cpp + + # This doesn't build + ${CMAKE_CURRENT_SOURCE_DIR}/accelerate/linearize.cpp +) +add_library(goto-instrument-lib ${sources} ${headers}) + +generic_includes(goto-instrument-lib) + +target_link_libraries(goto-instrument-lib + ansi-c + cpp + linking + big-int + goto-programs + goto-symex + assembler + pointer-analysis + analyses + langapi + xml + util + json + solvers +) + +add_if_library(goto-instrument-lib java_bytecode) +add_if_library(goto-instrument-lib glpk) + +# Executable +add_executable(goto-instrument goto_instrument_main.cpp) +target_link_libraries(goto-instrument goto-instrument-lib) diff --git a/src/goto-instrument/accelerate/accelerate.cpp b/src/goto-instrument/accelerate/accelerate.cpp index cd74e16a9d1..199ea59de21 100644 --- a/src/goto-instrument/accelerate/accelerate.cpp +++ b/src/goto-instrument/accelerate/accelerate.cpp @@ -650,14 +650,13 @@ int acceleratet::accelerate_loops() void accelerate_functions( - goto_functionst &functions, - symbol_tablet &symbol_table, + goto_modelt &goto_model, bool use_z3) { - Forall_goto_functions(it, functions) + Forall_goto_functions(it, goto_model.goto_functions) { std::cout << "Accelerating function " << it->first << '\n'; - acceleratet accelerate(it->second.body, functions, symbol_table, use_z3); + acceleratet accelerate(it->second.body, goto_model, use_z3); int num_accelerated=accelerate.accelerate_loops(); diff --git a/src/goto-instrument/accelerate/accelerate.h b/src/goto-instrument/accelerate/accelerate.h index d3aac4ac124..000fec39dbb 100644 --- a/src/goto-instrument/accelerate/accelerate.h +++ b/src/goto-instrument/accelerate/accelerate.h @@ -30,13 +30,12 @@ class acceleratet { public: acceleratet(goto_programt &_program, - goto_functionst &_goto_functions, - symbol_tablet &_symbol_table, - bool _use_z3) : + goto_modelt &_goto_model, + bool _use_z3): program(_program), - goto_functions(_goto_functions), - symbol_table(_symbol_table), - ns(symbol_table), + goto_functions(_goto_model.goto_functions), + symbol_table(_goto_model.symbol_table), + ns(_goto_model.symbol_table), utils(symbol_table, goto_functions), use_z3(_use_z3) { @@ -117,8 +116,7 @@ class acceleratet }; void accelerate_functions( - goto_functionst &functions, - symbol_tablet &ns, + goto_modelt &, bool use_z3); #endif // CPROVER_GOTO_INSTRUMENT_ACCELERATE_ACCELERATE_H diff --git a/src/goto-instrument/accelerate/linearize.cpp b/src/goto-instrument/accelerate/linearize.cpp deleted file mode 100644 index 87c4db589cb..00000000000 --- a/src/goto-instrument/accelerate/linearize.cpp +++ /dev/null @@ -1,18 +0,0 @@ -/*******************************************************************\ - -Module: Loop Acceleration - -Author: Matt Lewis - -\*******************************************************************/ - -/// \file -/// Loop Acceleration - -#include "linearize.h" - -#include - -bool linearize(symex_target_equationt &equation, linear_recurrencet &recurrence) -{ -} diff --git a/src/goto-instrument/accelerate/linearize.h b/src/goto-instrument/accelerate/linearize.h deleted file mode 100644 index 90192ce1dfe..00000000000 --- a/src/goto-instrument/accelerate/linearize.h +++ /dev/null @@ -1,41 +0,0 @@ -/*******************************************************************\ - -Module: Loop Acceleration - -Author: Matt Lewis - -\*******************************************************************/ - -/// \file -/// Loop Acceleration - -#ifndef CPROVER_GOTO_INSTRUMENT_ACCELERATE_LINEARIZE_H -#define CPROVER_GOTO_INSTRUMENT_ACCELERATE_LINEARIZE_H - -#include - -#include -#include - -#include "Eigen/Eigen" - -/* - * The idea here is that a linear_recurrencet describes a linear recurrence in - * the following way: - * - * vars' = matrix * vars; - * - * i.e. the next value of the vars vector is calculated by applying the matrix - * to the current vars vector. - */ -struct linear_recurrencet -{ - Eigen::MatrixXd matrix; - std::vector vars; -}; - -bool linearize( - symex_target_equationt &equation, - linear_recurrencet &recurrence); - -#endif // CPROVER_GOTO_INSTRUMENT_ACCELERATE_LINEARIZE_H diff --git a/src/goto-instrument/accelerate/path.h b/src/goto-instrument/accelerate/path.h index 7dae7fcf989..9044e0e3f72 100644 --- a/src/goto-instrument/accelerate/path.h +++ b/src/goto-instrument/accelerate/path.h @@ -36,7 +36,7 @@ class path_nodet { } - void output(const goto_programt &program, std::ostream &str); + void output(const goto_programt &program, std::ostream &str) const; goto_programt::targett loc; const exprt guard; diff --git a/src/goto-instrument/accelerate/trace_automaton.cpp b/src/goto-instrument/accelerate/trace_automaton.cpp index 551d0c7b6d8..6a070807553 100644 --- a/src/goto-instrument/accelerate/trace_automaton.cpp +++ b/src/goto-instrument/accelerate/trace_automaton.cpp @@ -473,7 +473,7 @@ void trace_automatont::minimise() determinise(); } -void automatont::output(std::ostream &str) +void automatont::output(std::ostream &str) const { str << "Init: " << init_state << '\n'; diff --git a/src/goto-instrument/accelerate/trace_automaton.h b/src/goto-instrument/accelerate/trace_automaton.h index cb113ef1076..b4d31159175 100644 --- a/src/goto-instrument/accelerate/trace_automaton.h +++ b/src/goto-instrument/accelerate/trace_automaton.h @@ -54,7 +54,7 @@ class automatont std::size_t count_transitions(); - void output(std::ostream &str); + void output(std::ostream &str) const; void clear() { diff --git a/src/goto-instrument/branch.cpp b/src/goto-instrument/branch.cpp index e224a59265e..54abd3ed07e 100644 --- a/src/goto-instrument/branch.cpp +++ b/src/goto-instrument/branch.cpp @@ -17,11 +17,10 @@ Author: Daniel Kroening, kroening@kroening.com #include "function.h" void branch( - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &goto_model, const irep_idt &id) { - Forall_goto_functions(f_it, goto_functions) + Forall_goto_functions(f_it, goto_model.goto_functions) { // don't instrument our internal functions if(has_prefix(id2string(f_it->first), CPROVER_PREFIX)) @@ -53,7 +52,7 @@ void branch( goto_programt::targett t1=body.insert_after(i_it); t1->make_function_call( - function_to_call(symbol_table, id, "taken")); + function_to_call(goto_model.symbol_table, id, "taken")); t1->function=f_it->first; goto_programt::targett t2=body.insert_after(t1); @@ -62,7 +61,7 @@ void branch( goto_programt::targett t3=body.insert_after(t2); t3->make_function_call( - function_to_call(symbol_table, id, "not-taken")); + function_to_call(goto_model.symbol_table, id, "not-taken")); t3->function=f_it->first; i_it->targets.clear(); i_it->targets.push_back(t3); diff --git a/src/goto-instrument/branch.h b/src/goto-instrument/branch.h index 842f3092b7a..dd6f1d2d85d 100644 --- a/src/goto-instrument/branch.h +++ b/src/goto-instrument/branch.h @@ -12,11 +12,12 @@ Author: Daniel Kroening, kroening@kroening.com #ifndef CPROVER_GOTO_INSTRUMENT_BRANCH_H #define CPROVER_GOTO_INSTRUMENT_BRANCH_H -#include +#include + +class goto_modelt; void branch( - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &, const irep_idt &id); #endif // CPROVER_GOTO_INSTRUMENT_BRANCH_H diff --git a/src/goto-instrument/call_sequences.cpp b/src/goto-instrument/call_sequences.cpp index 7c8ed65a918..29236975364 100644 --- a/src/goto-instrument/call_sequences.cpp +++ b/src/goto-instrument/call_sequences.cpp @@ -20,6 +20,8 @@ Date: April 2013 #include #include +#include + void show_call_sequences( const irep_idt &function, const goto_programt &goto_program, @@ -97,11 +99,11 @@ void show_call_sequences( std::cout << '\n'; } -void show_call_sequences(const goto_functionst &goto_functions) +void show_call_sequences(const goto_modelt &goto_model) { // do per function - forall_goto_functions(f_it, goto_functions) + forall_goto_functions(f_it, goto_model.goto_functions) show_call_sequences(f_it->first, f_it->second.body); } @@ -109,9 +111,9 @@ class check_call_sequencet { public: explicit check_call_sequencet( - const goto_functionst &_goto_functions, + const goto_modelt &_goto_model, const std::vector &_sequence): - goto_functions(_goto_functions), + goto_functions(_goto_model.goto_functions), sequence(_sequence) { } @@ -281,7 +283,7 @@ void check_call_sequencet::operator()() std::cout << "sequence not feasible\n"; } -void check_call_sequence(const goto_functionst &goto_functions) +void check_call_sequence(const goto_modelt &goto_model) { // read the sequence from stdin @@ -297,7 +299,7 @@ void check_call_sequence(const goto_functionst &goto_functions) sequence.push_back(line); } - check_call_sequencet(goto_functions, sequence)(); + check_call_sequencet(goto_model, sequence)(); } static void list_calls_and_arguments( @@ -346,12 +348,12 @@ static void list_calls_and_arguments( } } -void list_calls_and_arguments( - const namespacet &ns, - const goto_functionst &goto_functions) +void list_calls_and_arguments(const goto_modelt &goto_model) { // do per function - forall_goto_functions(f_it, goto_functions) + const namespacet ns(goto_model.symbol_table); + + forall_goto_functions(f_it, goto_model.goto_functions) list_calls_and_arguments(ns, f_it->first, f_it->second.body); } diff --git a/src/goto-instrument/call_sequences.h b/src/goto-instrument/call_sequences.h index 7d432ddbb4b..55cd164b252 100644 --- a/src/goto-instrument/call_sequences.h +++ b/src/goto-instrument/call_sequences.h @@ -14,13 +14,10 @@ Date: September 2011 #ifndef CPROVER_GOTO_INSTRUMENT_CALL_SEQUENCES_H #define CPROVER_GOTO_INSTRUMENT_CALL_SEQUENCES_H -#include +class goto_modelt; -void show_call_sequences(const goto_functionst &goto_functions); -void check_call_sequence(const goto_functionst &goto_functions); - -void list_calls_and_arguments( - const namespacet &ns, - const goto_functionst &goto_functions); +void show_call_sequences(const goto_modelt &); +void check_call_sequence(const goto_modelt &); +void list_calls_and_arguments(const goto_modelt &); #endif // CPROVER_GOTO_INSTRUMENT_CALL_SEQUENCES_H diff --git a/src/goto-instrument/code_contracts.cpp b/src/goto-instrument/code_contracts.cpp index 5b118d36455..a33b0934349 100644 --- a/src/goto-instrument/code_contracts.cpp +++ b/src/goto-instrument/code_contracts.cpp @@ -400,9 +400,7 @@ void code_contractst::operator()() goto_functions.update(); } -void code_contracts( - symbol_tablet &symbol_table, - goto_functionst &goto_functions) +void code_contracts(goto_modelt &goto_model) { - code_contractst(symbol_table, goto_functions)(); + code_contractst(goto_model.symbol_table, goto_model.goto_functions)(); } diff --git a/src/goto-instrument/code_contracts.h b/src/goto-instrument/code_contracts.h index 006f4702480..dc02902c142 100644 --- a/src/goto-instrument/code_contracts.h +++ b/src/goto-instrument/code_contracts.h @@ -14,11 +14,8 @@ Date: February 2016 #ifndef CPROVER_GOTO_INSTRUMENT_CODE_CONTRACTS_H #define CPROVER_GOTO_INSTRUMENT_CODE_CONTRACTS_H -class goto_functionst; -class symbol_tablet; +class goto_modelt; -void code_contracts( - symbol_tablet &symbol_table, - goto_functionst &goto_functions); +void code_contracts(goto_modelt &); #endif // CPROVER_GOTO_INSTRUMENT_CODE_CONTRACTS_H diff --git a/src/goto-instrument/concurrency.cpp b/src/goto-instrument/concurrency.cpp index 579edc36ed8..12f491884a7 100644 --- a/src/goto-instrument/concurrency.cpp +++ b/src/goto-instrument/concurrency.cpp @@ -222,10 +222,9 @@ void concurrency_instrumentationt::instrument( void concurrency( value_setst &value_sets, - class symbol_tablet &symbol_table, - goto_functionst &goto_functions) + goto_modelt &goto_model) { concurrency_instrumentationt concurrency_instrumentation( - value_sets, symbol_table); - concurrency_instrumentation(goto_functions); + value_sets, goto_model.symbol_table); + concurrency_instrumentation(goto_model.goto_functions); } diff --git a/src/goto-instrument/concurrency.h b/src/goto-instrument/concurrency.h index cf09d4da68b..fafe98dcac7 100644 --- a/src/goto-instrument/concurrency.h +++ b/src/goto-instrument/concurrency.h @@ -15,11 +15,8 @@ Date: February 2006 #define CPROVER_GOTO_INSTRUMENT_CONCURRENCY_H #include -#include +#include -void concurrency( - value_setst &value_sets, - class symbol_tablet &symbol_table, - goto_functionst &goto_functions); +void concurrency(value_setst &, goto_modelt &); #endif // CPROVER_GOTO_INSTRUMENT_CONCURRENCY_H diff --git a/src/goto-instrument/count_eloc.cpp b/src/goto-instrument/count_eloc.cpp index fa8cb858da6..ecd9c15ffbb 100644 --- a/src/goto-instrument/count_eloc.cpp +++ b/src/goto-instrument/count_eloc.cpp @@ -26,10 +26,10 @@ typedef std::unordered_map filest; typedef std::unordered_map working_dirst; static void collect_eloc( - const goto_functionst &goto_functions, + const goto_modelt &goto_model, working_dirst &dest) { - forall_goto_functions(f_it, goto_functions) + forall_goto_functions(f_it, goto_model.goto_functions) { forall_goto_program_instructions(it, f_it->second.body) { @@ -43,12 +43,12 @@ static void collect_eloc( } } -void count_eloc(const goto_functionst &goto_functions) +void count_eloc(const goto_modelt &goto_model) { std::size_t eloc=0; working_dirst eloc_map; - collect_eloc(goto_functions, eloc_map); + collect_eloc(goto_model, eloc_map); for(const std::pair &files : eloc_map) for(const std::pair &lines : files.second) @@ -57,10 +57,10 @@ void count_eloc(const goto_functionst &goto_functions) std::cout << "Effective lines of code: " << eloc << '\n'; } -void list_eloc(const goto_functionst &goto_functions) +void list_eloc(const goto_modelt &goto_model) { working_dirst eloc_map; - collect_eloc(goto_functions, eloc_map); + collect_eloc(goto_model, eloc_map); for(const std::pair &files : eloc_map) for(const std::pair &lines : files.second) @@ -74,13 +74,13 @@ void list_eloc(const goto_functionst &goto_functions) } } -void print_path_lengths(const goto_functionst &goto_functions) +void print_path_lengths(const goto_modelt &goto_model) { - const irep_idt &entry_point=goto_functions.entry_point(); + const irep_idt &entry_point=goto_model.goto_functions.entry_point(); goto_functionst::function_mapt::const_iterator start= - goto_functions.function_map.find(entry_point); + goto_model.goto_functions.function_map.find(entry_point); - if(start==goto_functions.function_map.end() || + if(start==goto_model.goto_functions.function_map.end() || !start->second.body_available()) { std::cout << "No entry point found, path length undefined\n"; @@ -98,7 +98,7 @@ void print_path_lengths(const goto_functionst &goto_functions) typedef cfg_baset cfgt; cfgt cfg; - cfg(goto_functions); + cfg(goto_model.goto_functions); const goto_programt &start_program=start->second.body; @@ -113,7 +113,7 @@ void print_path_lengths(const goto_functionst &goto_functions) << " instructions\n"; std::size_t n_loops=0, loop_ins=0; - forall_goto_functions(gf_it, goto_functions) + forall_goto_functions(gf_it, goto_model.goto_functions) forall_goto_program_instructions(i_it, gf_it->second.body) // loops or recursion if(i_it->is_backwards_goto() || diff --git a/src/goto-instrument/count_eloc.h b/src/goto-instrument/count_eloc.h index 38760038836..9a140eec52b 100644 --- a/src/goto-instrument/count_eloc.h +++ b/src/goto-instrument/count_eloc.h @@ -14,12 +14,10 @@ Date: December 2012 #ifndef CPROVER_GOTO_INSTRUMENT_COUNT_ELOC_H #define CPROVER_GOTO_INSTRUMENT_COUNT_ELOC_H -#include +#include -void count_eloc(const goto_functionst &goto_functions); - -void list_eloc(const goto_functionst &goto_functions); - -void print_path_lengths(const goto_functionst &goto_functions); +void count_eloc(const goto_modelt &); +void list_eloc(const goto_modelt &); +void print_path_lengths(const goto_modelt &); #endif // CPROVER_GOTO_INSTRUMENT_COUNT_ELOC_H diff --git a/src/goto-instrument/cover.cpp b/src/goto-instrument/cover.cpp index 258b790a887..d76afe03b71 100644 --- a/src/goto-instrument/cover.cpp +++ b/src/goto-instrument/cover.cpp @@ -28,6 +28,8 @@ Date: May 2016 #include #include +namespace +{ class basic_blockst { public: @@ -237,7 +239,7 @@ class basic_blockst } } - void output(std::ostream &out) + void output(std::ostream &out) const { for(block_mapt::const_iterator b_it=block_map.begin(); @@ -289,6 +291,7 @@ class basic_blockst block_info.source_location.set_basic_block_covered_lines(covered_lines); } }; +} bool coverage_goalst::get_coverage_goals( const std::string &coverage_file, diff --git a/src/goto-instrument/document_properties.cpp b/src/goto-instrument/document_properties.cpp index 0a7e656bff0..5140459c025 100644 --- a/src/goto-instrument/document_properties.cpp +++ b/src/goto-instrument/document_properties.cpp @@ -17,6 +17,8 @@ Author: Daniel Kroening, kroening@kroening.com #include +#include + #define MAXWIDTH 62 class document_propertiest @@ -361,15 +363,15 @@ void document_propertiest::doit() } void document_properties_html( - const goto_functionst &goto_functions, + const goto_modelt &goto_model, std::ostream &out) { - document_propertiest(goto_functions, out).html(); + document_propertiest(goto_model.goto_functions, out).html(); } void document_properties_latex( - const goto_functionst &goto_functions, + const goto_modelt &goto_model, std::ostream &out) { - document_propertiest(goto_functions, out).latex(); + document_propertiest(goto_model.goto_functions, out).latex(); } diff --git a/src/goto-instrument/document_properties.h b/src/goto-instrument/document_properties.h index 35406ae2f30..45f1b147ca7 100644 --- a/src/goto-instrument/document_properties.h +++ b/src/goto-instrument/document_properties.h @@ -14,14 +14,14 @@ Author: Daniel Kroening, kroening@kroening.com #include -#include +class goto_modelt; void document_properties_latex( - const goto_functionst &goto_functions, + const goto_modelt &, std::ostream &out); void document_properties_html( - const goto_functionst &goto_functions, + const goto_modelt &, std::ostream &out); #endif // CPROVER_GOTO_INSTRUMENT_DOCUMENT_PROPERTIES_H diff --git a/src/goto-instrument/dot.cpp b/src/goto-instrument/dot.cpp index bf58fe12cd3..d011c10914a 100644 --- a/src/goto-instrument/dot.cpp +++ b/src/goto-instrument/dot.cpp @@ -25,11 +25,9 @@ Author: Daniel Kroening, kroening@kroening.com class dott { public: - dott( - const goto_functionst &_goto_functions, - const namespacet &_ns): - ns(_ns), - goto_functions(_goto_functions), + explicit dott( + const goto_modelt &_goto_model): + goto_model(_goto_model), subgraphscount(0) { } @@ -37,8 +35,7 @@ class dott void output(std::ostream &out); protected: - const namespacet &ns; - const goto_functionst &goto_functions; + const goto_modelt &goto_model; unsigned subgraphscount; @@ -91,6 +88,8 @@ void dott::write_dot_subgraph( } else { + const namespacet ns(goto_model.symbol_table); + std::set seen; goto_programt::const_targetst worklist; worklist.push_back(instructions.begin()); @@ -265,7 +264,7 @@ void dott::output(std::ostream &out) std::list clusters; - forall_goto_functions(it, goto_functions) + forall_goto_functions(it, goto_model.goto_functions) if(it->second.body_available()) write_dot_subgraph(out, id2string(it->first), it->second.body); @@ -350,11 +349,8 @@ void dott::write_edge( out << ";\n"; } -void dot( - const goto_functionst &src, - const namespacet &ns, - std::ostream &out) +void dot(const goto_modelt &src, std::ostream &out) { - dott dot(src, ns); + dott dot(src); dot.output(out); } diff --git a/src/goto-instrument/dot.h b/src/goto-instrument/dot.h index 1a5f84e319b..12d5f0edfbb 100644 --- a/src/goto-instrument/dot.h +++ b/src/goto-instrument/dot.h @@ -12,11 +12,12 @@ Author: Daniel Kroening, kroening@kroening.com #ifndef CPROVER_GOTO_INSTRUMENT_DOT_H #define CPROVER_GOTO_INSTRUMENT_DOT_H -#include +#include + +#include void dot( - const goto_functionst &src, - const namespacet &ns, + const goto_modelt &, std::ostream &out); #endif // CPROVER_GOTO_INSTRUMENT_DOT_H diff --git a/src/goto-instrument/function.cpp b/src/goto-instrument/function.cpp index 6c62a07f4f7..5cf1883fb8f 100644 --- a/src/goto-instrument/function.cpp +++ b/src/goto-instrument/function.cpp @@ -79,11 +79,10 @@ code_function_callt function_to_call( } void function_enter( - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &goto_model, const irep_idt &id) { - Forall_goto_functions(f_it, goto_functions) + Forall_goto_functions(f_it, goto_model.goto_functions) { // don't instrument our internal functions if(has_prefix(id2string(f_it->first), CPROVER_PREFIX)) @@ -100,17 +99,16 @@ void function_enter( goto_programt::targett t= body.insert_before(body.instructions.begin()); t->make_function_call( - function_to_call(symbol_table, id, f_it->first)); + function_to_call(goto_model.symbol_table, id, f_it->first)); t->function=f_it->first; } } void function_exit( - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &goto_model, const irep_idt &id) { - Forall_goto_functions(f_it, goto_functions) + Forall_goto_functions(f_it, goto_model.goto_functions) { // don't instrument our internal functions if(has_prefix(id2string(f_it->first), CPROVER_PREFIX)) @@ -136,7 +134,7 @@ void function_exit( goto_programt::instructiont call; call.function=f_it->first; call.make_function_call( - function_to_call(symbol_table, id, f_it->first)); + function_to_call(goto_model.symbol_table, id, f_it->first)); body.insert_before_swap(i_it, call); // move on @@ -164,7 +162,7 @@ void function_exit( { goto_programt::instructiont call; call.make_function_call( - function_to_call(symbol_table, id, f_it->first)); + function_to_call(goto_model.symbol_table, id, f_it->first)); call.function=f_it->first; body.insert_before_swap(last, call); } diff --git a/src/goto-instrument/function.h b/src/goto-instrument/function.h index 88b486df6b0..101a0643e40 100644 --- a/src/goto-instrument/function.h +++ b/src/goto-instrument/function.h @@ -12,21 +12,19 @@ Author: Daniel Kroening, kroening@kroening.com #ifndef CPROVER_GOTO_INSTRUMENT_FUNCTION_H #define CPROVER_GOTO_INSTRUMENT_FUNCTION_H -#include +#include class code_function_callt function_to_call( - symbol_tablet &symbol_table, + symbol_tablet &, const irep_idt &id, const irep_idt &argument); void function_enter( - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &, const irep_idt &id); void function_exit( - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &, const irep_idt &id); #endif // CPROVER_GOTO_INSTRUMENT_FUNCTION_H diff --git a/src/goto-instrument/goto_instrument_parse_options.cpp b/src/goto-instrument/goto_instrument_parse_options.cpp index be77888ad47..397dfc10536 100644 --- a/src/goto-instrument/goto_instrument_parse_options.cpp +++ b/src/goto-instrument/goto_instrument_parse_options.cpp @@ -41,6 +41,7 @@ Author: Daniel Kroening, kroening@kroening.com #include #include #include +#include #include #include @@ -199,10 +200,10 @@ int goto_instrument_parse_optionst::doit() } goto_unwindt goto_unwind; - goto_unwind(goto_functions, unwind_set, k, unwind_strategy); + goto_unwind(goto_model, unwind_set, k, unwind_strategy); - goto_functions.update(); - goto_functions.compute_loop_numbers(); + goto_model.goto_functions.update(); + goto_model.goto_functions.compute_loop_numbers(); if(cmdline.isset("log")) { @@ -234,11 +235,11 @@ int goto_instrument_parse_optionst::doit() if(cmdline.isset("show-threaded")) { - namespacet ns(symbol_table); + namespacet ns(goto_model.symbol_table); - is_threadedt is_threaded(goto_functions); + is_threadedt is_threaded(goto_model); - forall_goto_functions(f_it, goto_functions) + forall_goto_functions(f_it, goto_model.goto_functions) { std::cout << "////\n"; std::cout << "//// Function: " << f_it->first << '\n'; @@ -261,14 +262,13 @@ int goto_instrument_parse_optionst::doit() do_partial_inlining(); // recalculate numbers, etc. - goto_functions.update(); + goto_model.goto_functions.update(); status() << "Pointer Analysis" << eom; - namespacet ns(symbol_table); + namespacet ns(goto_model.symbol_table); value_set_analysist value_set_analysis(ns); - value_set_analysis(goto_functions); - - show_value_sets(get_ui(), goto_functions, value_set_analysis); + value_set_analysis(goto_model.goto_functions); + show_value_sets(get_ui(), goto_model, value_set_analysis); return 0; } @@ -277,15 +277,14 @@ int goto_instrument_parse_optionst::doit() do_indirect_call_and_rtti_removal(); do_partial_inlining(); do_remove_returns(); - parameter_assignments(symbol_table, goto_functions); + parameter_assignments(goto_model); // recalculate numbers, etc. - goto_functions.update(); + goto_model.goto_functions.update(); - namespacet ns(symbol_table); global_may_alias_analysist global_may_alias_analysis; - global_may_alias_analysis(goto_functions, ns); - global_may_alias_analysis.output(ns, goto_functions, std::cout); + global_may_alias_analysis(goto_model); + global_may_alias_analysis.output(goto_model, std::cout); return 0; } @@ -294,14 +293,14 @@ int goto_instrument_parse_optionst::doit() { do_indirect_call_and_rtti_removal(); do_partial_inlining(); - parameter_assignments(symbol_table, goto_functions); + parameter_assignments(goto_model); // recalculate numbers, etc. - goto_functions.update(); + goto_model.goto_functions.update(); - namespacet ns(symbol_table); + namespacet ns(goto_model.symbol_table); - forall_goto_functions(it, goto_functions) + forall_goto_functions(it, goto_model.goto_functions) { local_bitvector_analysist local_bitvector_analysis(it->second); std::cout << ">>>>\n"; @@ -319,23 +318,22 @@ int goto_instrument_parse_optionst::doit() do_indirect_call_and_rtti_removal(); do_partial_inlining(); do_remove_returns(); - parameter_assignments(symbol_table, goto_functions); + parameter_assignments(goto_model); - remove_unused_functions(goto_functions, get_message_handler()); + remove_unused_functions(goto_model, get_message_handler()); if(!cmdline.isset("inline")) { - thread_exit_instrumentation(goto_functions); - mutex_init_instrumentation(symbol_table, goto_functions); + thread_exit_instrumentation(goto_model); + mutex_init_instrumentation(goto_model); } // recalculate numbers, etc. - goto_functions.update(); + goto_model.goto_functions.update(); - namespacet ns(symbol_table); custom_bitvector_analysist custom_bitvector_analysis; - custom_bitvector_analysis(goto_functions, ns); - custom_bitvector_analysis.output(ns, goto_functions, std::cout); + custom_bitvector_analysis(goto_model); + custom_bitvector_analysis.output(goto_model, std::cout); return 0; } @@ -345,17 +343,14 @@ int goto_instrument_parse_optionst::doit() do_indirect_call_and_rtti_removal(); do_partial_inlining(); do_remove_returns(); - parameter_assignments(symbol_table, goto_functions); + parameter_assignments(goto_model); // recalculate numbers, etc. - goto_functions.update(); - - namespacet ns(symbol_table); + goto_model.goto_functions.update(); escape_analysist escape_analysis; - escape_analysis(goto_functions, ns); - - escape_analysis.output(ns, goto_functions, std::cout); + escape_analysis(goto_model); + escape_analysis.output(goto_model, std::cout); return 0; } @@ -365,26 +360,25 @@ int goto_instrument_parse_optionst::doit() do_indirect_call_and_rtti_removal(); do_partial_inlining(); do_remove_returns(); - parameter_assignments(symbol_table, goto_functions); + parameter_assignments(goto_model); - remove_unused_functions(goto_functions, get_message_handler()); + remove_unused_functions(goto_model, get_message_handler()); if(!cmdline.isset("inline")) { - thread_exit_instrumentation(goto_functions); - mutex_init_instrumentation(symbol_table, goto_functions); + thread_exit_instrumentation(goto_model); + mutex_init_instrumentation(goto_model); } // recalculate numbers, etc. - goto_functions.update(); + goto_model.goto_functions.update(); - namespacet ns(symbol_table); + namespacet ns(goto_model.symbol_table); custom_bitvector_analysist custom_bitvector_analysis; - custom_bitvector_analysis(goto_functions, ns); + custom_bitvector_analysis(goto_model); custom_bitvector_analysis.check( - ns, - goto_functions, + goto_model, cmdline.isset("xml-ui"), std::cout); @@ -397,13 +391,13 @@ int goto_instrument_parse_optionst::doit() do_partial_inlining(); // recalculate numbers, etc. - goto_functions.update(); + goto_model.goto_functions.update(); - namespacet ns(symbol_table); + namespacet ns(goto_model.symbol_table); status() << "Pointer Analysis" << eom; points_tot points_to; - points_to(goto_functions); + points_to(goto_model); points_to.output(std::cout); return 0; } @@ -414,27 +408,26 @@ int goto_instrument_parse_optionst::doit() do_partial_inlining(); // recalculate numbers, etc. - goto_functions.update(); + goto_model.goto_functions.update(); status() << "Interval Analysis" << eom; - namespacet ns(symbol_table); + namespacet ns(goto_model.symbol_table); ait interval_analysis; - interval_analysis(goto_functions, ns); - - interval_analysis.output(ns, goto_functions, std::cout); + interval_analysis(goto_model); + interval_analysis.output(goto_model, std::cout); return 0; } if(cmdline.isset("show-call-sequences")) { - show_call_sequences(goto_functions); + show_call_sequences(goto_model); return 0; } if(cmdline.isset("check-call-sequence")) { do_remove_returns(); - check_call_sequence(goto_functions); + check_call_sequence(goto_model); return 0; } @@ -443,15 +436,14 @@ int goto_instrument_parse_optionst::doit() do_indirect_call_and_rtti_removal(); do_partial_inlining(); - namespacet ns(symbol_table); - list_calls_and_arguments(ns, goto_functions); + list_calls_and_arguments(goto_model); return 0; } if(cmdline.isset("show-rw-set")) { - namespacet ns(symbol_table); + namespacet ns(goto_model.symbol_table); if(!cmdline.isset("inline")) { @@ -459,24 +451,24 @@ int goto_instrument_parse_optionst::doit() do_partial_inlining(); // recalculate numbers, etc. - goto_functions.update(); + goto_model.goto_functions.update(); } status() << "Pointer Analysis" << eom; value_set_analysist value_set_analysis(ns); - value_set_analysis(goto_functions); + value_set_analysis(goto_model.goto_functions); const symbolt &symbol=ns.lookup(ID_main); symbol_exprt main(symbol.name, symbol.type); std::cout << - rw_set_functiont(value_set_analysis, ns, goto_functions, main); + rw_set_functiont(value_set_analysis, goto_model, main); return 0; } if(cmdline.isset("show-symbol-table")) { - show_symbol_table(); + ::show_symbol_table(goto_model, get_ui()); return 0; } @@ -484,11 +476,10 @@ int goto_instrument_parse_optionst::doit() { do_indirect_call_and_rtti_removal(); - const namespacet ns(symbol_table); + const namespacet ns(goto_model.symbol_table); reaching_definitions_analysist rd_analysis(ns); - rd_analysis(goto_functions, ns); - - rd_analysis.output(ns, goto_functions, std::cout); + rd_analysis(goto_model); + rd_analysis.output(goto_model, std::cout); return 0; } @@ -497,11 +488,10 @@ int goto_instrument_parse_optionst::doit() { do_indirect_call_and_rtti_removal(); - const namespacet ns(symbol_table); + const namespacet ns(goto_model.symbol_table); dependence_grapht dependence_graph(ns); - dependence_graph(goto_functions, ns); - - dependence_graph.output(ns, goto_functions, std::cout); + dependence_graph(goto_model); + dependence_graph.output(goto_model, std::cout); dependence_graph.output_dot(std::cout); return 0; @@ -509,79 +499,78 @@ int goto_instrument_parse_optionst::doit() if(cmdline.isset("count-eloc")) { - count_eloc(goto_functions); + count_eloc(goto_model); return 0; } if(cmdline.isset("list-eloc")) { - list_eloc(goto_functions); + list_eloc(goto_model); return 0; } if(cmdline.isset("print-path-lengths")) { - print_path_lengths(goto_functions); + print_path_lengths(goto_model); return 0; } if(cmdline.isset("list-symbols")) { - show_symbol_table(true); + show_symbol_table_brief(goto_model, get_ui()); return 0; } if(cmdline.isset("show-uninitialized")) { - show_uninitialized(symbol_table, goto_functions, std::cout); + show_uninitialized(goto_model, std::cout); return 0; } if(cmdline.isset("interpreter")) { status() << "Starting interpreter" << eom; - interpreter(symbol_table, goto_functions, get_message_handler()); + interpreter(goto_model, get_message_handler()); return 0; } if(cmdline.isset("show-claims") || cmdline.isset("show-properties")) { - const namespacet ns(symbol_table); - show_properties(ns, get_ui(), goto_functions); + const namespacet ns(goto_model.symbol_table); + show_properties(goto_model, get_ui()); return 0; } if(cmdline.isset("document-claims-html") || cmdline.isset("document-properties-html")) { - document_properties_html(goto_functions, std::cout); + document_properties_html(goto_model, std::cout); return 0; } if(cmdline.isset("document-claims-latex") || cmdline.isset("document-properties-latex")) { - document_properties_latex(goto_functions, std::cout); + document_properties_latex(goto_model, std::cout); return 0; } if(cmdline.isset("show-loops")) { - show_loop_ids(get_ui(), goto_functions); + show_loop_ids(get_ui(), goto_model); return 0; } if(cmdline.isset("show-natural-loops")) { - const namespacet ns(symbol_table); - show_natural_loops(goto_functions); + show_natural_loops(goto_model); return 0; } if(cmdline.isset("print-internal-representation")) { - for(auto const &pair : goto_functions.function_map) + for(auto const &pair : goto_model.goto_functions.function_map) for(auto const &ins : pair.second.body.instructions) { if(ins.code.is_not_nil()) @@ -594,28 +583,27 @@ int goto_instrument_parse_optionst::doit() if(cmdline.isset("show-goto-functions")) { - namespacet ns(symbol_table); - show_goto_functions(ns, get_ui(), goto_functions); + namespacet ns(goto_model.symbol_table); + show_goto_functions(goto_model, get_ui()); return 0; } if(cmdline.isset("list-undefined-functions")) { - const namespacet ns(symbol_table); - list_undefined_functions(goto_functions, ns, std::cout); + list_undefined_functions(goto_model, std::cout); return 0; } // experimental: print structs if(cmdline.isset("show-struct-alignment")) { - print_struct_alignment_problems(symbol_table, std::cout); + print_struct_alignment_problems(goto_model.symbol_table, std::cout); return 0; } if(cmdline.isset("show-locations")) { - show_locations(get_ui(), goto_functions); + show_locations(get_ui(), goto_model); return 0; } @@ -625,11 +613,11 @@ int goto_instrument_parse_optionst::doit() const bool h_libc=!cmdline.isset("no-system-headers"); const bool h_all=cmdline.isset("use-all-headers"); const bool harness=cmdline.isset("harness"); - namespacet ns(symbol_table); + namespacet ns(goto_model.symbol_table); // restore RETURN instructions in case remove_returns had been // applied - restore_returns(symbol_table, goto_functions); + restore_returns(goto_model); if(cmdline.args.size()==2) { @@ -644,7 +632,7 @@ int goto_instrument_parse_optionst::doit() return 10; } (is_cpp ? dump_cpp : dump_c)( - goto_functions, + goto_model.goto_functions, h_libc, h_all, harness, @@ -653,7 +641,7 @@ int goto_instrument_parse_optionst::doit() } else (is_cpp ? dump_cpp : dump_c)( - goto_functions, + goto_model.goto_functions, h_libc, h_all, harness, @@ -665,7 +653,7 @@ int goto_instrument_parse_optionst::doit() if(cmdline.isset("call-graph")) { - call_grapht call_graph(goto_functions); + call_grapht call_graph(goto_model); if(cmdline.isset("xml")) call_graph.output_xml(std::cout); @@ -679,7 +667,7 @@ int goto_instrument_parse_optionst::doit() if(cmdline.isset("dot")) { - namespacet ns(symbol_table); + namespacet ns(goto_model.symbol_table); if(cmdline.args.size()==2) { @@ -694,10 +682,10 @@ int goto_instrument_parse_optionst::doit() return 10; } - dot(goto_functions, ns, out); + dot(goto_model, out); } else - dot(goto_functions, ns, std::cout); + dot(goto_model, std::cout); return 0; } @@ -706,21 +694,21 @@ int goto_instrument_parse_optionst::doit() { do_indirect_call_and_rtti_removal(); - namespacet ns(symbol_table); + namespacet ns(goto_model.symbol_table); status() << "Performing full inlining" << eom; - goto_inline(goto_functions, ns, ui_message_handler); + goto_inline(goto_model, get_message_handler()); status() << "Accelerating" << eom; - accelerate_functions(goto_functions, symbol_table, cmdline.isset("z3")); - remove_skip(goto_functions); - goto_functions.update(); + accelerate_functions(goto_model, cmdline.isset("z3")); + remove_skip(goto_model); + goto_model.goto_functions.update(); } if(cmdline.isset("horn-encoding")) { status() << "Horn-clause encoding" << eom; - namespacet ns(symbol_table); + namespacet ns(goto_model.symbol_table); if(cmdline.args.size()==2) { @@ -737,10 +725,10 @@ int goto_instrument_parse_optionst::doit() return 1; } - horn_encoding(goto_functions, ns, out); + horn_encoding(goto_model, out); } else - horn_encoding(goto_functions, ns, std::cout); + horn_encoding(goto_model, std::cout); return 0; } @@ -750,14 +738,13 @@ int goto_instrument_parse_optionst::doit() do_indirect_call_and_rtti_removal(); status() << "Removing unused functions" << eom; - remove_unused_functions(goto_functions, get_message_handler()); + remove_unused_functions(goto_model.goto_functions, get_message_handler()); } if(cmdline.isset("undefined-function-is-assume-false")) { do_indirect_call_and_rtti_removal(); - - undefined_function_abort_path(goto_functions); + undefined_function_abort_path(goto_model); } // write new binary? @@ -766,7 +753,7 @@ int goto_instrument_parse_optionst::doit() status() << "Writing GOTO program to `" << cmdline.args[1] << "'" << eom; if(write_goto_binary( - cmdline.args[1], symbol_table, goto_functions, get_message_handler())) + cmdline.args[1], goto_model, get_message_handler())) return 1; else return 0; @@ -812,16 +799,15 @@ void goto_instrument_parse_optionst::do_indirect_call_and_rtti_removal( status() << "Function Pointer Removal" << eom; remove_function_pointers( get_message_handler(), - symbol_table, - goto_functions, + goto_model, cmdline.isset("pointer-check")); status() << "Virtual function removal" << eom; - remove_virtual_functions(symbol_table, goto_functions); + remove_virtual_functions(goto_model); status() << "Catch and throw removal" << eom; // This introduces instanceof, so order is important: - remove_exceptions(symbol_table, goto_functions); + remove_exceptions(goto_model); status() << "Java instanceof removal" << eom; - remove_instanceof(symbol_table, goto_functions); + remove_instanceof(goto_model); } /// Remove function pointers that can be resolved by analysing const variables @@ -839,8 +825,7 @@ void goto_instrument_parse_optionst::do_remove_const_function_pointers_only() status() << "Removing const function pointers only" << eom; remove_function_pointers( get_message_handler(), - symbol_table, - goto_functions, + goto_model, cmdline.isset("pointer-check"), true); // abort if we can't resolve via const pointers } @@ -855,8 +840,7 @@ void goto_instrument_parse_optionst::do_partial_inlining() if(!cmdline.isset("inline")) { status() << "Partial Inlining" << eom; - const namespacet ns(symbol_table); - goto_partial_inline(goto_functions, ns, ui_message_handler); + goto_partial_inline(goto_model, ui_message_handler); } } @@ -868,7 +852,7 @@ void goto_instrument_parse_optionst::do_remove_returns() remove_returns_done=true; status() << "Removing returns" << eom; - remove_returns(symbol_table, goto_functions); + remove_returns(goto_model); } void goto_instrument_parse_optionst::get_goto_program() @@ -876,7 +860,7 @@ void goto_instrument_parse_optionst::get_goto_program() status() << "Reading GOTO program from `" << cmdline.args[0] << "'" << eom; if(read_goto_binary(cmdline.args[0], - symbol_table, goto_functions, get_message_handler())) + goto_model, get_message_handler())) throw 0; config.set(cmdline); @@ -929,13 +913,13 @@ void goto_instrument_parse_optionst::instrument_goto_program() { status() << "Adding gotos to skip loops" << eom; if(skip_loops( - goto_functions, + goto_model, cmdline.get_value("skip-loops"), get_message_handler())) throw 0; } - namespacet ns(symbol_table); + namespacet ns(goto_model.symbol_table); // initialize argv with valid pointers if(cmdline.isset("model-argc-argv")) @@ -946,8 +930,7 @@ void goto_instrument_parse_optionst::instrument_goto_program() status() << "Adding up to " << max_argc << " command line arguments" << eom; if(model_argc_argv( - symbol_table, - goto_functions, + goto_model, max_argc, get_message_handler())) throw 0; @@ -956,8 +939,7 @@ void goto_instrument_parse_optionst::instrument_goto_program() if(cmdline.isset("remove-function-body")) { remove_functions( - symbol_table, - goto_functions, + goto_model, cmdline.get_values("remove-function-body"), get_message_handler()); } @@ -972,7 +954,7 @@ void goto_instrument_parse_optionst::instrument_goto_program() config.ansi_c.defines.push_back("__CPROVER_CUSTOM_BITVECTOR_ANALYSIS"); // add the library - link_to_library(symbol_table, goto_functions, ui_message_handler); + link_to_library(goto_model, get_message_handler()); } // now do full inlining, if requested @@ -984,12 +966,12 @@ void goto_instrument_parse_optionst::instrument_goto_program() cmdline.isset("custom-bitvector-analysis")) { do_remove_returns(); - thread_exit_instrumentation(goto_functions); - mutex_init_instrumentation(symbol_table, goto_functions); + thread_exit_instrumentation(goto_model); + mutex_init_instrumentation(goto_model); } status() << "Performing full inlining" << eom; - goto_inline(goto_functions, ns, ui_message_handler); + goto_inline(goto_model, get_message_handler()); } if(cmdline.isset("show-custom-bitvector-analysis") || @@ -998,8 +980,8 @@ void goto_instrument_parse_optionst::instrument_goto_program() do_partial_inlining(); status() << "Propagating Constants" << eom; - constant_propagator_ait constant_propagator_ai(goto_functions, ns); - remove_skip(goto_functions); + constant_propagator_ait constant_propagator_ai(goto_model); + remove_skip(goto_model); } if(cmdline.isset("escape-analysis")) @@ -1007,28 +989,28 @@ void goto_instrument_parse_optionst::instrument_goto_program() do_indirect_call_and_rtti_removal(); do_partial_inlining(); do_remove_returns(); - parameter_assignments(symbol_table, goto_functions); + parameter_assignments(goto_model); // recalculate numbers, etc. - goto_functions.update(); + goto_model.goto_functions.update(); status() << "Escape Analysis" << eom; escape_analysist escape_analysis; - escape_analysis(goto_functions, ns); - escape_analysis.instrument(goto_functions, ns); + escape_analysis(goto_model); + escape_analysis.instrument(goto_model); // inline added functions, they are often small - goto_partial_inline(goto_functions, ns, ui_message_handler); + goto_partial_inline(goto_model, get_message_handler()); // recalculate numbers, etc. - goto_functions.update(); + goto_model.goto_functions.update(); } // verify and set invariants and pre/post-condition pairs if(cmdline.isset("apply-code-contracts")) { status() << "Applying Code Contracts" << eom; - code_contracts(symbol_table, goto_functions); + code_contracts(goto_model); } // replace function pointers, if explicitly requested @@ -1055,9 +1037,8 @@ void goto_instrument_parse_optionst::instrument_goto_program() if(!cmdline.isset("log")) { goto_function_inline( - goto_functions, + goto_model, function, - ns, ui_message_handler, true, caching); @@ -1069,9 +1050,8 @@ void goto_instrument_parse_optionst::instrument_goto_program() jsont result= goto_function_inline_and_log( - goto_functions, + goto_model, function, - ns, ui_message_handler, true, caching); @@ -1095,8 +1075,8 @@ void goto_instrument_parse_optionst::instrument_goto_program() } } - goto_functions.update(); - goto_functions.compute_loop_numbers(); + goto_model.goto_functions.update(); + goto_model.goto_functions.compute_loop_numbers(); } if(cmdline.isset("partial-inline")) @@ -1104,10 +1084,10 @@ void goto_instrument_parse_optionst::instrument_goto_program() do_indirect_call_and_rtti_removal(); status() << "Partial inlining" << eom; - goto_partial_inline(goto_functions, ns, ui_message_handler, true); + goto_partial_inline(goto_model, get_message_handler(), true); - goto_functions.update(); - goto_functions.compute_loop_numbers(); + goto_model.goto_functions.update(); + goto_model.goto_functions.compute_loop_numbers(); } // now do full inlining, if requested @@ -1119,12 +1099,12 @@ void goto_instrument_parse_optionst::instrument_goto_program() cmdline.isset("custom-bitvector-analysis")) { do_remove_returns(); - thread_exit_instrumentation(goto_functions); - mutex_init_instrumentation(symbol_table, goto_functions); + thread_exit_instrumentation(goto_model); + mutex_init_instrumentation(goto_model); } status() << "Performing full inlining" << eom; - goto_inline(goto_functions, ns, ui_message_handler, true); + goto_inline(goto_model, get_message_handler(), true); } if(cmdline.isset("constant-propagator")) @@ -1133,19 +1113,18 @@ void goto_instrument_parse_optionst::instrument_goto_program() status() << "Propagating Constants" << eom; - constant_propagator_ait constant_propagator_ai(goto_functions, ns); - - remove_skip(goto_functions); + constant_propagator_ait constant_propagator_ai(goto_model); + remove_skip(goto_model); } // add generic checks, if needed - goto_check(ns, options, goto_functions); + goto_check(options, goto_model); // check for uninitalized local variables if(cmdline.isset("uninitialized-check")) { status() << "Adding checks for uninitialized local variables" << eom; - add_uninitialized_locals_assertions(symbol_table, goto_functions); + add_uninitialized_locals_assertions(goto_model); } // check for maximum call stack size @@ -1153,8 +1132,7 @@ void goto_instrument_parse_optionst::instrument_goto_program() { status() << "Adding check for maximum call stack size" << eom; stack_depth( - symbol_table, - goto_functions, + goto_model, unsafe_string2unsigned(cmdline.get_value("stack-depth"))); } @@ -1164,14 +1142,14 @@ void goto_instrument_parse_optionst::instrument_goto_program() { status() << "Adding nondeterministic initialization of static/global " "variables" << eom; - nondet_static(ns, goto_functions); + nondet_static(goto_model); } if(cmdline.isset("slice-global-inits")) { status() << "Slicing away initializations of unused global variables" << eom; - slice_global_inits(ns, goto_functions); + slice_global_inits(goto_model); } if(cmdline.isset("string-abstraction")) @@ -1181,9 +1159,8 @@ void goto_instrument_parse_optionst::instrument_goto_program() status() << "String Abstraction" << eom; string_abstraction( - symbol_table, - get_message_handler(), - goto_functions); + goto_model, + get_message_handler()); } // some analyses require function pointer removal and partial inlining @@ -1199,25 +1176,19 @@ void goto_instrument_parse_optionst::instrument_goto_program() status() << "Pointer Analysis" << eom; value_set_analysist value_set_analysis(ns); - value_set_analysis(goto_functions); + value_set_analysis(goto_model.goto_functions); if(cmdline.isset("remove-pointers")) { // removing pointers status() << "Removing Pointers" << eom; - remove_pointers( - goto_functions, - symbol_table, - value_set_analysis); + remove_pointers(goto_model, value_set_analysis); } if(cmdline.isset("race-check")) { status() << "Adding Race Checks" << eom; - race_check( - value_set_analysis, - symbol_table, - goto_functions); + race_check(value_set_analysis, goto_model); } if(cmdline.isset("mm")) @@ -1225,8 +1196,8 @@ void goto_instrument_parse_optionst::instrument_goto_program() // TODO: move to wmm/weak_mem, and copy goto_functions AFTER some of the // modifications. Do the analysis on the copy, after remove_asm, and // instrument the original (without remove_asm) - remove_asm(symbol_table, goto_functions); - goto_functions.update(); + remove_asm(goto_model); + goto_model.goto_functions.update(); std::string mm=cmdline.get_value("mm"); memory_modelt model; @@ -1294,8 +1265,7 @@ void goto_instrument_parse_optionst::instrument_goto_program() weak_memory( model, value_set_analysis, - symbol_table, - goto_functions, + goto_model, cmdline.isset("scc"), inst_strategy, unwind_loops, @@ -1319,8 +1289,7 @@ void goto_instrument_parse_optionst::instrument_goto_program() status() << "Instrumenting interrupt handler" << eom; interrupt( value_set_analysis, - symbol_table, - goto_functions, + goto_model, cmdline.get_value("isr")); } @@ -1328,32 +1297,26 @@ void goto_instrument_parse_optionst::instrument_goto_program() if(cmdline.isset("mmio")) { status() << "Instrumenting memory-mapped I/O" << eom; - mmio( - value_set_analysis, - symbol_table, - goto_functions); + mmio(value_set_analysis, goto_model); } if(cmdline.isset("concurrency")) { status() << "Sequentializing concurrency" << eom; - concurrency( - value_set_analysis, - symbol_table, - goto_functions); + concurrency(value_set_analysis, goto_model); } } if(cmdline.isset("interval-analysis")) { status() << "Interval analysis" << eom; - interval_analysis(ns, goto_functions); + interval_analysis(goto_model); } if(cmdline.isset("havoc-loops")) { status() << "Havocking loops" << eom; - havoc_loops(goto_functions); + havoc_loops(goto_model); } if(cmdline.isset("k-induction")) @@ -1374,15 +1337,14 @@ void goto_instrument_parse_optionst::instrument_goto_program() status() << "Instrumenting k-induction for k=" << k << ", " << (base_case?"base case":"step case") << eom; - k_induction(goto_functions, base_case, step_case, k); + k_induction(goto_model, base_case, step_case, k); } if(cmdline.isset("function-enter")) { status() << "Function enter instrumentation" << eom; function_enter( - symbol_table, - goto_functions, + goto_model, cmdline.get_value("function-enter")); } @@ -1390,8 +1352,7 @@ void goto_instrument_parse_optionst::instrument_goto_program() { status() << "Function exit instrumentation" << eom; function_exit( - symbol_table, - goto_functions, + goto_model, cmdline.get_value("function-exit")); } @@ -1399,28 +1360,27 @@ void goto_instrument_parse_optionst::instrument_goto_program() { status() << "Branch instrumentation" << eom; branch( - symbol_table, - goto_functions, + goto_model, cmdline.get_value("branch")); } // add failed symbols - add_failed_symbols(symbol_table); + add_failed_symbols(goto_model.symbol_table); // recalculate numbers, etc. - goto_functions.update(); + goto_model.goto_functions.update(); // add loop ids - goto_functions.compute_loop_numbers(); + goto_model.goto_functions.compute_loop_numbers(); // label the assertions - label_properties(goto_functions); + label_properties(goto_model); // nondet volatile? if(cmdline.isset("nondet-volatile")) { status() << "Making volatile variables non-deterministic" << eom; - nondet_volatile(symbol_table, goto_functions); + nondet_volatile(goto_model); } // reachability slice? @@ -1430,9 +1390,9 @@ void goto_instrument_parse_optionst::instrument_goto_program() status() << "Performing a reachability slice" << eom; if(cmdline.isset("property")) - reachability_slicer(goto_functions, cmdline.get_values("property")); + reachability_slicer(goto_model, cmdline.get_values("property")); else - reachability_slicer(goto_functions); + reachability_slicer(goto_model); } // full slice? @@ -1443,13 +1403,13 @@ void goto_instrument_parse_optionst::instrument_goto_program() status() << "Performing a full slice" << eom; if(cmdline.isset("property")) - property_slicer(goto_functions, ns, cmdline.get_values("property")); + property_slicer(goto_model, cmdline.get_values("property")); else - full_slicer(goto_functions, ns); + full_slicer(goto_model); } // recalculate numbers, etc. - goto_functions.update(); + goto_model.goto_functions.update(); } /// display command line help diff --git a/src/goto-instrument/goto_instrument_parse_options.h b/src/goto-instrument/goto_instrument_parse_options.h index 25ed2ce4cee..2a921437603 100644 --- a/src/goto-instrument/goto_instrument_parse_options.h +++ b/src/goto-instrument/goto_instrument_parse_options.h @@ -15,7 +15,6 @@ Author: Daniel Kroening, kroening@kroening.com #include #include -#include #include #include #include @@ -82,7 +81,7 @@ Author: Daniel Kroening, kroening@kroening.com class goto_instrument_parse_optionst: public parse_options_baset, - public language_uit + public messaget { public: virtual int doit(); @@ -90,7 +89,7 @@ class goto_instrument_parse_optionst: goto_instrument_parse_optionst(int argc, const char **argv): parse_options_baset(GOTO_INSTRUMENT_OPTIONS, argc, argv), - language_uit(cmdline, ui_message_handler), + messaget(ui_message_handler), ui_message_handler(cmdline, "goto-instrument"), function_pointer_removal_done(false), partial_inlining_done(false), @@ -116,7 +115,12 @@ class goto_instrument_parse_optionst: bool partial_inlining_done; bool remove_returns_done; - goto_functionst goto_functions; + goto_modelt goto_model; + + ui_message_handlert::uit get_ui() + { + return ui_message_handler.get_ui(); + } }; #endif // CPROVER_GOTO_INSTRUMENT_GOTO_INSTRUMENT_PARSE_OPTIONS_H diff --git a/src/goto-instrument/havoc_loops.cpp b/src/goto-instrument/havoc_loops.cpp index d612a31fc03..01bc2701dd8 100644 --- a/src/goto-instrument/havoc_loops.cpp +++ b/src/goto-instrument/havoc_loops.cpp @@ -184,10 +184,10 @@ void havoc_loopst::havoc_loops() havoc_loop(loop.first, loop.second); } -void havoc_loops(goto_functionst &goto_functions) +void havoc_loops(goto_modelt &goto_model) { - function_modifiest function_modifies(goto_functions); + function_modifiest function_modifies(goto_model.goto_functions); - Forall_goto_functions(it, goto_functions) + Forall_goto_functions(it, goto_model.goto_functions) havoc_loopst(function_modifies, it->second); } diff --git a/src/goto-instrument/havoc_loops.h b/src/goto-instrument/havoc_loops.h index dc3245a1162..42edd24d4b9 100644 --- a/src/goto-instrument/havoc_loops.h +++ b/src/goto-instrument/havoc_loops.h @@ -12,8 +12,8 @@ Author: Daniel Kroening, kroening@kroening.com #ifndef CPROVER_GOTO_INSTRUMENT_HAVOC_LOOPS_H #define CPROVER_GOTO_INSTRUMENT_HAVOC_LOOPS_H -#include +class goto_modelt; -void havoc_loops(goto_functionst &goto_functions); +void havoc_loops(goto_modelt &); #endif // CPROVER_GOTO_INSTRUMENT_HAVOC_LOOPS_H diff --git a/src/goto-instrument/horn_encoding.cpp b/src/goto-instrument/horn_encoding.cpp index 31fcb187848..bccce9a0580 100644 --- a/src/goto-instrument/horn_encoding.cpp +++ b/src/goto-instrument/horn_encoding.cpp @@ -16,8 +16,7 @@ Date: June 2015 #include void horn_encoding( - const goto_functionst &, - const namespacet &, + const goto_modelt &, std::ostream &out) { } diff --git a/src/goto-instrument/horn_encoding.h b/src/goto-instrument/horn_encoding.h index 44160c35ceb..c1f8fb5fc60 100644 --- a/src/goto-instrument/horn_encoding.h +++ b/src/goto-instrument/horn_encoding.h @@ -14,11 +14,10 @@ Module: Horn-clause Encoding #include -#include +#include void horn_encoding( - const goto_functionst &, - const namespacet &, + const goto_modelt &, std::ostream &out); #endif // CPROVER_GOTO_INSTRUMENT_HORN_ENCODING_H diff --git a/src/goto-instrument/interrupt.cpp b/src/goto-instrument/interrupt.cpp index 38a5a258ff6..23bf63eb1a4 100644 --- a/src/goto-instrument/interrupt.cpp +++ b/src/goto-instrument/interrupt.cpp @@ -189,30 +189,29 @@ symbol_exprt get_isr( void interrupt( value_setst &value_sets, - const symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &goto_model, const irep_idt &interrupt_handler) { // look up the ISR - symbol_exprt isr=get_isr(symbol_table, interrupt_handler); + symbol_exprt isr= + get_isr(goto_model.symbol_table, interrupt_handler); // we first figure out which objects are read/written by the ISR - const namespacet ns(symbol_table); rw_set_functiont isr_rw_set( - value_sets, ns, goto_functions, isr); + value_sets, goto_model, isr); // now instrument - Forall_goto_functions(f_it, goto_functions) + Forall_goto_functions(f_it, goto_model.goto_functions) if(f_it->first!=CPROVER_PREFIX "initialize" && f_it->first!=goto_functionst::entry_point() && f_it->first!=isr.get_identifier()) interrupt( - value_sets, symbol_table, + value_sets, goto_model.symbol_table, #ifdef LOCAL_MAY f_it->second, #endif f_it->second.body, isr, isr_rw_set); - goto_functions.update(); + goto_model.goto_functions.update(); } diff --git a/src/goto-instrument/interrupt.h b/src/goto-instrument/interrupt.h index 711c4fa32df..775357c2a84 100644 --- a/src/goto-instrument/interrupt.h +++ b/src/goto-instrument/interrupt.h @@ -14,15 +14,13 @@ Date: September 2011 #ifndef CPROVER_GOTO_INSTRUMENT_INTERRUPT_H #define CPROVER_GOTO_INSTRUMENT_INTERRUPT_H -class symbol_tablet; -class goto_functionst; +class goto_modelt; #include "rw_set.h" void interrupt( - value_setst &value_sets, - const class symbol_tablet &symbol_table, - goto_functionst &goto_functions, + value_setst &, + goto_modelt &, const irep_idt &interrupt_handler); #endif // CPROVER_GOTO_INSTRUMENT_INTERRUPT_H diff --git a/src/goto-instrument/k_induction.cpp b/src/goto-instrument/k_induction.cpp index 9a018e1c331..900057f9f8b 100644 --- a/src/goto-instrument/k_induction.cpp +++ b/src/goto-instrument/k_induction.cpp @@ -150,10 +150,10 @@ void k_inductiont::k_induction() } void k_induction( - goto_functionst &goto_functions, + goto_modelt &goto_model, bool base_case, bool step_case, unsigned k) { - Forall_goto_functions(it, goto_functions) + Forall_goto_functions(it, goto_model.goto_functions) k_inductiont(it->second, base_case, step_case, k); } diff --git a/src/goto-instrument/k_induction.h b/src/goto-instrument/k_induction.h index e5af8b0c43f..f8d8ac4d351 100644 --- a/src/goto-instrument/k_induction.h +++ b/src/goto-instrument/k_induction.h @@ -12,10 +12,10 @@ Author: Daniel Kroening, kroening@kroening.com #ifndef CPROVER_GOTO_INSTRUMENT_K_INDUCTION_H #define CPROVER_GOTO_INSTRUMENT_K_INDUCTION_H -#include +class goto_modelt; void k_induction( - goto_functionst &goto_functions, + goto_modelt &, bool base_case, bool step_case, unsigned k); diff --git a/src/goto-instrument/mmio.cpp b/src/goto-instrument/mmio.cpp index a7a21a2f1a9..a865077d0f0 100644 --- a/src/goto-instrument/mmio.cpp +++ b/src/goto-instrument/mmio.cpp @@ -164,23 +164,18 @@ void mmio( void mmio( value_setst &value_sets, - class symbol_tablet &symbol_table, - goto_functionst &goto_functions) + goto_modelt &goto_model) { - // we first figure out which objects are read/written by the ISR - - - // now instrument - Forall_goto_functions(f_it, goto_functions) + Forall_goto_functions(f_it, goto_model.goto_functions) if(f_it->first!=CPROVER_PREFIX "initialize" && f_it->first!=goto_functionst::entry_point()) - mmio(value_sets, symbol_table, + mmio(value_sets, goto_model.symbol_table, #ifdef LOCAL_MAY f_it->second, #endif f_it->second.body); - goto_functions.update(); + goto_model.goto_functions.update(); } diff --git a/src/goto-instrument/mmio.h b/src/goto-instrument/mmio.h index eab567f9873..f2fbec84fa1 100644 --- a/src/goto-instrument/mmio.h +++ b/src/goto-instrument/mmio.h @@ -15,12 +15,10 @@ Date: September 2011 #define CPROVER_GOTO_INSTRUMENT_MMIO_H class value_setst; -class symbol_tablet; -class goto_functionst; +class goto_modelt; void mmio( - value_setst &value_sets, - class symbol_tablet &symbol_table, - goto_functionst &goto_functions); + value_setst &, + goto_modelt &); #endif // CPROVER_GOTO_INSTRUMENT_MMIO_H diff --git a/src/goto-instrument/model_argc_argv.cpp b/src/goto-instrument/model_argc_argv.cpp index 13d8de6c0b3..779bf1bfcc1 100644 --- a/src/goto-instrument/model_argc_argv.cpp +++ b/src/goto-instrument/model_argc_argv.cpp @@ -27,7 +27,7 @@ Date: April 2016 #include #include -#include +#include #include /// Set up argv with up to max_argc pointers into an array of 4096 bytes. @@ -37,18 +37,19 @@ Date: April 2016 /// \param message_handler: message logging /// \return True, if and only if modelling succeeded bool model_argc_argv( - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &goto_model, unsigned max_argc, message_handlert &message_handler) { messaget message(message_handler); - const namespacet ns(symbol_table); + const namespacet ns(goto_model.symbol_table); - if(!symbol_table.has_symbol(goto_functions.entry_point())) + if(!goto_model.symbol_table.has_symbol( + goto_model.goto_functions.entry_point())) { message.error() << "Linking not done, missing " - << goto_functions.entry_point() << messaget::eom; + << goto_model.goto_functions.entry_point() + << messaget::eom; return true; } @@ -79,7 +80,7 @@ bool model_argc_argv( std::ostringstream oss; oss << "int ARGC;\n" << "char *ARGV[1];\n" - << "void " << goto_functions.entry_point() << "()\n" + << "void " << goto_model.goto_functions.entry_point() << "()\n" << "{\n" << " unsigned next=0u;\n" << " " CPROVER_PREFIX "assume(ARGC>=1);\n" @@ -118,8 +119,8 @@ bool model_argc_argv( // add __CPROVER_assume if necessary (it might exist already) if(it->first==CPROVER_PREFIX "assume" || it->first==CPROVER_PREFIX "input") - symbol_table.add(it->second); - else if(it->first==goto_functions.entry_point()) + goto_model.symbol_table.add(it->second); + else if(it->first==goto_model.goto_functions.entry_point()) { value=it->second.value; @@ -128,28 +129,32 @@ bool model_argc_argv( replace.insert("ARGV", ns.lookup("argv'").symbol_expr()); replace(value); } - else if(has_prefix(id2string(it->first), - id2string(goto_functions.entry_point())+"::") && - symbol_table.add(it->second)) + else if(has_prefix( + id2string(it->first), + id2string(goto_model.goto_functions.entry_point())+"::") && + goto_model.symbol_table.add(it->second)) UNREACHABLE; } POSTCONDITION(value.is_not_nil()); goto_convert( to_code(value), - symbol_table, + goto_model.symbol_table, init_instructions, message_handler); + Forall_goto_program_instructions(it, init_instructions) { it->source_location.set_file(""); - it->function=goto_functions.entry_point(); + it->function=goto_model.goto_functions.entry_point(); } goto_functionst::function_mapt::iterator start_entry= - goto_functions.function_map.find(goto_functions.entry_point()); + goto_model.goto_functions.function_map.find( + goto_model.goto_functions.entry_point()); + DATA_INVARIANT( - start_entry!=goto_functions.function_map.end() && + start_entry!=goto_model.goto_functions.function_map.end() && start_entry->second.body_available(), "entry point expected to have a body"); @@ -175,7 +180,7 @@ bool model_argc_argv( // update counters etc. remove_skip(start); start.compute_loop_numbers(); - goto_functions.update(); + goto_model.goto_functions.update(); return false; } diff --git a/src/goto-instrument/model_argc_argv.h b/src/goto-instrument/model_argc_argv.h index 08a214f6fd6..9328f22b488 100644 --- a/src/goto-instrument/model_argc_argv.h +++ b/src/goto-instrument/model_argc_argv.h @@ -14,14 +14,12 @@ Date: April 2016 #ifndef CPROVER_GOTO_INSTRUMENT_MODEL_ARGC_ARGV_H #define CPROVER_GOTO_INSTRUMENT_MODEL_ARGC_ARGV_H -class goto_functionst; +class goto_modelt; class message_handlert; -class symbol_tablet; bool model_argc_argv( - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &, unsigned max_argc, - message_handlert &message_handler); + message_handlert &); #endif // CPROVER_GOTO_INSTRUMENT_MODEL_ARGC_ARGV_H diff --git a/src/goto-instrument/nondet_static.h b/src/goto-instrument/nondet_static.h index 16114584849..ac99134c5bf 100644 --- a/src/goto-instrument/nondet_static.h +++ b/src/goto-instrument/nondet_static.h @@ -15,13 +15,13 @@ Date: November 2011 #ifndef CPROVER_GOTO_INSTRUMENT_NONDET_STATIC_H #define CPROVER_GOTO_INSTRUMENT_NONDET_STATIC_H -class goto_functionst; -class namespacet; class goto_modelt; +class namespacet; +class goto_functionst; void nondet_static( - const namespacet &, - goto_functionst &); + const namespacet &ns, + goto_functionst &goto_functions); void nondet_static(goto_modelt &); diff --git a/src/goto-instrument/nondet_volatile.cpp b/src/goto-instrument/nondet_volatile.cpp index 4da1ebf6731..1e9024e48d0 100644 --- a/src/goto-instrument/nondet_volatile.cpp +++ b/src/goto-instrument/nondet_volatile.cpp @@ -119,12 +119,10 @@ void nondet_volatile( } } -void nondet_volatile( - symbol_tablet &symbol_table, - goto_functionst &goto_functions) +void nondet_volatile(goto_modelt &goto_model) { - Forall_goto_functions(f_it, goto_functions) - nondet_volatile(symbol_table, f_it->second.body); + Forall_goto_functions(f_it, goto_model.goto_functions) + nondet_volatile(goto_model.symbol_table, f_it->second.body); - goto_functions.update(); + goto_model.goto_functions.update(); } diff --git a/src/goto-instrument/nondet_volatile.h b/src/goto-instrument/nondet_volatile.h index 8cb3930fd56..dd92f3b1833 100644 --- a/src/goto-instrument/nondet_volatile.h +++ b/src/goto-instrument/nondet_volatile.h @@ -12,14 +12,12 @@ Author: Daniel Kroening, kroening@kroening.com #ifndef CPROVER_GOTO_INSTRUMENT_NONDET_VOLATILE_H #define CPROVER_GOTO_INSTRUMENT_NONDET_VOLATILE_H -#include +#include bool is_volatile( - const symbol_tablet &symbol_table, - const typet &type); + const symbol_tablet &, + const typet &); -void nondet_volatile( - symbol_tablet &symbol_table, - goto_functionst &goto_functions); +void nondet_volatile(goto_modelt &); #endif // CPROVER_GOTO_INSTRUMENT_NONDET_VOLATILE_H diff --git a/src/goto-instrument/points_to.h b/src/goto-instrument/points_to.h index 8b4a47d980a..76775a6f636 100644 --- a/src/goto-instrument/points_to.h +++ b/src/goto-instrument/points_to.h @@ -14,7 +14,7 @@ Author: Daniel Kroening, kroening@kroening.com #include -#include +#include #include #include "object_id.h" @@ -26,10 +26,10 @@ class points_tot { } - void operator()(goto_functionst &goto_functions) + void operator()(goto_modelt &goto_model) { // build the CFG data structure - cfg(goto_functions); + cfg(goto_model.goto_functions); // iterate fixedpoint(); diff --git a/src/goto-instrument/race_check.cpp b/src/goto-instrument/race_check.cpp index aec5eedda53..b426c98815e 100644 --- a/src/goto-instrument/race_check.cpp +++ b/src/goto-instrument/race_check.cpp @@ -294,29 +294,29 @@ void race_check( void race_check( value_setst &value_sets, - symbol_tablet &symbol_table, - goto_functionst &goto_functions) + goto_modelt &goto_model) { - w_guardst w_guards(symbol_table); + w_guardst w_guards(goto_model.symbol_table); - Forall_goto_functions(f_it, goto_functions) + Forall_goto_functions(f_it, goto_model.goto_functions) if(f_it->first!=goto_functionst::entry_point() && f_it->first!=CPROVER_PREFIX "initialize") race_check( value_sets, - symbol_table, + goto_model.symbol_table, L_M_ARG(f_it->second) f_it->second.body, w_guards); // get "main" goto_functionst::function_mapt::iterator - m_it=goto_functions.function_map.find(goto_functions.entry_point()); + m_it=goto_model.goto_functions.function_map.find( + goto_model.goto_functions.entry_point()); - if(m_it==goto_functions.function_map.end()) + if(m_it==goto_model.goto_functions.function_map.end()) throw "race check instrumentation needs an entry point"; goto_programt &main=m_it->second.body; w_guards.add_initialization(main); - goto_functions.update(); + goto_model.goto_functions.update(); } diff --git a/src/goto-instrument/race_check.h b/src/goto-instrument/race_check.h index 442d142ddc0..829ca529ea6 100644 --- a/src/goto-instrument/race_check.h +++ b/src/goto-instrument/race_check.h @@ -15,22 +15,17 @@ Date: February 2006 #define CPROVER_GOTO_INSTRUMENT_RACE_CHECK_H #include -#include - -class goto_programt; +#include void race_check( - value_setst &value_sets, - class symbol_tablet &symbol_table, + value_setst &, + class symbol_tablet &, #ifdef LOCAL_MAY const goto_functionst::goto_functiont &goto_function, #endif goto_programt &goto_program ); -void race_check( - value_setst &value_sets, - class symbol_tablet &symbol_table, - goto_functionst &goto_functions); +void race_check(value_setst &, goto_modelt &); #endif // CPROVER_GOTO_INSTRUMENT_RACE_CHECK_H diff --git a/src/goto-instrument/reachability_slicer.cpp b/src/goto-instrument/reachability_slicer.cpp index c92333e31a3..7773aa7a760 100644 --- a/src/goto-instrument/reachability_slicer.cpp +++ b/src/goto-instrument/reachability_slicer.cpp @@ -80,18 +80,18 @@ void reachability_slicert::slice(goto_functionst &goto_functions) goto_functions.update(); } -void reachability_slicer(goto_functionst &goto_functions) +void reachability_slicer(goto_modelt &goto_model) { reachability_slicert s; assert_criteriont a; - s(goto_functions, a); + s(goto_model.goto_functions, a); } void reachability_slicer( - goto_functionst &goto_functions, + goto_modelt &goto_model, const std::list &properties) { reachability_slicert s; properties_criteriont p(properties); - s(goto_functions, p); + s(goto_model.goto_functions, p); } diff --git a/src/goto-instrument/reachability_slicer.h b/src/goto-instrument/reachability_slicer.h index 4d82e4b194e..25e6a19ba5b 100644 --- a/src/goto-instrument/reachability_slicer.h +++ b/src/goto-instrument/reachability_slicer.h @@ -12,12 +12,15 @@ Author: Daniel Kroening, kroening@kroening.com #ifndef CPROVER_GOTO_INSTRUMENT_REACHABILITY_SLICER_H #define CPROVER_GOTO_INSTRUMENT_REACHABILITY_SLICER_H -#include +#include +#include -void reachability_slicer(goto_functionst &goto_functions); +class goto_modelt; + +void reachability_slicer(goto_modelt &); void reachability_slicer( - goto_functionst &goto_functions, + goto_modelt &, const std::list &properties); #endif // CPROVER_GOTO_INSTRUMENT_REACHABILITY_SLICER_H diff --git a/src/goto-instrument/remove_function.cpp b/src/goto-instrument/remove_function.cpp index 131438d1af6..2ec053ccac4 100644 --- a/src/goto-instrument/remove_function.cpp +++ b/src/goto-instrument/remove_function.cpp @@ -15,26 +15,25 @@ Date: April 2017 #include -#include +#include /// Remove the body of function "identifier" such that an analysis will treat it /// as a side-effect free function with non-deterministic return value. /// \par parameters: symbol_table Input symbol table to be modified -/// goto_functions Input functions to be modified +/// goto_model Input program to be modified /// identifier Function to be removed /// message_handler Error/status output void remove_function( - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &goto_model, const irep_idt &identifier, message_handlert &message_handler) { messaget message(message_handler); goto_functionst::function_mapt::iterator entry= - goto_functions.function_map.find(identifier); + goto_model.goto_functions.function_map.find(identifier); - if(entry==goto_functions.function_map.end()) + if(entry==goto_model.goto_functions.function_map.end()) { message.error() << "No function " << identifier << " in goto program" << messaget::eom; @@ -52,7 +51,7 @@ void remove_function( message.status() << "Removing body of " << identifier << messaget::eom; entry->second.clear(); - symbol_table.lookup(identifier).value.make_nil(); + goto_model.symbol_table.lookup(identifier).value.make_nil(); } } @@ -60,15 +59,14 @@ void remove_function( /// will treat it as a side-effect free function with non-deterministic return /// value. /// \par parameters: symbol_table Input symbol table to be modified -/// goto_functions Input functions to be modified +/// goto_model Input program to be modified /// names List of functions to be removed /// message_handler Error/status output void remove_functions( - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &goto_model, const std::list &names, message_handlert &message_handler) { for(const auto &f : names) - remove_function(symbol_table, goto_functions, f, message_handler); + remove_function(goto_model, f, message_handler); } diff --git a/src/goto-instrument/remove_function.h b/src/goto-instrument/remove_function.h index e11db1757ba..3c88b8ce803 100644 --- a/src/goto-instrument/remove_function.h +++ b/src/goto-instrument/remove_function.h @@ -19,20 +19,17 @@ Date: April 2017 #include -class goto_functionst; +class goto_modelt; class message_handlert; -class symbol_tablet; void remove_function( - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &, const irep_idt &identifier, - message_handlert &message_handler); + message_handlert &); void remove_functions( - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &, const std::list &names, - message_handlert &message_handler); + message_handlert &); #endif // CPROVER_GOTO_INSTRUMENT_REMOVE_FUNCTION_H diff --git a/src/goto-instrument/rw_set.h b/src/goto-instrument/rw_set.h index 15c3766f23c..6de564f0783 100644 --- a/src/goto-instrument/rw_set.h +++ b/src/goto-instrument/rw_set.h @@ -23,7 +23,7 @@ Date: February 2006 #include #include -#include +#include #include #ifdef LOCAL_MAY @@ -203,12 +203,12 @@ class rw_set_functiont:public rw_set_baset public: rw_set_functiont( value_setst &_value_sets, - const namespacet &_ns, - const goto_functionst &_goto_functions, + const goto_modelt &_goto_model, const exprt &function): - rw_set_baset(_ns), + rw_set_baset(ns), + ns(_goto_model.symbol_table), value_sets(_value_sets), - goto_functions(_goto_functions) + goto_functions(_goto_model.goto_functions) { compute_rec(function); } @@ -216,6 +216,7 @@ class rw_set_functiont:public rw_set_baset ~rw_set_functiont() {} protected: + const namespacet ns; value_setst &value_sets; const goto_functionst &goto_functions; diff --git a/src/goto-instrument/show_locations.cpp b/src/goto-instrument/show_locations.cpp index 2b9580add2f..530ad487d7a 100644 --- a/src/goto-instrument/show_locations.cpp +++ b/src/goto-instrument/show_locations.cpp @@ -18,6 +18,8 @@ Author: Daniel Kroening, kroening@kroening.com #include +#include + void show_locations( ui_message_handlert::uit ui, const irep_idt function_id, @@ -64,11 +66,8 @@ void show_locations( void show_locations( ui_message_handlert::uit ui, - const goto_functionst &goto_functions) + const goto_modelt &goto_model) { - for(goto_functionst::function_mapt::const_iterator - it=goto_functions.function_map.begin(); - it!=goto_functions.function_map.end(); - it++) - show_locations(ui, it->first, it->second.body); + for(const auto &f : goto_model.goto_functions.function_map) + show_locations(ui, f.first, f.second.body); } diff --git a/src/goto-instrument/show_locations.h b/src/goto-instrument/show_locations.h index 3f71b19ca48..af6bf185dcd 100644 --- a/src/goto-instrument/show_locations.h +++ b/src/goto-instrument/show_locations.h @@ -14,10 +14,10 @@ Author: Daniel Kroening, kroening@kroening.com #include -#include +class goto_modelt; void show_locations( ui_message_handlert::uit ui, - const goto_functionst &goto_functions); + const goto_modelt &); #endif // CPROVER_GOTO_INSTRUMENT_SHOW_LOCATIONS_H diff --git a/src/goto-instrument/skip_loops.cpp b/src/goto-instrument/skip_loops.cpp index d8be5f1e7ef..c28f2f80fe9 100644 --- a/src/goto-instrument/skip_loops.cpp +++ b/src/goto-instrument/skip_loops.cpp @@ -16,7 +16,7 @@ Date: January 2016 #include #include -#include +#include typedef std::set loop_idst; typedef std::map loop_mapt; @@ -91,7 +91,7 @@ static bool parse_loop_ids( } bool skip_loops( - goto_functionst &goto_functions, + goto_modelt &goto_model, const std::string &loop_ids, message_handlert &message_handler) { @@ -105,7 +105,7 @@ bool skip_loops( } loop_mapt::const_iterator it=loop_map.begin(); - Forall_goto_functions(f_it, goto_functions) + Forall_goto_functions(f_it, goto_model.goto_functions) { if(it==loop_map.end() || it->firstfirst) break; // possible error handled below @@ -124,7 +124,7 @@ bool skip_loops( } // update counters etc. - goto_functions.update(); + goto_model.goto_functions.update(); return false; } diff --git a/src/goto-instrument/skip_loops.h b/src/goto-instrument/skip_loops.h index c5e84c6172c..d82104436b8 100644 --- a/src/goto-instrument/skip_loops.h +++ b/src/goto-instrument/skip_loops.h @@ -16,12 +16,12 @@ Date: January 2016 #include -class goto_functionst; +class goto_modelt; class message_handlert; bool skip_loops( - goto_functionst &goto_functions, + goto_modelt &, const std::string &loop_ids, - message_handlert &message_handler); + message_handlert &); #endif // CPROVER_GOTO_INSTRUMENT_SKIP_LOOPS_H diff --git a/src/goto-instrument/stack_depth.cpp b/src/goto-instrument/stack_depth.cpp index 2897a4e6697..2dc96cdf8bd 100644 --- a/src/goto-instrument/stack_depth.cpp +++ b/src/goto-instrument/stack_depth.cpp @@ -13,13 +13,14 @@ Date: November 2011 #include "stack_depth.h" +#include #include #include #include #include #include -#include +#include symbol_exprt add_stack_depth_symbol(symbol_tablet &symbol_table) { @@ -83,14 +84,15 @@ void stack_depth( } void stack_depth( - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &goto_model, const int depth) { - const symbol_exprt sym=add_stack_depth_symbol(symbol_table); + const symbol_exprt sym= + add_stack_depth_symbol(goto_model.symbol_table); + const exprt depth_expr(from_integer(depth, sym.type())); - Forall_goto_functions(f_it, goto_functions) + Forall_goto_functions(f_it, goto_model.goto_functions) if(f_it->second.body_available() && f_it->first!=CPROVER_PREFIX "initialize" && f_it->first!=goto_functionst::entry_point()) @@ -98,8 +100,11 @@ void stack_depth( // initialize depth to 0 goto_functionst::function_mapt::iterator - i_it=goto_functions.function_map.find(CPROVER_PREFIX "initialize"); - assert(i_it!=goto_functions.function_map.end()); + i_it=goto_model.goto_functions.function_map.find( + CPROVER_PREFIX "initialize"); + DATA_INVARIANT( + i_it!=goto_model.goto_functions.function_map.end(), + "__CPROVER_initialize must exist"); goto_programt &init=i_it->second.body; goto_programt::targett first=init.instructions.begin(); @@ -110,5 +115,5 @@ void stack_depth( it->function=first->function; // update counters etc. - goto_functions.update(); + goto_model.goto_functions.update(); } diff --git a/src/goto-instrument/stack_depth.h b/src/goto-instrument/stack_depth.h index 8d0414121d7..d63037116ac 100644 --- a/src/goto-instrument/stack_depth.h +++ b/src/goto-instrument/stack_depth.h @@ -14,12 +14,10 @@ Date: November 2011 #ifndef CPROVER_GOTO_INSTRUMENT_STACK_DEPTH_H #define CPROVER_GOTO_INSTRUMENT_STACK_DEPTH_H -class symbol_tablet; -class goto_functionst; +class goto_modelt; void stack_depth( - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &, const int depth); #endif // CPROVER_GOTO_INSTRUMENT_STACK_DEPTH_H diff --git a/src/goto-instrument/thread_instrumentation.cpp b/src/goto-instrument/thread_instrumentation.cpp index 8222deed0e4..9182c62a786 100644 --- a/src/goto-instrument/thread_instrumentation.cpp +++ b/src/goto-instrument/thread_instrumentation.cpp @@ -9,8 +9,11 @@ Author: Daniel Kroening, kroening@kroening.com #include "thread_instrumentation.h" #include + #include +#include + static bool has_start_thread(const goto_programt &goto_program) { for(const auto &instruction : goto_program.instructions) @@ -53,12 +56,12 @@ void thread_exit_instrumentation(goto_programt &goto_program) end->function=function; } -void thread_exit_instrumentation(goto_functionst &goto_functions) +void thread_exit_instrumentation(goto_modelt &goto_model) { // we'll look for START THREAD std::set thread_fkts; - forall_goto_functions(f_it, goto_functions) + forall_goto_functions(f_it, goto_model.goto_functions) { if(has_start_thread(f_it->second.body)) { @@ -77,9 +80,8 @@ void thread_exit_instrumentation(goto_functionst &goto_functions) // now instrument for(const auto &fkt : thread_fkts) - { - thread_exit_instrumentation(goto_functions.function_map.at(fkt).body); - } + thread_exit_instrumentation( + goto_model.goto_functions.function_map.at(fkt).body); } void mutex_init_instrumentation( @@ -118,16 +120,14 @@ void mutex_init_instrumentation( } } -void mutex_init_instrumentation( - const symbol_tablet &symbol_table, - goto_functionst &goto_functions) +void mutex_init_instrumentation(goto_modelt &goto_model) { // get pthread_mutex_lock symbol_tablet::symbolst::const_iterator f_it= - symbol_table.symbols.find("pthread_mutex_lock"); + goto_model.symbol_table.symbols.find("pthread_mutex_lock"); - if(f_it==symbol_table.symbols.end()) + if(f_it==goto_model.symbol_table.symbols.end()) return; // get type of lock argument @@ -140,7 +140,7 @@ void mutex_init_instrumentation( if(lock_type.id()!=ID_pointer) return; - Forall_goto_functions(f_it, goto_functions) + Forall_goto_functions(f_it, goto_model.goto_functions) mutex_init_instrumentation( - symbol_table, f_it->second.body, lock_type.subtype()); + goto_model.symbol_table, f_it->second.body, lock_type.subtype()); } diff --git a/src/goto-instrument/thread_instrumentation.h b/src/goto-instrument/thread_instrumentation.h index c4c92394d72..6bda06ee6d8 100644 --- a/src/goto-instrument/thread_instrumentation.h +++ b/src/goto-instrument/thread_instrumentation.h @@ -10,10 +10,9 @@ Author: Daniel Kroening, kroening@kroening.com #ifndef CPROVER_GOTO_INSTRUMENT_THREAD_INSTRUMENTATION_H #define CPROVER_GOTO_INSTRUMENT_THREAD_INSTRUMENTATION_H -#include +class goto_modelt; -void thread_exit_instrumentation(goto_functionst &); - -void mutex_init_instrumentation(const symbol_tablet &, goto_functionst &); +void thread_exit_instrumentation(goto_modelt &); +void mutex_init_instrumentation(goto_modelt &); #endif // CPROVER_GOTO_INSTRUMENT_THREAD_INSTRUMENTATION_H diff --git a/src/goto-instrument/undefined_functions.cpp b/src/goto-instrument/undefined_functions.cpp index f76815d3009..ea5556151bf 100644 --- a/src/goto-instrument/undefined_functions.cpp +++ b/src/goto-instrument/undefined_functions.cpp @@ -15,22 +15,25 @@ Date: July 2016 #include -#include +#include + +#include void list_undefined_functions( - const goto_functionst &goto_functions, - const namespacet &ns, + const goto_modelt &goto_model, std::ostream &os) { - forall_goto_functions(it, goto_functions) + const namespacet ns(goto_model.symbol_table); + + forall_goto_functions(it, goto_model.goto_functions) if(!ns.lookup(it->first).is_macro && !it->second.body_available()) os << it->first << '\n'; } -void undefined_function_abort_path(goto_functionst &goto_functions) +void undefined_function_abort_path(goto_modelt &goto_model) { - Forall_goto_functions(it, goto_functions) + Forall_goto_functions(it, goto_model.goto_functions) Forall_goto_program_instructions(iit, it->second.body) { goto_programt::instructiont &ins=*iit; @@ -47,8 +50,10 @@ void undefined_function_abort_path(goto_functionst &goto_functions) to_symbol_expr(call.function()).get_identifier(); goto_functionst::function_mapt::const_iterator entry= - goto_functions.function_map.find(function); - assert(entry!=goto_functions.function_map.end()); + goto_model.goto_functions.function_map.find(function); + DATA_INVARIANT( + entry!=goto_model.goto_functions.function_map.end(), + "called function must be in function_map"); if(entry->second.body_available()) continue; diff --git a/src/goto-instrument/undefined_functions.h b/src/goto-instrument/undefined_functions.h index e9bb9df6f95..39b6cfe45e1 100644 --- a/src/goto-instrument/undefined_functions.h +++ b/src/goto-instrument/undefined_functions.h @@ -17,14 +17,12 @@ Date: July 2016 #include class namespacet; - -class goto_functionst; +class goto_modelt; void list_undefined_functions( - const goto_functionst &goto_functions, - const namespacet &ns, - std::ostream &os); + const goto_modelt &, + std::ostream &); -void undefined_function_abort_path(goto_functionst &goto_functions); +void undefined_function_abort_path(goto_modelt &); #endif diff --git a/src/goto-instrument/uninitialized.cpp b/src/goto-instrument/uninitialized.cpp index ca33c6bfbbb..5c416946213 100644 --- a/src/goto-instrument/uninitialized.cpp +++ b/src/goto-instrument/uninitialized.cpp @@ -194,26 +194,23 @@ void uninitializedt::add_assertions(goto_programt &goto_program) } } -void add_uninitialized_locals_assertions( - symbol_tablet &symbol_table, - goto_functionst &goto_functions) +void add_uninitialized_locals_assertions(goto_modelt &goto_model) { - Forall_goto_functions(f_it, goto_functions) + Forall_goto_functions(f_it, goto_model.goto_functions) { - uninitializedt uninitialized(symbol_table); + uninitializedt uninitialized(goto_model.symbol_table); uninitialized.add_assertions(f_it->second.body); } } void show_uninitialized( - const class symbol_tablet &symbol_table, - const goto_functionst &goto_functions, + const goto_modelt &goto_model, std::ostream &out) { - const namespacet ns(symbol_table); + const namespacet ns(goto_model.symbol_table); - forall_goto_functions(f_it, goto_functions) + forall_goto_functions(f_it, goto_model.goto_functions) { if(f_it->second.body_available()) { diff --git a/src/goto-instrument/uninitialized.h b/src/goto-instrument/uninitialized.h index 11437eee972..281d61894d2 100644 --- a/src/goto-instrument/uninitialized.h +++ b/src/goto-instrument/uninitialized.h @@ -16,15 +16,12 @@ Date: January 2010 #include -#include +#include -void add_uninitialized_locals_assertions( - class symbol_tablet &symbol_table, - goto_functionst &goto_functions); +void add_uninitialized_locals_assertions(goto_modelt &); void show_uninitialized( - const class symbol_tablet &symbol_table, - const goto_functionst &goto_functions, + const goto_modelt &, std::ostream &out); #endif // CPROVER_GOTO_INSTRUMENT_UNINITIALIZED_H diff --git a/src/goto-instrument/unwind.h b/src/goto-instrument/unwind.h index 6e86a5d98e2..6360fbaeb74 100644 --- a/src/goto-instrument/unwind.h +++ b/src/goto-instrument/unwind.h @@ -15,9 +15,9 @@ Author: Daniel Kroening, kroening@kroening.com #include #include -#include +#include -class goto_functionst; +class goto_modelt; // -1: do not unwind loop typedef std::map> unwind_sett; @@ -66,11 +66,30 @@ class goto_unwindt } void operator()( - goto_functionst &goto_functions, + goto_functionst &, const unwind_sett &unwind_set, const int k=-1, // -1: no global bound const unwind_strategyt unwind_strategy=unwind_strategyt::PARTIAL); + void operator()( + goto_modelt &goto_model, + const unsigned k, // global bound + const unwind_strategyt unwind_strategy=unwind_strategyt::PARTIAL) + { + const unwind_sett unwind_set; + operator()(goto_model.goto_functions, unwind_set, k, unwind_strategy); + } + + void operator()( + goto_modelt &goto_model, + const unwind_sett &unwind_set, + const int k=-1, // -1: no global bound + const unwind_strategyt unwind_strategy=unwind_strategyt::PARTIAL) + { + operator()( + goto_model.goto_functions, unwind_set, k, unwind_strategy); + } + // unwind log jsont output_log_json() const diff --git a/src/goto-instrument/wmm/goto2graph.h b/src/goto-instrument/wmm/goto2graph.h index ea2a79f8b99..c8b472e079b 100644 --- a/src/goto-instrument/wmm/goto2graph.h +++ b/src/goto-instrument/wmm/goto2graph.h @@ -20,13 +20,12 @@ Date: 2012 #include #include -#include +#include #include "event_graph.h" #include "wmm.h" -class symbol_tablet; -class goto_functionst; +class goto_modelt; class value_setst; class local_may_aliast; @@ -329,11 +328,10 @@ class instrumentert std::multimap id2cycloc; instrumentert( - symbol_tablet &_symbol_table, - goto_functionst &_goto_f, + goto_modelt &_goto_model, messaget &_message): - ns(_symbol_table), - goto_functions(_goto_f), + ns(_goto_model.symbol_table), + goto_functions(_goto_model.goto_functions), render_po_aligned(true), render_by_file(false), render_by_function(false), diff --git a/src/goto-instrument/wmm/instrumenter_pensieve.h b/src/goto-instrument/wmm/instrumenter_pensieve.h index 1e954344322..cb7afeb45dc 100644 --- a/src/goto-instrument/wmm/instrumenter_pensieve.h +++ b/src/goto-instrument/wmm/instrumenter_pensieve.h @@ -15,16 +15,14 @@ Module: Instrumenter #include "event_graph.h" #include "goto2graph.h" -class symbol_tablet; -class goto_functionst; +class goto_modelt; class namespacet; class instrumenter_pensievet:public instrumentert { public: - instrumenter_pensievet(symbol_tablet &_symbol_table, - goto_functionst &_goto_f, messaget &message) - : instrumentert(_symbol_table, _goto_f, message) + instrumenter_pensievet(goto_modelt &_goto_model, messaget &message) + : instrumentert(_goto_model, message) { } diff --git a/src/goto-instrument/wmm/weak_memory.cpp b/src/goto-instrument/wmm/weak_memory.cpp index 0e1b5cbbc90..468d944f14a 100644 --- a/src/goto-instrument/wmm/weak_memory.cpp +++ b/src/goto-instrument/wmm/weak_memory.cpp @@ -106,8 +106,7 @@ void introduce_temporaries( void weak_memory( memory_modelt model, value_setst &value_sets, - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + goto_modelt &goto_model, bool SCC, instrumentation_strategyt event_strategy, unsigned unwinding_bound, @@ -135,10 +134,10 @@ void weak_memory( message.status() << "--------" << messaget::eom; // all access to shared variables is pushed into assignments - Forall_goto_functions(f_it, goto_functions) + Forall_goto_functions(f_it, goto_model.goto_functions) if(f_it->first!=CPROVER_PREFIX "initialize" && f_it->first!=goto_functionst::entry_point()) - introduce_temporaries(value_sets, symbol_table, f_it->first, + introduce_temporaries(value_sets, goto_model.symbol_table, f_it->first, f_it->second.body, #ifdef LOCAL_MAY f_it->second, @@ -148,7 +147,7 @@ void weak_memory( message.status() << "Temp added" << messaget::eom; unsigned max_thds = 0; - instrumentert instrumenter(symbol_table, goto_functions, message); + instrumentert instrumenter(goto_model, message); max_thds=instrumenter.goto2graph_cfg(value_sets, model, no_dependencies, duplicate_body); message.status()<<"abstraction completed"<::iterator it= shared_buffers.affected_by_delay_set.begin(); @@ -245,19 +246,19 @@ void weak_memory( << ran_it->second << messaget::eom; } - shared_bufferst::cfg_visitort visitor(shared_buffers, symbol_table, - goto_functions); - visitor.weak_memory(value_sets, goto_functions.entry_point(), model); + shared_bufferst::cfg_visitort visitor( + shared_buffers, goto_model.symbol_table, goto_model.goto_functions); + visitor.weak_memory( + value_sets, goto_model.goto_functions.entry_point(), model); /* removes potential skips */ - Forall_goto_functions(f_it, goto_functions) - remove_skip(f_it->second.body); + remove_skip(goto_model); // initialization code for buffers - shared_buffers.add_initialization_code(goto_functions); + shared_buffers.add_initialization_code(goto_model.goto_functions); // update counters etc. - goto_functions.update(); + goto_model.goto_functions.update(); message.status()<< "Goto-program instrumented" << messaget::eom; } diff --git a/src/goto-instrument/wmm/weak_memory.h b/src/goto-instrument/wmm/weak_memory.h index 34b98e6a767..d4eb6078174 100644 --- a/src/goto-instrument/wmm/weak_memory.h +++ b/src/goto-instrument/wmm/weak_memory.h @@ -16,20 +16,19 @@ Date: September 2011 #include "wmm.h" -#include "util/irep.h" +#include -class value_setst; -class goto_functionst; class symbol_tablet; +class value_setst; +class goto_modelt; class message_handlert; class goto_programt; class messaget; void weak_memory( memory_modelt model, - value_setst &value_sets, - symbol_tablet &symbol_table, - goto_functionst &goto_functions, + value_setst &, + goto_modelt &, bool SCC, instrumentation_strategyt event_stategy, unsigned unwinding_bound, @@ -43,14 +42,14 @@ void weak_memory( bool render_function, bool cav11_option, bool hide_internals, - message_handlert &message, + message_handlert &, bool ignore_arrays); void introduce_temporaries( - value_setst &value_sets, - symbol_tablet &symbol_table, + value_setst &, + symbol_tablet &, const irep_idt &function, - goto_programt &goto_program, + goto_programt &, #ifdef LOCAL_MAY const goto_functionst::goto_functiont &goto_function, #endif diff --git a/src/goto-programs/CMakeLists.txt b/src/goto-programs/CMakeLists.txt new file mode 100644 index 00000000000..84a06943b98 --- /dev/null +++ b/src/goto-programs/CMakeLists.txt @@ -0,0 +1,7 @@ +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +add_library(goto-programs ${sources} ${headers}) + +generic_includes(goto-programs) + +target_link_libraries(goto-programs util assembler langapi analyses ansi-c) diff --git a/src/goto-programs/Makefile b/src/goto-programs/Makefile index b164beef079..4da25537292 100644 --- a/src/goto-programs/Makefile +++ b/src/goto-programs/Makefile @@ -36,6 +36,7 @@ SRC = basic_blocks.cpp \ property_checker.cpp \ read_bin_goto_object.cpp \ read_goto_binary.cpp \ + rebuild_goto_start_function.cpp \ remove_asm.cpp \ remove_complex.cpp \ remove_const_function_pointers.cpp \ diff --git a/src/goto-programs/goto_convert_functions.cpp b/src/goto-programs/goto_convert_functions.cpp index 5a35d5e2ef7..58d03a16cef 100644 --- a/src/goto-programs/goto_convert_functions.cpp +++ b/src/goto-programs/goto_convert_functions.cpp @@ -221,15 +221,6 @@ void goto_convert_functionst::convert_function(const irep_idt &identifier) f.make_hidden(); } -void goto_convert( - symbol_tablet &symbol_table, - goto_modelt &goto_model, - message_handlert &message_handler) -{ - goto_convert(symbol_table, goto_model.goto_functions, message_handler); - goto_model.symbol_table.swap(symbol_table); -} - void goto_convert( goto_modelt &goto_model, message_handlert &message_handler) diff --git a/src/goto-programs/goto_convert_functions.h b/src/goto-programs/goto_convert_functions.h index 85de9a67b97..3162b453d0f 100644 --- a/src/goto-programs/goto_convert_functions.h +++ b/src/goto-programs/goto_convert_functions.h @@ -23,12 +23,6 @@ void goto_convert( goto_functionst &functions, message_handlert &); -// confusing, will go away -void goto_convert( - symbol_tablet &symbol_table, - goto_modelt &dest, - message_handlert &); - // convert it all! void goto_convert( goto_modelt &, diff --git a/src/goto-programs/goto_inline.cpp b/src/goto-programs/goto_inline.cpp index 88ba69c26c0..62957297922 100644 --- a/src/goto-programs/goto_inline.cpp +++ b/src/goto-programs/goto_inline.cpp @@ -284,24 +284,25 @@ void goto_function_inline( } jsont goto_function_inline_and_log( - goto_functionst &goto_functions, + goto_modelt &goto_model, const irep_idt function, - const namespacet &ns, message_handlert &message_handler, bool adjust_function, bool caching) { + const namespacet ns(goto_model.symbol_table); + goto_inlinet goto_inline( - goto_functions, + goto_model.goto_functions, ns, message_handler, adjust_function, caching); goto_functionst::function_mapt::iterator f_it= - goto_functions.function_map.find(function); + goto_model.goto_functions.function_map.find(function); - if(f_it==goto_functions.function_map.end()) + if(f_it==goto_model.goto_functions.function_map.end()) return jsont(); goto_functionst::goto_functiont &goto_function=f_it->second; @@ -326,8 +327,8 @@ jsont goto_function_inline_and_log( } goto_inline.goto_inline(function, goto_function, inline_map, true); - goto_functions.update(); - goto_functions.compute_loop_numbers(); + goto_model.goto_functions.update(); + goto_model.goto_functions.compute_loop_numbers(); return goto_inline.output_inline_log_json(); } diff --git a/src/goto-programs/goto_inline.h b/src/goto-programs/goto_inline.h index 3319aa36172..bbb4f0365e5 100644 --- a/src/goto-programs/goto_inline.h +++ b/src/goto-programs/goto_inline.h @@ -65,9 +65,8 @@ void goto_function_inline( bool caching=true); jsont goto_function_inline_and_log( - goto_functionst &goto_functions, + goto_modelt &, const irep_idt function, - const namespacet &ns, message_handlert &message_handler, bool adjust_function=false, bool caching=true); diff --git a/src/goto-programs/goto_model.h b/src/goto-programs/goto_model.h index 6e9ebbc6f37..2f9c5939bc2 100644 --- a/src/goto-programs/goto_model.h +++ b/src/goto-programs/goto_model.h @@ -31,7 +31,7 @@ class goto_modelt goto_functions.clear(); } - void output(std::ostream &out) + void output(std::ostream &out) const { namespacet ns(symbol_table); goto_functions.output(ns, out); diff --git a/src/goto-programs/goto_trace.h b/src/goto-programs/goto_trace.h index 02f230e8943..2153cffb040 100644 --- a/src/goto-programs/goto_trace.h +++ b/src/goto-programs/goto_trace.h @@ -24,6 +24,7 @@ Date: July 2005 #include #include +#include #include #include @@ -195,12 +196,12 @@ class goto_tracet void show_goto_trace( std::ostream &out, - const namespacet &ns, - const goto_tracet &goto_trace); + const namespacet &, + const goto_tracet &); void trace_value( std::ostream &out, - const namespacet &ns, + const namespacet &, const ssa_exprt &lhs_object, const exprt &full_lhs, const exprt &value); diff --git a/src/goto-programs/initialize_goto_model.cpp b/src/goto-programs/initialize_goto_model.cpp index 7b7024acdb0..11f182146a4 100644 --- a/src/goto-programs/initialize_goto_model.cpp +++ b/src/goto-programs/initialize_goto_model.cpp @@ -21,6 +21,8 @@ Author: Daniel Kroening, kroening@kroening.com #include #include +#include + #include "goto_convert_functions.h" #include "read_goto_binary.h" @@ -134,12 +136,30 @@ bool initialize_goto_model( return true; } + if(cmdline.isset("function")) + { + const std::string &function_id=cmdline.get_value("function"); + rebuild_goto_start_functiont start_function_rebuilder( + msg.get_message_handler(), + goto_model.symbol_table, + goto_model.goto_functions); + + if(start_function_rebuilder(function_id)) + { + return 6; + } + } + msg.status() << "Generating GOTO Program" << messaget::eom; goto_convert( goto_model.symbol_table, goto_model.goto_functions, message_handler); + + // stupid hack + config.set_object_bits_from_symbol_table( + goto_model.symbol_table); } catch(const char *e) { diff --git a/src/goto-programs/interpreter.cpp b/src/goto-programs/interpreter.cpp index 25d2be08cb8..c65bc472a46 100644 --- a/src/goto-programs/interpreter.cpp +++ b/src/goto-programs/interpreter.cpp @@ -1049,18 +1049,6 @@ exprt interpretert::get_value(const irep_idt &id) return get_value(get_type, integer2size_t(whole_lhs_object_address)); } -void interpreter( - const symbol_tablet &symbol_table, - const goto_functionst &goto_functions, - message_handlert &message_handler) -{ - interpretert interpreter( - symbol_table, - goto_functions, - message_handler); - interpreter(); -} - /// Prints the current state of the memory map Since messaget mdofifies class /// members, print functions are nonconst void interpretert::print_memory(bool input_flags) @@ -1079,3 +1067,15 @@ void interpretert::print_memory(bool input_flags) debug() << eom; } } + +void interpreter( + const goto_modelt &goto_model, + message_handlert &message_handler) +{ + interpretert interpreter( + goto_model.symbol_table, + goto_model.goto_functions, + message_handler); + interpreter(); +} + diff --git a/src/goto-programs/interpreter.h b/src/goto-programs/interpreter.h index 8d598852b1a..c4b84863bc7 100644 --- a/src/goto-programs/interpreter.h +++ b/src/goto-programs/interpreter.h @@ -14,11 +14,10 @@ Author: Daniel Kroening, kroening@kroening.com #include -#include "goto_functions.h" +#include "goto_model.h" void interpreter( - const symbol_tablet &symbol_table, - const goto_functionst &goto_functions, - message_handlert &message_handler); + const goto_modelt &, + message_handlert &); #endif // CPROVER_GOTO_PROGRAMS_INTERPRETER_H diff --git a/src/goto-programs/read_goto_binary.cpp b/src/goto-programs/read_goto_binary.cpp index 2b4a3805401..9e7a1968ccc 100644 --- a/src/goto-programs/read_goto_binary.cpp +++ b/src/goto-programs/read_goto_binary.cpp @@ -30,8 +30,6 @@ Module: Read Goto Programs #include #include -#include - #include "goto_model.h" #include "link_goto_model.h" #include "read_bin_goto_object.h" diff --git a/src/goto-programs/read_goto_binary.h b/src/goto-programs/read_goto_binary.h index bbaba7a5c11..1cc60e13a37 100644 --- a/src/goto-programs/read_goto_binary.h +++ b/src/goto-programs/read_goto_binary.h @@ -14,10 +14,10 @@ Author: Daniel Kroening, kroening@kroening.com #include -class symbol_tablet; class goto_functionst; -class message_handlert; class goto_modelt; +class message_handlert; +class symbol_tablet; bool read_goto_binary( const std::string &filename, diff --git a/src/goto-programs/rebuild_goto_start_function.cpp b/src/goto-programs/rebuild_goto_start_function.cpp new file mode 100644 index 00000000000..0949c1da73f --- /dev/null +++ b/src/goto-programs/rebuild_goto_start_function.cpp @@ -0,0 +1,109 @@ +/*******************************************************************\ + Module: Goto Programs + Author: Thomas Kiley, thomas@diffblue.com +\*******************************************************************/ + +/// \file +/// Goto Programs Author: Thomas Kiley, thomas@diffblue.com + +#include "rebuild_goto_start_function.h" + +#include +#include +#include +#include +#include +#include +#include + +/// To rebuild the _start funciton in the event the program was compiled into +/// GOTO with a different entry function selected. +/// \param _message_handler: The message handler to report any messages with +/// \param symbol_table: The symbol table of the program (to replace the _start +/// functions symbo) +/// \param goto_functions: The goto functions of the program (to replace the +/// body of the _start function). +rebuild_goto_start_functiont::rebuild_goto_start_functiont( + message_handlert &_message_handler, + symbol_tablet &symbol_table, + goto_functionst &goto_functions): + messaget(_message_handler), + symbol_table(symbol_table), + goto_functions(goto_functions) +{ +} + +/// To rebuild the _start function in the event the program was compiled into +/// GOTO with a different entry function selected. It works by discarding the +/// _start symbol and GOTO function and calling on the relevant languaget to +/// generate the _start function again. +/// \param entry_function: The name of the entry function that should be +/// called from _start +/// \return Returns true if either the symbol is not found, or something went +/// wrong with generating the start_function. False otherwise. +bool rebuild_goto_start_functiont::operator()( + const irep_idt &entry_function) +{ + const irep_idt &mode=get_entry_point_mode(); + + // Get the relevant languaget to generate the new entry point with + std::unique_ptr language=get_language_from_mode(mode); + INVARIANT(language, "No language found for mode: "+id2string(mode)); + language->set_message_handler(get_message_handler()); + + // To create a new entry point we must first remove the old one + remove_existing_entry_point(); + + bool return_code= + language->generate_start_function(entry_function, symbol_table); + + // Remove the function from the goto_functions so it is copied back in + // from the symbol table during goto_convert + if(!return_code) + { + const auto &start_function= + goto_functions.function_map.find(goto_functionst::entry_point()); + if(start_function!=goto_functions.function_map.end()) + { + goto_functions.function_map.erase(start_function); + } + } + + return return_code; +} + +/// Find out the mode of the current entry point to determine the mode of the +/// replacement entry point +/// \return A mode string saying which language to use +irep_idt rebuild_goto_start_functiont::get_entry_point_mode() const +{ + const symbolt ¤t_entry_point= + symbol_table.lookup(goto_functionst::entry_point()); + return current_entry_point.mode; +} + +/// Eliminate the existing entry point function symbol and any symbols created +/// in that scope from the symbol table. +void rebuild_goto_start_functiont::remove_existing_entry_point() +{ + // Remove the function itself + symbol_table.remove(goto_functionst::entry_point()); + + // And any symbols created in the scope of the entry point + std::vector entry_point_symbols; + for(const auto &symbol_entry : symbol_table.symbols) + { + const bool is_entry_point_symbol= + has_prefix( + id2string(symbol_entry.first), + id2string(goto_functionst::entry_point())); + + if(is_entry_point_symbol) + entry_point_symbols.push_back(symbol_entry.first); + } + + for(const irep_idt &entry_point_symbol : entry_point_symbols) + { + symbol_table.remove(entry_point_symbol); + } +} diff --git a/src/goto-programs/rebuild_goto_start_function.h b/src/goto-programs/rebuild_goto_start_function.h new file mode 100644 index 00000000000..870e05a61f6 --- /dev/null +++ b/src/goto-programs/rebuild_goto_start_function.h @@ -0,0 +1,42 @@ +/*******************************************************************\ + Module: Goto Programs + Author: Thomas Kiley, thomas@diffblue.com +\*******************************************************************/ + +/// \file +/// Goto Programs Author: Thomas Kiley, thomas@diffblue.com + +#ifndef CPROVER_GOTO_PROGRAMS_REBUILD_GOTO_START_FUNCTION_H +#define CPROVER_GOTO_PROGRAMS_REBUILD_GOTO_START_FUNCTION_H + +#include + +class symbol_tablet; +class goto_functionst; + +#define OPT_FUNCTIONS \ + "(function):" + +#define HELP_FUNCTIONS \ + " --function name set main function name\n" + +class rebuild_goto_start_functiont: public messaget +{ +public: + rebuild_goto_start_functiont( + message_handlert &_message_handler, + symbol_tablet &symbol_table, + goto_functionst &goto_functions); + + bool operator()(const irep_idt &entry_function); + +private: + irep_idt get_entry_point_mode() const; + + void remove_existing_entry_point(); + + symbol_tablet &symbol_table; + goto_functionst &goto_functions; +}; + +#endif // CPROVER_GOTO_PROGRAMS_REBUILD_GOTO_START_FUNCTION_H diff --git a/src/goto-programs/remove_exceptions.cpp b/src/goto-programs/remove_exceptions.cpp index 712aaf4b1f3..d437ddf622b 100644 --- a/src/goto-programs/remove_exceptions.cpp +++ b/src/goto-programs/remove_exceptions.cpp @@ -213,7 +213,7 @@ void remove_exceptionst::add_exceptional_returns( new_symbol.base_name=id2string(function_symbol.base_name)+EXC_SUFFIX; new_symbol.name=id2string(function_symbol.name)+EXC_SUFFIX; new_symbol.mode=function_symbol.mode; - new_symbol.type=typet(ID_pointer, empty_typet()); + new_symbol.type=pointer_type(empty_typet()); symbol_table.add(new_symbol); // initialize the exceptional return with NULL @@ -584,9 +584,7 @@ void remove_exceptions( /// removes throws/CATCH-POP/CATCH-PUSH void remove_exceptions(goto_modelt &goto_model) { - std::map> exceptions_map; - remove_exceptionst remove_exceptions( + remove_exceptions( goto_model.symbol_table, - exceptions_map); - remove_exceptions(goto_model.goto_functions); + goto_model.goto_functions); } diff --git a/src/goto-programs/remove_returns.cpp b/src/goto-programs/remove_returns.cpp index de22b39e2a4..8728a075941 100644 --- a/src/goto-programs/remove_returns.cpp +++ b/src/goto-programs/remove_returns.cpp @@ -384,10 +384,8 @@ void remove_returnst::restore(goto_functionst &goto_functions) } /// restores return statements -void restore_returns( - symbol_tablet &symbol_table, - goto_functionst &goto_functions) +void restore_returns(goto_modelt &goto_model) { - remove_returnst rr(symbol_table); - rr.restore(goto_functions); + remove_returnst rr(goto_model.symbol_table); + rr.restore(goto_model.goto_functions); } diff --git a/src/goto-programs/remove_returns.h b/src/goto-programs/remove_returns.h index d4e50cae57b..04b113cff18 100644 --- a/src/goto-programs/remove_returns.h +++ b/src/goto-programs/remove_returns.h @@ -29,6 +29,8 @@ void remove_returns(goto_modelt &); // reverse the above operations void restore_returns(symbol_tablet &, goto_functionst &); +void restore_returns(goto_modelt &); + code_typet original_return_type( const symbol_tablet &symbol_table, const irep_idt &function_id); diff --git a/src/goto-programs/remove_static_init_loops.cpp b/src/goto-programs/remove_static_init_loops.cpp index e6493732b62..c0f3c05150f 100644 --- a/src/goto-programs/remove_static_init_loops.cpp +++ b/src/goto-programs/remove_static_init_loops.cpp @@ -10,6 +10,7 @@ Author: Daniel Kroening, kroening@kroening.com /// Unwind loops in static initializers #include "remove_static_init_loops.h" +#include "goto_model.h" #include @@ -103,6 +104,18 @@ void remove_static_init_loopst::unwind_enum_static( /// code of Java enums /// \par parameters: symbol table, goto_functions and options /// \return side effect is adding loops to unwindset +void remove_static_init_loops( + const goto_modelt &goto_model, + optionst &options, + message_handlert &msg) +{ + remove_static_init_loops( + goto_model.symbol_table, + goto_model.goto_functions, + options, + msg); +} + void remove_static_init_loops( const symbol_tablet &symbol_table, const goto_functionst &goto_functions, diff --git a/src/goto-programs/remove_static_init_loops.h b/src/goto-programs/remove_static_init_loops.h index 3f781f6a70b..a78001046aa 100644 --- a/src/goto-programs/remove_static_init_loops.h +++ b/src/goto-programs/remove_static_init_loops.h @@ -9,18 +9,27 @@ Author: Daniel Kroening, kroening@kroening.com /// \file /// Unwind loops in static initializers +#ifndef CPROVER_GOTO_PROGRAMS_REMOVE_STATIC_INIT_LOOPS_H +#define CPROVER_GOTO_PROGRAMS_REMOVE_STATIC_INIT_LOOPS_H + #include #include #include #include -#ifndef CPROVER_GOTO_PROGRAMS_REMOVE_STATIC_INIT_LOOPS_H -#define CPROVER_GOTO_PROGRAMS_REMOVE_STATIC_INIT_LOOPS_H +class goto_modelt; +class symbol_tablet; +class goto_functionst; + +void remove_static_init_loops( + const goto_modelt &, + optionst &, + message_handlert &); void remove_static_init_loops( - const symbol_tablet &, - const goto_functionst &, + const symbol_tablet &symbol_table, + const goto_functionst &goto_functions, optionst &, message_handlert &); diff --git a/src/goto-programs/show_goto_functions.h b/src/goto-programs/show_goto_functions.h index 4f63fde97a6..d13c83557bc 100644 --- a/src/goto-programs/show_goto_functions.h +++ b/src/goto-programs/show_goto_functions.h @@ -14,9 +14,9 @@ Author: Peter Schrammel #include -class goto_functionst; class namespacet; class goto_modelt; +class goto_functionst; #define OPT_SHOW_GOTO_FUNCTIONS \ "(show-goto-functions)" diff --git a/src/goto-programs/show_properties.h b/src/goto-programs/show_properties.h index b5564818195..0cb0d1c641f 100644 --- a/src/goto-programs/show_properties.h +++ b/src/goto-programs/show_properties.h @@ -14,17 +14,18 @@ Author: Daniel Kroening, kroening@kroening.com #include -class goto_functionst; class namespacet; class goto_modelt; +class symbol_tablet; +class goto_functionst; + +void show_properties( + const goto_modelt &, + ui_message_handlert::uit ui); void show_properties( const namespacet &ns, ui_message_handlert::uit ui, const goto_functionst &goto_functions); -void show_properties( - const goto_modelt &, - ui_message_handlert::uit ui); - #endif // CPROVER_GOTO_PROGRAMS_SHOW_PROPERTIES_H diff --git a/src/goto-programs/show_symbol_table.cpp b/src/goto-programs/show_symbol_table.cpp index eebb63dcfcd..b4230f9086b 100644 --- a/src/goto-programs/show_symbol_table.cpp +++ b/src/goto-programs/show_symbol_table.cpp @@ -23,8 +23,44 @@ void show_symbol_table_xml_ui() { } +void show_symbol_table_brief_plain( + const symbol_tablet &symbol_table, + std::ostream &out) +{ + // we want to sort alphabetically + std::set symbols; + + forall_symbols(it, symbol_table.symbols) + symbols.insert(id2string(it->first)); + + const namespacet ns(symbol_table); + + for(const std::string &id : symbols) + { + const symbolt &symbol=ns.lookup(id); + + std::unique_ptr ptr; + + if(symbol.mode=="") + ptr=get_default_language(); + else + { + ptr=get_language_from_mode(symbol.mode); + if(ptr==nullptr) + throw "symbol "+id2string(symbol.name)+" has unknown mode"; + } + + std::string type_str; + + if(symbol.type.is_not_nil()) + ptr->from_type(symbol.type, type_str, ns); + + out << symbol.name << " " << type_str << '\n'; + } +} + void show_symbol_table_plain( - const goto_modelt &goto_model, + const symbol_tablet &symbol_table, std::ostream &out) { out << '\n' << "Symbols:" << '\n' << '\n'; @@ -32,10 +68,10 @@ void show_symbol_table_plain( // we want to sort alphabetically std::set symbols; - forall_symbols(it, goto_model.symbol_table.symbols) + forall_symbols(it, symbol_table.symbols) symbols.insert(id2string(it->first)); - const namespacet ns(goto_model.symbol_table); + const namespacet ns(symbol_table); for(const std::string &id : symbols) { @@ -112,14 +148,40 @@ void show_symbol_table_plain( } } +void show_symbol_table( + const symbol_tablet &symbol_table, + ui_message_handlert::uit ui) +{ + switch(ui) + { + case ui_message_handlert::uit::PLAIN: + show_symbol_table_plain(symbol_table, std::cout); + break; + + case ui_message_handlert::uit::XML_UI: + show_symbol_table_xml_ui(); + break; + + default: + break; + } +} + void show_symbol_table( const goto_modelt &goto_model, ui_message_handlert::uit ui) +{ + show_symbol_table(goto_model.symbol_table, ui); +} + +void show_symbol_table_brief( + const symbol_tablet &symbol_table, + ui_message_handlert::uit ui) { switch(ui) { case ui_message_handlert::uit::PLAIN: - show_symbol_table_plain(goto_model, std::cout); + show_symbol_table_brief_plain(symbol_table, std::cout); break; case ui_message_handlert::uit::XML_UI: @@ -130,3 +192,10 @@ void show_symbol_table( break; } } + +void show_symbol_table_brief( + const goto_modelt &goto_model, + ui_message_handlert::uit ui) +{ + show_symbol_table_brief(goto_model.symbol_table, ui); +} diff --git a/src/goto-programs/show_symbol_table.h b/src/goto-programs/show_symbol_table.h index 5ad717e7049..82e49128967 100644 --- a/src/goto-programs/show_symbol_table.h +++ b/src/goto-programs/show_symbol_table.h @@ -14,9 +14,22 @@ Author: Daniel Kroening, kroening@kroening.com #include +class symbol_tablet; class goto_modelt; void show_symbol_table( + const symbol_tablet &, + ui_message_handlert::uit ui); + +void show_symbol_table_brief( + const symbol_tablet &, + ui_message_handlert::uit ui); + +void show_symbol_table( + const goto_modelt &, + ui_message_handlert::uit ui); + +void show_symbol_table_brief( const goto_modelt &, ui_message_handlert::uit ui); diff --git a/src/goto-programs/slice_global_inits.cpp b/src/goto-programs/slice_global_inits.cpp index 2518a754af5..cc4f7349eb7 100644 --- a/src/goto-programs/slice_global_inits.cpp +++ b/src/goto-programs/slice_global_inits.cpp @@ -25,14 +25,13 @@ Date: December 2016 #include #include -void slice_global_inits( - const namespacet &ns, - goto_functionst &goto_functions) +void slice_global_inits(goto_modelt &goto_model) { // gather all functions reachable from the entry point - call_grapht call_graph(goto_functions); + call_grapht call_graph(goto_model); const call_grapht::grapht &graph=call_graph.graph; + goto_functionst &goto_functions=goto_model.goto_functions; std::list worklist; std::unordered_set functions_reached; diff --git a/src/goto-programs/slice_global_inits.h b/src/goto-programs/slice_global_inits.h index 25a96121961..9067bf83a57 100644 --- a/src/goto-programs/slice_global_inits.h +++ b/src/goto-programs/slice_global_inits.h @@ -14,11 +14,8 @@ Date: December 2016 #ifndef CPROVER_GOTO_PROGRAMS_SLICE_GLOBAL_INITS_H #define CPROVER_GOTO_PROGRAMS_SLICE_GLOBAL_INITS_H -class goto_functionst; -class namespacet; +class goto_modelt; -void slice_global_inits( - const namespacet &ns, - goto_functionst &goto_functions); +void slice_global_inits(goto_modelt &); #endif diff --git a/src/goto-programs/write_goto_binary.cpp b/src/goto-programs/write_goto_binary.cpp index 75542144d91..bdc353ad122 100644 --- a/src/goto-programs/write_goto_binary.cpp +++ b/src/goto-programs/write_goto_binary.cpp @@ -17,18 +17,20 @@ Author: CM Wintersteiger #include #include +#include + /// Writes a goto program to disc, using goto binary format ver 2 bool write_goto_binary_v3( std::ostream &out, - const symbol_tablet &lsymbol_table, - const goto_functionst &functions, + const symbol_tablet &symbol_table, + const goto_functionst &goto_functions, irep_serializationt &irepconverter) { // first write symbol table - write_gb_word(out, lsymbol_table.symbols.size()); + write_gb_word(out, symbol_table.symbols.size()); - forall_symbols(it, lsymbol_table.symbols) + forall_symbols(it, symbol_table.symbols) { // Since version 2, symbols are not converted to ireps, // instead they are saved in a custom binary format @@ -72,13 +74,13 @@ bool write_goto_binary_v3( // now write functions, but only those with body unsigned cnt=0; - forall_goto_functions(it, functions) + forall_goto_functions(it, goto_functions) if(it->second.body_available()) cnt++; write_gb_word(out, cnt); - for(const auto &fct : functions.function_map) + for(const auto &fct : goto_functions.function_map) { if(fct.second.body_available()) { @@ -122,8 +124,21 @@ bool write_goto_binary_v3( /// Writes a goto program to disc bool write_goto_binary( std::ostream &out, - const symbol_tablet &lsymbol_table, - const goto_functionst &functions, + const goto_modelt &goto_model, + int version) +{ + return write_goto_binary( + out, + goto_model.symbol_table, + goto_model.goto_functions, + version); +} + +/// Writes a goto program to disc +bool write_goto_binary( + std::ostream &out, + const symbol_tablet &symbol_table, + const goto_functionst &goto_functions, int version) { // header @@ -143,8 +158,7 @@ bool write_goto_binary( case 3: return write_goto_binary_v3( - out, lsymbol_table, functions, - irepconverter); + out, symbol_table, goto_functions, irepconverter); default: throw "unknown goto binary version"; @@ -156,8 +170,7 @@ bool write_goto_binary( /// Writes a goto program to disc bool write_goto_binary( const std::string &filename, - const symbol_tablet &symbol_table, - const goto_functionst &goto_functions, + const goto_modelt &goto_model, message_handlert &message_handler) { std::ofstream out(filename, std::ios::binary); @@ -170,5 +183,5 @@ bool write_goto_binary( return true; } - return write_goto_binary(out, symbol_table, goto_functions); + return write_goto_binary(out, goto_model); } diff --git a/src/goto-programs/write_goto_binary.h b/src/goto-programs/write_goto_binary.h index fd3acd9cb77..d9cf23d6def 100644 --- a/src/goto-programs/write_goto_binary.h +++ b/src/goto-programs/write_goto_binary.h @@ -19,20 +19,23 @@ Author: CM Wintersteiger #include "goto_functions.h" -class symbol_tablet; -class goto_functionst; +class goto_modelt; class message_handlert; bool write_goto_binary( std::ostream &out, - const symbol_tablet &symbol_table, - const goto_functionst &goto_functions, + const goto_modelt &, + int version=GOTO_BINARY_VERSION); + +bool write_goto_binary( + std::ostream &out, + const symbol_tablet &, + const goto_functionst &, int version=GOTO_BINARY_VERSION); bool write_goto_binary( const std::string &filename, - const symbol_tablet &lsymbol_table, - const goto_functionst &goto_functions, - message_handlert &message_handler); + const goto_modelt &, + message_handlert &); #endif // CPROVER_GOTO_PROGRAMS_WRITE_GOTO_BINARY_H diff --git a/src/goto-symex/CMakeLists.txt b/src/goto-symex/CMakeLists.txt new file mode 100644 index 00000000000..cc51bb603d9 --- /dev/null +++ b/src/goto-symex/CMakeLists.txt @@ -0,0 +1,7 @@ +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +add_library(goto-symex ${sources} ${headers}) + +generic_includes(goto-symex) + +target_link_libraries(goto-symex util) diff --git a/src/goto-symex/goto_symex_state.cpp b/src/goto-symex/goto_symex_state.cpp index 9616a3daa20..f2db40c8b71 100644 --- a/src/goto-symex/goto_symex_state.cpp +++ b/src/goto-symex/goto_symex_state.cpp @@ -34,21 +34,6 @@ goto_symex_statet::goto_symex_statet(): goto_symex_statet::~goto_symex_statet()=default; -void goto_symex_statet::initialize(const goto_functionst &goto_functions) -{ - goto_functionst::function_mapt::const_iterator it= - goto_functions.function_map.find(goto_functionst::entry_point()); - - if(it==goto_functions.function_map.end()) - throw "program has no entry point"; - - const goto_programt &body=it->second.body; - - source=symex_targett::sourcet(body); - top().end_of_function=--body.instructions.end(); - top().calling_location.pc=top().end_of_function; -} - void goto_symex_statet::level0t::operator()( ssa_exprt &ssa_expr, const namespacet &ns, diff --git a/src/goto-symex/goto_symex_state.h b/src/goto-symex/goto_symex_state.h index 3c2deecf994..37d7d94d334 100644 --- a/src/goto-symex/goto_symex_state.h +++ b/src/goto-symex/goto_symex_state.h @@ -42,8 +42,6 @@ class goto_symex_statet final symex_targett::sourcet source; symex_targett *symex_target; - void initialize(const goto_functionst &goto_functions); - // we have a two-level renaming typedef std::map original_identifierst; diff --git a/src/goto-symex/precondition.cpp b/src/goto-symex/precondition.cpp index 11657a78e55..8b3f9cdf082 100644 --- a/src/goto-symex/precondition.cpp +++ b/src/goto-symex/precondition.cpp @@ -10,12 +10,13 @@ Author: Daniel Kroening, kroening@kroening.com /// Symbolic Execution #include "precondition.h" +#include "goto_symex_state.h" #include #include -#include "goto_symex_state.h" +#include class preconditiont { diff --git a/src/java_bytecode/CMakeLists.txt b/src/java_bytecode/CMakeLists.txt new file mode 100644 index 00000000000..282519dbf1c --- /dev/null +++ b/src/java_bytecode/CMakeLists.txt @@ -0,0 +1,7 @@ +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +add_library(java_bytecode ${sources} ${headers}) + +generic_includes(java_bytecode) + +target_link_libraries(java_bytecode util goto-programs miniz json) diff --git a/src/java_bytecode/java_bytecode_language.cpp b/src/java_bytecode/java_bytecode_language.cpp index d5d1c890fc9..9758da39a92 100644 --- a/src/java_bytecode/java_bytecode_language.cpp +++ b/src/java_bytecode/java_bytecode_language.cpp @@ -106,6 +106,30 @@ void java_bytecode_languaget::modules_provided(std::set &modules) // modules.insert(translation_unit(parse_path)); } +/// Generate a _start function for a specific function. +/// \param entry_function_symbol_id: The symbol for the function that should be +/// used as the entry point +/// \param symbol_table: The symbol table for the program. The new _start +/// function symbol will be added to this table +/// \return Returns false if the _start method was generated correctly +bool java_bytecode_languaget::generate_start_function( + const irep_idt &entry_function_symbol_id, + symbol_tablet &symbol_table) +{ + const auto res= + get_main_symbol( + symbol_table, entry_function_symbol_id, get_message_handler()); + + return generate_java_start_function( + res.main_function, + symbol_table, + get_message_handler(), + assume_inputs_non_null, + max_nondet_array_length, + max_nondet_tree_depth, + *pointer_type_selector); +} + /// ANSI-C preprocessing bool java_bytecode_languaget::preprocess( std::istream &instream, diff --git a/src/java_bytecode/java_bytecode_language.h b/src/java_bytecode/java_bytecode_language.h index be0713e2d03..dba18a4a369 100644 --- a/src/java_bytecode/java_bytecode_language.h +++ b/src/java_bytecode/java_bytecode_language.h @@ -141,6 +141,10 @@ class java_bytecode_languaget:public languaget virtual void convert_lazy_method( const irep_idt &id, symbol_tablet &) override; + virtual bool generate_start_function( + const irep_idt &entry_function_symbol_id, + class symbol_tablet &symbol_table) override; + protected: bool do_ci_lazy_method_conversion(symbol_tablet &, lazy_methodst &); const select_pointer_typet &get_pointer_type_selector() const; diff --git a/src/java_bytecode/java_bytecode_vtable.cpp b/src/java_bytecode/java_bytecode_vtable.cpp deleted file mode 100644 index 68da4c6b494..00000000000 --- a/src/java_bytecode/java_bytecode_vtable.cpp +++ /dev/null @@ -1,449 +0,0 @@ -/*******************************************************************\ - -Module: - -Author: Daniel Kroening, kroening@kroening.com - -\*******************************************************************/ - -#include "java_bytecode_vtable.h" - -#include -#include - -#include -#include -#include -#include -#include -#include - -const char ID_virtual_name[]="virtual_name"; - -class is_virtual_name_equalt -{ - const irep_idt &virtual_name; -public: - explicit is_virtual_name_equalt(const class_typet::methodt &method): - virtual_name(method.get(ID_virtual_name)) - { - } - - bool operator()(const class_typet::methodt &method) const - { - return virtual_name==method.get(ID_virtual_name); - } -}; - -class is_name_equalt -{ - const irep_idt &name; - -public: - explicit is_name_equalt(const irep_idt &name): - name(name) - { - } - - bool operator()(const class_typet::componentt &component) const - { - return name==component.get_name(); - } -}; - -class java_bytecode_vtable_factoryt -{ - symbol_tablet &symbol_table; - const std::string &module; - const namespacet ns; - -public: - bool has_error; - - java_bytecode_vtable_factoryt( - symbol_tablet &symbol_table, - const std::string &module): - symbol_table(symbol_table), - module(module), - ns(symbol_table), - has_error(false) - { - } - - symbolt &get_vt_type_symbol(const class_typet &class_type) - { - const std::string &class_name(id2string(class_type.get(ID_name))); - return symbol_table.lookup(vtnamest::get_type(class_name)); - } - - void create_vtable_symbol(symbolt &result, const class_typet &class_type) - { - const std::string &class_name=id2string(class_type.get(ID_name)); - const std::string &base_class_name=id2string(class_type.get(ID_base_name)); - const symbolt &type_symbol(get_vt_type_symbol(class_type)); - result.name=vtnamest::get_table(class_name); - result.base_name=vtnamest::get_table_base(base_class_name); - result.pretty_name=result.base_name; - result.mode=type_symbol.mode; - result.module=module; - result.location=type_symbol.location; - result.type=symbol_typet(type_symbol.name); - result.is_lvalue=true; - result.is_state_var=true; - result.is_static_lifetime=true; - } - - bool has_component(const class_typet &vtable_type, const irep_idt &ifc_name) - { - const class_typet::componentst &comps(vtable_type.components()); - const is_name_equalt pred(ifc_name); - return std::find_if(comps.begin(), comps.end(), pred)!=comps.end(); - } - - void add_vtable_entry(struct_exprt &vtable_value, - const class_typet &interface, const class_typet &implementor, - const class_typet::methodt &implementation) - { - const class_typet::methodst &methods(interface.methods()); - const is_virtual_name_equalt pred(implementation); - const class_typet::methodst::const_iterator ifc_method( - std::find_if(methods.begin(), methods.end(), pred)); - assert(methods.end()!=ifc_method); - symbolt &vtable_type_symbol(get_vt_type_symbol(implementor)); - class_typet &vtable_type(to_class_type(vtable_type_symbol.type)); - const irep_idt &ifc_name(ifc_method->get_name()); - if(has_component(vtable_type, ifc_name)) - return; - - struct_typet::componentt entry_component; - entry_component.set_name(ifc_name); - entry_component.set_base_name(ifc_method->get_base_name()); - entry_component.type()=pointer_type(implementation.type()); - vtable_type.components().push_back(entry_component); - - const irep_idt &impl_name(implementation.get_name()); - const symbol_exprt impl_symbol(impl_name, implementation.type()); - const address_of_exprt impl_ref(impl_symbol); - vtable_value.copy_to_operands(impl_ref); - } - - const class_typet &get_class_type(const irept &base) - { - const typet &type(static_cast(base.find(ID_type))); - const symbol_typet &symbol_type(to_symbol_type(type)); - const irep_idt &base_class_name(symbol_type.get_identifier()); - assert(symbol_table.has_symbol(base_class_name)); - const symbolt &base_class_symbol(ns.lookup(base_class_name)); - return to_class_type(base_class_symbol.type); - } - - bool has_method(const irept &base, const class_typet::methodt &method) - { - const typet &type(static_cast(base.find(ID_type))); - const symbol_typet &symbol_type(to_symbol_type(type)); - const irep_idt &base_class_name(symbol_type.get_identifier()); - if(!symbol_table.has_symbol(base_class_name)) - return false; - const symbolt &base_class_symbol(ns.lookup(base_class_name)); - const class_typet &base_class_type(to_class_type(base_class_symbol.type)); - const class_typet::methodst &methods(base_class_type.methods()); - const is_virtual_name_equalt pred(method); - return std::find_if(methods.begin(), methods.end(), pred)!=methods.end(); - } - - void extract_types( - std::vector &result, - const irept::subt &types, - const class_typet::methodt &method) - { - for(irept::subt::const_iterator it=types.begin(); - it!=types.end(); ++it) - { - if(!has_method(*it, method)) - continue; - result.push_back(get_class_type(*it)); - } - } - - bool is_virtual(const class_typet::methodt &method) - { - return method.get_bool(ID_is_virtual) - && !method.get_bool(ID_constructor); - } - - void create_base_vtable_entries( - struct_exprt &vtable_value, - const class_typet &class_type, - const class_typet::methodt &method) - { - if(!is_virtual(method)) - return; - std::vector bases; - extract_types(bases, class_type.bases(), method); - // extract_types(bases, class_type.find(ID_interfaces).get_sub(), method); - for(const std::vector::value_type &b : bases) - add_vtable_entry(vtable_value, b, class_type, method); - } - - void create_vtable_entry(struct_exprt &vtable_value, - const class_typet &class_type, const class_typet::methodt &method) - { - if(!is_virtual(method)) - return; - add_vtable_entry(vtable_value, class_type, class_type, method); - } - - void set_vtable_value(symbolt &vtable_symbol, const class_typet &class_type, - struct_exprt &vtable_value) - { - const std::string &class_name(id2string(class_type.get(ID_name))); - const irep_idt vttype(vtnamest::get_type(class_name)); - vtable_value.type()=symbol_typet(vttype); - vtable_symbol.value=vtable_value; - } - - bool is_class_with_vt(const symbolt &symbol) - { - if(!symbol.is_type || ID_struct!=symbol.type.id()) - return false; - const class_typet &class_type(to_class_type(symbol.type)); - const std::string &class_name(id2string(class_type.get(ID_name))); - return symbol_table.has_symbol(vtnamest::get_type(class_name)); - } - - void operator()(const irep_idt &symbol_name) - { - const symbolt &symbol=symbol_table.lookup(symbol_name); - if(!is_class_with_vt(symbol)) - return; - const class_typet &class_type(to_class_type(symbol.type)); - const std::string &class_name(id2string(symbol_name)); - if(symbol_table.has_symbol(vtnamest::get_table(class_name))) - return; - symbolt vtable_symbol; - create_vtable_symbol(vtable_symbol, class_type); - const class_typet::methodst &methods(class_type.methods()); - struct_exprt vtable_value; - for(const class_typet::methodst::value_type &m : methods) - create_base_vtable_entries(vtable_value, class_type, m); - for(const class_typet::methodst::value_type &m : methods) - create_vtable_entry(vtable_value, class_type, m); - set_vtable_value(vtable_symbol, class_type, vtable_value); - assert(!symbol_table.add(vtable_symbol)); - } -}; - - -/******************************************************************* - - Function: java_bytecode_vtable - - Inputs: - - Outputs: - - Purpose: - -\*******************************************************************/ - -bool java_bytecode_vtable( - symbol_tablet &symbol_table, - const std::string &module) -{ - const symbol_tablet::symbolst &symbols(symbol_table.symbols); - std::vector names; - names.reserve(symbols.size()); - std::transform(symbols.begin(), symbols.end(), std::back_inserter(names), - [](const std::pair &entry) - { return entry.first;}); - java_bytecode_vtable_factoryt factory(symbol_table, module); - std::for_each(names.begin(), names.end(), factory); - return factory.has_error; -} - -static void create_vtable_type( - const irep_idt &vt_name, - symbol_tablet &symbol_table, - const symbolt &class_symbol) -{ - symbolt vt_symb_type; - vt_symb_type.name=vt_name; - vt_symb_type.base_name=vtnamest::get_type_base( - id2string(class_symbol.base_name)); - vt_symb_type.pretty_name=vt_symb_type.base_name; - vt_symb_type.mode=class_symbol.mode; - vt_symb_type.module=class_symbol.module; - vt_symb_type.location=class_symbol.location; - vt_symb_type.type=struct_typet(); - vt_symb_type.type.set(ID_name, vt_symb_type.name); - vt_symb_type.is_type=true; - assert(!symbol_table.add(vt_symb_type)); -} - -#define ID_vtable_pointer "@vtable_pointer" - -static void add_vtable_pointer_member( - const irep_idt &vt_name, - symbolt &class_symbol) -{ - struct_typet::componentt comp; - - comp.type()=pointer_type(symbol_typet(vt_name)); - comp.set_name(ID_vtable_pointer); - comp.set_base_name(ID_vtable_pointer); - comp.set_pretty_name(ID_vtable_pointer); - comp.set("is_vtptr", true); - - struct_typet &class_type=to_struct_type(class_symbol.type); - class_type.components().push_back(comp); -} - -/******************************************************************* - - Function: create_vtable_symbol - - Inputs: - - Outputs: - - Purpose: - -\*******************************************************************/ - -void create_vtable_symbol( - symbol_tablet &symbol_table, - const symbolt &class_symbol) -{ - const irep_idt vttype= - vtnamest::get_type(id2string(class_symbol.name)); - - if(!symbol_table.has_symbol(vttype)) - create_vtable_type(vttype, symbol_table, class_symbol); -} - -/******************************************************************* - - Function: has_vtable_info - - Inputs: - - Outputs: - - Purpose: - -\*******************************************************************/ - -bool has_vtable_info( - const symbol_tablet &symbol_table, - const symbolt &class_symbol) -{ - return - symbol_table.has_symbol(vtnamest::get_type(id2string(class_symbol.name))) && - to_struct_union_type(class_symbol.type).has_component(ID_vtable_pointer); -} - -/******************************************************************* - - Function: create_vtable_pointer - - Inputs: - - Outputs: - - Purpose: - -\*******************************************************************/ - -void create_vtable_pointer(symbolt &class_symbol) -{ - const irep_idt vttype= - vtnamest::get_type(id2string(class_symbol.name)); - - add_vtable_pointer_member(vttype, class_symbol); -} - -/******************************************************************* - - Function: get_virtual_name - - Inputs: - - Outputs: - - Purpose: - -\*******************************************************************/ - -void set_virtual_name(class_typet::methodt &method) -{ - const std::string &name(id2string(method.get(ID_name))); - const std::string::size_type vname_start(name.find_last_of('.') + 1); - std::string virtual_name(name.substr(vname_start)); - method.set(ID_virtual_name, virtual_name); -} - -static exprt get_ref( - const exprt &this_obj, - const symbol_typet &target_type) -{ - const typet &type(this_obj.type()); - const irep_idt &type_id(type.id()); - if(ID_symbol==type_id) - return get_ref(address_of_exprt(this_obj), target_type); - assert(ID_pointer==type_id); - const typecast_exprt cast(this_obj, pointer_type(target_type)); - return dereference_exprt(cast, target_type); -} - -static std::string get_full_class_name(const std::string &name) -{ - const bool has_prefix(name.find("java::")!=std::string::npos); - const std::string::size_type offset= - has_prefix ? std::string("java::").size() : 0; - const std::string::size_type end(name.find_first_of(':', offset)); - const std::string::size_type last_sep(name.rfind('.', end)); - return name.substr(0, last_sep); -} - -/******************************************************************* - - Function: make_vtable_function - - Inputs: - - Outputs: - - Purpose: - -\*******************************************************************/ - -exprt make_vtable_function( - const exprt &func, - const exprt &this_obj) -{ - const irep_idt &func_name(func.get(ID_identifier)); - const std::string class_id(get_full_class_name(id2string(func_name))); - - // TODO: Handle unavailable models! - if(class_id.find("java.")!=std::string::npos) - { - // When translating a single java_bytecode_parse_treet, we don't know - // which classes will eventually be available yet. If we could provide - // access to the class loader here, we know which classes have been - // loaded successfully. For classes which have not been loaded, returning - // "func" is equivalent to an unimplemented function. - return func; - } - - const symbol_typet vtable_type(vtnamest::get_type(class_id)); - const pointer_typet vt_ptr_type=pointer_type(vtable_type); - const symbol_typet target_type(class_id); - const exprt this_ref(get_ref(this_obj, target_type)); - const typet ref_type(this_ref.type()); - const member_exprt vtable_member(this_ref, ID_vtable_pointer, vt_ptr_type); - const dereference_exprt vtable(vtable_member, vtable_type); // TODO: cast? - const pointer_typet func_ptr_type=pointer_type(func.type()); - const member_exprt func_ptr(vtable, func_name, func_ptr_type); - const dereference_exprt virtual_func(func_ptr, func.type()); - return virtual_func; -} diff --git a/src/java_bytecode/java_bytecode_vtable.h b/src/java_bytecode/java_bytecode_vtable.h deleted file mode 100644 index 44a7f35bf1b..00000000000 --- a/src/java_bytecode/java_bytecode_vtable.h +++ /dev/null @@ -1,37 +0,0 @@ -/*******************************************************************\ - -Module: - -Author: Daniel Kroening, kroening@kroening.com - -\*******************************************************************/ - - -#ifndef CPROVER_JAVA_BYTECODE_JAVA_BYTECODE_VTABLE_H -#define CPROVER_JAVA_BYTECODE_JAVA_BYTECODE_VTABLE_H - -#include - -void create_vtable_pointer( - class symbolt &class_symbol); - -void create_vtable_symbol( - symbol_tablet &symbol_table, - const class symbolt &class_symbol); - -bool has_vtable_info( - const symbol_tablet &symbol_table, - const symbolt &class_symbol); - -exprt make_vtable_function( - const exprt &function, - const exprt &this_obj); - -void set_virtual_name( - class_typet::methodt &method); - -bool java_bytecode_vtable( - symbol_tablet &symbol_table, - const std::string &module); - -#endif // CPROVER_JAVA_BYTECODE_JAVA_BYTECODE_VTABLE_H diff --git a/src/java_bytecode/java_class_loader.cpp b/src/java_bytecode/java_class_loader.cpp index e627c9e1f8b..bb945ddcc10 100644 --- a/src/java_bytecode/java_class_loader.cpp +++ b/src/java_bytecode/java_class_loader.cpp @@ -207,7 +207,7 @@ void java_class_loadert::read_jar_file( // does it end on .class? if(has_suffix(file_name, ".class")) { - status() << "read class file " << file_name << " from " << file << eom; + debug() << "read class file " << file_name << " from " << file << eom; irep_idt class_name=file_to_class_name(file_name); // record diff --git a/src/java_bytecode/java_entry_point.cpp b/src/java_bytecode/java_entry_point.cpp index c142f37ddf5..12e806b8e2f 100644 --- a/src/java_bytecode/java_entry_point.cpp +++ b/src/java_bytecode/java_entry_point.cpp @@ -510,6 +510,39 @@ bool java_entry_point( max_nondet_tree_depth, pointer_type_selector); + return generate_java_start_function( + symbol, + symbol_table, + message_handler, + assume_init_pointers_not_null, + max_nondet_array_length, + max_nondet_tree_depth, + pointer_type_selector); +} + +/// Generate a _start function for a specific function. See +/// java_entry_point for more details. +/// \param symbol: The symbol representing the function to call +/// \param symbol_table: Global symbol table +/// \param message_handler: Where to write output to +/// \param assume_init_pointers_not_null: When creating pointers, assume they +/// always take a non-null value. +/// \param max_nondet_array_length: The length of the arrays to create when +/// filling them +/// \param max_nondet_tree_depth: defines the maximum depth of the object tree +/// (see java_entry_points documentation for details) +/// \param pointer_type_selector: Logic for substituting types of pointers +/// \returns true if error occurred on entry point search, false otherwise +bool generate_java_start_function( + const symbolt &symbol, + symbol_tablet &symbol_table, + message_handlert &message_handler, + bool assume_init_pointers_not_null, + size_t max_nondet_array_length, + size_t max_nondet_tree_depth, + const select_pointer_typet &pointer_type_selector) +{ + messaget message(message_handler); code_blockt init_code; // build call to initialization function diff --git a/src/java_bytecode/java_entry_point.h b/src/java_bytecode/java_entry_point.h index 18e42aafc65..cc03e8480b5 100644 --- a/src/java_bytecode/java_entry_point.h +++ b/src/java_bytecode/java_entry_point.h @@ -40,4 +40,13 @@ main_function_resultt get_main_symbol( message_handlert &, bool allow_no_body=false); +bool generate_java_start_function( + const symbolt &symbol, + class symbol_tablet &symbol_table, + class message_handlert &message_handler, + bool assume_init_pointers_not_null, + size_t max_nondet_array_length, + size_t max_nondet_tree_depth, + const select_pointer_typet &pointer_type_selector); + #endif // CPROVER_JAVA_BYTECODE_JAVA_ENTRY_POINT_H diff --git a/src/jsil/CMakeLists.txt b/src/jsil/CMakeLists.txt new file mode 100644 index 00000000000..b3a34114639 --- /dev/null +++ b/src/jsil/CMakeLists.txt @@ -0,0 +1,15 @@ +generic_bison(jsil) +generic_flex(jsil) + +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +add_library(jsil + ${sources} + ${headers} + ${BISON_parser_OUTPUTS} + ${FLEX_scanner_OUTPUTS} +) + +generic_includes(jsil) + +target_link_libraries(jsil util) diff --git a/src/jsil/jsil_language.cpp b/src/jsil/jsil_language.cpp index 447ae799911..ac55e02bc77 100644 --- a/src/jsil/jsil_language.cpp +++ b/src/jsil/jsil_language.cpp @@ -42,6 +42,22 @@ bool jsil_languaget::interfaces(symbol_tablet &symbol_table) return false; } +/// Generate a _start function for a specific function +/// \param entry_function_symbol_id: The symbol for the function that should be +/// used as the entry point +/// \param symbol_table: The symbol table for the program. The new _start +/// function symbol will be added to this table +/// \return Returns false if the _start method was generated correctly +bool jsil_languaget::generate_start_function( + const irep_idt &entry_function_symbol_id, + symbol_tablet &symbol_table) +{ + // TODO(tkiley): This should be implemented if this language + // is used. + UNREACHABLE; + return true; +} + bool jsil_languaget::preprocess( std::istream &instream, const std::string &path, @@ -89,9 +105,9 @@ bool jsil_languaget::typecheck( bool jsil_languaget::final( symbol_tablet &symbol_table, - bool generate_start_function) + bool create_start_function) { - if(generate_start_function) + if(create_start_function) { if(jsil_entry_point( symbol_table, diff --git a/src/jsil/jsil_language.h b/src/jsil/jsil_language.h index 48214c013ac..d3b8bc8302c 100644 --- a/src/jsil/jsil_language.h +++ b/src/jsil/jsil_language.h @@ -25,19 +25,21 @@ class jsil_languaget:public languaget virtual bool preprocess( std::istream &instream, const std::string &path, - std::ostream &outstream); + std::ostream &outstream) override; virtual bool parse( std::istream &instream, - const std::string &path); + const std::string &path) override; virtual bool typecheck( symbol_tablet &context, - const std::string &module); + const std::string &module) override; - virtual bool final(symbol_tablet &context, bool generate_start_function); + virtual bool final( + symbol_tablet &context, + bool create_start_function) override; - virtual void show_parse(std::ostream &out); + virtual void show_parse(std::ostream &out) override; virtual ~jsil_languaget(); jsil_languaget() { } @@ -45,12 +47,12 @@ class jsil_languaget:public languaget virtual bool from_expr( const exprt &expr, std::string &code, - const namespacet &ns); + const namespacet &ns) override; virtual bool from_type( const typet &type, std::string &code, - const namespacet &ns); + const namespacet &ns) override; std::unique_ptr get_pretty_printer(const namespacet &); @@ -59,18 +61,22 @@ class jsil_languaget:public languaget const std::string &code, const std::string &module, exprt &expr, - const namespacet &ns); + const namespacet &ns) override; - virtual std::unique_ptr new_language() + virtual std::unique_ptr new_language() override { return util_make_unique(); } - virtual std::string id() const { return "jsil"; } - virtual std::string description() const + virtual std::string id() const override { return "jsil"; } + virtual std::string description() const override { return "Javascript Intermediate Language"; } - virtual std::set extensions() const; + virtual std::set extensions() const override; + + virtual void modules_provided(std::set &modules) override; + virtual bool interfaces(symbol_tablet &symbol_table) override; - virtual void modules_provided(std::set &modules); - virtual bool interfaces(symbol_tablet &symbol_table); + virtual bool generate_start_function( + const irep_idt &entry_function_symbol_id, + class symbol_tablet &symbol_table) override; protected: jsil_parse_treet parse_tree; diff --git a/src/json/CMakeLists.txt b/src/json/CMakeLists.txt new file mode 100644 index 00000000000..944085707a0 --- /dev/null +++ b/src/json/CMakeLists.txt @@ -0,0 +1,15 @@ +generic_bison(json) +generic_flex(json) + +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +add_library(json + ${sources} + ${headers} + ${BISON_parser_OUTPUTS} + ${FLEX_scanner_OUTPUTS} +) + +generic_includes(json) + +target_link_libraries(json util) diff --git a/src/langapi/CMakeLists.txt b/src/langapi/CMakeLists.txt new file mode 100644 index 00000000000..aa71bc63612 --- /dev/null +++ b/src/langapi/CMakeLists.txt @@ -0,0 +1,7 @@ +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +add_library(langapi ${sources} ${headers}) + +generic_includes(langapi) + +target_link_libraries(langapi util) diff --git a/src/linking/CMakeLists.txt b/src/linking/CMakeLists.txt new file mode 100644 index 00000000000..f96361799db --- /dev/null +++ b/src/linking/CMakeLists.txt @@ -0,0 +1,7 @@ +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +add_library(linking ${sources} ${headers}) + +generic_includes(linking) + +target_link_libraries(linking util ansi-c) diff --git a/src/memory-models/CMakeLists.txt b/src/memory-models/CMakeLists.txt new file mode 100644 index 00000000000..04e51ad62b1 --- /dev/null +++ b/src/memory-models/CMakeLists.txt @@ -0,0 +1,15 @@ +generic_bison(mm) +generic_flex(mm) + +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +add_library(mmcc + ${sources} + ${headers} + ${BISON_parser_OUTPUTS} + ${FLEX_scanner_OUTPUTS} +) + +generic_includes(mmcc) + +target_link_libraries(mmcc util) diff --git a/src/miniz/CMakeLists.txt b/src/miniz/CMakeLists.txt new file mode 100644 index 00000000000..1d7862730e0 --- /dev/null +++ b/src/miniz/CMakeLists.txt @@ -0,0 +1,7 @@ +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +add_library(miniz ${sources} ${headers}) + +generic_includes(miniz) + +target_link_libraries(miniz) diff --git a/src/musketeer/Makefile b/src/musketeer/Makefile deleted file mode 100644 index be41fa923cc..00000000000 --- a/src/musketeer/Makefile +++ /dev/null @@ -1,62 +0,0 @@ -SRC = cycles_visitor.cpp \ - fence_assert.cpp \ - fence_inserter.cpp \ - fence_shared.cpp \ - fence_user_def.cpp \ - fencer.cpp \ - graph_visitor.cpp \ - languages.cpp \ - musketeer_main.cpp \ - musketeer_parse_options.cpp \ - pensieve.cpp \ - propagate_const_function_pointers.cpp \ - # Empty last line - -OBJ += ../ansi-c/ansi-c$(LIBEXT) \ - ../linking/linking$(LIBEXT) \ - ../big-int/big-int$(LIBEXT) \ - ../goto-programs/goto-programs$(LIBEXT) \ - ../goto-symex/goto-symex$(LIBEXT) \ - ../assembler/assembler$(LIBEXT) \ - ../pointer-analysis/pointer-analysis$(LIBEXT) \ - ../analyses/analyses$(LIBEXT) \ - ../langapi/langapi$(LIBEXT) \ - ../util/util$(LIBEXT) \ - ../solvers/solvers$(LIBEXT) \ - ../goto-instrument/wmm/weak_memory$(OBJEXT) \ - ../goto-instrument/wmm/fence$(OBJEXT) \ - ../goto-instrument/wmm/event_graph$(OBJEXT) \ - ../goto-instrument/wmm/goto2graph$(OBJEXT) \ - ../goto-instrument/wmm/data_dp$(OBJEXT) \ - ../goto-instrument/wmm/abstract_event$(OBJEXT) \ - ../goto-instrument/wmm/instrumenter_strategies$(OBJEXT) \ - ../goto-instrument/wmm/cycle_collection$(OBJEXT) \ - ../goto-instrument/wmm/shared_buffers$(OBJEXT) \ - ../goto-instrument/wmm/pair_collection$(OBJEXT) \ - ../goto-instrument/rw_set$(OBJEXT) - -INCLUDES= -I .. - -LIBS = - -CLEANFILES = musketeer$(EXEEXT) - -include ../config.inc -include ../common - -all: musketeer$(EXEEXT) - -ifneq ($(LIB_GLPK),) - LIBS += $(LIB_GLPK) - CP_CXXFLAGS += -DHAVE_GLPK -endif - -############################################################################### - -musketeer$(EXEEXT): $(OBJ) - $(LINKBIN) - -.PHONY: musketeer-mac-signed - -musketeer-mac-signed: musketeer$(EXEEXT) - codesign -v -s $(OSX_IDENTITY) musketeer$(EXEEXT) diff --git a/src/musketeer/cycles_visitor.cpp b/src/musketeer/cycles_visitor.cpp deleted file mode 100644 index 08bbe4bea96..00000000000 --- a/src/musketeer/cycles_visitor.cpp +++ /dev/null @@ -1,381 +0,0 @@ -/*******************************************************************\ - -Module: cycles visitor for computing edges involved for fencing - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// cycles visitor for computing edges involved for fencing - -#include "cycles_visitor.h" - -#include -#include - -#include "fence_inserter.h" - -class instrumentert; - -/* implemented: BTWN1, BTWN4 */ -#define BTWN1 - -/* po^+ /\ U{C_1, ..., C_n} \/ delays */ -void cycles_visitort::po_edges(std::set &edges) -{ - instrumentert &instrumenter=fence_inserter.instrumenter; - - event_grapht &egraph=instrumenter.egraph; - - for(std::set::iterator - C_j=instrumenter.set_of_cycles.begin(); - C_j!=instrumenter.set_of_cycles.end(); - ++C_j) - { - /* filters */ - if(fence_inserter.filter_cycles(C_j->id)) - continue; - -#ifdef BTWN1 - /* btwn1: variables are all the pos involved in cycles, plus the delays - for dp when analysing Power or ARM */ - if(fence_inserter.model==Power || fence_inserter.model==Unknown) - { - /* for Power/ARM, add also delays as variables for dp (other fences - are superfluous if the edge is not in pos; yet it's not harmful) */ - for(std::set::iterator e_i=C_j->unsafe_pairs.begin(); - e_i!=C_j->unsafe_pairs.end(); ++e_i) - { - if(e_i->is_po) - edges.insert(fence_inserter.add_edge(*e_i)); - else - { - /* also add pos of non-delaying pos+ of cycles, as they could AC or - BC */ - for(wmm_grapht::edgest::const_iterator - next_it=egraph.po_in(e_i->first).begin(); - next_it!=egraph.po_in(e_i->first).end(); - ++next_it) - { - std::list new_path; - new_path.push_back(e_i->first); - new_path.push_back(next_it->first); - fence_inserter.const_graph_visitor.const_graph_explore_AC(egraph, - next_it->first, new_path); - } - - for(wmm_grapht::edgest::const_iterator - next_it=egraph.po_out(e_i->second).begin(); - next_it!=egraph.po_out(e_i->second).end(); - ++next_it) - { - std::list new_path; - new_path.push_back(e_i->second); - new_path.push_back(next_it->first); - fence_inserter.const_graph_visitor.const_graph_explore_BC(egraph, - next_it->first, new_path); - } - } - } - } - - event_grapht::critical_cyclet::const_iterator cur=C_j->begin(); - assert(cur!=C_j->end()); - event_grapht::critical_cyclet::const_iterator next=cur; - ++next; - assert(next!=C_j->end()); - for(; cur!=C_j->end() && next!=C_j->end(); ++cur, ++next) - { - if(egraph[*cur].is_fence() || egraph[*next].is_fence()) - continue; - - const edget e_i(*cur, *next); - - if(e_i.is_po) - edges.insert(fence_inserter.add_edge(e_i)); - else - { - /* adds basic pos from this pos^+ */ - for(wmm_grapht::edgest::const_iterator - next_it=egraph.po_out(e_i.first).begin(); - next_it!=egraph.po_out(e_i.first).end(); - ++next_it) - { - std::list new_path; - new_path.push_back(e_i.first); - new_path.push_back(next_it->first); - fence_inserter.const_graph_visitor.const_graph_explore(egraph, - next_it->first, e_i.second, new_path); - } - } - } - /* last case */ - { - const edget e_i(*cur, C_j->front()); - - if(!egraph[*cur].is_fence() && !egraph[C_j->front()].is_fence()) - { - if(e_i.is_po) - edges.insert(fence_inserter.add_edge(e_i)); - else - { - /* adds basic pos from this pos^+ */ - for(wmm_grapht::edgest::const_iterator - next_it=egraph.po_out(e_i.first).begin(); - next_it!=egraph.po_out(e_i.first).end(); - ++next_it) - { - std::list new_path; - new_path.push_back(e_i.first); - new_path.push_back(next_it->first); - fence_inserter.const_graph_visitor.const_graph_explore(egraph, - next_it->first, e_i.second, new_path); - } - } - } - } -#elif defined BTWN4 - /* add delays as var */ - for(std::set::iterator e_i=C_j->unsafe_pairs.begin(); - e_i!=C_j->unsafe_pairs.end(); ++e_i) - edges.insert(fence_inserter.add_edge(*e_i)); - - /* maximum pos+ at the intersection of two cycles */ - std::set::iterator C_k=C_j; - ++C_k; - for(; C_k!=instrumenter.set_of_cycles.end(); ++C_k) - { - /* not necessary; might improve the construction time however */ -#if 0 - /* first, let us check if these cycles are entangled */ - event_grapht::critical_cyclet::const_iterator C_j_it=C_j->begin(); - event_grapht::critical_cyclet::const_iterator C_k_it=C_k->begin(); - for(; C_j_it!=C_j->end(); ++C_j_it) - { - for( ; - C_k_it!=C_k->end() && - !egraph.are_po_ordered(*C_j_it, *C_k_it) && - !egraph.are_po_ordered(*C_k_it, *C_j_it); - ++C_k_it) - { - } - - if(C_k_it!=C_k->end()) - break; - } - - if(C_j_it==C_j->end()) - continue; -#endif - - /* computes the largest pos+ in C_j */ - std::map m_begin; - std::map m_end; - std::set m_threads; - - unsigned previous_thread=0; - for(event_grapht::critical_cyclet::const_iterator C_j_it=C_j->begin(); - C_j_it!=C_j->end(); ++C_j_it) - { - const unsigned current_thread=egraph[*C_j_it].thread; - - if(previous_thread==current_thread && C_j_it!=C_j->begin()) - m_end[previous_thread]=C_j_it; - else - { - m_begin[current_thread]=C_j_it; - m_end[current_thread]=C_j_it; - m_threads.insert(current_thread); - } - - previous_thread=current_thread; - } - - /* computes the largest pos+ in C_k */ - std::map k_begin; - std::map k_end; - std::set k_threads; - - previous_thread=0; - for(event_grapht::critical_cyclet::const_iterator C_k_it=C_k->begin(); - C_k_it!=C_k->end(); ++C_k_it) - { - const unsigned current_thread=egraph[*C_k_it].thread; - - if(previous_thread==current_thread && C_k_it!=C_k->begin()) - k_end[previous_thread]=C_k_it; - else - { - k_begin[current_thread]=C_k_it; - k_end[current_thread]=C_k_it; - k_threads.insert(current_thread); - } - - previous_thread=current_thread; - } - - /* if there are some commun threads, take the intersection if relevant */ - for(std::set::const_iterator it=m_threads.begin(); - it!=m_threads.end(); ++it) - if(k_threads.find(*it)!=k_threads.end()) - { - const event_idt a=*m_begin[*it]; - const event_idt b=*m_end[*it]; - const event_idt c=*k_begin[*it]; - const event_idt d=*k_end[*it]; - - if(egraph.are_po_ordered(b, c)) - continue; - else if(egraph.are_po_ordered(d, a)) - continue; - else if(egraph.are_po_ordered(a, c) && egraph.are_po_ordered(b, d)) - fence_inserter.add_edge(edget(c, b)); - else if(egraph.are_po_ordered(a, c) && egraph.are_po_ordered(d, b)) - fence_inserter.add_edge(edget(c, d)); - else if(egraph.are_po_ordered(c, a) && egraph.are_po_ordered(b, d)) - fence_inserter.add_edge(edget(a, b)); - else if(egraph.are_po_ordered(c, a) && egraph.are_po_ordered(d, b)) - fence_inserter.add_edge(edget(a, d)); - } - } -#else - throw "no BTWN definition selected!"; -#endif - } -} - -/* C_j /\ po^+ /\ poWR */ -void cycles_visitort::powr_constraint( - const event_grapht::critical_cyclet &C_j, - std::set &edges) -{ - event_grapht &graph=fence_inserter.instrumenter.egraph; - - for(std::set::iterator e_i=C_j.unsafe_pairs.begin(); - e_i!=C_j.unsafe_pairs.end(); ++e_i) - { - if(e_i->is_po && - (graph[e_i->first].operation==abstract_eventt::operationt::Write && - graph[e_i->second].operation==abstract_eventt::operationt::Read)) - { - if( edges.insert(fence_inserter.add_edge(*e_i)).second ) - ++fence_inserter.constraints_number; - } - } -} - -/* C_j /\ po^+ /\ poWW */ -void cycles_visitort::poww_constraint( - const event_grapht::critical_cyclet &C_j, - std::set &edges) -{ - event_grapht &graph=fence_inserter.instrumenter.egraph; - - for(std::set::iterator e_i=C_j.unsafe_pairs.begin(); - e_i!=C_j.unsafe_pairs.end(); ++e_i) - { - if(e_i->is_po && - (graph[e_i->first].operation==abstract_eventt::operationt::Write && - graph[e_i->second].operation==abstract_eventt::operationt::Write)) - { - if( edges.insert(fence_inserter.add_edge(*e_i)).second ) - ++fence_inserter.constraints_number; - } - } -} - -/* C_j /\ po^+ /\ poRW */ -void cycles_visitort::porw_constraint( - const event_grapht::critical_cyclet &C_j, - std::set &edges) -{ - event_grapht &graph=fence_inserter.instrumenter.egraph; - - for(std::set::iterator e_i=C_j.unsafe_pairs.begin(); - e_i!=C_j.unsafe_pairs.end(); ++e_i) - { - if(e_i->is_po && - (graph[e_i->first].operation==abstract_eventt::operationt::Read && - graph[e_i->second].operation==abstract_eventt::operationt::Write)) - { - if( edges.insert(fence_inserter.add_edge(*e_i)).second ) - ++fence_inserter.constraints_number; - } - } -} - -/* C_j /\ po^+ /\ poRR */ -void cycles_visitort::porr_constraint( - const event_grapht::critical_cyclet &C_j, - std::set &edges) -{ - event_grapht &graph=fence_inserter.instrumenter.egraph; - - for(std::set::iterator e_i=C_j.unsafe_pairs.begin(); - e_i!=C_j.unsafe_pairs.end(); ++e_i) - { - if(e_i->is_po && - (graph[e_i->first].operation==abstract_eventt::operationt::Read && - graph[e_i->second].operation==abstract_eventt::operationt::Read)) - { - if( edges.insert(fence_inserter.add_edge(*e_i)).second ) - ++fence_inserter.constraints_number; - } - } -} - -/* C_j /\ comWR */ -void cycles_visitort::com_constraint( - const event_grapht::critical_cyclet &C_j, - std::set &edges) -{ - event_grapht &egraph=fence_inserter.instrumenter.egraph; - - for(std::set::const_iterator it=C_j.unsafe_pairs.begin(); - it!=C_j.unsafe_pairs.end(); - ++it) - { - if(egraph[it->first].operation==abstract_eventt::operationt::Write - && egraph[it->second].operation==abstract_eventt::operationt::Read - && egraph[it->first].thread!=egraph[it->second].thread) - if( edges.insert(fence_inserter.add_invisible_edge(*it)).second ) - ++fence_inserter.constraints_number; - } - -#if 0 - event_grapht &egraph=instrumenter.egraph; - - std::list::const_iterator e_it=C_j.begin(); - std::list::const_iterator next_it=e_it; - assert(!C_j.empty()); - ++next_it; - for(; next_it!=C_j.end() && e_it!=C_j.end(); ++e_it, ++next_it) - { - const abstract_eventt &e1=egraph[*e_it]; - const abstract_eventt &e2=egraph[*next_it]; - - if(e1.operation==abstract_eventt::Write - && e2.operation==abstract_eventt::Read - && e1.thread!=e2.thread) - { - if( edges.insert(add_invisible_edge(edget(*e_it, *next_it))).second ) - ++constraints_number; - } - } - /* last case */ - assert(e_it!=C_j.end()); - next_it=C_j.begin(); - - const abstract_eventt &e1=egraph[*e_it]; - const abstract_eventt &e2=egraph[*next_it]; - - if(e1.operation==abstract_eventt::Write - && e2.operation==abstract_eventt::Read - && e1.thread!=e2.thread) - { - if( edges.insert(add_invisible_edge(edget(*e_it, *next_it))).second ) - ++constraints_number; - } -#endif -} diff --git a/src/musketeer/cycles_visitor.h b/src/musketeer/cycles_visitor.h deleted file mode 100644 index 0b9b122eed8..00000000000 --- a/src/musketeer/cycles_visitor.h +++ /dev/null @@ -1,50 +0,0 @@ -/*******************************************************************\ - -Module: cycles visitor for computing edges involved for fencing - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// cycles visitor for computing edges involved for fencing - -#ifndef CPROVER_MUSKETEER_CYCLES_VISITOR_H -#define CPROVER_MUSKETEER_CYCLES_VISITOR_H - -#include - -#include - -class fence_insertert; - -class cycles_visitort -{ -protected: - typedef event_grapht::critical_cyclet::delayt edget; - - fence_insertert &fence_inserter; - -public: - explicit cycles_visitort(fence_insertert &_fi) - : fence_inserter(_fi) - {} - - /* computes po^+ edges in U{C_1, ..., C_j} */ - void po_edges(std::set &edges); - - /* computes pairs that will be protected for the - TSO/PSO/RMO/Power/ARM by the constraints */ - void powr_constraint(const event_grapht::critical_cyclet &C_j, - std::set &edges); - void poww_constraint(const event_grapht::critical_cyclet &C_j, - std::set &edges); - void porw_constraint(const event_grapht::critical_cyclet &C_j, - std::set &edges); - void porr_constraint(const event_grapht::critical_cyclet &C_j, - std::set &edges); - void com_constraint(const event_grapht::critical_cyclet &C_j, - std::set &edges); -}; - -#endif // CPROVER_MUSKETEER_CYCLES_VISITOR_H diff --git a/src/musketeer/experiments/goto-runner/clean.sh b/src/musketeer/experiments/goto-runner/clean.sh deleted file mode 100644 index eadc3f9523d..00000000000 --- a/src/musketeer/experiments/goto-runner/clean.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -rm -f goto-magic goto-functions-* test test.c progress-* pid-* info-* \ - results.txt *.gb.linked.* *.tar *.tar.bz2 - -rm -rf success-* failure-* - -rm -f nohup.out - -rm -rf inst-0 inst-1 - -# Remove all unpacked folders -for F in * -do - if [ -d "$F" ] && [ ${F:0:8} = 'goto-cc-' ]; then - rm -rf "$F" - fi -done diff --git a/src/musketeer/experiments/goto-runner/dkr11.cs.ox.ac.uk.config b/src/musketeer/experiments/goto-runner/dkr11.cs.ox.ac.uk.config deleted file mode 100644 index 774f3c09b24..00000000000 --- a/src/musketeer/experiments/goto-runner/dkr11.cs.ox.ac.uk.config +++ /dev/null @@ -1,52 +0,0 @@ -# Virtual memory limit for this script and children (in KiB) -MAXMEM=4000000 - -# Virtual memory limit for each (parallel) fencter run (in KiB), the sum of -# which should be smaller than the above -MAXMEM_FE=1500000 - -# Maximum size of archives to download (in bytes) -MAX_ARCHIVE_SIZE=100000000 - -# Maximum size of goto binaries to check (in bytes) -MAX_GB_SIZE=10000000 - -# Maximum LoC of goto binaries to check (LoC according to goto-instrument -# --count-eloc) -MAX_LOC=15000 - -# Tool timeout (in sec) -TIMEOUT=600 - -# Parallel factor (must be >= 1) -FACTOR=1 - -# List of packages -FILE_LIST=pkgs-qm-all - -# URL to download packages from (package name from pkgs-*-(all|paper) is -# inserted between BEFORE and AFTER) -#BEFORE='http://dkr-debian.cs.ox.ac.uk:8080/job/goto-cc-' -#AFTER='/ws/goto-binaries.tar.bz2' -BEFORE='http://theory.eecs.qmul.ac.uk/debian+mole/pkgs/' -AFTER='-goto-binaries.tar.bz2' - -# Path to pthread lib to link with (default) -PTHREAD_LIB=pthread_lib.c - -# Path to pthread lib to link with when the above one doesn't work (e.g. due to -# version issues); use same path as above if there's no alternative file to -# prevent file not found error -PTHREAD_LIB_ALT=pthread_lib_alt.c - -# Tool invocations to try on the goto binaries (run $FACTOR tools in parallel) -FE[0]="cbmc --mm sc" -FE[1]="cbmc --mm tso" - -# Other needed tools -GI="./goto-instrument" -GC="./goto-cc" - -# Indicate if downloaded archives should be kept -KEEP=1 - diff --git a/src/musketeer/experiments/goto-runner/dkr12.cs.ox.ac.uk.config b/src/musketeer/experiments/goto-runner/dkr12.cs.ox.ac.uk.config deleted file mode 100644 index 774f3c09b24..00000000000 --- a/src/musketeer/experiments/goto-runner/dkr12.cs.ox.ac.uk.config +++ /dev/null @@ -1,52 +0,0 @@ -# Virtual memory limit for this script and children (in KiB) -MAXMEM=4000000 - -# Virtual memory limit for each (parallel) fencter run (in KiB), the sum of -# which should be smaller than the above -MAXMEM_FE=1500000 - -# Maximum size of archives to download (in bytes) -MAX_ARCHIVE_SIZE=100000000 - -# Maximum size of goto binaries to check (in bytes) -MAX_GB_SIZE=10000000 - -# Maximum LoC of goto binaries to check (LoC according to goto-instrument -# --count-eloc) -MAX_LOC=15000 - -# Tool timeout (in sec) -TIMEOUT=600 - -# Parallel factor (must be >= 1) -FACTOR=1 - -# List of packages -FILE_LIST=pkgs-qm-all - -# URL to download packages from (package name from pkgs-*-(all|paper) is -# inserted between BEFORE and AFTER) -#BEFORE='http://dkr-debian.cs.ox.ac.uk:8080/job/goto-cc-' -#AFTER='/ws/goto-binaries.tar.bz2' -BEFORE='http://theory.eecs.qmul.ac.uk/debian+mole/pkgs/' -AFTER='-goto-binaries.tar.bz2' - -# Path to pthread lib to link with (default) -PTHREAD_LIB=pthread_lib.c - -# Path to pthread lib to link with when the above one doesn't work (e.g. due to -# version issues); use same path as above if there's no alternative file to -# prevent file not found error -PTHREAD_LIB_ALT=pthread_lib_alt.c - -# Tool invocations to try on the goto binaries (run $FACTOR tools in parallel) -FE[0]="cbmc --mm sc" -FE[1]="cbmc --mm tso" - -# Other needed tools -GI="./goto-instrument" -GC="./goto-cc" - -# Indicate if downloaded archives should be kept -KEEP=1 - diff --git a/src/musketeer/experiments/goto-runner/goto-runner.sh b/src/musketeer/experiments/goto-runner/goto-runner.sh deleted file mode 100644 index f3e64cc37f2..00000000000 --- a/src/musketeer/experiments/goto-runner/goto-runner.sh +++ /dev/null @@ -1,471 +0,0 @@ -#!/bin/bash - -# Run tool on all of Michael's Debian packages. -# -# goto-runner.sh -# -# : natural; id of this instance -# : line at which to start in $FILE_LIST (1-based) -# : line at which to stop in $FILE_LIST (inclusive) -# -# Produced files: -# - progress-*: progress -# - info-*: logfile of the script -# - pid-*: pid of the script -# - in success-*/*: output of successful runs -# - in failure-*/*: output of unsuccessful runs -# -# Progress format (updated when a new package is handled): -# (line-start) current line / line-stop (total lines) -# ... - -# ------------------------------------------------------------------------------ -# Config - -. "$(hostname).config" || exit 1 - -# ------------------------------------------------------------------------------ -# Misc - -error() { - echo $PRE "$1" >&2 -} - -inf() { - echo $PRE "$1" -} - -bail() { - error "$1" - exit 1 -} - -usage() { - echo -e '\nUsage:' >&2 - echo -e ' goto-runner.sh \n' >&2 -} - -natcheck() { - echo "$1" | egrep -q '^(0|([1-9][0-9]*))$' > /dev/null 2>&1 - [ $? -ne 0 ] && bail 'not a natural number' -} - -# Replace forward slashes with underscores -replace() { - echo "$1" | sed 's/\//\_/g' -} - -# ------------------------------------------------------------------------------ -# Handle arguments - -PRE='goto-runner:' - -if [ $# -ne 3 ]; then - error 'number of arguments != 3' - usage - exit 1 -fi - -I="$1" -LSTART="$2" -LSTOP="$3" - -natcheck "$I" -natcheck "$LSTART" -natcheck "$LSTOP" - -if [ "$LSTART" -eq 0 ]; then - error 'line-start must be >= 1' - usage - exit 1 -fi -if [ "$LSTART" -gt "$LSTOP" ]; then - error'line-start greater than line-stop' - usage - exit 1 -fi - -TN=${#FE[@]} - -# ------------------------------------------------------------------------------ -# Signal handling - -STOP=0 - -grace() { - inf 'Termination signal received; will exit after this iteration' - STOP=1 -} - -trap grace SIGINT SIGTERM - -# ------------------------------------------------------------------------------ -# Sanity checks - -N=$TN -for ((i=0; i /dev/null 2>&1 - [ $? -eq 127 ] && bail "Cannot invoke $T" -done - -[ ! -f "$PTHREAD_LIB" ] && bail 'pthread lib file does not exist' -[ ! -f "$PTHREAD_LIB_ALT" ] && bail 'alt pthread lib file does not exist' - -natcheck "$FACTOR" - -# ------------------------------------------------------------------------------ -# Preparation - -ulimit -v $MAXMEM - -INFO="info-$I" -PROG="progress-$I" - -[ -e $INFO ] && bail "file $INFO already exists (delete it to start afresh)" -[ ! -r $FILE_LIST ] && bail "file $FILE_LIST cannot be opened for reading" - -> $INFO -> $PROG - -echo '# vim: nowrap' >> $INFO - -# Directories for output files -mkdir success-$I > /dev/null 2>&1 -mkdir failure-$I > /dev/null 2>&1 - -# Magic -echo '0 bequad 0x7f47424600000002 goto-binary-old' > goto-magic -echo '0 belong 0x7f474246 goto-binary' > goto-magic -echo 'int main() {}' > test.c -$GC test.c -o test > /dev/null 2>&1 -file -m goto-magic test 2>&1 | grep 'goto-binary' > /dev/null 2>&1 -[ $? -ne 0 ] && bail 'goto magic failed' - -TOTAL=$(wc -l $FILE_LIST | cut -f 1 -d ' ') -NUM=$(($LSTOP - $LSTART + 1)) -COUNT=$LSTART - -FILES=$(tail -n +$LSTART $FILE_LIST | head -n $NUM) - -# Number of files handled so far -FILE_COUNT=0 - -# Number of goto binaries handled so far -GB_COUNT=0 - -# Number of goto binaries suitable for tool so far -FE_COUNT=0 - -MAIN_COUNT=0 -PTHREAD_COUNT=0 -LOC_COUNT=0 - -PKG_URL_COUNT=0 -PKG_SIZE_COUNT=0 -PKG_DOWN_COUNT=0 - -for ((i=0; i pid-$I - -# ------------------------------------------------------------------------------ -# Progress - -print-progress() { - echo -e "($LSTART) $COUNT / $LSTOP ($TOTAL)\n" > $PROG - - echo "Packages at URL: $PKG_URL_COUNT" >> $PROG - echo "^ + size within bounds: $PKG_SIZE_COUNT" >> $PROG - echo -e "^ + package downloaded: $PKG_DOWN_COUNT\n" >> $PROG - - echo "Files within packages: $FILE_COUNT" >> $PROG - echo "^ + is a goto binary: $GB_COUNT" >> $PROG - echo "^ + main: $MAIN_COUNT" >> $PROG - echo "^ + pthread_create: $PTHREAD_COUNT" >> $PROG - echo "^ + loc size within bounds: $LOC_COUNT" >> $PROG - echo -e "^ + linking successful: $FE_COUNT\n" >> $PROG - - local i=0 - for ((i=0; i> $PROG - echo "$i timeout: ${TO_COUNT[$i]}" >> $PROG - echo "$i error: ${CRASH_COUNT[$i]}" >> $PROG - done -} - -# ------------------------------------------------------------------------------ -# Exploration - -# Download packages and perform checks (for all lines in $FILE_LIST) -for L in $FILES -do - print-progress - - echo -e "\n>>> PACKAGE: $L ($COUNT)\n" >> $INFO - - COUNT=$(($COUNT + 1)) - - # Produce URL and archive name - URL="$BEFORE$L$AFTER" - ARCHIVE="${L}.tar.bz2" - - # Check if archive exists - wget --spider -nv --timeout=60 "$URL" > /dev/null 2>&1 - if [ $? -ne 0 ]; then - echo "$L: package does not exist at URL (or network problems)" >> $INFO - continue - fi - - PKG_URL_COUNT=$(($PKG_URL_COUNT + 1)) - - ARCHIVE_SIZE=$(wget --spider --timeout=60 "$URL" 2>&1) - if [ $? -ne 0 ]; then - echo "$L: error on checking archive size" >> $INFO - continue - fi - ARCHIVE_SIZE=$(echo "$ARCHIVE_SIZE" | grep 'Length:' | sed -r \ - 's/(^Length: | \(.*$)//g') - natcheck "$ARCHIVE_SIZE" - if [ "$ARCHIVE_SIZE" -gt "$MAX_ARCHIVE_SIZE" ]; then - echo "$L: archive size exceeds maximum size" >> $INFO - continue - fi - - PKG_SIZE_COUNT=$(($PKG_SIZE_COUNT + 1)) - - wget -nv --timeout=60 "$URL" -O "$ARCHIVE" > /dev/null 2>&1 - if [ $? -ne 0 ]; then - echo "$L: download error" >> $INFO - rm -f "$ARCHIVE" - continue - fi - - PKG_DOWN_COUNT=$(($PKG_DOWN_COUNT + 1)) - - # Unpack archive - mkdir "$L" - if [ $? -ne 0 ]; then - echo "$L: cannot create dir for unpacking" >> $INFO - continue - fi - tar xj -C "$L" -f "$ARCHIVE" - if [ $? -ne 0 ]; then - echo "$L: cannot untar archive" >> $INFO - continue - fi - if [ ! -d "$L/goto-binaries" ]; then - echo "$L: unexpected dir" >> $INFO - continue - fi - - echo -e 'package ok\n' >> $INFO - - # Traverse files in package - PKGFILES=$(find "$L/goto-binaries" -type f) - for F in $PKGFILES - do - print-progress - - FILE_COUNT=$(($FILE_COUNT + 1)) - - file -m goto-magic "$F" 2>&1 | grep 'goto-binary' > /dev/null 2>&1 - # If file is a goto binary - if [ $? -eq 0 ]; then - - GB_COUNT=$(($GB_COUNT + 1)) - - # Size of the binary - SIZE=$(wc -c "$F" | cut -d ' ' -f 1) - natcheck $SIZE - if [ $SIZE -gt $MAX_GB_SIZE ]; then - echo "$L: $F: Goto binary exceeds maximum size" >> $INFO - continue - fi - - timeout -k 5 30 $GI --show-goto-functions "$F" > goto-functions-$I 2> \ - /dev/null - if [ $? -ne 0 ]; then - # Most likely out of memory (ignore this binary and go to next one) - echo "$L: $F: Cannot get goto functions" >> $INFO - continue - fi - - # Check if there is a main function (invocation) - egrep 'main[\ ]?((\([\ ]?\))|(\(.+,.+\)))' goto-functions-$I > /dev/null \ - 2>&1 - if [ $? -ne 0 ]; then - echo "$L: $F: No main()" >> $INFO - continue - fi - - MAIN_COUNT=$(($MAIN_COUNT + 1)) - - # Check if there is an invocation of pthread_create - egrep 'pthread_create[\ ]?\(.+,.+,.+,.+\)' goto-functions-$I > /dev/null \ - 2>&1 - if [ $? -ne 0 ]; then - echo "$L: $F: No pthread_create()" >> $INFO - continue - fi - - PTHREAD_COUNT=$(($PTHREAD_COUNT + 1)) - - # LoC - LOC=$(timeout -k 5 30 $GI --count-eloc "$F" 2> /dev/null) - if [ $? -ne 0 ]; then - echo "$L: $F: Error on counting LoC" >> $INFO - continue - fi - LOC=$(echo "$LOC" | tail -n 1 | cut -d ' ' -f 5) - natcheck "$LOC" - if [ $LOC -gt $MAX_LOC ]; then - echo "$L: $F: Goto binary LoC exceeds maximum" >> $INFO - continue - fi - - LOC_COUNT=$(($LOC_COUNT + 1)) - - # Change name (CBMC/goto-cc bug workaround) - mv "$F" "$F.gb" - F="$F.gb" - - # Link with pthreads lib - $GC -o "$F.linked" "$F" "$PTHREAD_LIB" - if [ $? -ne 0 ]; then - echo "$L: $F: Linking error, trying next pthread lib" >> $INFO - $GC -o "$F.linked" "$F" "$PTHREAD_LIB_ALT" - if [ $? -ne 0 ]; then - echo "$L: $F: Linking error, giving up" >> $INFO - continue - fi - fi - F="$F.linked" - - # Increment number of goto binaries suitable for tool - FE_COUNT=$(($FE_COUNT + 1)) - - echo "@@@ Running tools on $L: $F." >> $INFO - echo "@@@ LoC: $LOC" >> $INFO - echo "@@@ Binary size (in bytes): $SIZE" >> $INFO - - # ------------------------------------------------------------------------ - # Invoke tools - - TN1=$(($TN - 1)) - - # Running list - PIDS="" - - # Pid to idx - declare -A PM - - for ((i=0; i> ../$INFO - bash -c "ulimit -v $MAXMEM_FE; $INV" & - P=$! - PIDS="$PIDS $P" - PM[$P]=$i - cd .. - - # Continue if <= parallel factor and we have not invoked all - R=$(($R + 1)) - if [ $R -lt $FACTOR ] && [ $i -lt $TN1 ]; then - continue - fi - - while true; do - for P in $PIDS - do - kill -0 $P > /dev/null 2>&1 - if [ $? -ne 0 ]; then - wait $P - RET=$? - IDX=${PM[$P]} - # Attempt to kill process just to be sure - kill -9 $P > /dev/null 2>&1 - PIDS=$(echo "$PIDS" | sed "s/$P//g") - R=$(($R - 1)) - cd "inst-$IDX" - # Harvest results - if [ $RET -eq 0 ]; then - echo "@@@: Success on $F ($IDX) (return code 0)" >> ../$INFO - mv "$OUT.$IDX" ../success-$I - if [ -f results.txt ]; then - mv results.txt ../success-$I/"$OUT.$IDX.res" - fi - SUC_COUNT[$IDX]=$((${SUC_COUNT[$IDX]} + 1)) - else - echo "@@@: Failure on $F ($IDX) (return code $RET)" >> ../$INFO - mv "$OUT.$IDX" ../failure-$I - if [ $RET -eq 124 ] || [ $RET -eq 137 ]; then - TO_COUNT[$IDX]=$((${TO_COUNT[$IDX]} + 1)) - else - CRASH_COUNT[$IDX]=$((${CRASH_COUNT[$IDX]} + 1)) - fi - fi - cd .. - rm -rf "inst-$IDX" - print-progress - if [ $i -lt $TN1 ]; then - continue 3 - fi - if [ -z "${PIDS// /}" ]; then - break 2 - fi - fi - done - sleep 3 - done - done - - # ------------------------------------------------------------------------ - - else - echo "$L: $F: Not a goto binary" >> $INFO - fi # If file is a goto binary - done # For all files in package - - # Delete archive and unpacked files - if [ $KEEP -eq 0 ]; then - # Downloaded archive - rm -rf "$ARCHIVE" - # Directory were archive was unpacked to - rm -rf "$L" - fi - - # delete goto functions dumped by goto-instrument - rm -f goto-functions-$I - - if [ $STOP -eq 1 ]; then - break - fi -done - -# Cleanup before termination -rm -f goto-magic - -print-progress diff --git a/src/musketeer/experiments/goto-runner/pkgs-jenkins-all b/src/musketeer/experiments/goto-runner/pkgs-jenkins-all deleted file mode 100644 index 845a1ba975a..00000000000 --- a/src/musketeer/experiments/goto-runner/pkgs-jenkins-all +++ /dev/null @@ -1,17214 +0,0 @@ -0ad -0ad-data -2ping -2vcard -389-adminutil -389-console -3dchess -3depict -4digits -4g8 -4store -6tunnel -7kaa -7kaa-data -9base -9menu -9wm -a2jmidid -a2ps -a52dec -a56 -a7xpg -aa3d -aac-tactics -aafigure -aalib -aaphoto -abacas -abcde -abcm2ps -abcmidi -abe -abgate -abicheck -abi-compliance-checker -abind -abinit -abiword -abntex -abook -abootimg -abr2gbr -abraca -abtransfers -accerciser -access-modifier-checker -accessodf -accountsservice -acct -ace -acedb -acegi-security -ace-of-penguins -aces3 -acetoneiso -acfax -acheck -acheck-rules -acheck-rules-fr -achilles -ack -ack-grep -acl -acl2 -aclock.app -acm -aconnectgui -acorn-fdisk -acoustid-fingerprinter -acpi -acpica-unix -acpid -acpidump -acpi-support -acpitail -acpitool -acr38 -acsccid -actdiag -actionaz -activemq -activemq-activeio -activemq-protobuf -activity-log-manager -activiz.net -adabrowse -adacgi -adacontrol -ada-reference-manual -adasockets -adblock-plus -adblock-plus-element-hiding-helper -addresses-for-gnustep -adduser -adios -adjtimex -adlint -admesh -adminer -adns -adolc -adonthell -adonthell-data -adplay -adplug -adun.app -advancecomp -advene -advi -adzapper -aegis -aegisub -aeolus -aephea -aes2501-wy -aesfix -aeskeyfind -aeskulap -aespipe -aether -aewan -aewm -aewm++ -aewm++-goodies -affiche -afflib -afnix -aft -afterstep -afuse -agave -agda -agda-bin -agda-stdlib -agedu -agenda.app -agg -aggregate -aghermann -aglfn -agtl -aha -ahcpd -ahven -aiccu -aide -aiksaurus -airport-utils -airstrike -aisleriot -ajaxterm -aj-snapshot -akonadi -akonadi-googledata -akuma -alacarte -alarm-clock -alarm-clock-applet -albatross -aldo -ale -alembic -alevt -alex -alex4 -alglib -algol68g -algotutor -alice -alien -alien-arena -alienblaster -alien-hunter -aliki -allegro4.4 -alleyoop -alliance -all-in-one-sidebar -all-knowing-dns -alltray -almanah -alpine -alqalam -alsa-base -alsaequal -alsa-lib -alsamixergui -alsa-oss -alsaplayer -alsa-plugins -alsa-tools -alsa-utils -alsoft-conf -alt-ergo -altermime -alt-key -altree -alure -amanda -amap-align -amarok -amavisd-milter -amavisd-new -ambdec -amb-plugins -amide -amideco -amiga-fdisk -amispammer -amoeba -amoebax -amora-server -ampache-themes -amphetamine -amphetamine-data -ample -ampliconnoise -ampsharp -amrita2 -ams -amsynth -amtterm -amule -amule-emc -am-utils -an -anacron -analitza -analog -anarchism -and -anet -angband -angband-doc -angrydd -animals -animal-sniffer -anjuta -anjuta-extras -anki -ann -anna -annotation-indexer -anon-proxy -ant -ant-contrib -antelope -antennavis -anthy -antigrav -antiword -antlr -antlr3 -antlr-maven-plugin -ant-phone -ants -anubis -anypaper -anyremote -anyremote2html -anything-el -anytun -aoetools -aoeui -aolserver4 -aolserver4-nsldap -aolserver4-nsmysql -aolserver4-nsopenssl -aolserver4-nspostgres -aolserver4-nssha1 -aolserver4-nssqlite3 -aolserver4-nsxml -apache2 -apache-log4j1.2 -apache-mime4j -apache-mod-auth-ntlm-winbind -apache-pom -apachetop -apache-upload-progress-module -apbs -apcalc -apcupsd -apel -apertium -apertium-dbus -apertium-en-ca -apertium-en-es -apertium-eo-ca -apertium-eo-es -apertium-es-ca -apertium-es-gl -apertium-es-pt -apertium-es-ro -apertium-eu-es -apertium-fr-ca -apertium-fr-es -apertium-oc-ca -apertium-oc-es -apertium-pt-ca -apertium-pt-gl -apertium-tolk -apf -apf-firewall -apg -apgdiff -apipkg -aplus-fsf -apmd -apng2gif -apoo -apparix -apparmor -appconfig -apper -app-install-data -appmenu-qt -approx -apq -apq-postgresql -apr -apron -aprsd -aprsdigi -apr-util -apsfilter -apt -apt-build -apt-cacher -apt-cacher-ng -apt-clone -aptdaemon -apt-dater -apt-dpkg-ref -apt-file -apt-forktracer -aptfs -apticron -aptitude -apt-listbugs -apt-listchanges -apt-mirror -apt-move -apt-offline -aptoncd -apt-p2p -apt-rdepends -apt-setup -aptsh -apt-show-source -apt-show-versions -apt-spacewalk -apt-spy -apt-src -apt-transport-debtorrent -apt-watch -apt-xapian-index -apt-zip -ap-utils -apvlv -apwal -aqemu -aqsis -aqualung -ara -arandr -aranym -arbtt -arc -archivemail -archivemount -archmage -archmbox -ardentryst -ardesia -ardour -arduino -arduino-mk -arename -argparse -args4j -argtable2 -argus -argus-client -argvalidate -argyll -aria2 -aribas -ario -arista -arj -ark -armada-backlight -armadillo -armagetronad -arno-iptables-firewall -aroarfw -arora -arpack -arpack++ -arpalert -arping -arpon -arp-scan -arptables -arpwatch -array-info -artha -as31 -asc -ascd -ascdc -ascii -ascii2binary -asciidoc -asciijump -asciimathtml -asciio -asclock -asc-music -asedriveiiie -asio -asis -asm -asm2 -asm3 -asmail -asmix -asmixer -asmon -asp -aspcud -aspectc++ -aspectj -aspell -aspell-am -aspell-ar -aspell-ar-large -aspell-bn -aspell-br -aspell-cs -aspell-cy -aspell-el -aspell-en -aspell-fa -aspell-fr -aspell-ga -aspell-gu -aspell-he -aspell-hi -aspell-hr -aspell-hsb -aspell-hu -aspell-hy -aspell-is -aspell-it -aspell-kk -aspell-kn -aspell-ku -aspell-ml -aspell-mr -aspell-or -aspell-pa -aspell-pl -aspell-pt -aspell-ro -aspell-sk -aspell-sl -aspell-sv -aspell-ta -aspell-te -aspell-tl -aspell-uz -aspic -asql -asr-manpages -assaultcube -assimp -assogiate -asterisk -asterisk-core-sounds -asterisk-espeak -asterisk-flite -asterisk-moh-opsound -asterisk-prompt-de -asterisk-prompt-es-co -asterisk-prompt-fr-armelle -asterisk-prompt-fr-proformatique -asterisk-prompt-it -asterisk-prompt-se -astronomical-almanac -astyle -asunder -asused -aswiki -asylum -asymptote -async-http-client -at -atanks -atari800 -atdgen -aterm -atftp -atheist -athena-jot -atinject-jsr330 -atk1.0 -atkmm1.6 -atlas -atlas-cpp -atlc -atom4 -atomicparsley -atomix -atool -atop -atoppatch -atp -atris -atsar -ats-lang-anairiats -at-spi -at-spi2-atk -at-spi2-core -attal -attal-themes -attica -attr -aubio -auctex -audacious -audacious-dumb -audacious-plugins -audacity -audex -audiofile -audiolink -audiopreview -audioread -audit -audtty -aufs-tools -augeas -aumix -auralquiz -auth2db -authbind -authres -auto-apt -autoclass -auto-complete-el -autoconf -autoconf2.13 -autoconf2.59 -autoconf2.64 -autoconf-archive -autoconf-dickey -autoconf-gl-macros -autocutsel -autodia -autodir -autodns-dhcp -autodocksuite -autodock-vina -autofill-forms -autofs -autogen -auto-install-el -autojump -autokey -autolog -automake -automake1.10 -automake1.11 -automake1.9 -automatic-save-folder -automaton -automoc -auto-multiple-choice -automysqlbackup -autopkgtest -autopostgresqlbackup -autoproject -autopsy -autorenamer -autorun4linuxcd -autossh -autotalent -autotools-dev -autotrace -autotrash -autounit -avahi -avahi-sharp -avalon-framework -avarice -avbin -avce00 -avfs -aview -avifile -avinfo -avogadro -avra -avrdude -avr-evtd -avr-libc -avrp -avrprog -awardeco -away -aweather -awesfx -awesome -awesome-extra -awffull -awl -awstats -ax25-tools -axel -axiom -axis -ayaspell-dic -aylet -ayttm -azr3-jack -azureus -b43-fwcutter -babel -babeld -babiloo -babl -backbone -backintime -backport-util-concurrent -backup2l -backup-manager -backupninja -backuppc -bacula -bacula-doc -balance -balazar3 -balazarbrothers -balder2d -ball -ballz -balsa -bam -bamf -bandwidthcalc -bandwidthd -bangarang -banshee -banshee-community-extensions -baobab -bar -barada-pam -barcode -bareftp -barnowl -barrage -barry -base-files -base-installer -basemap -basenji -base-passwd -basex -bash -bashburn -bash-completion -bashdb -basic256 -basilisk2 -basket -bastet -batctl -batik -batmand -batmon.app -battery-stats -battleball -bauble -baycomepp -baycomusb -bb -bbdb -bbe -bbmail -bbpager -bbrun -bbtime -bc -bcel -bcfg2 -bchunk -bcpp -bcron -bdfresize -beaker -beancounter -beansbinding -beanstalkd -beast -beautifulsoup -beautifulsoup4 -beav -bedtools -beecrypt -beef -beep -beets -belier -beneath-a-steel-sky -berusky -berusky-data -bespin -betaradio -between -bfbtester -bfm -bf-utf -bglibs -bgoffice -bgoffice-computer-terms -bgoffice-dict-downloader -bhl -biabam -bibclean -bibcursed -biber -biblatex -biblatex-dw -bibledit-bibletime -bibledit-gtk -bibledit-xiphos -bible-kjv -bibletime -bibtex2html -bibtexconv -bibtool -bibus -bibutils -bicyclerepair -bidentd -bidiui -bidiv -biff -big-cursor -billard-gl -biloba -binclock -bind9 -bindex -bindfs -bindgraph -binfmtc -binfmt-support -bing -biniax2 -biniou -binkd -bino -bin-prot -bins -binstats -binutils -binutils-avr -binutils-h8300-hms -binutils-m68hc1x -binutils-mingw-w64 -binutils-msp430 -binutils-z80 -bio2jack -biococoa -biofox -biogenesis -biojava3-live -biojava-live -biomaj -biomaj-watcher -bioperl -bioperl-run -biosig4c++ -biosquid -bip -bird -birthday -bisho -bison -bison++ -bisonc++ -bist -bitlbee -bitmap-mule -bitmeter -bitops -bitpim -bitstormlite -bitstream -bittornado -bittorrent -bjsonrpc -bkchem -bkhive -blackbox -black-box -blackbox-themes -blacs-mpi -blacs-pvm -blahtexml -blam -blas -blazeblogger -blcr -bld -bleachbit -blender -blends -blepvco -bless -bley -blhc -blinken -bliss -blist -blitz++ -blktap -blktap-dkms -blktool -blktrace -blobandconquer -blobby -bloboats -blobwars -blockattack -blockdiag -blockout2 -blocks-of-the-undead -blop -blosxom -blt -bluedevil -bluefish -blueman -bluemindo -bluemon -blueproximity -bluetile -bluewho -bluez -bluez-hcidump -bluez-tools -bmagic -bmf -bml -bmon -bnd -bnfc -boa -boa-constructor -boats -bobcat -bobo -bobot++ -bochs -bodr -bogl -bognor-regis -bogofilter -boinc -bokken -bombardier -bomberclone -bomstrip -bonnie++ -boo -bookletimposer -bookview -boolector -boolstuff -boost1.49 -boost-defaults -boot -bootcd -bootchart -bootchart2 -booth -boot-info-script -bootp -bootpc -bopm -bordeaux-threads -bosh -boswars -botan1.10 -bottlerocket -bouncy -bouncycastle -bowtie -bowtie2 -box2d -boxbackup -boxes -boxshade -bozohttpd -bplay -bppphyview -bppsuite -bpython -brag -brailleutils -brandy -brasero -brewtarget -brian -brickos -bridge-method-injector -bridge-utils -brightside -briquolo -br.ispell -bristol -brltty -browser-history -brp-pacu -brutalchess -brutefir -bs2b-ladspa -bsaf -bsd-finger -bsdgames -bsdiff -bsd-mailx -bsdmainutils -bsfilter -bsh -bsl -bsnes -btag -btanks -bterm-unifont -bti -btrfs-tools -btscanner -btyacc -bubbros -bucardo -buddy -buffer -buffy -buffycli -bugsquish -bugz -buici-clock -buildapp -buildbot -buildbot-slave -build-essential -build-helper-maven-plugin -buildtorrent -bulletml -bum -bumprace -bundler -bup -burgerspace -burn -burp -busybox -buthead -buxon -buzztard -bvi -bwa -bwbar -bwbasic -bwidget -bwm-ng -byacc -byacc-j -bygfoot -byobu -bytecode -byzanz -bzflag -bzip2 -bzr -bzr-builddeb -bzr-cvsps-import -bzr-dbus -bzr-email -bzr-explorer -bzr-fastimport -bzr-git -bzr-grep -bzr-gtk -bzr-loom -bzr-pipeline -bzr-rewrite -bzr-search -bzr-stats -bzr-svn -bzrtools -bzr-upload -bzr-xmloutput -c2050 -c2esp -c2hs -c3p0 -cabal-debian -cabextract -cableswig -ca-certificates -ca-certificates-java -cachefilesd -cacti -cacti-spine -cadabra -cadaver -cadencii -cadubi -cain -cairo -cairo-5c -cairo-clock -cairodevice -cairo-dock -cairo-dock-plug-ins -cairomm -cairo-ocaml -cairosvg -cakephp -cakephp-instaweb -cal -cal3d -calabash -calamaris -calcoo -calcurse -calendar -calendarserver -calf -calibre -calife -calligra -calligra-l10n -calligra-transitional -cam -cameleon -camera.app -cameramonitor -caml2html -camlbz2 -camlidl -camlidl-doc -camlimages -camljava -camlmix -camlp5 -camltemplate -camlzip -camomile -camorama -camping -canlock -canna -canna-shion -c++-annotations -canto -cantor -capi4hylafax -capistrano -cappuccino -caps -car -cardstories -c-ares -caret -carettah -caribou -carmetal -carton -caspar -castle-combat -castor -catcodec -catdoc -catdvi -catfish -catools -catwalk -cavezofphear -cb2bib -cba -cbedic -cbflib -cbios -cbm -cbmc -cbmplugs -cbrpager -cc1111 -ccache -ccbuild -cccc -cccd -ccd2iso -ccfits -ccid -cciss-vol-status -cclib -cclive -ccontrol -cconv -c-cpp-reference -ccrypt -ccseapps -cctools -ccze -cd5 -cdargs -cdbackup -cdbs -cdcat -cdcd -cd-circleprint -cdck -cdcover -cdde -cd-discid -cddlib -cde -cdebconf -cdebconf-entropy -cdebconf-terminal -cdebootstrap -cdecl -cd-hit -cdi-api -cdk -cdlabelgen -cdo -cdparanoia -cdpr -cdrdao -cdrkit -cdrom-checker -cdrom-detect -cdrom-retriever -cdtool -cduce -cdw -cecil -cecil-flowanalysis -cecilia -cedar-backup2 -ceferino -cegui-mk2 -celery -celestia -cellwriter -cenon.app -centerim -cereal -cerealizer -cernlib -certificatepatrol -certmonger -ceve -cfengine2 -cfengine3 -cffi -cfflib -cfget -cfi -cfingerd -cfitsio3 -cflow -cfortran -cfourcc -cfv -cgal -cgdb -cgiemail -cgi-extratags-perl -cgilib -cglib -cgoban -cgsi-gsoap -cgvg -chaksem -chalow -chameleon-cursor-theme -changetrack -chaosreader -charactermanaj -chardet -charls -charmap.app -charybdis -chase -chasen -check -checkbot -checkgmail -checkinstall -check-mk -checkpolicy -check-postgres -checkpw -checksecurity -checkstyle -cheese -cheetah -chef -chef-expander -chef-server-api -chef-solr -chemeq -chemfp -chemical-mime-data -chemical-structures -chemtool -cherrypy3 -cherrytree -chewmail -chiark-tcl -chiark-utils -chicken -childsplay -childsplay-alphabet-sounds-bg -childsplay-alphabet-sounds-ca -childsplay-alphabet-sounds-de -childsplay-alphabet-sounds-el -childsplay-alphabet-sounds-en-gb -childsplay-alphabet-sounds-es -childsplay-alphabet-sounds-fr -childsplay-alphabet-sounds-it -childsplay-alphabet-sounds-nb -childsplay-alphabet-sounds-nl -childsplay-alphabet-sounds-pt -childsplay-alphabet-sounds-ro -childsplay-alphabet-sounds-ru -childsplay-alphabet-sounds-sl -childsplay-alphabet-sounds-sv -chimera2 -chipmunk -chipw -chirp -chise-base -chkconfig -chkrootkit -chktex -chm2pdf -chmlib -chmsee -chntpw -chocolate-doom -choose-mirror -choosewm -choqok -chordii -chromaprint -chromium-browser -chromium-bsu -chron -chronicle -chrony -chrootuid -chrpath -chuck -cia-clients -c-icap -c-icap-modules -cicero -ciderwebmail -cifs-utils -cil -cimg -cinfony -ciphersaber -cipux -cipux-cat-web -cipux-dog -cipux-object -cipux-passwd -cipux-rbac-simple -cipux-rpc -cipux-rpc-client -cipux-storage -cipux-task -circos -circos-tools -circuits -circuslinux -citadel -cjet -cjk -ckanclient -ckeditor -ckermit -ckport -cksfv -cl-alexandria -clalsadrv -clam -clamassassin -clamav -clamav-unofficial-sigs -clam-chordata -clam-networkeditor -clamsmtp -clamtk -clamz -clang -clanlib -cl-asdf -clasp -classworlds -cl-awk -clawsker -claws-mail -claws-mail-extra-plugins -claws-mail-themes -cl-babel -cl-base64 -clc-intercal -cl-closer-mop -cl-cluck -cl-clx-sbcl -cl-contextl -cldump -clean-crypto -clearlooks-phenix-theme -clearsilver -clementine -clex -cl-fftw3 -cl-flexichain -clfswm -cl-ftp -cl-getopt -clhep -cl-hyperobject -cli-common -clif -clinica -cliofetion -clipf -clipit -clippoly -clips -clips-doc -cliquer -cl-irc -cl-irc-logger -clirr -clirr-maven-plugin -clisp -clive -cl-kmrcl -cl-launch -cl-lexer -cl-lml -cl-lml2 -cl-lw-compat -cl-mcclim -cl-md5 -cl-modlisp -cln -cloc -clock-setup -clojure1.2 -clojure1.4 -clojure-contrib -clojure-maven-plugin -clonalframe -cloog -cloog-ppl -cloop -clp -cl-pg -cl-photo -cl-pipes -cl-plplot -cl-portable-aserve -cl-postoffice -cl-ppcre -cl-ptester -cl-pubmed -cl-puri -cl-regex -cl-reversi -cl-rlc -cl-rsm-mod -cl-rss -cl-rt -cl-salza -cl-spatial-trees -cl-split-sequence -cl-sql -clthreads -cltl -clucene-core -clucy -cl-uffi -cl-umlisp -cl-umlisp-orf -cl-usocket -clustalo -clustalw -clustalx -cluster -cluster-agents -cluster-glue -clustershell -clusterssh -clutter-1.0 -clutter-gesture -clutter-gst -clutter-gtk -clutter-imcontext -clutter-sharp -clxclient -cl-xlunit -cl-xmls -cl-xptest -clzip -cmake -cmatrix -cmd2 -cmdpack -cmdtest -cmigemo -cmigrep -cminpack -cmip5-cmor-tables -cmor -cmospwd -cmph -cm-super -cmt -cmtk -cmucl -cmus -cnf -cntlm -coala -cobertura -cobertura-maven-plugin -coccinella -coccinelle -coco-cpp -coco-cs -coco-doc -coco-java -code2html -codeblocks -codecgraph -codegroup -codemirror-js -codenarc -coderay -code-saturne -codespeak-lib -codetools -codeville -codfis -cogl -coherence -coils -coin3 -coinor-cbc -coinor-cgl -coinor-csdp -coinor-dylp -coinor-flopc++ -coinor-ipopt -coinor-osi -coinor-symphony -coinor-vol -coinst -coinutils -coldfire -colibri -collabtive -collatinus -collectd -collections15 -collectl -collectl-utils -colorblind -colorchooser -colorcode -colord -colordiff -colorgcc -colorhug-client -colormake -colorname -colorpicker -colortail -colortest -colortest-python -colrconv -combat -comedilib -comgt -comix -comixcursors -command-not-found -commando -command-runner-applet -commit-patch -common-lisp-controller -commons-beanutils -commons-configuration -commons-csv -commons-daemon -commons-exec -commons-httpclient -commons-io -commons-javaflow -commons-jci -commons-math -commons-parent -commons-pool -commons-vfs -compactheader -comparepdf -compartment -compass-fancy-buttons-plugin -compass-h5bp-plugin -compass-layoutgala-plugin -compass-slickmap-plugin -compass-susy-plugin -compass-yui-plugin -compiz-fusion-bcop -composite -comprez -concalc -concordance -concurrent-dfsg -condor -conduit -cone -confclerk -confget -config-manager -configobj -config-package-dev -configshell -configure-debian -confluence -confuse -congruity -conkeror -conky -conky-all -connectagram -connectomeviewer -connect-proxy -connman -conntrack -conque -cons -console-braille -console-common -console-cyrillic -console-data -consolekit -console-log -console-setup -console-tools -conspy -contacts -context -contextfree -context-modules -controlaula -convertall -convlit -convmv -cook -cookie-monster -cookietool -coolkey -coolmail -copyfs -copyright-update -coq -coq-float -coreutils -coriander -corkscrew -corosync -cortado -cortina -cothreads -couchdb -courier -courier-authlib -courier-filter-perl -couriergraph -couriergrey -courierpassd -covered -cowbell -cowdancer -cowsay -cp2k -cpan-listchanges -cpanminus -cpio -cpipe -cpl -cplay -cpm -cpmtools -cppcheck -cpphs -cppo -cpptasks -cppunit -cpputest -cpqarrayd -cproto -cpu -cpuburn -cpufreqd -cpufrequtils -cpuid -cpulimit -cpuset -cpushare -cqrlib -cqrlog -crack -crack-attack -cracklib2 -crafty-bitmaps -crafty-books-medium -crafty-books-medtosmall -crafty-books-small -cramfs -cramfsswap -crash -crashmail -crashme -crasm -crawl -crda -cream -createrepo -create-resources -creepy -creoleparser -c-repl -cricket -crimson -crip -criticalmass -critterding -crm114 -cron -cron-apt -cron-deja-vu -cronolog -cronometer -cronutils -crossfire -crossfire-client -crossfire-client-images -crossfire-client-sounds -crossfire-maps -crossfire-maps-small -crosshurd -crossroads -crtmpserver -cruft -cryptcat -crypt++el -cryptgps -cryptkeeper -cryptmount -cryptokit -cryptsetup -crystalcursors -crystalhd -cscope -csh -c-sig -csmash -csmash-demosong -csound -csound-manual -cssc -cssed -css-mode -cssparser -csstidy -cssutils -cstocs -cstream -csv2latex -csync2 -ctapi -ctdb -ctemplate -cthumb -ctioga2 -ctn -ctn-doc -ctorrent -ctpl -ctsim -ctwm -cuba -cube2font -cubictemp -cucumber -cudf -cue2toc -cuetools -culmus -culmus-fancy -cultivation -cunit -cup -cups -cups-filters -cups-pdf -cups-pk-helper -cupt -curl -curlftpfs -curtain -curves -customdeb -custom-tab-width -cutecom -cutesdr -cutils -cutter -cutter-testing-framework -cutycapt -cuyo -cvc3 -cvector -cvm -cvs -cvs2cl -cvs2html -cvs2svn -cvs-autoreleasedeb -cvs-buildpackage -cvschangelogbuilder -cvsconnect -cvsd -cvsdelta -cvsgraph -cvs-mailcommit -cvsps -cvssuck -cvs-syncmail -cvstrac -cvsutils -cvsweb -cvxopt -cwdaemon -cweb-latex -cwebx -cwidget -cwiid -cwirc -cxref -cxxtest -cxxtools -cycfx2prog -cyclades-serial-client -cycle -cynthiune.app -cyrus-imapd-2.4 -cyrus-imspd -cyrus-sasl2 -cytadela -cython -d2to1 -d52 -daa2iso -dacco -dacs -dact -dactyl -dadadodo -daemon -daemonfs -daemonlogger -daemontools -dahdi-linux -dahdi-tools -dailystrips -daisy-player -dajaxice -dancer-ircd -dancer-xml -dangen -dans-gdal-scripts -dansguardian -dante -dapl -daptup -daq -dar -darcs -darcsum -darcsweb -dares -darkice -darkplaces -darksnow -darkstat -darktable -darnwdl -darts -dash -dasher -das-watchdog -datapm -date -datefudge -dates -davfs2 -davical -dav-text -dawgdic -db -db1-compat -db4.7 -db4.8 -db4o -dbacl -dballe -dbar -dbconfig-common -db-defaults -dbeacon -dbench -dbf -dbf2mysql -dbi -dbix-easy-perl -dblatex -dbmix -dbs -dbskkd-cdb -dbtoepub -dbus -dbusada -dbus-c++ -dbus-glib -dbus-java -dbus-python -dbus-sharp -dbus-sharp-glib -dbview -dc3dd -dcap -dcfldd -dclock -dcmtk -d-conf -dc-qt -dcraw -dctrl2xml -dctrl-tools -dd2 -ddccontrol -ddccontrol-db -ddclient -ddd -ddir -ddns3-client -ddpt -dds -dds2tar -ddskk -ddtc -deal -dealer -deap -debarchiver -debaux -debbugs -debconf -debconf-kde -debdelta -debfoster -debget -deb-gview -debhelper -debian-archive-keyring -debian-builder -debianbuttons -debian-cd -debiandoc-sgml -debiandoc-sgml-doc -debiandoc-sgml-doc-pt-br -debian-edu -debian-edu-archive-keyring -debian-edu-artwork -debian-edu-config -debian-edu-doc -debian-edu-install -debian-faq -debian-gis -debian-goodies -debian-handbook -debian-history -debian-installer -debian-installer-launcher -debian-installer-netboot-images -debian-installer-utils -debian-junior -debian-keyring -debian-med -debian-policy -debian-ports-archive-keyring -debian-reference -debian-science -debian-timeline -debianutils -debian-xcontrol -debian-zh-faq -debichem -debirf -debmirror -debnest -debomatic -debootstrap -deborphan -debpartial-mirror -debpear -debram -debroster -debsecan -debsig-verify -debsums -debtags -debtorrent -debtree -decibel-audio-player -decoratortools -dee -deejayd -deets -defendguin -deja-dup -dejagnu -deliciousapi -delimmatch -delta -deluge -denemo -deng -denyhosts -depqbf -deps -derivations -desklaunch -deskmenu -desktop-base -desktop-file-utils -desktopnova -desktop-profiles -desmume -desproxy -detox -deutex -devede -develock-el -developers-reference -devhelp -device3dfx -device-tree-compiler -devil -devilspie -devilspie2 -devio -devscripts -devtodo -dfc -d-feet -dff -dfo -dfu-programmer -dfu-util -dh-ada-library -dh-autoreconf -dh-buildinfo -dhcpcd -dhcpcd5 -dhcpcd-dbus -dhcpcd-ui -dhcpdump -dhcp-helper -dhcping -dhcp-probe -dh-di -dhelp -dhex -dh-exec -dhis-client -dhis-dns-engine -dhis-mx-sendmail-engine -dhis-server -dhis-tools-dns -dh-kpatches -dh-linktree -dh-lisp -dh-lua -dh-make -dh-make-drupal -dh-make-perl -dh-make-php -dh-ocaml -di -dia -dia2code -diagnostics -diakonos -dialign -dialign-t -dialog -dia-newcanvas -dia-shapes -dibbler -dicelab -dico -dicom3tools -dicomnifti -dicompyler -dicomscope -dict-bouvier -dictclient -dictconv -dictd -dict-devil -dictdlib -dict-elements -dictem -dict-foldoc -dict-gazetteer2k -dict-gcide -diction -dictionaries-common -dictionary-el -dict-jargon -dict-moby-thesaurus -didiwiki -didjvu -dieharder -diet -dietlibc -diffmon -diffpdf -diffstat -diffuse -diffutils -diggler -digikam -digitemp -dillo -dimbl -dime -di-netboot-assistant -ding -ding-libs -dino -diod -diploma -dipy -dir2ogg -dirac -dircproxy -dirdiff -directfb -directoryassistant -directvnc -dirmngr -dirvish -dis51 -disc-cover -discount -discover -discover-data -discus -dish -disk-manager -disktype -disper -display-dhammapada -dispmua -dissy -dist -distcc -distorm64 -distribute -distro-info -distro-info-data -disulfinder -ditaa -dita-ot -d-itg -ditrack -ditz -diveintopython -diveintopython3 -diveintopython-zh -divxcomp -dizzy -djagios -django-adminaudit -django-ajax-selects -django-app-plugins -django-auth-ldap -django-authority -django-celery -django-classy-tags -django-countries -django-dajax -django-evolution -django-extra-views -django-filter -django-floppyforms -django-genshi -django-markupfield -django-nose -django-notification -django-openid-auth -django-pagination -django-picklefield -django-reversion -django-sekizai -django-tables -django-tastypie -django-threaded-multihost -djmount -djtools -djview4 -djvulibre -djvusmooth -dkg-handwriting -dkimproxy -dkimpy -dkms -dkopp -dl10n -dlint -dlocate -dlz-ldap-enum -dmake -dmalloc -dmapi -dmaths -dmg2img -dmidecode -dmitry -dmraid -dmtcp -dmucs -dmz-cursor-theme -dnprogs -dns2tcp -dns323-firmware-tools -dns-browse -dns-flood-detector -dnshistory -dnsjava -dnsmasq -dnsproxy -dnspython -dnspython3 -dnsruby -dnssec-tools -dnstop -dnstracer -dnswalk -doc-base -docbook -docbook2odf -docbook2x -docbook5-xml -docbook-defguide -docbook-dsssl -docbook-dsssl-doc -docbook-ebnf -docbook-html-forms -docbook-mathml -docbook-simple -docbook-slides -docbook-slides-demo -docbook-to-man -docbook-utils -docbook-website -docbook-xml -docbook-xsl -docbook-xsl-doc -docbook-xsl-saxon -doc-central -doc-debian -doc-debian-es -doc-debian-fr -docdiff -docker -docky -doclifter -doc-linux-fr -doc-linux-hr -doc-linux-ja -doc-linux-pl -doconce -docsis -doctorj -doctrine -docvert -docx2txt -dogtail -dojo -dokuwiki -dolfin -dom4j -donkey -doodle -dopewars -dos2unix -dosage -dosbox -doscan -doschk -dose2 -dose3 -dosemu -dosfstools -dossizola -dot2tex -dotconf -dot-forward -dotlrn -dots -dotur -douf00 -dov4l -dovecot -dovecot-antispam -downthemall -downtimed -doxia -doxia-maven-plugin -doxia-sitetools -doxygen -doxymacs -doxypy -dozzaqueux -dpatch -dphys-config -dphys-swapfile -dpkg -dpkg-awk -dpkg-cross -dpkg-repack -dpkg-sig -dpkg-www -dpsyco -d-push -dput -draai -drac -dracut -dradio -dragbox -d-rats -drawmap -drawterm -drawtiming -drawtk -drawxtl -drbd8 -drbdlinks -drbl -drc -dreamchess -dreampie -drgeo -drgeo-doc -driconf -driftnet -drivel -drizzle -drmaa -drobo-utils -dropbear -drpython -drraw -drslib -drupal7 -drush -dsbltesters -dsc-statistics -dsdo -dsdp -dsh -d-shlibs -dsniff -dspam -dssi -dssp -dstat -dsyslog -dtach -dtaus -dtc-xen -dtrx -duff -dulwich -duma -dumbster -dump -dumpasn1 -dumpet -dune-common -dune-geometry -dune-grid -dune-istl -dune-localfunctions -dunst -duo-unix -duplicity -dupload -duply -durep -dutch -dv4l -dvbackup -dvbcut -dvblast -dvbsnoop -dvbstream -dvbstreamer -dvbtune -dvcs-autosync -dvdauthor -dvdbackup -dvdisaster -dvd+rw-tools -dvdtape -dvgrab -dvhtool -dvi2dvi -dvi2ps -dvi2ps-fontdata -dvi2ps-fontdesc-morisawa5 -dvidvi -dvipng -dvipost -dvips-fontdata-n2bk -dvipsk-ja -dvorak7min -dvswitch -dvtm -dwarfutils -dwarves-dfsg -dwb -dwdiff -dwm -dwoo -dwww -dwz -dx -dxflib -dxpc -dxsamples -dynagen -dynalang -dynalogin -dynamite -dynare -dyndns -dzen2 -e00compr -e2fsprogs -e2ps -e2tools -e2undel -e2wm -e3 -eancheck -ears -easychem -easyconf -easy-format -easygit -easyh10 -easymock -easymp3gain -easypg -easyspice -easytag -easyzone -eb -eblook -ebnetd -eboard -eboard-extras-pack1 -ebook-speaker -ebook-tools -ebtables -ebumeter -ebview -ecaccess -ecasound -ecb -echolot -echoping -ecj -ecl -eclipse -eclipse-anyedit -eclipse-cdt -eclipse-cdt-pkg-config -eclipse-egit -eclipse-emf -eclipse-gef -eclipselink -eclipse-linuxtools -eclipse-mercurialeclipse -eclipse-mylyn -eclipse-rse -ecore -ecryptfs-utils -ed -ed2k-hash -edac-utils -edb -edbrowse -edbus -edenmath.app -edfbrowser -edict -edict-el -editline -editmoin -editobj -editra -edje -edos-debcheck -eeepc-acpi-scripts -eegdev -eekboek -eep24c -eet -efax -efax-gtk -effects -efibootmgr -eficas -efingerd -efi-reader -eflite -efp -efreet -efte -egenix-mx-base -egg -eggdrop -eglibc -ehcache -eiciel -eigen2 -eigen3 -eigenbase-farrago -eigenbase-resgen -eina -einstein -eiskaltdcpp -ejabberd -eject -ekeyd -ekg -ekg2 -ekiga -elastix -eldav -electric -electric-fence -electricsheep -elektra -elementary -elementtidy -elfrc -elfutils -el-get -elib -elib.intl -elida -elilo -elinks -eliom -elixir -elk -elki -elmerfem -elscreen -elserv -elvis -elvis-tiny -elyxer -elza -emacs23 -emacs-calfw -emacs-chess -emacs-defaults -emacsen-common -emacs-goodies-el -emacs-jabber -emacspeak -emacs-window-layout -email2trac -email-reminder -embassy-domainatrix -embassy-domalign -embassy-domsearch -ember -ember-media -emboss -emboss-explorer -embryo -emdebian-archive-keyring -emdebian-crush -emdebian-grip -emelfm2-svg-icons -emerillon -emesene -emma -emma-coverage -emms -emoslib -empathy -empire -empire-hub -empire-lafe -empty-expect -empy -emu8051 -enblend-enfuse -enca -encfs -enchant -enemies-of-carlotta -enemylines3 -enemylines7 -enet -engauge-digitizer -engine-pkcs11 -enigma -enigmail -enna -enscribe -enscript -ensymble -ent -entagged -enum -envstore -eog -eog-plugins -eo-spell -eot-utils -epcr -epdfview -eperl -epic4 -epic4-help -epic5 -epigrass -epiphany -epiphany-browser -epiphany-extensions -episoder -epix -epm -epoptes -epr-api -epsilon -epson-inkjet-printer-escpr -epstool -epwutil -epydoc -epylog -eq10q -eql -eqonomize -equivs -erc -eric -eris -erlang -erm -eruby -esdl -esekeyd -esix -esmtp -esniper -esorex -esound -espa-nol -espctag -espeak -espeakedit -espeak-gui -espeakup -esperanza -espresso -ess -essays1743 -estic -esys-particle -etckeeper -eterm -etherape -etherpuppet -etherwake -ethos -ethstats -ethstatus -ethtool -etk.docking -etktab -etl -etoile -etoolbox -etsf-io -etw -e-uae -euca2ools -eukleides -euler -eurephia -evas -event-dance -eventlog -eventstat -evernote-mode -evilvte -evilwm -evince -evolution -evolution-data-server -evolution-ews -evolution-exchange -evolution-mapi -evolution-rss -evolution-webcal -evolver -evolvotron -evtest -eweouz -ewipe -exabgp -exactimage -exaile -excalibur-logger -excalibur-logkit -excellent-bifurcation -exec-maven-plugin -execnet -exempi -exfat-utils -exif -exifprobe -exiftags -exim4 -eximdoc4 -exiv2 -exmh -exo -exodusii -exonerate -expat -expect -expeyes -explorercanvas -exrtools -ext3grep -extace -extlib -extplorer -extra-xdg-menus -extrema -extremetuxracer -extsmail -extundelete -exuberant-ctags -exult -eyed3 -ezgo -ez-ipupdate -ezmlm-browse -ezstream -eztrace -f2c -faad2 -facile -fact++ -facter -factory-boy -fadecut -fai -faifa -fail2ban -fair -fairymax -fake -fakechroot -fake-hwclock -fakepop -fakeroot -fakeroot-ng -faketime -falconpl -falselogin -fam -famfamfam-flag -fannj -fapg -farpd -farstream -fasianoptions -fassets -fastdep -fastdnaml -fastforward -fastjar -fastjet -fastlink -fasttree -fastx-toolkit -fatattr -fatrat -fatrat-czshare -fatrat-opensubtitles -fatresize -fatsort -faucc -fauhdlc -faulthandler -faumachine -faust -faustworks -fbasics -fbautostart -fbb -fbbdoc -fbcat -fbdesk -fbi -fb-music-high -fbonds -fbpager -fbpanel -fbreader -fbset -fbterm -fbterm-ucimf -fbxkb -fccexam -fceu -fcgiwrap -fcheck -fcitx -fcitx-chewing -fcitx-cloudpinyin -fcitx-configtool -fcitx-fbterm -fcitx-googlepinyin -fcitx-hangul -fcitx-libpinyin -fcitx-m17n -fcitx-sunpinyin -fcitx-table-extra -fcitx-table-other -fcitx-ui-light -fcitx-unikey -fckeditor -fcmp -fcode-utils -fcoe-utils -fcopulae -fcrackzip -fdclone -fdflush -fdm -fdpowermon -fdsend -fdupes -fdutils -febootstrap -feed2imap -feed2omb -feedparser -feh -felix-bundlerepository -felix-framework -felix-gogo-command -felix-gogo-runtime -felix-gogo-shell -felix-latin -felix-main -felix-osgi-obr -felix-shell -felix-shell-tui -felix-utils -fence-agents -fenics -fenix -ferari -ferm -ferret -festival -festival-czech -festival-doc -festival-freebsoft-utils -festival-hi -festival-it -festival-mr -festival-te -festlex-cmu -festlex-poslex -festvox-czech-dita -festvox-czech-krb -festvox-czech-machac -festvox-czech-ph -festvox-don -festvox-kallpc16k -festvox-kallpc8k -festvox-kdlpc16k -festvox-kdlpc8k -festvox-mbrola -festvox-rablpc16k -festvox-rablpc8k -festvox-ru -festvox-suopuhe-lj -festvox-suopuhe-mv -fet -fetch-crl -fetchmail -fetchyahoo -fexoticoptions -fextremes -feynmf -ffc -ffcall -ffdiaporama -ffe -ffindex -ffmpeg2theora -ffmpeg-php -ffmpegthumbnailer -ffms2 -ffproxy -ffrenzy -fftw -fftw3 -fgarch -fgetty -fgo -fhist -fiaif -fiat -fibranet -fieldslib -fife -fig2ps -fig2sxd -figlet -figtoipe -figtree -file -file-kanji -filelight -file-mmagic -filepp -file-rc -file-roller -fileschanged -filetea -filetraq -filezilla -filler -fillets-ng -fillets-ng-data -filo -fil-plugins -filter -filtergen -filters -fim -fimport -finance-yahooquote -findimagedupes -findlib -findutils -finish-install -fio -firebird2.5 -firebug -firecookie -firedns -firegestures -firehol -firestarter -firestring -firetray -firexpath -firmware-free -fische -fish -fishpoll -fityk -fizmo -fizsh -flac -flactag -flake -flam3 -flamerobin -flamethrower -flamingo -flann -flare -flashbake -flashblock -flashgot -flashplugin-nonfree -flashrom -flashybrid -flask -flask-wtf -flasm -flatzebra -flawfinder -fl-cow -fldiff -fldigi -flex -flexbackup -flexc++ -flexi-streams -flexloader -flexml -flex-old -flickrbackup -flickrfs -flight-of-the-amazon-queen -flim -flip -flite -floatbg -flobopuyo -flog -florence -flot -flotr -flowcanvas -flowscan -flowscan-cuflow -flow-tools -flpsed -fltk1.1 -fltk1.3 -flufl.bounce -flufl.enum -flufl.i18n -flufl.lock -flufl.password -fluid-soundfont -fluidsynth -fluidsynth-dssi -flumotion -flup -flush -flute -fluxbox -flvmeta -flvstreamer -flvtool2 -flwm -fmcs -fmit -fmtools -fmultivar -fnonlinear -fntsample -focalinux -focuswriter -fofix-dfsg -folks -fondu -fontchooser -fontconfig -fontforge -fontforge-doc -fontforge-extras -font-manager -fontmatrix -fonts-anonymous-pro -fonts-aoyagi-kouzan-t -fonts-aoyagi-soseki -fonts-arabeyes -fonts-arphic-bkai00mp -fonts-arphic-bsmi00lp -fonts-arphic-gbsn00lp -fonts-arphic-gkai00mp -fonts-arphic-ukai -fonts-arphic-uming -fonts-baekmuk -fonts-beng -fonts-beng-extra -fonts-beteckna -fonts-bpg-georgian -fonts-breip -fonts-cabin -fonts-cabinsketch -fonts-cantarell -fonts-century-catalogue -fonts-cmu -fonts-comfortaa -fonts-cwtex -fonts-dancingscript -fonts-dejima-mincho -fonts-deva -fonts-deva-extra -fonts-dosis -fonts-droid -fonts-dustin -fonts-dzongkha -fonts-ecolier-court -fonts-ecolier-lignes-court -fonts-eeyek -fonts-evertype-conakry -fonts-f500 -fonts-fanwood -fonts-farsiweb -fonts-freefarsi -fonts-freefont -fonts-gfs-artemisia -fonts-gfs-baskerville -fonts-gfs-bodoni-classic -fonts-gfs-complutum -fonts-gfs-didot -fonts-gfs-didot-classic -fonts-gfs-gazis -fonts-gfs-neohellenic -fonts-gfs-olga -fonts-gfs-porson -fonts-gfs-solomos -fonts-gfs-theokritos -fonts-gubbi -fonts-gujr -fonts-gujr-extra -fonts-guru -fonts-guru-extra -fonts-hanazono -fonts-horai-umefont -fonts-hosny-amiri -fonts-hosny-thabit -fonts-inconsolata -fonts-indic -fonts-ipaexfont -fonts-ipafont -fonts-ipamj-mincho -fonts-johnsmith-induni -fonts-junicode -fonts-jura -fonts-kacst -fonts-kacst-one -fonts-kanjistrokeorders -fonts-kaushanscript -fonts-khmeros -fonts-kiloji -fonts-knda -fonts-knda-extra -fonts-komatuna -fonts-konatu -fonts-kouzan-mouhitsu -fonts-lao -fonts-lato -fonts-levien-museum -fonts-levien-typoscript -fonts-lg-aboriginal -fonts-liberation -fonts-lindenhill -fonts-linex -fonts-linuxlibertine -fonts-lklug-sinhala -fonts-lobstertwo -fonts-lohit-beng-assamese -fonts-lohit-beng-bengali -fonts-lohit-deva -fonts-lohit-gujr -fonts-lohit-guru -fonts-lohit-knda -fonts-lohit-mlym -fonts-lohit-orya -fonts-lohit-taml -fonts-lohit-telu -fonts-manchufont -fonts-mgopen -fonts-migmix -fonts-misaki -fonts-mlym -fonts-mmcedar -fonts-monapo -fonts-motoya-l-cedar -fonts-motoya-l-maruberi -fonts-mph-2b-damase -fonts-mplus -fonts-nafees -fonts-nakula -fonts-nanum -fonts-nanum-coding -fonts-nanum-eco -fonts-nanum-gothic-light -fonts-navilu -fonts-ocr-a -fonts-oflb-asana-math -fonts-oflb-euterpe -fonts-okolaks -fonts-oldstandard -fonts-opendin -fonts-orya -fonts-orya-extra -fonts-pagul -fonts-paktype -fonts-pecita -fonts-play -fonts-prociono -fonts-quattrocento -fonts-rufscript -fonts-sahadeva -fonts-samyak -fonts-sawarabi-gothic -fonts-sawarabi-mincho -fonts-senamirmir-washra -fonts-sil-abyssinica -fonts-sil-andika -fonts-sil-charis -fonts-sil-dai-banna -fonts-sil-doulos -fonts-sil-ezra -fonts-sil-galatia -fonts-sil-gentium -fonts-sil-gentium-basic -fonts-sil-nuosusil -fonts-sil-padauk -fonts-sil-scheherazade -fonts-sil-sophia-nubian -fonts-sil-zaghawa-beria -fonts-sipa-arundina -fonts-smc -fonts-stix -fonts-takao -fonts-taml -fonts-taml-tamu -fonts-taml-tscu -fonts-telu -fonts-telu-extra -fonts-tibetan-machine -fonts-tlwg -fonts-tomsontalks -fonts-tuffy -fonts-ubuntu-title -fonts-ukij-uyghur -fonts-umeplus -fonts-unfonts-core -fonts-unfonts-extra -fonts-unikurdweb -fonts-uralic -fonts-vlgothic -fonts-vollkorn -fonts-yanone-kaffeesatz -fonts-yozvox-yozfont -fonttools -fontypython -fonty-rg -foo2zjs -foobillard -fookb -fookebox -foolscap -foomatic-db -foomatic-db-engine -foomatic-filters -foo-yc20 -fop -foptions -foreign -foremost -forg -forgethtml -forgetsql -forked-daapd -fort77 -fortune-mod -fortunes-bg -fortunes-bofh-excuses -fortunes-br -fortunes-cs -fortunes-de -fortunes-debian-hints -fortunes-eo -fortunes-es -fortunes-fr -fortunes-ga -fortunes-it -fortunes-mario -fortunes-pl -fortunes-ru -fortune-zh -fosfat -fossil -fotowall -fotoxx -foundry -fox1.6 -foxtrotgps -foxyproxy -fpc -fpconst -fped -fping -fpm2 -fportfolio -fprintd -fprint-demo -fprobe -fprobe-ulog -fqterm -fracplanet -fragmaster -frama-c -francine -fraqtive -freealchemist -freealut -freebirth -freebsd-buildutils -freebsd-glue -freebsd-libs -freebsd-manpages -freebsd-sendpr -freecdb -freecell-solver -freeciv -freecode-submit -freecol -freecraft -freedict -freedink -freedink-data -freedink-dfarc -freedoom -freedroid -freedroidrpg -freefem -freefem++ -freefem3d -freegish -freeglut -freehdl -freehep-chartableconverter-plugin -freehep-export -freehep-graphics2d -freehep-graphicsio -freehep-graphicsio-emf -freehep-graphicsio-java -freehep-graphicsio-pdf -freehep-graphicsio-ps -freehep-graphicsio-svg -freehep-graphicsio-swf -freehep-graphicsio-tests -freehep-io -freehep-swing -freehep-util -freehep-xml -freeimage -freeipmi -freemat -freemedforms-project -freemind -freepats -freeplane -freeplayer -freepops -freepwing -freeradius -freerdp -freesci -freespeak -freesweep -freetable -freetalk -freetds -freetennis -freetts -freetuxtv -freetype -freevial -freevo -freewheeling -freewnn -freexl -fregression -frei0r -freqtweak -frescobaldi -freshen -fretsonfire -fretsonfire-songs-muldjord -fretsonfire-songs-sectoid -fribidi -fritzing -frog -frogatto -frogdata -frogr -frontaccounting -frotz -frown -frozen-bubble -fruit -fsarchiver -fsgateway -fslint -fsmark -fso-datad -fso-deviced -fso-frameworkd -fso-gpsd -fso-gsm0710muxd -fso-gsmd -fso-specs -fso-usaged -fspanel -fsplib -f-spot -fsprotect -fspy -fstransform -fstrcmp -fsviewer-icons -fsvs -fswebcam -ftdi-eeprom -fte -fteqcc -ftgl -ftjam -ftnchek -ftp.app -ftpcopy -ftpgrab -ftphs -ftplib -ftpmirror -ftp-upload -ftpwatch -ftrading -fts -fullquottel -funcoeszz -funcparserlib -funitroots -funkload -funnelweb -funnelweb-doc -funnyboat -funny-manpages -funtools -furiusisomount -fuse -fuse4bsd -fuse-convmvfs -fusedav -fuse-emulator -fuse-emulator-utils -fuse-exfat -fuseiso -fuse-posixovl -fusesmb -fuse-umfuse-ext2 -fuse-umfuse-fat -fuse-umfuse-iso9660 -fusil -fusioninventory-agent -fuss-launcher -fuzz -fuzzyocr -fvwm -fvwm1 -fvwm-crystal -fvwm-icons -fwanalog -fwbuilder -fweb -fwknop -fwlogwatch -fwsnort -fxload -fxt -fyre -g15composer -g15daemon -g15macro -g15mpd -g15stats -g2 -g2clib -g2ipmsg -g2p-sk -g3data -g3dviewer -gabedit -gadap -gadfly -gadmin-bind -gadmin-openvpn-client -gadmin-openvpn-server -gadmin-proftpd -gadmin-rsync -gadmin-samba -gadmintools-meta -gaduhistory -gaffitter -gaim-librvp -gaim-themes -gajim -galax -galculator -galib -gallery -galleryremote -gallery-uploader -galleta -galternatives -gamazons -gambas3 -gambc -gambit -gameclock -game-data-packager -game-music-emu -gamera -games-thumbnails -gamgi -gamin -gamine -gammu -ganeti -ganeti-instance-debootstrap -ganglia -ganglia-modules-linux -gant -ganv -ganymed-ssh2 -ganyremote -gap -gap-ctbllib -gap-gdat -gaphas -gaphor -gap-tomlib -garcon -garden-of-coloured-lights -gargoyle-free -garlic -garlic-doc -garmin-ant-downloader -garmindev -garmin-forerunner-tools -gartoon -gastables -gatling -gauche -gauche-c-wrapper -gauche-gl -gaupol -gausssum -gav -gavl -gav-themes -gawk -gbackground -gbase -gbatnav -gbemol -gbgoffice -gbirthday -gbonds -gbrainy -gbrowse -gbsplay -gcal -gcalcli -gcalctool -gcap -gcb -gcc-3.3 -gcc-4.4 -gcc-4.6 -gcc-4.7 -gcc-avr -gcc-defaults -gcc-doc-defaults -gcc-h8300-hms -gcc-m68hc1x -gcc-mingw-w64 -gcc-msp430 -gccxml -gcin -gcipher -gcj-4.6 -gcj-4.7 -gcl -gco -gcolor2 -gcompris -gconf -gconf-editor -gconfmm2.6 -gconjugue -gcontactsync -gcp -gcpegg -gcr -gcstar -gcx -gd4o -gdal -gdata -gdata-sharp -gdb -gdb-avr -gdbm -gdb-mingw-w64 -gdb-msp430 -gdc-4.4 -gdc-4.6 -gdcm -gddrescue -gdebi -gdeskcal -gdesklets -gdevilspie -gdigi -gdis -gdisk -gdk-pixbuf -gdl -gdm3 -gdmap -gdome2 -gdpc -geant321 -geany -geany-plugins -gearhead -gearhead2 -gearmand -gearman-interface -gearman-server -gecko-mediaplayer -gecode -gecrit -geda-gaf -geda-xgsch2pcb -gedit -gedit-latex-plugin -gedit-plugins -gedit-r-plugin -gedit-source-code-browser-plugin -gedit-valencia-plugin -geekcode -geeqie -gegl -geiser -geki2 -geki3 -gelemental -gem -gem2deb -gemanx-gtk2 -gemdropx -gems -genbackupdata -genders -genetic -geneweb -genext2fs -gengetopt -genisovh -genius -genparse -genromfs -genshi -gentle -gentlyweb-utils -gentoo -genus2reduction -geoclue -geocode-glib -geogebra -geogebra-kde -geographiclib -geoip -geoip-database -geoip-database-contrib -geomview -geopy -geos -geotranz -gerbv -germinate -geronimo-activation-1.1-spec -geronimo-commonj-spec -geronimo-ejb-3.0-spec -geronimo-interceptor-3.0-spec -geronimo-j2ee-connector-1.5-spec -geronimo-jacc-1.1-spec -geronimo-javamail-1.4-provider -geronimo-javamail-1.4-spec -geronimo-jms-1.1-spec -geronimo-jpa-2.0-spec -geronimo-jpa-3.0-spec -geronimo-jta-1.1-spec -geronimo-osgi-support -geronimo-stax-1.2-spec -geronimo-validation-1.0-spec -gerstensaft -gesftpserver -geshi -gespeaker -getdata -getfem++ -get-flash-videos -get-iplayer -getmail4 -getstream -gettext -gettext-ant-tasks -gettext-lint -gexec -geximon -gexiv2 -gextractwinicons -gfan -gfarm -gfarm2fs -gfax -gff2aplot -gff2ps -gflags -gfm -gforth -gfpoken -gftp -gfxboot -gfxboot-examples -gfxboot-themes -ggcov -ggobi -ghc -ghc-mod -ghc-testsuite -ghemical -ghex -ghextris -ghostess -ghostscript -giblib -gif2apng -gif2png -giflib -gifsicle -gifticlib -giftrans -gigedit -giggle -gigolo -gimmix -gimp -gimp-data-extras -gimp-dcraw -gimp-dds -gimp-dimage-color -gimp-gap -gimp-help -gimplensfun -gimp-plugin-registry -gimp-resynthesizer -gimp-texturize -ginac -ginkgocadx -ginspector -gio-sharp -gip -girara -git -git2cl -git-annex -git-buildpackage -git-cola -git-dpm -git-extras -git-flow -git-ftp -gitg -github-backup -github-cli -gitit -gitmagic -gitolite -gitpkg -git-review -git-sh -gitstats -git-stuff -giws -gjacktransport -gjay -gjiten -gjots2 -gjs -gkdebconf -gkermit -gkeyfile-sharp -gkrellkam -gkrellm -gkrellm-gkrellmpc -gkrellmitime -gkrellm-leds -gkrellm-mailwatch -gkrellmoon -gkrellm-radio -gkrellm-reminder -gkrellm-snmp -gkrellm-thinkbat -gkrellm-volume -gkrellmwireless -gkrellm-x86info -gkrellm-xkb -gkrellshoot -gkrelltop -gkrelluim -gkrellweather -gkremldk -gksu -gl-117 -gl2ps -glabels -glade -glade-3 -glam2 -glance -glark -glassfish -glaurung -glbsp -gle -glee -gle-graphics -glew -glfer -glfw -glhack -glib2.0 -glibmm2.4 -glib-networking -glide -glipper -glitch -gliv -glm -glob2 -global -globs -globus-authz -globus-authz-callout-error -globus-callout -globus-common -globus-core -globus-ftp-client -globus-ftp-control -globus-gass-cache -globus-gass-cache-program -globus-gass-copy -globus-gass-server-ez -globus-gass-transfer -globus-gatekeeper -globus-gfork -globus-gram-audit -globus-gram-client -globus-gram-client-tools -globus-gram-job-manager -globus-gram-job-manager-callout-error -globus-gram-job-manager-condor -globus-gram-job-manager-fork -globus-gram-job-manager-pbs -globus-gram-job-manager-scripts -globus-gram-job-manager-sge -globus-gram-protocol -globus-gridftp-server -globus-gridftp-server-control -globus-gridmap-callout-error -globus-gsi-callback -globus-gsi-cert-utils -globus-gsi-credential -globus-gsi-openssl-error -globus-gsi-proxy-core -globus-gsi-proxy-ssl -globus-gsi-sysconfig -globus-gssapi-error -globus-gssapi-gsi -globus-gss-assist -globus-io -globus-openssl-module -globus-proxy-utils -globus-rls-client -globus-rls-server -globus-rsl -globus-scheduler-event-generator -globus-simple-ca -globus-usage -globus-xio -globus-xio-gsi-driver -globus-xioperf -globus-xio-pipe-driver -globus-xio-popen-driver -glogg -gloox -glosstex -glotski -glpeces -glpi -glpk -glpk-java -glrr -glrr-widgets -gltron -gluas -glue -gluegen2 -glue-schema -glui -glurp -glusterfs -glw -glx-alternatives -gmail-notify -gman -gmanedit -gmchess -gmediaserver -gmemusage -gmerlin -gmerlin-avdecoder -gmerlin-encoders -gmetadom -gmetrics -gmfsk -gmic -gmidimonitor -gmime -gmlive -gmobilemedia -gmodels -gmorgan -gmotionlive -gmp -gmpc -gmpc-plugins -gmp-ecm -gmrun -gmt -gmt-coast-low -gmt-doc-ps -gmt-gshhs -gmtk -gmtkbabel -gmt-manpages -gmtp -gmt-tutorial -gmult -gmusicbrowser -gmysqlcc -gnac -gnade -gnarwl -gnash -gnat -gnat-4.6 -gnat-gps -gnats -gnelib -gnet -gngb -gniall -gnoemoe -gnokii -gnomad2 -gnome3-emblems -gnome-activity-journal -gnome-alsamixer -gnome-applets -gnome-audio -gnome-backgrounds -gnome-blog -gnome-bluetooth -gnome-boxes -gnome-breakout -gnome-btdownload -gnomecatalog -gnome-chemistry-utils -gnome-codec-install -gnome-color-chooser -gnome-color-manager -gnome-colors -gnome-commander -gnome-common -gnome-contacts -gnome-control-center -gnome-desktop -gnome-desktop3 -gnome-desktop-sharp2 -gnome-devel-docs -gnome-dictionary -gnome-disk-utility -gnome-do -gnome-documents -gnome-doc-utils -gnome-do-plugins -gnome-dvb-daemon -gnome-extra-icons -gnome-font-viewer -gnome-games -gnome-games-extra-data -gnome-gmail -gnome-hearts -gnome-hwp-support -gnome-icon-theme -gnome-icon-theme-extras -gnome-icon-theme-nuovo -gnome-icon-theme-symbolic -gnome-icon-theme-yasis -gnome-js-common -gnome-keyring -gnome-keyring-sharp -gnomekiss -gnome-mag -gnome-mastermind -gnome-media -gnome-menus -gnome-menus2 -gnome-mime-data -gnome-mplayer -gnome-mud -gnome-nds-thumbnailer -gnome-nettool -gnome-online-accounts -gnome-orca -gnome-osd -gnome-packagekit -gnome-paint -gnome-panel -gnome-phone-manager -gnome-photo-printer -gnome-pie -gnome-pkg-tools -gnome-power-manager -gnome-ppp -gnome-python -gnome-python-desktop -gnome-python-extras -gnomeradio -gnome-rdp -gnome-schedule -gnome-screensaver -gnome-screensaver-flags -gnome-screenshot -gnome-search-tool -gnome-session -gnome-settings-daemon -gnome-sharp2 -gnome-shell -gnome-shell-extensions -gnome-shell-timer -gnome-specimen -gnome-speech -gnome-split -gnome-subtitles -gnome-sushi -gnome-system-log -gnome-system-monitor -gnome-system-tools -gnome-terminal -gnome-themes -gnome-themes-extras -gnome-themes-standard -gnome-tweak-tool -gnome-u2ps -gnome-user-docs -gnome-user-share -gnome-vfs -gnome-vfsmm2.6 -gnome-video-arcade -gnome-video-effects -gnome-xcf-thumbnailer -gnomint -gnonlin -gnote -gnotime -gns3 -gnubg -gnubiff -gnubik -gnuboy -gnucap -gnucash -gnucash-docs -gnuchess -gnuchess-book -gnudatalanguage -gnudoq -gnu-efi -gnu-fdisk -gnugk -gnugo -gnuhtml2latex -gnuift -gnuit -gnujump -gnulib -gnumach -gnumed-client -gnumed-server -gnumeric -gnunet -gnunet-fuse -gnunet-gtk -gnupg -gnupg2 -gnupg-doc -gnupginterface -gnupg-pkcs11-scd -gnuplot -gnuplot-mode -gnupod-tools -gnuradio -gnurobbo -gnurobots -gnuserv -gnushogi -gnusim8085 -gnu-smalltalk -gnu-standards -gnustep-back -gnustep-base -gnustep-dl2 -gnustep-examples -gnustep-gui -gnustep-icons -gnustep-make -gnustep-netclasses -gnutls26 -gnuvd -go2 -goaccess -goattracker -gob2 -goban -gobby -gobby-infinote -gobi-loader -gobject-introspection -goby -gocr -god -goffice -gofigure2 -gogglesmm -gogoc -golang -goldencheetah -goldendict -golly -gom -gomoku.app -gonzui -goo -goobox -goocanvas -goocanvasmm -google-bookmarks -googleearth-package -googlefontdirectory-tools -google-mock -google-perftools -google-sitemapgen -gopchop -gopher -goplay -gordon -gorm.app -gosa -gosa-perl -gosmore -gotmail -goto-common -goto-fai -goto-fai-backend -goto-fai-progress -gource -gourmet -gozer -gozerbot -gozerbot-plugins -gp2c -gpa -gpac -gpaint -gpart -gparted -gpdftext -gpe-announce -gpe-appmgr -gpe-bluetooth -gpe-calendar -gpe-clock -gpe-conf -gpe-confd -gpe-contacts -gpe-edit -gpe-expenses -gpe-filemanager -gpe-gallery -gpe-go -gpe-icons -gpe-julia -gpe-lights -gpe-login -gpe-mininet -gpe-mixer -gpe-othello -gpe-ownerinfo -gpe-question -gperf -gperiodic -gpe-screenshot -gpe-shield -gpe-soundbite -gpe-soundserver -gpe-su -gpesyncd -gpe-taskmanager -gpe-tetris -gpe-timesheet -gpe-todo -gpe-watch -gpe-what -gpgme1.0 -gphoto2 -gphotofs -gphpedit -gpick -gpicview -gpiv -gpivtools -gplanarity -gplcver -gplots -gpm -gpodder -gpointing-device-settings -gpp -gpr -gprbuild -gpredict -gprename -gprolog -gpsbabel -gpscorrelate -gpsd -gpsim -gpsim-doc -gpsk31 -gpsman -gpsmanshp -gpsprune -gpstrans -gpt -gputils -gpw -gpx2shp -gpxviewer -gquilt -grabc -grace -gradm2 -grads -grafx2 -gramadoir -gramofile -gramophone2 -gramps -grantlee -granule -grap -graphicsmagick -graphite2 -graphite-carbon -graphmonkey -graphthing -graphviz -graphy -grass -gravitation -gravitywars -grc -grcm -grcompiler -grdesktop -greasemonkey -greed -greekocr4gamera -greenwich -gregmisc -gregorio -grep -grepcidr -grepmail -gresolver -gretl -greylistd -grfcodec -grhino -gri -grib-api -gridengine -gridlock.app -grid-packaging-tools -gridsite -griffith -grig -grilo -grilo-plugins -grinder -gringo -gringotts -grisbi -grml2usb -grml-debootstrap -grml-rescueboot -groff -grok -grokevt -gromacs -gromit -groovy -groovy1.7.2 -gross -groundhog -grpn -grr.app -grsync -grub -grub2 -grub2-splashimages -grub-choose-default -grub-imageboot -grub-installer -grub-splashimages -grun -gsasl -gscan2pdf -gscanbus -gsetroot -gsettings-desktop-schemas -gsfonts -gsfonts-x11 -gshare -gsimplecal -gsl -gsm0710muxd -gsmartcontrol -gsmc -gsmlib -gsnmp -gsoap -gsoko -gsql -gss -gssdp -gst0.10-python -gst123 -gst-buzztard -gst-chromaprint -gst-fluendo-mp3 -gstm -gst-plugins-bad0.10 -gst-plugins-base0.10 -gst-plugins-good0.10 -gst-plugins-ugly0.10 -gst-qa-system -gstreamer0.10 -gstreamer0.10-dvswitch -gstreamer0.10-editing-services -gstreamer0.10-ffmpeg -gstreamer0.10-rtsp -gstreamer-hplugins -gstreamer-sharp -gsutil -gt5 -gtamsanalyzer.app -gtans -gtest -gtetrinet -gtg -gtg-trace -gthumb -gtick -gtimer -gtk+2.0 -gtk2-engines -gtk2-engines-aurora -gtk2-engines-cleanice -gtk2-engines-magicchicken -gtk2-engines-murrine -gtk2-engines-oxygen -gtk2-engines-qtcurve -gtk2-engines-wonderland -gtk2-engines-xfce -gtk2hs-buildtools -gtk+3.0 -gtk3-engines-unico -gtkam -gtkaml -gtkatlantic -gtkballs -gtkboard -gtk-chtheme -gtkcookie -gtk-doc -gtkgl2 -gtkglarea-sharp -gtkglext -gtkglextmm -gtk-gnutella -gtkguitune -gtkhash -gtkhotkey -gtkhtml3.14 -gtkhtml4.0 -gtkimageview -gtk-im-libthai -gtklick -gtklp -gtkmathview -gtkmm2.4 -gtkmm3.0 -gtkmm-documentation -gtk-nodoka-engine -gtkorphan -gtkperf -gtkpod -gtkpool -gtk-recordmydesktop -gtk-sharp2 -gtk-sharp-beans -gtksourceview2 -gtksourceview3 -gtkspell -gtkspell3 -gtk-theme-switch -gtktrain -gtk-vector-screenshot -gtk-vnc -gtkvncviewer -gtkwave -gtml -gtools -gtranslator -gtrayicon -gts -gtypist -guacamole -guacd -guake -guava -guava-libraries -guayadeque -gucharmap -gudev-sharp-1.0 -guessnet -guest-templates -gui-apt-key -guice -guichan -guidata -guifications -guile-1.6 -guile-1.8 -guile-2.0 -guile-cairo -guile-db -guile-lib -guile-pg -guilt -guiqwt -guitarix -gui-ufw -gummi -gunicorn -gunroar -gup -gupnp -gupnp-av -gupnp-dlna -gupnp-igd -gupnp-tools -gupnp-vala -gurgitate-mail -gurlchecker -gutenprint -guvcview -guymager -gv -gvb -gvfs -gvidm -gvpe -gvrng -gwaei -gwakeonlan -gwaterfall -gwc -gweled -gwenview -gw-fonts-ttf -gwhere -gwhois -gworkspace -gworldclock -g-wrap -gwrite -gwyddion -gxine -gxmessage -gxmms2 -gxneur -gxtuner -gyoto -gyp -gyrus -gzip -gzrt -h323plus -h5py -h5utils -ha -hachoir-core -hachoir-metadata -hachoir-parser -hachoir-regex -hachoir-subfile -hachoir-urwid -hachoir-wx -haci -haildb -ha-jdbc -hal -halevt -halibut -hal-info -hama-slide-mouse-control -hamexam -hamfax -haml-elisp -hamlib -hamradiomenus -hamster-applet -handlersocket -hannah -hannah-foo2zjs -hapm -happy -harden -harden-doc -hardening-wrapper -hardinfo -hardlink -harminv -hasciicam -haserl -hashalot -hashcash -haskell98-report -haskell98-tutorial -haskell-acid-state -haskell-active -haskell-adjunctions -haskell-aeson -haskell-algebra -haskell-alut -haskell-ami -haskell-ansi-terminal -haskell-ansi-wl-pprint -haskell-arrows -haskell-asn1-data -haskell-attempt -haskell-attoparsec -haskell-attoparsec-conduit -haskell-attoparsec-enumerator -haskell-augeas -haskell-authenticate -haskell-base16-bytestring -haskell-base64-bytestring -haskell-base-unicode-symbols -haskell-bifunctors -haskell-binary-shared -haskell-bindings-dsl -haskell-bindings-gpgme -haskell-bindings-libzip -haskell-bitarray -haskell-blaze-builder -haskell-blaze-builder-conduit -haskell-blaze-builder-enumerator -haskell-blaze-html -haskell-blaze-markup -haskell-blaze-textual -haskell-bloomfilter -haskell-boolean -haskell-boomerang -haskell-brainfuck -haskell-byteorder -haskell-bytestring-lexing -haskell-bytestring-mmap -haskell-bytestring-nums -haskell-bytestring-show -haskell-bzlib -haskell-cabal-file-th -haskell-cabal-install -haskell-cairo -haskell-case-insensitive -haskell-categories -haskell-cautious-file -haskell-cereal -haskell-cereal-conduit -haskell-certificate -haskell-cgi -haskell-chart -haskell-chell -haskell-citeproc-hs -haskell-clientsession -haskell-clock -haskell-cmdargs -haskell-colour -haskell-comonad -haskell-comonads-fd -haskell-comonad-transformers -haskell-conduit -haskell-configfile -haskell-configurator -haskell-contravariant -haskell-convertible -haskell-cookie -haskell-cprng-aes -haskell-cpu -haskell-criterion -haskell-crypto -haskell-crypto-api -haskell-cryptocipher -haskell-crypto-conduit -haskell-cryptohash -haskell-crypto-pubkey-types -haskell-css-text -haskell-csv -haskell-csv-conduit -haskell-curl -haskell-data-accessor -haskell-data-accessor-mtl -haskell-data-accessor-template -haskell-data-binary-ieee754 -haskell-data-default -haskell-dataenc -haskell-data-inttrie -haskell-data-lens -haskell-data-memocombinators -haskell-datetime -haskelldb -haskelldb-hdbc -haskelldb-hdbc-odbc -haskelldb-hdbc-postgresql -haskelldb-hdbc-sqlite3 -haskell-dbus -haskell-debian -haskell-devscripts -haskell-diagrams -haskell-diagrams-cairo -haskell-diagrams-core -haskell-diagrams-lib -haskell-diff -haskell-digest -haskell-dimensional -haskell-directory-tree -haskell-distributive -haskell-dlist -haskell-doc -haskell-download-curl -haskell-dpkg -haskell-dummy -haskell-dyre -haskell-edison-api -haskell-edison-core -haskell-edit-distance -haskell-editline -haskell-ekg -haskell-email-validate -haskell-entropy -haskell-enumerator -haskell-erf -haskell-event-list -haskell-exception-transformers -haskell-executable-path -haskell-explicit-exception -haskell-failure -haskell-fastcgi -haskell-fast-logger -haskell-fclabels -haskell-feed -haskell-fgl -haskell-file-embed -haskell-filemanip -haskell-filestore -haskell-filesystem-conduit -haskell-free -haskell-gconf -haskell-gd -haskell-ghc-events -haskell-ghc-mtl -haskell-ghc-paths -haskell-ghc-syb-utils -haskell-gio -haskell-github -haskell-glade -haskell-glfw -haskell-glib -haskell-glut -haskell-gnuidn -haskell-gnutls -haskell-gsasl -haskell-gstreamer -haskell-gtk -haskell-gtkglext -haskell-gtksourceview2 -haskell-haddock -haskell-hakyll -haskell-hamlet -haskell-happstack -haskell-happstack-server -haskell-harp -haskell-hashable -haskell-hashed-storage -haskell-hashmap -haskell-hashtables -haskell-haskeline -haskell-haskell-src -haskell-haskore -haskell-hastache -haskell-haxr -haskell-hcard -haskell-hcwiid -haskell-hfuse -haskell-hinotify -haskell-hint -haskell-hipmunk -haskell-hjavascript -haskell-hjscript -haskell-hjsmin -haskell-hostname -haskell-hs3 -haskell-hs-bibutils -haskell-hscurses -haskell-hsemail -haskell-hsh -haskell-hsp -haskell-hspec -haskell-hsql -haskell-hsql-mysql -haskell-hsql-odbc -haskell-hsql-postgresql -haskell-hsql-sqlite3 -haskell-hssyck -haskell-hstringtemplate -haskell-hsx -haskell-html -haskell-html-conduit -haskell-http -haskell-http-conduit -haskell-http-date -haskell-http-types -haskell-hunit -haskell-hxt -haskell-hxt-cache -haskell-hxt-charproperties -haskell-hxt-curl -haskell-hxt-http -haskell-hxt-regex-xmlschema -haskell-hxt-relaxng -haskell-hxt-tagsoup -haskell-hxt-unicode -haskell-hxt-xpath -haskell-hxt-xslt -haskell-iconv -haskell-ieee754 -haskell-ifelse -haskell-io-choice -haskell-iospec -haskell-io-storage -haskell-irc -haskell-iteratee -haskell-ixset -haskell-json -haskell-keys -haskell-knob -haskell-lambdabot-utils -haskell-language-c -haskell-language-haskell-extract -haskell-language-javascript -haskell-largeword -haskell-lazysmallcheck -haskell-leksah -haskell-leksah-server -haskell-lexer -haskell-libtagc -haskell-libxml-sax -haskell-libzip -haskell-lifted-base -haskell-listlike -haskell-llvm -haskell-llvm-base -haskell-logict -haskell-ltk -haskell-maccatcher -haskell-markov-chain -haskell-math-functions -haskell-maths -haskell-maybet -haskell-mbox -haskell-memotrie -haskell-mersenne-random -haskell-midi -haskell-mime-mail -haskell-mmap -haskell-mode -haskell-monadcatchio-mtl -haskell-monadcatchio-transformers -haskell-monad-control -haskell-monadcryptorandom -haskell-monad-loops -haskell-monad-par -haskell-monadrandom -haskell-monads-tf -haskell-monoid-transformer -haskell-mtl -haskell-mtlparse -haskell-murmur-hash -haskell-mwc-random -haskell-ncurses -haskell-netwire -haskell-network -haskell-network-conduit -haskell-network-protocol-xmpp -haskell-newtype -haskell-non-negative -haskell-numbers -haskell-numeric-quest -haskell-numinstances -haskell-numtype -haskell-oeis -haskell-openal -haskell-opengl -haskell-openpgp-asciiarmor -haskell-options -haskell-pandoc-types -haskell-pango -haskell-parallel -haskell-parseargs -haskell-parsec -haskell-parsec2 -haskell-pastis -haskell-path-pieces -haskell-patience -haskell-pcre-light -haskell-pem -haskell-persistent -haskell-persistent-sqlite -haskell-persistent-template -haskell-platform -haskell-polyparse -haskell-pool-conduit -haskell-postgresql-libpq -haskell-postgresql-simple -haskell-pretty-show -haskell-primes -haskell-primitive -haskell-psqueue -haskell-puremd5 -haskell-pwstore-fast -haskell-quickcheck -haskell-quickcheck1 -haskell-random -haskell-random-shuffle -haskell-ranged-sets -haskell-ranges -haskell-reactive-banana -haskell-readline -haskell-recaptcha -haskell-regex-base -haskell-regex-compat -haskell-regex-pcre -haskell-regex-posix -haskell-regexpr -haskell-regex-tdfa -haskell-regex-tdfa-utf8 -haskell-representable-functors -haskell-representable-tries -haskell-resource-pool -haskell-resourcet -haskell-rsa -haskell-safe -haskell-safecopy -haskell-sdl -haskell-sdl-gfx -haskell-sdl-image -haskell-sdl-mixer -haskell-sdl-ttf -haskell-semigroupoids -haskell-semigroups -haskell-sendfile -haskell-sha -haskell-shakespeare -haskell-shakespeare-css -haskell-shakespeare-i18n -haskell-shakespeare-js -haskell-shakespeare-text -haskell-shellac -haskell-show -haskell-silently -haskell-simpleea -haskell-simpleirc -haskell-simple-sendfile -haskell-skein -haskell-smallcheck -haskell-smtpclient -haskell-snap-core -haskell-snap-server -haskell-socks -haskell-split -haskell-src-exts -haskell-statevar -haskell-static-hash -haskell-statistics -haskell-stm -haskell-stream -haskell-strict -haskell-strict-concurrency -haskell-strptime -haskell-svgcairo -haskell-syb -haskell-syb-with-class -haskell-syb-with-class-instances-text -haskell-system-fileio -haskell-system-filepath -haskell-tagged -haskell-tagsoup -haskell-tagstream-conduit -haskell-tar -haskell-template -haskell-temporary -haskell-terminfo -haskell-test-framework -haskell-test-framework-hunit -haskell-test-framework-quickcheck2 -haskell-test-framework-th -haskell-test-framework-th-prime -haskell-testpack -haskell-texmath -haskell-text -haskell-text-icu -haskell-tinyurl -haskell-tls -haskell-tls-extra -haskell-transformers -haskell-transformers-base -haskell-type-level -haskell-uniplate -haskell-unix-bytestring -haskell-unix-compat -haskell-unixutils -haskell-unlambda -haskell-unordered-containers -haskell-uri -haskell-url -haskell-utf8-light -haskell-utf8-string -haskell-utility-ht -haskell-uuagc-cabal -haskell-uuid -haskell-uulib -haskell-vault -haskell-vector -haskell-vector-algorithms -haskell-vector-space -haskell-vector-space-points -haskell-void -haskell-vte -haskell-vty -haskell-wai -haskell-wai-app-file-cgi -haskell-wai-app-static -haskell-wai-extra -haskell-wai-logger -haskell-wai-logger-prefork -haskell-wai-test -haskell-warp -haskell-warp-tls -haskell-webkit -haskell-web-routes -haskell-weighted-regexp -haskell-x11 -haskell-x11-xft -haskell-xdg-basedir -haskell-xhtml -haskell-xml -haskell-xml2html -haskell-xml-conduit -haskell-xml-types -haskell-xss-sanitize -haskell-yaml -haskell-yaml-light -haskell-yesod -haskell-yesod-auth -haskell-yesod-core -haskell-yesod-default -haskell-yesod-form -haskell-yesod-json -haskell-yesod-markdown -haskell-yesod-persistent -haskell-yesod-routes -haskell-yesod-static -haskell-yesod-test -haskell-zip-archive -haskell-zlib -haskell-zlib-bindings -haskell-zlib-conduit -haskell-zlib-enum -hatari -hatop -haveged -hawknl -hawtjni -haxml -hdapsd -hdate-applet -hdbc -hdbc-odbc -hdbc-postgresql -hdbc-sqlite3 -hddtemp -hdf5 -hdf-eos4 -hdf-eos5 -hdparm -hdup -headache -hearse -heartbeat -hebcal -hedgewars -heimdal -heirloom-mailx -helium -hello -hello-debhelper -help2man -helpviewer.app -hepmc -herbstluftwm -hercules -herculesstudio -heroes -heroes-data -heroes-sound-effects -heroes-sound-tracks -hesiod -hessian -hevea -hex-a-hop -hexalate -hexcurse -hexec -hexedit -hexer -hexter -hexxagon -hfsplus -hfsprogs -hfsutils -hg-fast-export -hg-git -hgnested -hgsubversion -hgsvn -hgview -hhsuite -hibernate -hicolor-icon-theme -highlight -highlighting-kate -hiki -hime -hippo-canvas -hiredis -hitchhiker -hitori -hivex -hkgerman -hkl -hlbr -hlbrw -hlins -hlint -hmisc -hmmer -hnb -ho22bus -hoauth -hobbit-plugins -hocr -hodie -hoichess -hol88 -holdingnuts -hol-light -holotz-castle -homebank -horae -horgand -horizon -hostap-utils -hostname -hotkeys -hotot -hotswap -hotwire -howm -hoz -hp2xx -hp48cc -hpanel -hpcc -hping3 -hplip -hp-ppd -hp-search-mac -hpsockd -hscolour -hsetroot -hslogger -hspell -hspell-gui -hsqldb -ht -htag -htcheck -htcheck-php -htdig -html2ps -html2text -html2wml -html5lib -htmlcxx -htmldoc -htmlgen -html-helper-mode -html-template -htmlunit -htmlunit-core-js -html-xml-utils -htop -htree -htsengine -hts-voice-nitech-jp-atr503-m001 -httest -httpcode -httpcomponents-client -httpcomponents-core -httperf -httpfs2 -http-icons -httpie -httping -httptunnel -httpunit -httrack -hugin -hugs98 -hunspell -hunspell-an -hunspell-be -hunspell-dict-ko -hunspell-en-us -hunspell-gl-es -hunspell-kk -hunspell-ml -hunspell-ru -hunspell-se -hunspell-sv -hunt -hwdata -hw-detect -hwinfo -hwloc -hyantesite -hyde -hydrogen -hydrogen-drumkits -hyena -hylafax -hyperspec -hyphen -hyphen-as -hyphen-bn -hyphen-gu -hyphen-hi -hyphen-kn -hyphen-mr -hyphen-pa -hyphen-show -hyphen-ta -hyphen-te -hypre -i2c-tools -i3lock -i3status -i3-wm -i810switch -i8kutils -ia32-libs -ia32-libs-gtk -iat -iausofa-c -iaxmodem -ibam -ibid -ibod -ibsim -ibus -ibus-anthy -ibus-array -ibus-chewing -ibus-client-clutter -ibus-el -ibus-googlepinyin -ibus-hangul -ibus-input-pad -ibus-m17n -ibus-pinyin -ibus-qt -ibus-skk -ibus-sunpinyin -ibus-table -ibus-table-chinese -ibus-table-extraphrase -ibus-table-others -ibus-tegaki -ibus-unikey -ibus-xkbc -ibutils -ical2html -icc-profiles-free -iceape -icebreaker -icecast2 -icecream -icedove -icedove-l10n -icedtea-web -ices2 -iceweasel -iceweasel-linky -icewm -icheck -icicles -icinga -icinga-web -icli -icmake -icmpinfo -icmptx -icmpush -icom -icon -icon-naming-utils -icon-slicer -icoutils -icu -icu4j -icu4j-4.4 -id3 -id3lib3.8.3 -id3ren -id3tool -id3v2 -ident2 -identicurse -idesk -ideviceinstaller -idjc -idle3-tools -idl-font-lock-el -idm-console-framework -ido -id-utils -idzebra -iec16022 -ifd-gempc -ifeffit -ifenslave-2.6 -ifetch-tools -ifhp -ifile -ifmail -ifmetric -ifpgui -ifplugd -ifrench -ifrench-gut -ifrit -ifscheme -ifstat -iftop -ifupdown -ifupdown-extra -ifupdown-scripts-zg2 -ifuse -igaelic -igal2 -igerman98 -igraph -igstk -ii -ii-esu -iipimage -iirish -iisemulator -iitalian -ijs -ikarus -ike-scan -ikiwiki -ikiwiki-hosting -ikvm -ilmbase -ilohamail -im -imageindex -imagej -imagemagick -imageshack-uploader -imagetooth -imagevis3d -imagination -imanx -imap-acl-extension -imapcopy -imapfilter -imaprowl -imaptool -im-config -imdbpy -imdb-tools -imediff2 -imgsizer -imgtex -imgvtopgm -imhangul -imhangul3 -imhangul-common -iml -imlib2 -imms -impacket -importlib -impose+ -imposm -imposm-parser -impressive -imsniff -imspector -im-switch -imview-doc -imvirt -imwheel -inadyn -incron -indent -indicator-applet -indicator-application -indicator-messages -indicator-session -indigo -inetutils -infernal -infiniband-diags -info2man -info2www -infon -infon-devel -inform-mode -ini4j -initramfs-tools -initz -ink-generator -inkscape -inn -inn2 -innfeed -innoextract -inosync -inotail -inoticoming -inotify-tools -inotifyx -inputlirc -input-pad -input-utils -insighttoolkit -inspircd -insserv -installation-guide -installation-locale -installation-report -instant -instead -integrit -intel2gas -intel-gpu-tools -inteltool -intel-vaapi-driver -intercal -interchange -intlfonts -intltool -intltool-debian -intone -invada-studio-plugins -invada-studio-plugins-lv2 -invaders -inventor -iodine -iog -iok -ion -ioping -ioquake3 -io-stringy -iotop -ip2host -ip4r -ipadic -ipband -ipcalc -ipcheck -ipdb -ipe -ipe5toxml -iperf -ipfm -ipgrab -ipheth -ipip -ipkungfu -ipmitool -ipolish -ippl -iprelay -iprint -iproute -ips -ipsec-tools -ipset -ipsvd -iptables -iptables-persistent -iptotal -iptraf -iptstate -iptux -iputils -ipv6calc -ipvsadm -ipwatchd -ipwatchd-gnotify -ipxe -ipy -ipython -ircd-hybrid -ircd-irc2 -ircd-ircu -ircd-ratbox -ircii -ircmarkers -ircp-tray -irda-utils -iripdb -ir.lv2 -iroffer -irqbalance -irrlicht -irsim -irssi -irssi-plugin-xmpp -irssi-scripts -isakmpd -isatapd -isc-dhcp -iscsitarget -isdnactivecards -isdnutils -iselect -isight-firmware-tools -isl -islamic-menus -isns -iso-codes -isodate -isomaster -isomd5sum -isoqlog -isoquery -isorelax -iso-scan -ispell -ispell-czech -ispell-et -ispell-fi -ispell-fo -ispell-gl -ispell-lt -ispell.pt -ispell-tl -ispell-uk -istanbul -istgt -isync -italc -itcl3 -itk3 -itksnap -itools -itop -its -itsalltext -itsol -itstool -iucode-tool -iverilog -ivtools -ivtv-utils -ivy -ivykis -iw -iwatch -iwidgets4 -jaaa -jabberbot -jabber-irc -jabber.py -jabber-querybot -jablicator -jabref -jabref-plugin-oo -jacal -jack -jack-audio-connection-kit -jack-capture -jackd2 -jackd-defaults -jackeq -jack-keyboard -jackmeter -jack-mixer -jackrabbit -jack-rack -jack-stdio -jacksum -jack-tools -jacktrip -jade -jadetex -jaffl -jags -jailer -jailtool -jajuk -jakarta-ecs -jakarta-jmeter -jakarta-taglibs-standard -jalv -jalview -jam -jama -jamin -jaminid -jam-lib -jana -janest-core -janino -jansi -jansi-native -jansson -japa -japi-compliance-checker -japitools -jardiff -jargon -jargon-text -jargs -jarjar -jarjar-maven-plugin -jas -jasmin-sable -jasper -jasperreports -jasperreports3.7 -jas-plotter -jasypt -jaula -java2html -java3d -java3ds-fileloader -java-access-bridge -java-atk-wrapper -javacc -javacc-maven-plugin -java-common -javadap -java-gnome -javahelp2 -java-imaging-utilities -javamorph -java-package -javascript-common -javassist -javatools -java-wrappers -java-xmlbuilder -jaxe -jaxme -jaxml -jazip -jbig2dec -jbigkit -jblas -jbofihe -jbossas4 -jcal -jcc -jcharts -jcifs -jclassinfo -jclic -jclicmoodle -jcm -jcodings -jcommander -jconvolver -jcsp -jd -jdresolve -jebl2 -jed -jed-extra -jedit -jeex -jekyll -jellydoc -jellyfish -jemalloc -jenkins-commons-jelly -jenkins-commons-jexl -jenkins-crypto-util -jenkins-dom4j -jenkins-executable-war -jenkins-htmlunit -jenkins-htmlunit-core-js -jenkins-json -jenkins-memory-monitor -jenkins-remoting -jenkins-task-reactor -jenkins-test-annotations -jenkins-trilead-ssh2 -jenkins-winstone -jenkins-xstream -jericho-html -jesd -jesred -jester -jetring -jets3t -jetty -jetty8 -jeuclid -jexcelapi -jffi -jffnms -jflex -jfractionlab -jfsutils -jftp -jfugue -jgit -jgraph -jgromacs -jhbuild -jhdf -jhead -jifty -jigdo -jigit -jigl -jigzo -jiipview -jimtcl -jing-trang -jinja2 -jinput -jirc -jkmeter -jlapack -jless -jlex -jlha-utils -jlibeps -jline -jlint -jmagick -jmdns -jmeters -jmock -jmock2 -jmol -jnettop -jnoise -jnoisemeter -jnr-netdb -jnr-x86asm -joblib -jocaml -joda-convert -jodconverter -jodconverter-cli -jodreports -joe -john -jokosher -joptsimple -josm -josm-plugins -josql -jove -jovie -joy2key -joystick -jp2a -jpeginfo -jpegjudge -jpegoptim -jpegpixi -jpilot -jpilot-backup -jpnevulator -jpoker -jpylyzer -jqapi -jquery -jquery-goodies -jquery-jplayer -jquery-jplayer-bluemonday -jquery-jplayer-pinkflag -jquery-mobile -jqueryui -jquery-ui-themes -jruby -jruby-joni -js2-mode -jsch -jscribble -jscropperui -jsdebugger -jsdoc-toolkit -jshash -jsilver -jsjac -jsmath -jsmath-fonts -jsmath-fonts-sprite -js-of-ocaml -jsonbot -json-c -json-glib -jsonpickle -jsonpipe -json-simple -json-spirit -json-static -json-wheel -jsoup -jsr107cache -jss -jstest-gtk -jsxgraph -jsymphonic -jta -jtb -jtex-base -jtharness -jthread -jtidy -jtreg -jts -judy -juffed -jug -jugglemaster -juke -juman -jumpnbump -jumpnbump-levels -junior-doc -junit -junit4 -junitperf -junkfilter -jupp -jutils -jvim -jvyamlb -jwchat -jwhois -jwm -jxgrabkey -jxplorer -jython -jzip -jzlib -k3b -k3d -k4dirstat -kaa-base -kaa-imlib2 -kaa-metadata -kabikaboo -kaccessible -kactivities -kadu -kaffeine -kakasi -kalgebra -kali -kalign -kalternatives -kalzium -kamera -kamerka -kamoso -kanagram -kanatest -kanif -kanjidic -kanjipad -kannel -kannel-sqlbox -kanyremote -kaptain -kasumi -kate -katoob -kawari8 -kaya -kbackup -kball -kbd -kbd-chooser -kbdd -kbibtex -kbruch -kbuild -kcalc -kcc -kcemu -kcharselect -kcheckers -kchmviewer -kcm-fcitx -kcollectd -kcolorchooser -kcometen4 -kcov -kdbg -kdc2tiff -kde4libs -kdeadmin -kdeartwork -kde-baseapps -kdegames -kdegraphics-mobipocket -kdegraphics-strigi-analyzer -kdegraphics-thumbnailers -kde-gtk-config -kde-l10n -kdemultimedia -kdenetwork -kdenlive -kdepim -kdepimlibs -kdepim-runtime -kdeplasma-addons -kde-runtime -kdesdk -kdesrc-build -kde-style-polyester -kde-style-qtcurve -kdesudo -kdesvn -kdetoys -kdevelop -kdevelop-pg-qt -kdevelop-php -kdevelop-php-docs -kdevplatform -kde-wallpapers -kdewebdev -kde-workspace -kdf -kdiff3 -kdm-gdmcompat -kdocker -kdrill -kedpm -keepalived -keepass2 -keepassx -keepnote -kelbt -kephra -kerberos-configs -kernel-handbook -kernel-package -kernel-patch-viewos -kerneltop -kernel-wedge -kernsmooth -ketchup -ketm -keurocalc -kexec-tools -keybinder -keyboards-rg -keychain -keylaunch -keymapper -key-mon -keynav -keystone -keytouch-editor -keyutils -kfloppy -kfreebsd-8 -kfreebsd-9 -kfreebsd-defaults -kftpgrabber -kgamma -kgb -kgb-bot -kgeography -kgpg -khangman -khmerconverter -khronos-opencl-headers -khronos-opengl-man4 -kicad -kickseed -kid -kid3 -kig -kiki -kiki-the-nano-bot -kildclient -kile -killer -kimwitu -kimwitu++ -kimwitu-doc -kindleclip -king -kingston-update-notifier -kino -kinput2 -kio-ftps -kio-gopher -kiten -kiwi -klatexformula -klavaro -klettres -klibc -klick -klog -klone -kluppe -klustakwik -kmag -kmess -kmetronome -kmflcomp -kmfl-keyboards-mywin -kmidimon -kmldonkey -kmod -kmousetool -kmouth -kmplayer -kmplot -kmymoney -knemo -knews -knights -knockd -knocker -knopflerfish-osgi -knowledgeroot -kobodeluxe -kolabadmin -kolourpaint -kombu -komi -komparator -kon2 -konfont -konsole -konversation -konwert -korundum -kosd -ko.tex -ko.tex-extra-hlfont -ko.tex-unfonts -koules -kover -kpartsplugin -kphotoalbum -kplayer -kradio4 -kraft -krank -kraptor -krb5 -krb5-appl -krb5-auth-dialog -krb5-sync -krecipes -kredentials -kremotecontrol -krename -kross-interpreters -kruler -krusader -ksaneplugin -kscope -ksh -kshutdown -ksnapshot -ksplice -ksshaskpass -kst -kstars -kstart -kterm -ktikz -ktimer -ktorrent -ktouch -ktp-accounts-kcm -ktp-approver -ktp-auth-handler -ktp-call-ui -ktp-common-internals -ktp-contact-list -ktp-filetransfer-handler -ktp-kded-integration-module -ktp-presence-applet -ktp-send-file -ktp-text-ui -kturtle -kumofs -kunststoff -kup -kupfer -kuvert -kvirc -kvkbd -kvpm -kvpnc -kwalify -kwallet -kwalletcli -kwave -kwin-style-crystal -kwin-style-dekorator -kwordquiz -kwstyle -kwwidgets -kxl -kxml2 -l2tp-ipsec-vpn -l2tp-ipsec-vpn-daemon -l2tpns -l7-filter-userspace -l7-protocols -lablgl -lablgtk2 -lablgtk-extras -lablgtkmathview -labrea -laby -lacheck -ladder -ladish -laditools -ladr -ladspa-sdk -ladvd -lakai -lam -lambdabot -lame -lammps -landell -landslide -langdrill -langscan -lapack -laptop-detect -laptop-mode-tools -larswm -lasi -lasso -last-align -lastfm -lastfmsubmitd -lat -latd -late -latencytop -latex209 -latex2html -latex2rtf -latex-beamer -latex-cjk-chinese-arphic -latex-cjk-japanese-wadalab -latexdiff -latexdraw -latexila -latex-make -latexmk -latex-mk -latexml -latex-sanskrit -latex-xcolor -latrace -lattice -latticeextra -launchtool -launchy -lazarus -lazr.restfulclient -lazr.uri -lazyarray -lazygal -lbcd -lbdb -lbreakout2 -lbt -lcab -lcalc -lcd4linux -lcdf-typetools -lcdproc -lcgdm -lcms -lcms2 -lcov -lcrack -lcrt -ldap2dns -ldap2zone -ldap-account-manager -ldap-haskell -ldapjdk -ldapscripts -ldaptor -ldapvi -ldb -ldm -ldm-themes -ldns -ldp-docbook-stylesheets -ldtp -le -leafnode -leafpad -leaktracer -leave -lebiniou -lebiniou-data -ledger -ledgersmb -le-dico-de-rene-cougnenc -ledit -ledmon -leds-alix -legit -lein-clojars -leiningen -lekhonee-gnome -lemonldap-ng -lensfun -leptonlib -less -lesstif2 -letodms -letterize -levee -leveldb -lfhex -lfm -lft -lftp -lhapdf -lhasa -lhs2tex -lib3ds -libaacs -libaal -libabstract-ruby -libaccessors-perl -libace-perl -libacme-bleach-perl -libacme-brainfck-perl -libacme-damn-perl -libacme-eyedrops-perl -libacme-poe-knee-perl -libacpi -libai-fann-perl -libaio -libajaxtags-java -libalberta2 -libalgorithm-c3-perl -libalgorithm-checkdigits-perl -libalgorithm-combinatorics-perl -libalgorithm-dependency-perl -libalgorithm-diff-perl -libalgorithm-diff-xs-perl -libalgorithm-merge-perl -libalgorithm-munkres-perl -libalgorithm-numerical-sample-perl -libalgorithm-permute-perl -libaliased-perl -libalias-perl -libalien-sdl-perl -libalien-wxwidgets-perl -libalkimia -libalog -libalzabo-perl -libamazon-sqs-simple-perl -libantlr3c -libanydata-perl -libanyevent-aggressiveidle-perl -libanyevent-callback-perl -libanyevent-dbd-pg-perl -libanyevent-dbi-perl -libanyevent-forkobject-perl -libanyevent-httpd-perl -libanyevent-http-perl -libanyevent-i3-perl -libanyevent-irc-perl -libanyevent-perl -libanyevent-redis-perl -libanyevent-serialize-perl -libanyevent-tools-perl -libanyevent-xmpp-perl -libany-moose-perl -libany-template-processdir-perl -libao -libaopalliance-java -libaosd -libapache2-authcassimple-perl -libapache2-authcookie-perl -libapache2-authenntlm-perl -libapache2-mod-auth-cas -libapache2-mod-auth-memcookie -libapache2-mod-authn-sasl -libapache2-mod-authn-yubikey -libapache2-mod-authnz-external -libapache2-mod-auth-openid -libapache2-mod-auth-pam -libapache2-mod-auth-pgsql -libapache2-mod-auth-plain -libapache2-mod-auth-pubtkt -libapache2-mod-auth-tkt -libapache2-mod-authz-unixgroup -libapache2-mod-bw -libapache2-mod-defensible -libapache2-mod-encoding -libapache2-mod-fcgid -libapache2-mod-geoip -libapache2-mod-ldap-userdir -libapache2-mod-lisp -libapache2-mod-macro -libapache2-mod-nss -libapache2-mod-perl2 -libapache2-mod-python -libapache2-mod-qos -libapache2-mod-rivet -libapache2-mod-rpaf -libapache2-mod-ruid2 -libapache2-mod-xsendfile -libapache2-reload-perl -libapache2-sitecontrol-perl -libapache-admin-config-perl -libapache-asp-perl -libapache-authenhook-perl -libapache-authznetldap-perl -libapache-dbilogger-perl -libapache-dbi-perl -libapache-db-perl -libapache-gallery-perl -libapache-htgroup-perl -libapache-htpasswd-perl -libapache-mod-auth-kerb -libapache-mod-auth-radius -libapache-mod-encoding -libapache-mod-evasive -libapache-mod-jk -libapache-mod-layout -libapache-mod-log-sql -libapache-mod-musicindex -libapache-mod-random -libapache-mod-removeip -libapache-poi-java -libapache-session-browseable-perl -libapache-session-ldap-perl -libapache-session-perl -libapache-session-wrapper-perl -libapache-sessionx-perl -libapache-singleton-perl -libapp-cache-perl -libapp-cli-perl -libapp-cmd-perl -libapp-control-perl -libapp-daemon-perl -libappindicator -libapp-info-perl -libapp-nopaste-perl -libapp-options-perl -libapp-rad-perl -libapp-repl-perl -libapp-termcast-perl -libapreq2 -libapr-memcache -libapt-pkg-perl -libaqbanking -libarchive -libarchive-any-perl -libarchive-ar-perl -libarchive-peek-perl -libarchive-tar-wrapper-perl -libarchive-zip-perl -libarch-perl -libarray-compare-perl -libarray-diff-perl -libarray-printcols-perl -libarray-refelem-perl -libarray-unique-perl -libart-lgpl -libasa-perl -libaspect-perl -libass -libassa -libassuan -libast -libasterisk-agi-perl -libastro-fits-cfitsio-perl -libastro-fits-header-perl -libasync-interrupt-perl -libasync-mergepoint-perl -libasyncns -libatasmart -libatombus-perl -libatomic-ops -libatompub-perl -libaudio-cd-perl -libaudio-ecasound-perl -libaudio-file-perl -libaudio-flac-decoder-perl -libaudio-flac-header-perl -libaudiomask -libaudio-mixer-perl -libaudio-moosic-perl -libaudio-mpd-common-perl -libaudio-mpd-perl -libaudio-musepack-perl -libaudio-rpld-perl -libaudio-scan-perl -libaudio-scrobbler-perl -libaudio-wav-perl -libaudio-wma-perl -libaugeas-ruby -libaunit -libauthcas-perl -libauthen-bitcard-perl -libauthen-captcha-perl -libauthen-cas-client-perl -libauthen-dechpwd-perl -libauthen-krb5-admin-perl -libauthen-krb5-perl -libauthen-krb5-simple-perl -libauthen-ntlm-perl -libauthen-oath-perl -libauthen-pam-perl -libauthen-passphrase-perl -libauthen-radius-perl -libauthen-sasl-cyrus-perl -libauthen-sasl-perl -libauthen-simple-cdbi-perl -libauthen-simple-dbi-perl -libauthen-simple-dbm-perl -libauthen-simple-http-perl -libauthen-simple-kerberos-perl -libauthen-simple-ldap-perl -libauthen-simple-net-perl -libauthen-simple-pam-perl -libauthen-simple-passwd-perl -libauthen-simple-perl -libauthen-simple-radius-perl -libauthen-simple-smb-perl -libauthen-smb-perl -libauthen-tacacsplus-perl -libauthority-shared-perl -libauth-yubikey-decrypter-perl -libauth-yubikey-webclient-perl -libautobox-core-perl -libautobox-dump-perl -libautobox-list-util-perl -libautobox-perl -libautodie-perl -libautovivification-perl -libav -libavc1394 -libavg -libavl -libaws -libax25 -libaxiom-java -libbarcode-code128-perl -libbareword-filehandles-perl -libbase -libbash -libbasicplayer-java -libbenchmark-apps-perl -libbenchmark-progressbar-perl -libbenchmark-timer-perl -libbencode-perl -libberkeleydb-perl -libbest-perl -libb-hooks-endofscope-perl -libb-hooks-op-annotation-perl -libb-hooks-op-check-entersubforcv-perl -libb-hooks-op-check-perl -libb-hooks-op-ppaddr-perl -libb-hooks-parser-perl -libbiblio-citation-parser-perl -libbiblio-endnotestyle-perl -libbiblio-isis-perl -libbind -libbind-config-parser-perl -libbind-confparser-perl -libbinio -libbio-asn1-entrezgene-perl -libbio-chado-schema-perl -libbio-das-lite-perl -libbio-graphics-perl -libbio-mage-perl -libbio-mage-utils-perl -libbio-primerdesigner-perl -libbio-samtools-perl -libbio-scf-perl -libbitmask -libbit-vector-minimal-perl -libbit-vector-perl -libb-keywords-perl -libblocksruntime -libbloom-filter-perl -libbluedevil -libbluray -libbonobo -libbonoboui -libboolean-perl -libbot-basicbot-perl -libbot-training-perl -libboulder-perl -libb-perlreq-perl -libbpp-core -libbpp-phyl -libbpp-popgen -libbpp-qt -libbpp-raa -libbpp-seq -libbrahe -libbrowser-open-perl -libbs2b -libbsd -libbsd-arc4random-perl -libbsd-resource-perl -libbsf-java -libbtm-java -libbuffy -libbuffy-bindings -libburn -libbusiness-creditcard-perl -libbusiness-edi-perl -libbusiness-isbn-data-perl -libbusiness-isbn-perl -libbusiness-issn-perl -libbusiness-onlinepayment-authorizenet-perl -libbusiness-onlinepayment-ippay-perl -libbusiness-onlinepayment-openecho-perl -libbusiness-onlinepayment-payconnect-perl -libbusiness-onlinepayment-payflowpro-perl -libbusiness-onlinepayment-paymentech-perl -libbusiness-onlinepayment-perl -libbusiness-onlinepayment-tclink-perl -libbusiness-onlinepayment-transactioncentral-perl -libbusiness-onlinepayment-viaklix-perl -libbusiness-paypal-api-perl -libbusiness-tax-vat-validation-perl -libbusiness-us-usps-webtools-perl -libb-utils-perl -libbytelist-java -libbz2-ruby -libcaca -libcache-cache-perl -libcache-fastmmap-perl -libcache-historical-perl -libcache-memcached-fast-perl -libcache-memcached-managed-perl -libcache-memcached-perl -libcache-mmap-perl -libcache-perl -libcache-ref-perl -libcache-simple-timedexpiry-perl -libcairo-gobject-perl -libcairo-perl -libcal-dav-perl -libcalendar-simple-perl -libcam-pdf-perl -libcanberra -libcap2 -libcap-ng -libcapsinetwork -libcaptcha-recaptcha-perl -libcapture-tiny-perl -libcarp-always-perl -libcarp-assert-more-perl -libcarp-assert-perl -libcarp-clan-perl -libcarp-clan-share-perl -libcarp-datum-perl -libcatalyst-action-rest-perl -libcatalyst-actionrole-acl-perl -libcatalyst-authentication-credential-http-perl -libcatalyst-controller-actionrole-perl -libcatalyst-devel-perl -libcatalyst-engine-apache-perl -libcatalyst-engine-psgi-perl -libcatalyst-manual-perl -libcatalyst-model-cdbi-perl -libcatalyst-modules-extra-perl -libcatalyst-modules-perl -libcatalyst-perl -libcatalyst-plugin-log-dispatch-perl -libcatalyst-plugin-scheduler-perl -libcatalyst-plugin-smarturi-perl -libcatalyst-plugin-unicode-encoding-perl -libcatalyst-view-petal-perl -libcatalyst-view-tt-perl -libcatalystx-injectcomponent-perl -libcatalystx-leakchecker-perl -libcatalystx-simplelogin-perl -libccaudio2 -libccrtp -libccscript3 -libccss -libcdaudio -libcdb-file-perl -libcddb -libcddb-file-perl -libcddb-get-perl -libcddb-perl -libcdio -libcdk5 -libcdk-perl -libcec -libcgi-ajax-perl -libcgi-application-basic-plugin-bundle-perl -libcgi-application-dispatch-perl -libcgi-application-extra-plugin-bundle-perl -libcgi-application-perl -libcgi-application-plugin-actiondispatch-perl -libcgi-application-plugin-ajaxupload-perl -libcgi-application-plugin-anytemplate-perl -libcgi-application-plugin-authentication-perl -libcgi-application-plugin-authorization-perl -libcgi-application-plugin-autorunmode-perl -libcgi-application-plugin-captcha-perl -libcgi-application-plugin-configauto-perl -libcgi-application-plugin-config-simple-perl -libcgi-application-plugin-dbh-perl -libcgi-application-plugin-dbiprofile-perl -libcgi-application-plugin-devpopup-perl -libcgi-application-plugin-fillinform-perl -libcgi-application-plugin-formstate-perl -libcgi-application-plugin-forward-perl -libcgi-application-plugin-json-perl -libcgi-application-plugin-linkintegrity-perl -libcgi-application-plugin-logdispatch-perl -libcgi-application-plugin-messagestack-perl -libcgi-application-plugin-protectcsrf-perl -libcgi-application-plugin-ratelimit-perl -libcgi-application-plugin-requiressl-perl -libcgi-application-plugin-session-perl -libcgi-application-plugin-stream-perl -libcgi-application-plugin-tt-perl -libcgi-application-plugin-validaterm-perl -libcgi-application-plugin-viewcode-perl -libcgi-application-server-perl -libcgic -libcgicc -libcgi-compile-perl -libcgi-cookie-splitter-perl -libcgi-emulate-psgi-perl -libcgi-formalware-perl -libcgi-formbuilder-perl -libcgi-formbuilder-source-yaml-perl -libcgi-pm-perl -libcgi-psgi-perl -libcgi-session-driver-memcached-perl -libcgi-session-expiresessions-perl -libcgi-session-perl -libcgi-session-serialize-yaml-perl -libcgi-simple-perl -libcgi-ssi-parser-perl -libcgi-ssi-perl -libcgi-untaint-date-perl -libcgi-untaint-email-perl -libcgi-untaint-perl -libcgi-uploader-perl -libcgi-validop-perl -libcgi-xmlapplication-perl -libcgi-xmlform-perl -libcgi-xml-perl -libcgns -libcgroup -libchado-perl -libchamplain -libchart-clicker-perl -libchart-gnuplot-perl -libchart-perl -libchart-strip-perl -libcheck-isa-perl -libchemistry-elements-perl -libchemistry-formula-perl -libchewing -libchi-driver-memcached-perl -libchild-perl -libchipcard -libchi-perl -libcitadel -libcitygml -libclamav-client-perl -libclass-accessor-chained-perl -libclass-accessor-children-perl -libclass-accessor-class-perl -libclass-accessor-classy-perl -libclass-accessor-grouped-perl -libclass-accessor-lvalue-perl -libclass-accessor-named-perl -libclass-accessor-perl -libclass-adapter-perl -libclass-autouse-perl -libclass-base-perl -libclass-c3-adopt-next-perl -libclass-c3-componentised-perl -libclass-c3-perl -libclass-c3-xs-perl -libclass-container-perl -libclass-contract-perl -libclass-csv-perl -libclass-data-accessor-perl -libclass-data-inheritable-perl -libclass-date-perl -libclass-dbi-abstractsearch-perl -libclass-dbi-asform-perl -libclass-dbi-fromcgi-perl -libclass-dbi-fromform-perl -libclass-dbi-loader-perl -libclass-dbi-loader-relationship-perl -libclass-dbi-mysql-perl -libclass-dbi-pager-perl -libclass-dbi-perl -libclass-dbi-pg-perl -libclass-dbi-plugin-abstractcount-perl -libclass-dbi-plugin-pager-perl -libclass-dbi-plugin-perl -libclass-dbi-plugin-retrieveall-perl -libclass-dbi-plugin-type-perl -libclass-dbi-sqlite-perl -libclass-dbi-sweet-perl -libclass-default-perl -libclass-delegator-perl -libclass-errorhandler-perl -libclass-factory-perl -libclass-factory-util-perl -libclass-field-perl -libclass-gomor-perl -libclass-handle-perl -libclass-inner-perl -libclass-insideout-perl -libclass-inspector-perl -libclass-isa-perl -libclass-loader-perl -libclass-load-perl -libclass-load-xs-perl -libclass-makemethods-perl -libclass-meta-perl -libclass-methodmaker-perl -libclass-method-modifiers-perl -libclass-mixinfactory-perl -libclass-mix-perl -libclass-multimethods-perl -libclass-objecttemplate-perl -libclass-ooorno-perl -libclass-perl -libclass-pluggable-perl -libclass-prototyped-perl -libclass-returnvalue-perl -libclass-singleton-perl -libclass-spiffy-perl -libclass-std-fast-perl -libclass-std-perl -libclass-std-utils-perl -libclass-throwable-perl -libclass-trait-perl -libclass-trigger-perl -libclass-unload-perl -libclass-virtual-perl -libclass-whitehole-perl -libclass-xsaccessor-perl -libclaw -libcli -libclone-fast-perl -libclone-perl -libclone-pp-perl -libcloud -libclutter-perl -libcmis -libcobra-java -libcodemodel-java -libcolor-calc-perl -libcolor-library-perl -libcolor-palette-perl -libcolor-scheme-perl -libcommoncpp2 -libcommons-attributes-java -libcommons-cli-java -libcommons-codec-java -libcommons-collections3-java -libcommons-collections-java -libcommons-compress-java -libcommons-dbcp-java -libcommons-digester-java -libcommons-discovery-java -libcommons-el-java -libcommon-sense-perl -libcommons-fileupload-java -libcommons-jexl-java -libcommons-jxpath-java -libcommons-lang3-java -libcommons-lang-java -libcommons-launcher-java -libcommons-logging-java -libcommons-modeler-java -libcommons-net1-java -libcommons-net2-java -libcommons-openpgp-java -libcommons-validator-java -libcompface -libcompress-bzip2-perl -libcompress-raw-bzip2-perl -libcompress-raw-zlib-perl -libconcurrentlinkedhashmap-java -libconfig -libconfig-any-perl -libconfig-apacheformat-perl -libconfig-augeas-perl -libconfig-autoconf-perl -libconfig-auto-perl -libconfig-file-perl -libconfig-general-perl -libconfig-gitlike-perl -libconfig-grammar-perl -libconfig-inifiles-perl -libconfig-inihash-perl -libconfig-ini-perl -libconfig-jfdi-perl -libconfig-json-perl -libconfig-merge-perl -libconfig-model-approx-perl -libconfig-model-backend-augeas-perl -libconfig-model-cursesui-perl -libconfig-model-itself-perl -libconfig-model-openssh-perl -libconfig-model-perl -libconfig-model-tkui-perl -libconfig-mvp-perl -libconfig-mvp-reader-ini-perl -libconfig-pit-perl -libconfigreader-perl -libconfigreader-simple-perl -libconfig-record-perl -libconfig-scoped-perl -libconfig-simple-perl -libconfig-std-perl -libconfig-tiny-perl -libconfig-yaml-perl -libconstantine-java -libconst-fast-perl -libcontactsdb -libcontext-preserve-perl -libcontextual-return-perl -libconvert-ascii-armour-perl -libconvert-asn1-perl -libconvert-base32-perl -libconvert-ber-perl -libconvert-binary-c-perl -libconvert-binhex-perl -libconvert-color-perl -libconvert-nls-date-format-perl -libconvert-pem-perl -libconvert-tnef-perl -libconvert-units-perl -libconvert-uulib-perl -libconvert-ytext-perl -libcorelinux -libcoro-perl -libcourriel-perl -libcoyotl -libcoy-perl -libcpan-changes-perl -libcpan-checksums-perl -libcpandb-perl -libcpan-distnameinfo-perl -libcpan-inject-perl -libcpan-meta-check-perl -libcpan-meta-perl -libcpan-meta-requirements-perl -libcpan-meta-yaml-perl -libcpan-mini-perl -libcpan-perl-releases-perl -libcpan-uploader-perl -libcps-perl -libcpuset -libcql-parser-perl -libcriticism-perl -libcroco -libcrypt-blowfish-perl -libcrypt-cast5-perl -libcrypt-cbc-perl -libcrypt-des-ede3-perl -libcrypt-des-perl -libcrypt-dh-gmp-perl -libcrypt-dh-perl -libcrypt-dsa-perl -libcrypt-ecb-perl -libcrypt-eksblowfish-perl -libcrypt-gcrypt-perl -libcrypt-generatepassword-perl -libcrypt-gpg-perl -libcrypt-hcesha-perl -libcrypt-mysql-perl -libcrypto++ -libcrypt-openssl-bignum-perl -libcrypt-openssl-dsa-perl -libcrypt-openssl-random-perl -libcrypt-openssl-rsa-perl -libcrypt-openssl-x509-perl -libcrypt-passwdmd5-perl -libcrypt-random-source-perl -libcrypt-rc4-perl -libcrypt-rijndael-perl -libcrypt-saltedhash-perl -libcrypt-simple-perl -libcrypt-smbhash-perl -libcrypt-smime-perl -libcrypt-ssleay-perl -libcrypt-twofish-perl -libcryptui -libcrypt-unixcrypt-perl -libcrypt-unixcrypt-xs-perl -libcrypt-util-perl -libcrypt-x509-perl -libcsfml -libcsoap -libcss-dom-perl -libcss-minifier-perl -libcss-minifier-xs-perl -libcss-packer-perl -libcss-perl -libcss-squish-perl -libcss-tiny-perl -libcsv-java -libctapimkt -libctl -libcue -libcurses-perl -libcurses-ui-perl -libcurses-widgets-perl -libcvs-perl -libcxgb3 -libdaemon -libdaemon-control-perl -libdancer-logger-psgi-perl -libdancer-perl -libdancer-plugin-database-perl -libdancer-plugin-dbic-perl -libdancer-plugin-flashmessage-perl -libdancer-plugin-rest-perl -libdancer-session-cookie-perl -libdancer-session-memcached-perl -libdanga-socket-perl -libdansguardian-perl -libdap -libdata-alias-perl -libdata-amf-perl -libdata-buffer-perl -libdata-clone-perl -libdata-compare-perl -libdata-dumper-concise-perl -libdata-dumper-simple-perl -libdata-dump-perl -libdata-dump-streamer-perl -libdata-dumpxml-perl -libdata-entropy-perl -libdata-faker-perl -libdata-float-perl -libdata-flow-perl -libdata-format-html-perl -libdata-formvalidator-constraints-datetime-perl -libdata-formvalidator-perl -libdata-guid-perl -libdata-hexdumper-perl -libdata-ical-perl -libdata-integer-perl -libdata-javascript-anon-perl -libdata-javascript-perl -libdata-miscellany-perl -libdata-munge-perl -libdata-objectdriver-perl -libdata-optlist-perl -libdata-page-perl -libdatapager-perl -libdata-pageset-perl -libdata-parsebinary-perl -libdata-password-perl -libdata-peek-perl -libdata-phrasebook-loader-yaml-perl -libdata-phrasebook-perl -libdata-printer-perl -libdata-random-perl -libdata-report-perl -libdata-rmap-perl -libdata-section-perl -libdata-section-simple-perl -libdata-serializer-perl -libdata-show-perl -libdata-showtable-perl -libdata-sorting-perl -libdata-stag-perl -libdata-stream-bulk-perl -libdata-streamdeserializer-perl -libdata-streamserializer-perl -libdata-structure-util-perl -libdata-transformer-perl -libdata-treedumper-perl -libdata-treedumper-renderer-dhtml-perl -libdata-treedumper-renderer-gtk-perl -libdata-types-perl -libdata-util-perl -libdata-uuid-libuuid-perl -libdata-validate-domain-perl -libdata-validate-email-perl -libdata-validate-ip-perl -libdata-validate-uri-perl -libdata-visitor-perl -libdata-walk-perl -libdata-yaml-perl -libdate-calc-perl -libdate-calc-xs-perl -libdate-convert-perl -libdate-hijri-perl -libdate-iso8601-perl -libdate-jd-perl -libdate-leapyear-perl -libdate-manip-perl -libdate-pcalc-perl -libdate-simple-perl -libdatetime-astro-sunrise-perl -libdatetime-calendar-discordian-perl -libdatetime-event-cron-perl -libdatetime-event-ical-perl -libdatetime-event-recurrence-perl -libdatetime-event-sunrise-perl -libdatetime-format-builder-perl -libdatetime-format-dateparse-perl -libdatetime-format-db2-perl -libdatetime-format-dbi-perl -libdatetime-format-duration-perl -libdatetime-format-epoch-perl -libdatetime-format-flexible-perl -libdatetime-format-http-perl -libdatetime-format-ical-perl -libdatetime-format-iso8601-perl -libdatetime-format-mail-perl -libdatetime-format-mysql-perl -libdatetime-format-natural-perl -libdatetime-format-oracle-perl -libdatetime-format-pg-perl -libdatetime-format-sqlite-perl -libdatetime-format-strptime-perl -libdatetime-format-w3cdtf-perl -libdatetime-format-xsd-perl -libdatetime-locale-perl -libdatetime-perl -libdatetime-set-perl -libdatetime-timezone-perl -libdatetime-timezone-systemv-perl -libdatetime-timezone-tzfile-perl -libdatetimex-easy-perl -libdatrie -libdbd-anydata-perl -libdbd-csv-perl -libdbd-excel-perl -libdbd-firebird-perl -libdbd-ldap-perl -libdbd-mock-perl -libdbd-mysql-perl -libdbd-odbc-perl -libdbd-oracle-perl -libdbd-pg-perl -libdbd-sqlite2-perl -libdbd-sqlite3-perl -libdbd-sybase-perl -libdbd-xbase-perl -libdb-file-lock-perl -libdbi -libdbicx-testdatabase-perl -libdbi-drivers -libdbi-perl -libdbix-abstract-perl -libdbix-class-candy-perl -libdbix-class-cursor-cached-perl -libdbix-class-datetime-epoch-perl -libdbix-class-dynamicdefault-perl -libdbix-class-encodedcolumn-perl -libdbix-class-helpers-perl -libdbix-class-htmlwidget-perl -libdbix-class-inflatecolumn-ip-perl -libdbix-class-introspectablem2m-perl -libdbix-class-perl -libdbix-class-resultset-recursiveupdate-perl -libdbix-class-schema-loader-perl -libdbix-class-timestamp-perl -libdbix-class-tree-nestedset-perl -libdbix-connector-perl -libdbix-contextualfetch-perl -libdbix-datasource-perl -libdbix-dbschema-perl -libdbix-dbstag-perl -libdbix-dr-perl -libdbix-fulltextsearch-perl -libdbix-oo-perl -libdbix-password-perl -libdbix-profile-perl -libdbix-recordset-perl -libdbix-safe-perl -libdbix-searchbuilder-perl -libdbix-sequence-perl -libdbix-simple-perl -libdbix-xmlmessage-perl -libdbix-xml-rdb-perl -libdb-je-java -libdbm-deep-perl -libdbusmenu -libdbusmenu-qt -libdc0 -libdc1394-22 -libdca -libdebian-copyright-perl -libdebian-installer -libdebian-package-html-perl -libdebug -libdebug-client-perl -libdebug-trace-perl -libdecodeqr -libdesktop-agnostic -libdesktop-notify-perl -libdessert0.87 -libdevel-argnames-perl -libdevel-backtrace-perl -libdevel-beginlift-perl -libdevel-bt-perl -libdevel-caller-ignorenamespaces-perl -libdevel-caller-perl -libdevel-calltrace-perl -libdevel-checklib-perl -libdevel-cover-perl -libdevel-cycle-perl -libdevel-declare-perl -libdevel-dprof-perl -libdevel-dumpvar-perl -libdevel-ebug-perl -libdevel-findref-perl -libdevel-gdb-perl -libdevel-globaldestruction-perl -libdevel-hide-perl -libdevel-leak-perl -libdevel-lexalias-perl -libdevel-nytprof-perl -libdevel-partialdump-perl -libdevel-patchperl-perl -libdevel-pragma-perl -libdevel-profile-perl -libdevel-ptkdb-perl -libdevel-refactor-perl -libdevel-refcount-perl -libdevel-repl-perl -libdevel-simpletrace-perl -libdevel-size-perl -libdevel-stacktrace-ashtml-perl -libdevel-stacktrace-perl -libdevel-stacktrace-withlexicals-perl -libdevel-symdump-perl -libdevel-trace-perl -libdevice-cdio-perl -libdevice-gsm-perl -libdevice-modem-perl -libdevice-serialport-perl -libdevice-usb-pcsensor-hidtemper-perl -libdevice-usb-perl -libdigest-bubblebabble-perl -libdigest-crc-perl -libdigest-hmac-perl -libdigest-jhash-perl -libdigest-md2-perl -libdigest-md4-perl -libdigest-md5-file-perl -libdigest-perl -libdigest-sha-perl -libdigest-whirlpool-perl -libdirectory-scratch-perl -libdirectory-scratch-structured-perl -libdir-purge-perl -libdir-self-perl -libdisasm -libdiscid -libdispatch -libdisplaymigration -libdist-metadata-perl -libdist-zilla-perl -libdist-zilla-plugin-changelogfromgit-perl -libdist-zilla-plugin-git-perl -libdist-zilla-plugin-podspellingtests-perl -libdist-zilla-plugin-podweaver-perl -libdist-zilla-plugin-prepender-perl -libdist-zilla-plugin-run-perl -libdist-zilla-plugins-cjm-perl -libdivecomputer -libdjconsole -libdkim -libdmapsharing -libdmtx -libdmx -libdns-zoneparse-perl -libdockapp -libdpkg-log-perl -libdrm -libdr-tarantool-perl -libdrumstick -libdshconfig -libdssialsacompat -libdtdparser-java -libdublincore-record-perl -libdumb -libdumbnet -libdv -libdvb -libdvbcsa -libdvbpsi -libdvdnav -libdvdread -libeatmydata -libebml -libebook-tools-perl -libechonest -libedit -libee -libelf -libelixirfm-perl -libemail-abstract-perl -libemail-address-perl -libemail-date-format-perl -libemail-date-perl -libemail-filter-perl -libemail-find-perl -libemail-folder-perl -libemail-foldertype-perl -libemail-localdelivery-perl -libemail-messageid-perl -libemail-mime-contenttype-perl -libemail-mime-createhtml-perl -libemail-mime-encodings-perl -libemail-mime-perl -libemail-outlook-message-perl -libemail-received-perl -libemail-sender-perl -libemail-sender-transport-smtp-tls-perl -libemail-send-io-perl -libemail-send-perl -libemail-simple-perl -libemail-thread-perl -libemail-valid-loose-perl -libemail-valid-perl -libencode-arabic-perl -libencode-detect-perl -libencode-eucjpms-perl -libencode-hanextra-perl -libencode-imaputf7-perl -libencode-jis2k-perl -libencode-locale-perl -libencode-perl -libend-perl -libenv-path-perl -libenv-ps1-perl -libenv-sanctify-perl -libepc -libepsilon -libept -liberror-perl -libescape-ruby -libesmtp -libestr -libetpan -libev -libeval-closure-perl -libeval-context-perl -libevent -libeventdb -libevent-perl -libevent-rpc-perl -libevocosm -libev-perl -libewf -libexcel-template-perl -libexcel-template-plus-perl -libexcel-writer-xlsx-perl -libexception-class-dbi-perl -libexception-class-perl -libexception-class-trycatch-perl -libexception-handler-perl -libexif -libexif-gtk -libexml-java -libexosip2 -libexpect-perl -libexpect-php5 -libexpect-simple-perl -libexplain -libexporter-easy-perl -libexporter-lite-perl -libexporter-renaming-perl -libexporter-tidy-perl -libextractor -libextractor-java -libextractor-python -libexttextcat -libextutils-autoinstall-perl -libextutils-cbuilder-perl -libextutils-cchecker-perl -libextutils-depends-perl -libextutils-f77-perl -libextutils-libbuilder-perl -libextutils-parsexs-perl -libextutils-pkgconfig-perl -libextutils-xsbuilder-perl -libextutils-xspp-perl -libezmorph-java -libf2c2 -libfakekey -libfam-ruby -libfann -libfax-hylafax-client-perl -libfcgi -libfcgi-perl -libfcgi-procmanager-perl -libfcgi-ruby -libfeed-find-perl -libffado -libffi -libfile-basedir-perl -libfile-bom-perl -libfile-cache-perl -libfile-changenotify-perl -libfile-chdir-perl -libfile-chmod-perl -libfile-copy-link-perl -libfile-copy-recursive-perl -libfile-counterfile-perl -libfile-countlines-perl -libfile-desktopentry-perl -libfile-dircompare-perl -libfile-fcntllock-perl -libfile-finder-perl -libfile-find-object-perl -libfile-find-object-rule-perl -libfile-find-rule-perl -libfile-find-rule-perl-perl -libfile-find-rule-vcs-perl -libfile-find-wanted-perl -libfile-flat-perl -libfile-flock-perl -libfile-fnmatch-perl -libfile-fu-perl -libfilehandle-fmode-perl -libfilehandle-unget-perl -libfile-homedir-perl -libfile-inplace-perl -libfile-keepass-perl -libfile-libmagic-perl -libfile-listing-perl -libfile-localizenewlines-perl -libfile-mimeinfo-perl -libfile-mmagic-xs-perl -libfile-modified-perl -libfile-ncopy-perl -libfile-next-perl -libfile-nfslock-perl -libfile-path-expand-perl -libfile-path-tiny-perl -libfile-pid-perl -libfile-policy-perl -libfile-pushd-perl -libfile-queue-perl -libfile-readbackwards-perl -libfile-read-perl -libfile-remove-perl -libfile-rsync-perl -libfile-rsyncp-perl -libfile-scan-perl -libfile-searchpath-perl -libfile-sharedir-install-perl -libfile-sharedir-par-perl -libfile-sharedir-perl -libfile-slurp-perl -libfile-slurp-unicode-perl -libfile-spec-native-perl -libfile-spec-perl -libfile-sync-perl -libfilesys-df-perl -libfilesys-diskspace-perl -libfilesys-notify-simple-perl -libfilesys-smbclient-perl -libfilesys-statvfs-perl -libfilesystem-ruby -libfile-tail-perl -libfile-touch-perl -libfile-type-perl -libfile-type-webimages-perl -libfile-userconfig-perl -libfile-util-perl -libfile-which-perl -libfile-wildcard-perl -libfilter-eof-perl -libfilter-perl -libfilter-template-perl -libfinance-bank-ie-permanenttsb-perl -libfinance-qif-perl -libfinance-quotehist-perl -libfinance-quote-perl -libfinance-streamer-perl -libfindbin-libs-perl -libfind-lib-perl -libfishsound -libfiu -libfixposix -libflexdock-java -libflickr-api-perl -libflickrnet -libflickr-upload-perl -libflorist -libfm -libfolia -libfont-afm-perl -libfontenc -libfont-freetype-perl -libfonts-java -libfont-ttf-perl -libforest-perl -libforks-perl -libformat-human-bytes-perl -libforms -libformula -libformvalidator-simple-perl -libfortune-perl -libfpdf-tpl-php -libfpdi-php -libfprint -libfreemarker-java -libfreenect -libfreezethaw-perl -libfrontier-rpc-perl -libfs -libfsobasics -libfsoframework -libfso-glib -libfsoresource -libfsosystem -libfsotransport -libftdi -libfuse-perl -libfusioninventory-agent-task-deploy-perl -libfusioninventory-agent-task-esx-perl -libg15 -libg15render -libg3d -libgadu -libgarmin -libgc -libgcal -libgcgi -libgconf-bridge -libgcr410 -libgcrypt11 -libgctp -libgd2 -libgda5 -libgdal-grass -libgdata -libgd-barcode-perl -libgdchart-gd2 -libgdf -libgd-gd2-noxpm-perl -libgd-gd2-perl -libgd-graph3d-perl -libgd-graph-perl -libgdiplus -libgd-securityimage-perl -libgd-svg-perl -libgd-text-perl -libgearman-client-perl -libgedcom-perl -libgee -libgeier -libgenome -libgeo-coder-googlev3-perl -libgeo-coordinates-itm-perl -libgeo-coordinates-utm-perl -libgeo-distance-perl -libgeo-distance-xs-perl -libgeo-googleearth-pluggable-perl -libgeo-google-mapobject-perl -libgeography-countries-perl -libgeography-nationalgrid-perl -libgeo-helmerttransform-perl -libgeo-ipfree-perl -libgeo-ip-perl -libgeo-metar-perl -libgeometry-primitive-perl -libgeo-osm-tiles-perl -libgeo-point-perl -libgeo-postcode-perl -libgeo-proj4-perl -libgeotiff-dfsg -libgetargs-long-perl -libgetdata -libgetopt++ -libgetopt-argvfile-perl -libgetopt-declare-perl -libgetopt-euclid-perl -libgetopt-java -libgetopt-long-descriptive-perl -libgetopt-lucid-perl -libgetopt-mixed-perl -libgetopt-simple-perl -libgetopt-tabular-perl -libgetopt-usaginator-perl -libgettext-commons-java -libgfshare -libghemical -libgig -libgii -libgit-pure-perl -libgit-repository-perl -libgit-wrapper-perl -libgksu -libglade2 -libglademm2.4 -libglazedlists-java -libglib-object-introspection-perl -libglib-perl -libgmpada -libgnome -libgnome2-canvas-perl -libgnome2-gconf-perl -libgnome2-perl -libgnome2-vfs-perl -libgnome2-wnck-perl -libgnomecanvas -libgnomecanvasmm2.6 -libgnomecups -libgnomekbd -libgnome-keyring -libgnome-media-profiles -libgnomemm2.6 -libgnomeprint -libgnomeprintui -libgnomeui -libgnomeuimm2.6 -libgnuinet-java -libgnujaf-java -libgnumail-java -libgnupg-interface-perl -libgnupg-perl -libgnu-regexp-java -libgoo-canvas-perl -libgoogle-collections-java -libgoogle-gson-java -libgooglepinyin -libgo-perl -libgpars-groovy-java -libgpelaunch -libgpepimc -libgpeschedule -libgpevtype -libgpewidget -libgpg-error -libgphoto2 -libgpiv -libgpod -libgps-point-perl -libgraph-easy-as-svg-perl -libgraph-easy-perl -libgraphics-colornames-perl -libgraphics-colornames-www-perl -libgraphics-colorobject-perl -libgraphics-color-perl -libgraphics-gnuplotif-perl -libgraphics-libplot-perl -libgraphics-primitive-driver-cairo-perl -libgraphics-primitive-perl -libgraph-perl -libgraph-readwrite-perl -libgraphviz-perl -libgraph-writer-graphviz-perl -libgravatar-url-perl -libgrits -libgroboutils-java -libgrss -libgsecuredelete -libgsf -libgsm -libgsm0710 -libgsm0710mux -libgssapi-perl -libgssglue -libgstreamer-interfaces-perl -libgstreamer-perl -libgtextutils -libgtk2-ex-entry-pango-perl -libgtk2-ex-podviewer-perl -libgtk2-ex-printdialog-perl -libgtk2-ex-simple-list-perl -libgtk2-ex-volumebutton-perl -libgtk2-gladexml-perl -libgtk2-gladexml-simple-perl -libgtk2-imageview-perl -libgtk2-notify-perl -libgtk2-perl -libgtk2-sourceview2-perl -libgtk2-spell-perl -libgtk2-trayicon-perl -libgtk2-traymanager-perl -libgtk2-unique-perl -libgtk3-perl -libgtkada -libgtkdatabox -libgtksourceviewmm -libgtkstylus -libgtop2 -libguac -libguac-client-rdp -libguac-client-vnc -libguard-perl -libguess -libguestfs -libgusb -libguytools2 -libgweather -libgwenhywfar -libgxps -libhamcrest-java -libhandoff -libhangul -libharu -libhash-asobject-perl -libhash-case-perl -libhash-fieldhash-perl -libhash-flatten-perl -libhash-merge-perl -libhash-merge-simple-perl -libhash-moreutils-perl -libhash-multivalue-perl -libhash-util-fieldhash-compat-perl -libhash-withdefaults-perl -libhbaapi -libhbalinux -libhdate -libhdf4 -libhdhomerun -libheap-perl -libheimdal-kadm5-perl -libhibernate3-java -libhibernate-commons-annotations-java -libhibernate-jbosscache-java -libhibernate-validator-java -libhmsbeagle -libhook-lexwrap-perl -libhook-wrapsub-perl -libhtml-autopagerize-perl -libhtml-auto-perl -libhtml-calendarmonth-perl -libhtml-calendarmonthsimple-perl -libhtml-clean-perl -libhtml-copy-perl -libhtml-defang-perl -libhtml-diff-perl -libhtml-display-perl -libhtml-element-extended-perl -libhtml-embedded-turtle-perl -libhtml-encoding-perl -libhtml-entities-numbered-perl -libhtml-fillinform-perl -libhtml-format-perl -libhtml-formattext-withlinks-andtables-perl -libhtml-formattext-withlinks-perl -libhtml-formfu-model-dbic-perl -libhtml-formfu-perl -libhtml-formhandler-perl -libhtml-form-perl -libhtml-fromtext-perl -libhtml-highlight-perl -libhtml-html5-entities-perl -libhtml-html5-microdata-parser-perl -libhtml-html5-outline-perl -libhtml-html5-parser-perl -libhtml-html5-sanity-perl -libhtml-html5-writer-perl -libhtml-htmltokenizer-ruby -libhtml-linkextractor-perl -libhtml-lint-perl -libhtml-mason-perl -libhtml-mason-psgihandler-perl -libhtml-microformats-perl -libhtml-packer-perl -libhtmlparser-java -libhtml-parser-perl -libhtml-popuptreeselect-perl -libhtml-prototype-perl -libhtml-quoted-perl -libhtml-rewriteattributes-perl -libhtml-scrubber-perl -libhtml-selector-xpath-perl -libhtml-simpleparse-perl -libhtml-stream-perl -libhtml-strip-perl -libhtml-stripscripts-parser-perl -libhtml-stripscripts-perl -libhtml-tableextract-perl -libhtml-tableparser-perl -libhtml-table-perl -libhtml-tagcloud-perl -libhtml-tagfilter-perl -libhtml-tagset-perl -libhtml-template-compiled-perl -libhtml-template-dumper-perl -libhtml-template-expr-perl -libhtml-template-perl -libhtml-template-pluggable-perl -libhtml-template-pro-perl -libhtml-tidy-perl -libhtml-tiny-perl -libhtml-toc-perl -libhtml-tokeparser-simple-perl -libhtml-treebuilder-libxml-perl -libhtml-treebuilder-xpath-perl -libhtml-tree-perl -libhtml-widget-perl -libhtml-widgets-navmenu-perl -libhtml-widgets-selectlayers-perl -libhtml-wikiconverter-dokuwiki-perl -libhtml-wikiconverter-kwiki-perl -libhtml-wikiconverter-markdown-perl -libhtml-wikiconverter-mediawiki-perl -libhtml-wikiconverter-moinmoin-perl -libhtml-wikiconverter-oddmuse-perl -libhtml-wikiconverter-perl -libhtml-wikiconverter-phpwiki-perl -libhtml-wikiconverter-pmwiki-perl -libhtml-wikiconverter-snipsnap-perl -libhtml-wikiconverter-tikiwiki-perl -libhtml-wikiconverter-usemod-perl -libhtml-wikiconverter-wakkawiki-perl -libhtml-wikiconverter-wikkawiki-perl -libhtp -libhttp-async-perl -libhttp-body-perl -libhttp-browserdetect-perl -libhttp-cache-transparent-perl -libhttp-cookies-perl -libhttp-daemon-perl -libhttp-daemon-ssl-perl -libhttp-date-perl -libhttp-dav-perl -libhttp-exception-perl -libhttp-link-parser-perl -libhttp-lite-perl -libhttp-lrdd-perl -libhttp-message-perl -libhttp-negotiate-perl -libhttp-oai-perl -libhttp-parser-perl -libhttp-parser-xs-perl -libhttp-proxy-perl -libhttp-recorder-perl -libhttp-request-ascgi-perl -libhttp-request-params-perl -libhttp-response-encoding-perl -libhttp-server-simple-authen-perl -libhttp-server-simple-mason-perl -libhttp-server-simple-perl -libhttp-server-simple-psgi-perl -libhttp-server-simple-recorder-perl -libhttp-server-simple-static-perl -libhttp-tiny-perl -libhx -libi18n-acceptlanguage-perl -libi18n-charset-perl -libibatis-java -libibcm -libibcommon -libibmad -libibtk -libibumad -libibverbs -libical -libical-parser-html-perl -libical-parser-perl -libical-parser-sax-perl -libice -libicns -libicon-famfamfam-silk-perl -libics -libid3tag -libident -libidl -libidn -libidn2-0 -libidna-punycode-perl -libiec61883 -libieee1284 -libifp -libiksemel -libima-dbi-perl -libimage-base-bundle-perl -libimage-exif-perl -libimage-exiftool-perl -libimage-imlib2-perl -libimage-info-perl -libimage-librsvg-perl -libimage-math-constrain-perl -libimage-metadata-jpeg-perl -libimager-perl -libimager-qrcode-perl -libimage-seek-perl -libimage-size-perl -libimap-admin-perl -libimlib2-ruby -libimobiledevice -libindi -libindicate -libindicate-qt -libindicator -libindirect-perl -libinfinity -libinline-files-perl -libinline-perl -libinnodb -libinstpatch -libint -libinternals-perl -libintl-perl -libio-aio-perl -libio-all-lwp-perl -libio-all-perl -libio-async-loop-epoll-perl -libio-async-loop-glib-perl -libio-async-perl -libio-bufferedselect-perl -libio-captureoutput-perl -libio-capture-perl -libio-compress-perl -libiodbc2 -libio-digest-perl -libio-dirent-perl -libio-epoll-perl -libio-file-withpath-perl -libio-handle-util-perl -libio-html-perl -libio-interactive-perl -libio-interface-perl -libio-lcdproc-perl -libio-lockedfile-perl -libio-multiplex-perl -libio-prompter-perl -libio-prompt-perl -libio-pty-easy-perl -libio-pty-perl -libio-socket-inet6-perl -libio-socket-ip-perl -libio-socket-multicast6-perl -libio-socket-multicast-perl -libio-socket-socks-perl -libio-socket-ssl-perl -libio-string-perl -libio-stty-perl -libio-tee-perl -libio-tiecombine-perl -libipathverbs -libipc-pubsub-perl -libipc-run3-perl -libipc-run-perl -libipc-run-safehandles-perl -libipc-shareable-perl -libipc-sharedcache-perl -libipc-sharelite-perl -libipc-signal-perl -libipc-system-simple-perl -libiptables-chainmgr-perl -libiptables-parse-perl -libiptcdata -libircclient -libirc-formatting-html-perl -libirclib-java -libirc-utils-perl -libirman -libiscsi -libiscwt-java -libisfreetype-java -libisnativec-java -libisoburn -libisofs -libisrt-java -libitext1-java -libitext5-java -libitext-java -libitl -libitl-gobject -libitpp -libixp -libj2ssh-java -libjaba-client-java -libjackson-json-java -libjama -libjamon-java -libjaudiotagger-java -libjava-jdbc-clojure -libjavascript-beautifier-perl -libjavascript-minifier-perl -libjavascript-minifier-xs-perl -libjavascript-packer-perl -libjavascript-rpc-perl -libjaxen-java -libjaxp1.3-java -libjazzy-java -libjbcrypt-java -libjboss-aop-java -libjboss-cache1-java -libjboss-cache2-java -libjboss-cache3-java -libjboss-classloader-java -libjboss-common-java -libjboss-deployers-java -libjboss-integration-java -libjboss-managed-java -libjboss-marshalling-java -libjboss-metadata-java -libjboss-microcontainer-java -libjboss-profiler-java -libjboss-reflect-java -libjboss-remoting-java -libjboss-serialization-java -libjboss-vfs-java -libjboss-web-services-java -libjboss-xml-binding-java -libjbzip2-java -libjcalendar-java -libjcip-annotations-java -libjcode-perl -libjcode-pm-perl -libjcommon-java -libjconv -libjdbm-java -libjdepend-java -libjdo-api-java -libjdom1-java -libjemmy2-java -libjena-iri-java -libje-perl -libjettison-java -libjfreechart-java -libjgoodies-animation-java -libjgoodies-binding-java -libjgoodies-common-java -libjgoodies-forms-java -libjgoodies-looks-java -libjgraph-java -libjgrapht0.6-java -libjgrapht0.8-java -libjgraphx-java -libjgroups2.6-java -libjgroups-java -libjhlabs-filters-java -libjibx1.1-java -libjibx1.2-java -libjifty-dbi-perl -libjifty-plugin-authentication-bitcard-perl -libjifty-plugin-authentication-cas-perl -libjifty-plugin-authentication-facebook-perl -libjifty-plugin-authentication-ldap-perl -libjifty-plugin-authzldap-perl -libjifty-plugin-chart-perl -libjifty-plugin-comment-perl -libjifty-plugin-googlemap-perl -libjifty-plugin-oauth-perl -libjifty-plugin-openid-perl -libjifty-plugin-sitenews-perl -libjifty-plugin-userpic-perl -libjifty-plugin-wikitoolbar-perl -libjira-client-perl -libjlatexmath-java -libjlayer-java -libjlha-java -libjmac-java -libjna-java -libjna-posix-java -libjnr-posix-java -libjoda-time-java -libjogl2-java -libjogl-java -libjorbis-java -libjpedal-jbig2-java -libjpeg6b -libjpeg8 -libjpfcodegen-java -libjpf-java -libjrosetta-java -libjs-edit-area -libjs-extjs -libjson-any-perl -libjsoncpp -libjson-java -libjson-perl -libjson-pp-perl -libjson-rpc-perl -libjson-xs-perl -libjspeex-java -libjsr166y-java -libjsr305-java -libjsr311-api-java -libjs-swfobject -libjs-swfupload -libjswingreader-java -libjsyntaxpane-java -libjtds-java -libjtype-java -libjxp-java -libkal -libkarma -libkate -libkdcraw -libkdeedu -libkdtree++ -libkexiv2 -libkibi -libkinosearch1-perl -libkiokudb-backend-dbi-perl -libkiokudb-perl -libkipi -libkmfl -libkml -libkmlframework-java -libkohana2-php -libkohana3.1-php -libkohana3.2-php -libkqueue -libksane -libksba -libktoblzcheck -libktorrent -libkwargs-perl -libkwiki-cache-perl -libkwiki-perl -liblaf-plugin-java -liblaf-widget-java -liblarch -liblarch-gtk -liblas -liblastfm -liblastfm-java -liblatex-decode-perl -liblatex-driver-perl -liblatex-encode-perl -liblatex-table-perl -liblatex-tom-perl -liblayout -liblayout-manager-perl -liblchown-perl -liblexical-persistence-perl -liblexical-sealrequirehints-perl -liblib-abs-perl -liblibrary-callnumber-lc-perl -liblicense -liblinear -liblinebreak2 -liblingua-de-ascii-perl -liblingua-en-inflect-number-perl -liblingua-en-inflect-perl -liblingua-en-inflect-phrase-perl -liblingua-en-namecase-perl -liblingua-en-nameparse-perl -liblingua-en-numbers-ordinate-perl -liblingua-en-tagger-perl -liblingua-en-words2nums-perl -liblingua-es-numeros-perl -liblingua-identify-perl -liblingua-ispell-perl -liblingua-preferred-perl -liblingua-pt-stemmer-perl -liblingua-stem-perl -liblingua-stem-snowball-da-perl -liblingua-stem-snowball-perl -liblingua-stopwords-perl -liblinux-distribution-packages-perl -liblinux-distribution-perl -liblinux-dvb-perl -liblinux-inotify2-perl -liblinux-kernelsort-perl -liblinux-lvm-perl -liblinux-usermod-perl -liblip -liblist-allutils-perl -liblist-compare-perl -liblist-maker-perl -liblist-moreutils-perl -liblist-utilsby-perl -liblivejournal-perl -liblivemedia -liblo -libloader -libload-perl -liblocale-currency-format-perl -liblocale-gettext-perl -liblocale-hebrew-perl -liblocale-maketext-fuzzy-perl -liblocale-maketext-gettext-perl -liblocale-maketext-lexicon-perl -liblocale-msgfmt-perl -liblocale-po-perl -liblocales-perl -liblocale-subcountry-perl -liblocale-us-perl -liblocal-lib-perl -liblockfile -liblockfile-simple-perl -liblog4ada -liblog-agent-logger-perl -liblog-agent-perl -liblog-agent-rotate-perl -liblog-any-adapter-dispatch-perl -liblog-any-adapter-perl -liblog-any-perl -liblog-contextual-perl -liblog-dispatch-array-perl -liblog-dispatch-config-perl -liblog-dispatch-configurator-any-perl -liblog-dispatch-filerotate-perl -liblog-dispatchouli-perl -liblog-dispatch-perl -liblogfile-rotate-perl -liblogger-syslog-perl -liblog-handler-perl -liblog-log4perl-perl -liblog-loglite-perl -liblognorm -liblog-report-perl -liblog-tracemessages-perl -liblog-trace-perl -libloki -liblouis -liblouisutdml -liblouisxml -liblqr -liblrdf -liblscp -libltcsmpte -liblucene-queryparser-perl -liblunar -liblwp-authen-negotiate-perl -liblwp-authen-oauth-perl -liblwp-authen-wsse-perl -liblwp-mediatypes-perl -liblwp-online-perl -liblwp-protocol-http-socketunix-perl -liblwp-protocol-https-perl -liblwp-protocol-psgi-perl -liblwp-protocol-socks-perl -liblwp-useragent-determined-perl -liblwpx-paranoidagent-perl -libm4ri -libmaa -libmad -libmail-box-perl -libmail-bulkmail-perl -libmail-cclient-perl -libmail-checkuser-perl -libmail-deliverystatus-bounceparser-perl -libmail-dkim-perl -libmail-field-received-perl -libmail-gnupg-perl -libmail-imapclient-perl -libmail-imaptalk-perl -libmail-listdetector-perl -libmail-mbox-messageparser-perl -libmail-mboxparser-perl -libmail-milter-perl -libmail-pop3client-perl -libmail-rfc822-address-perl -libmail-sendeasy-perl -libmail-sendmail-perl -libmail-srs-perl -libmail-thread-perl -libmailtools-perl -libmail-verify-perl -libmail-verp-perl -libmakefile-dom-perl -libmakefile-parser-perl -libmarc-charset-perl -libmarc-crosswalk-dublincore-perl -libmarc-lint-perl -libmarc-perl -libmarc-record-perl -libmarc-xml-perl -libmarkdown-php -libmason-perl -libmason-plugin-cache-perl -libmason-plugin-htmlfilters-perl -libmason-plugin-routersimple-perl -libmasonx-interp-withcallbacks-perl -libmasonx-processdir-perl -libmasonx-request-withapachesession-perl -libmatchbox -libmath++ -libmath-algebra-symbols-perl -libmath-base36-perl -libmath-base85-perl -libmath-basecalc-perl -libmath-basecnv-perl -libmath-bezier-perl -libmath-bigint-gmp-perl -libmath-bigint-perl -libmath-calculus-differentiate-perl -libmath-calculus-expression-perl -libmath-calculus-newtonraphson-perl -libmath-calc-units-perl -libmath-combinatorics-perl -libmath-complex-perl -libmath-derivative-perl -libmatheval -libmath-fibonacci-perl -libmath-gmp-perl -libmath-gradient-perl -libmath-nocarry-perl -libmath-numbercruncher-perl -libmath-polygon-perl -libmath-random-isaac-perl -libmath-random-isaac-xs-perl -libmath-random-mt-perl -libmath-random-oo-perl -libmath-randomorg-perl -libmath-random-tt800-perl -libmath-round-perl -libmath-sparsematrix-perl -libmath-sparsevector-perl -libmath-spline-perl -libmath-symbolic-perl -libmath-tamuanova-perl -libmath-vec-perl -libmath-vecstat-perl -libmath-vector-real-kdtree-perl -libmath-vector-real-perl -libmatio -libmatroska -libmatthew-java -libmcrypt -libmdsp -libmecab-java -libmecab-perl -libmediainfo -libmediawiki-api-perl -libmemcache -libmemcached -libmemoize-expirelru-perl -libmemoize-memcached-perl -libmetadata-extractor-java -libmethod-alias-perl -libmethod-autoload-perl -libmethod-signatures-perl -libmethod-signatures-simple-perl -libmicroba-java -libmicrohttpd -libmidi-perl -libmiglayout-java -libmikmod -libmime-base32-perl -libmime-base64-urlsafe-perl -libmime-charset-perl -libmimedir -libmimedir-gnome -libmime-encwords-perl -libmime-explode-perl -libmime-lite-html-perl -libmime-lite-perl -libmime-tools-perl -libmime-types-perl -libmimic -libmixin-extrafields-param-perl -libmixin-extrafields-perl -libmixin-linewise-perl -libmkdoc-xml-perl -libmkv -libmldbm-perl -libmldbm-sync-perl -libmlx4 -libmms -libmng -libmnl -libmocked-perl -libmodbus -libmodelfile -libmodem-vgetty-perl -libmodern-perl-perl -libmodplug -libmodule-build-perl -libmodule-corelist-perl -libmodule-cpanfile-perl -libmodule-cpants-analyse-perl -libmodule-depends-perl -libmodule-extract-perl -libmodule-extract-use-perl -libmodule-extractuse-perl -libmodule-find-perl -libmodule-implementation-perl -libmodule-info-perl -libmodule-inspector-perl -libmodule-install-authorrequires-perl -libmodule-install-autolicense-perl -libmodule-install-automanifest-perl -libmodule-install-doapchangesets-perl -libmodule-install-doap-perl -libmodule-install-manifestskip-perl -libmodule-install-perl -libmodule-install-rdf-perl -libmodule-install-readmefrompod-perl -libmodule-install-trustmetayml-perl -libmodule-install-xsutil-perl -libmodule-load-conditional-perl -libmodule-manifest-perl -libmodule-manifest-skip-perl -libmodule-math-depends-perl -libmodule-metadata-perl -libmodule-optional-perl -libmodule-packaged-perl -libmodule-package-perl -libmodule-pluggable-fast-perl -libmodule-pluggable-ordered-perl -libmodule-refresh-perl -libmodule-runtime-perl -libmodule-scandeps-perl -libmodule-signature-perl -libmodule-starter-pbp-perl -libmodule-starter-perl -libmodule-starter-plugin-cgiapp-perl -libmodule-starter-plugin-simplestore-perl -libmodule-starter-plugin-tt2-perl -libmodule-starter-smart-perl -libmodule-used-perl -libmodule-util-perl -libmodule-versions-report-perl -libmoe -libmojolicious-perl -libmojolicious-plugin-basicauth-perl -libmojomojo-perl -libmojo-server-fastcgi-perl -libmongo-client -libmongodb-perl -libmonitoring-availability-perl -libmonitoring-livestatus-perl -libmonkey-patch-perl -libmoo-perl -libmoose-autobox-perl -libmoose-perl -libmoosex-aliases-perl -libmoosex-app-cmd-perl -libmoosex-async-perl -libmoosex-attribute-chained-perl -libmoosex-attributehelpers-perl -libmoosex-attributeshortcuts-perl -libmoosex-blessed-reconstruct-perl -libmoosex-clone-perl -libmoosex-compiletime-traits-perl -libmoosex-configfromfile-perl -libmoosex-daemonize-perl -libmoosex-declare-perl -libmoosex-emulate-class-accessor-fast-perl -libmoosex-followpbp-perl -libmoosex-getopt-perl -libmoosex-hasdefaults-perl -libmoosex-has-sugar-perl -libmoosex-insideout-perl -libmoosex-lazyrequire-perl -libmoosex-log-log4perl-perl -libmoosex-markasmethods-perl -libmoosex-meta-typeconstraint-forcecoercion-perl -libmoosex-methodattributes-perl -libmoosex-method-signatures-perl -libmoosex-multiinitarg-perl -libmoosex-multimethods-perl -libmoosex-nonmoose-perl -libmoosex-object-pluggable-perl -libmoosex-oneargnew-perl -libmoosex-param-perl -libmoosex-params-validate-perl -libmoosex-poe-perl -libmoosex-relatedclassroles-perl -libmoosex-role-parameterized-perl -libmoosex-role-timer-perl -libmoosex-role-withoverloading-perl -libmoosex-semiaffordanceaccessor-perl -libmoosex-setonce-perl -libmoosex-simpleconfig-perl -libmoosex-singleton-perl -libmoosex-storage-perl -libmoosex-strictconstructor-perl -libmoosex-traits-perl -libmoosex-traits-pluggable-perl -libmoosex-types-common-perl -libmoosex-types-datetime-morecoercions-perl -libmoosex-types-datetime-perl -libmoosex-types-iso8601-perl -libmoosex-types-json-perl -libmoosex-types-loadableclass-perl -libmoosex-types-netaddr-ip-perl -libmoosex-types-path-class-perl -libmoosex-types-perl -libmoosex-types-perl-perl -libmoosex-types-set-object-perl -libmoosex-types-structured-perl -libmoosex-types-varianttable-perl -libmoosex-undeftolerant-perl -libmoosex-yaml-perl -libmouse-perl -libmousex-getopt-perl -libmousex-nativetraits-perl -libmousex-strictconstructor-perl -libmousex-types-path-class-perl -libmousex-types-perl -libmowgli -libmozilla-ldap-perl -libmp3-info-perl -libmp3spi-java -libmp3splt -libmp3-tag-perl -libmp4-info-perl -libmpc -libmpd -libmpdclient -libmpeg3 -libmpikmeans -libmqdb-perl -libmro-compat-perl -libmrss -libmr-tarantool-perl -libmsgcat-perl -libmsn -libmsoffice-word-html-writer-perl -libmsv -libmthca -libmtp -libmultidimensional-perl -libmusicbrainz3 -libmusicbrainz5 -libmusicbrainz-discid-perl -libmx4j-java -libmysql-diff-perl -libnagios-object-perl -libnagios-plugin-perl -libnamespace-autoclean-perl -libnamespace-clean-perl -libnanoxml2-java -libnatpmp -libnbio -libnb-javaparser-java -libncursesada -libneedle-extras-ruby -libneedle-ruby -libnes -libnet -libnet-address-ip-local-perl -libnetaddr-ip-perl -libnet-akamai-perl -libnet-akismet-perl -libnet-amazon-ec2-perl -libnet-amazon-perl -libnet-amazon-s3-perl -libnet-amazon-s3-tools-perl -libnet-appliance-session-perl -libnetapp-perl -libnet-arp-perl -libnet-bluetooth-perl -libnet-bonjour-perl -libnet-cidr-lite-perl -libnet-cidr-perl -libnet-citadel-perl -libnet-cli-interact-perl -libnet-cups-perl -libnet-daap-dmap-perl -libnet-daemon-perl -libnet-dbus-glib-perl -libnet-dbus-perl -libnet-dhcp-perl -libnet-dns-async-perl -libnet-dns-perl -libnet-dns-resolver-programmable-perl -libnet-dns-sec-perl -libnet-domain-tld-perl -libnetdot-client-rest-perl -libnet-dpap-client-perl -libnet-dri-perl -libnet-dropbox-api-perl -libnet-easytcp-perl -libnet-epp-perl -libnetfilter-conntrack -libnetfilter-cttimeout -libnetfilter-log -libnetfilter-queue -libnet-finger-perl -libnet-frame-perl -libnet-freedb-perl -libnet-github-perl -libnet-google-authsub-perl -libnet-google-code-perl -libnet-gpsd3-perl -libnet-hiveminder-perl -libnet-hotline-perl -libnet-http-perl -libnet-https-any-perl -libnet-httpserver-perl -libnet-https-nb-perl -libnet-ident-perl -libnet-ifconfig-wrapper-perl -libnet-imap-client-perl -libnet-imap-simple-perl -libnet-imap-simple-ssl-perl -libnet-inet6glue-perl -libnet-ip-minimal-perl -libnet-ip-perl -libnet-iptrie-perl -libnet-ipv6addr-perl -libnet-irc-perl -libnet-irc-ruby -libnet-irr-perl -libnet-jabber-bot-perl -libnet-jabber-loudmouth-perl -libnet-jabber-perl -libnet-jifty-perl -libnet-ldapapi-perl -libnet-ldap-filterbuilder-perl -libnet-ldap-perl -libnet-ldap-server-perl -libnet-libdnet-perl -libnet-libidn-perl -libnet-mac-perl -libnet-mac-vendor-perl -libnet-managesieve-perl -libnet-nbname-perl -libnet-netmask-perl -libnet-netrc-ruby -libnet-nis-perl -libnet-nslookup-perl -libnet-ntp-perl -libnet-oauth-perl -libnet-openid-common-perl -libnet-openid-consumer-perl -libnet-openid-server-perl -libnet-opensrs-perl -libnet-openssh-compat-perl -libnet-openssh-perl -libnetpacket-perl -libnet-patricia-perl -libnet-pcap-perl -libnet-ph-perl -libnet-ping-external-perl -libnet-proxy-perl -libnet-rawip-perl -libnet-rblclient-perl -libnet-rendezvous-publish-backend-avahi-perl -libnet-rendezvous-publish-perl -libnet-scp-expect-perl -libnet-scp-perl -libnetsds-kannel-perl -libnetsds-perl -libnetsds-util-perl -libnet-server-mail-perl -libnet-server-perl -libnet-sftp-foreign-perl -libnet-sieve-perl -libnet-sieve-script-perl -libnet-sip-perl -libnet-smpp-perl -libnet-smtpauth-perl -libnet-smtp-server-perl -libnet-smtp-ssl-perl -libnet-smtp-tls-butmaintained-perl -libnet-smtp-tls-perl -libnet-snmp-perl -libnet-snpp-perl -libnet-socks-perl -libnet-ssh2-perl -libnet-ssh-perl -libnet-ssleay-perl -libnet-sslglue-perl -libnet-stomp-perl -libnet-subnets-perl -libnet-tclink-perl -libnet-telnet-perl -libnet-tftpd-perl -libnet-tftp-perl -libnet-traceroute-perl -libnet-traceroute-pureperl-perl -libnet-trac-perl -libnet-upnp-perl -libnet-vnc-perl -libnet-whois-parser-perl -libnet-whois-raw-perl -libnet-whois-ripe-perl -libnetwork-ipv4addr-perl -libnet-write-perl -libnetxap-perl -libnetx-java -libnet-xmpp-perl -libnet-xwhois-perl -libnet-z3950-simple2zoom-perl -libnet-z3950-simpleserver-perl -libnet-z3950-zoom-perl -libnews-article-nocem-perl -libnews-article-perl -libnews-newsrc-perl -libnews-nntpclient-perl -libnews-scan-perl -libnfnetlink -libnfo -libnfs -libnfsidmap -libnice -libnids -libnih -libnjb -libnl -libnl3 -libnmap-parser-perl -libnoise -libnotify -libnova -libnsbmp -libnsgif -libnss-cache -libnss-db -libnss-extrausers -libnss-gw-name -libnss-ldap -libnss-lwres -libnss-myhostname -libnss-mysql-bg -libnss-pgsql -libntlm -libnumber-bytes-human-perl -libnumber-compare-perl -libnumber-format-perl -libnumber-fraction-perl -libnumber-range-perl -libnumber-recordlocator-perl -libnxml -libnzb -liboauth -liboauth-php -libobject-authority-perl -libobject-declare-perl -libobject-destroyer-perl -libobject-event-perl -libobject-id-perl -libobject-insideout-perl -libobject-multitype-perl -libobject-pluggable-perl -libobject-realize-later-perl -libobject-role-perl -libobject-signature-perl -libobject-tiny-perl -libocas -libofa -libofetion -libofx -libogg -liboggplay -libogg-vorbis-decoder-perl -libogg-vorbis-header-pureperl-perl -liboggz -liboglappth -libogre-perl -liboil -libois-perl -libole-storage-lite-perl -libomxalsa -libomxcamera -libomxfbdevsink -libomxil-bellagio -libomxmad -libomxvideosrc -libomxvorbis -libomxxvideo -libonemind-commons-invoke-java -libonemind-commons-java-java -libonig -liboobs -liboop -libopengl-perl -libopengl-xscreensaver-perl -libopenobex -libopenoffice-oodoc-perl -libopenraw -libopenusb -liboping -libopkele -liboptions-java -liborigin -liborigin2 -liborlite-migrate-perl -liborlite-mirror-perl -liborlite-perl -liborlite-statistics-perl -liboro-java -libosinfo -libosip2 -libosl -libosm-gary68-perl -libotf -libotr -libouch-perl -libowfat -libowl-directsemantics-perl -liboxford-calendar-perl -libp11 -libpackage-deprecationmanager-perl -libpackage-new-perl -libpackage-pkg-perl -libpackage-stash-perl -libpackage-stash-xs-perl -libpadre-plugin-autoformat-perl -libpadre-plugin-datawalker-perl -libpadre-plugin-git-perl -libpadre-plugin-moose-perl -libpadre-plugin-parsertool-perl -libpadre-plugin-pdl-perl -libpadre-plugin-perlcritic-perl -libpadre-plugin-perltidy-perl -libpadre-plugin-snippet-perl -libpadre-plugin-spellcheck-perl -libpadre-plugin-svn-perl -libpadre-plugin-yaml-perl -libpadwalker-perl -libpal-java -libpalm-perl -libpam4j -libpam-abl -libpam-afs-session -libpam-alreadyloggedin -libpam-blue -libpam-ccreds -libpam-chroot -libpam-encfs -libpam-foreground -libpam-krb5 -libpam-ldap -libpam-mklocaluser -libpam-mount -libpam-pwdfile -libpam-radius-auth -libpam-script -libpam-ssh -libpam-tacplus -libpam-unix2 -libpam-usb -libpango-perl -libpano13 -libpaper -libpar2 -libparallel-forkmanager-perl -libparallel-iterator-perl -libparams-callbackrequest-perl -libparams-classify-perl -libparams-coerce-perl -libparams-util-perl -libparams-validate-perl -libparanoid-perl -libpar-dist-perl -libpar-packer-perl -libpar-perl -libparse-cpan-meta-perl -libparse-cpan-packages-perl -libparse-debcontrol-perl -libparse-debianchangelog-perl -libparse-debian-packages-perl -libparse-dia-sql-perl -libparse-dmidecode-perl -libparse-edid-perl -libparse-errorstring-perl-perl -libparse-exuberantctags-perl -libparse-fixedlength-perl -libparse-http-useragent-perl -libparse-mediawikidump-perl -libparse-method-signatures-perl -libparse-plainconfig-perl -libparser++ -libparse-recdescent-perl -libparse-syslog-perl -libparse-win32registry-perl -libparse-yapp-perl -libpasswd-unix-perl -libpath-class-file-stat-perl -libpath-class-perl -libpath-dispatcher-declarative-perl -libpath-dispatcher-perl -libpcap -libpcapnav -libpciaccess -libpcl1 -libpcre++ -libpdf-api2-perl -libpdf-api2-simple-perl -libpdfbox-java -libpdf-create-perl -libpdf-fdf-simple-perl -libpdfrenderer-java -libpdf-report-perl -libpdf-reuse-barcode-perl -libpdf-reuse-perl -libpdf-table-perl -libpdl-io-hdf5-perl -libpdl-netcdf-perl -libpdl-stats-perl -libpeas -libperl4-corelibs-perl -libperl5i-perl -libperl6-caller-perl -libperl6-export-attrs-perl -libperl6-export-perl -libperl6-form-perl -libperl6-junction-perl -libperl6-say-perl -libperl6-slurp-perl -libperlanet-perl -libperl-apireference-perl -libperlbal-xs-httpheaders-perl -libperl-critic-perl -libperl-destruct-level-perl -libperldoc-search-perl -libperlio-eol-perl -libperlio-gzip-perl -libperlio-via-dynamic-perl -libperlio-via-symlink-perl -libperlmenu-perl -libperl-metrics-simple-perl -libperl-minimumversion-perl -libperl-prereqscanner-perl -libperlspeak-perl -libperl-version-perl -libperlx-maybe-perl -libpetal-perl -libpetal-utils-perl -libpgjava -libpgm -libpg-perl -libpgplot-perl -libpgp-sign-perl -libphash -libphone-ui -libphone-ui-shr -libphone-utils -libphp-adodb -libphp-jabber -libphp-jpgraph -libphp-pclzip -libphp-phpmailer -libphp-serialization-perl -libphp-snoopy -libphp-swiftmailer -libphysfs -libpinyin -libpipeline -libpixels-java -libpixie-java -libplack-middleware-crossorigin-perl -libplack-middleware-deflater-perl -libplack-middleware-expires-perl -libplack-middleware-file-sass-perl -libplack-middleware-reverseproxy-perl -libplack-middleware-session-perl -libplack-middleware-status-perl -libplack-perl -libplack-test-externalserver-perl -libplayer -libplist -libplrpc-perl -libplucene-perl -libpmount -libpng -libpod2-base-perl -libpod-2-docbook-perl -libpod-abstract-perl -libpod-constants-perl -libpod-coverage-perl -libpod-coverage-trustpod-perl -libpod-elemental-perl -libpod-elemental-perlmunger-perl -libpod-eventual-perl -libpod-index-perl -libpod-markdown-perl -libpodofo -libpod-plainer-perl -libpod-pom-perl -libpod-pseudopod-perl -libpod-readme-perl -libpod-sax-perl -libpod-simple-perl -libpod-simple-wiki-perl -libpod-spell-perl -libpod-strip-perl -libpod-tests-perl -libpod-tree-perl -libpod-weaver-perl -libpod-webserver-perl -libpod-wordlist-hanekomu-perl -libpod-wsdl-perl -libpod-xhtml-perl -libpoe-api-peek-perl -libpoe-component-client-dns-perl -libpoe-component-client-http-perl -libpoe-component-client-ident-perl -libpoe-component-client-keepalive-perl -libpoe-component-client-mpd-perl -libpoe-component-client-ping-perl -libpoe-component-dbiagent-perl -libpoe-component-ikc-perl -libpoe-component-irc-perl -libpoe-component-jabber-perl -libpoe-component-jobqueue-perl -libpoe-component-pcap-perl -libpoe-component-pubsub-perl -libpoe-component-resolver-perl -libpoe-component-server-http-perl -libpoe-component-server-simplehttp-perl -libpoe-component-server-soap-perl -libpoe-component-sslify-perl -libpoe-component-syndicator-perl -libpoe-filter-http-parser-perl -libpoe-filter-ircd-perl -libpoe-filter-stomp-perl -libpoe-filter-xml-perl -libpoe-loop-event-perl -libpoe-loop-tk-perl -libpoe-perl -libpoe-test-loops-perl -libpoet-perl -libposix-strptime-perl -libpostfix-parse-mailq-perl -libpostscriptbarcode -libpostscript-file-perl -libpostscript-perl -libpostscript-simple-perl -libppd -libppi-html-perl -libppi-perl -libppix-editortools-perl -libppix-regexp-perl -libppi-xs-perl -libppix-utilities-perl -libpqxx3 -libpragmatic-perl -libprefork-perl -libprelude -libpreludedb -libpri -libprinterconf -libprintsys -libprivileges-drop-perl -libprobe-perl-perl -libproc-background-perl -libproc-daemon-perl -libproc-fork-perl -libproc-invokeeditor-perl -libproc-pid-file-perl -libproc-processtable-perl -libproc-reliable-perl -libproc-simple-perl -libproc-syncexec-perl -libproc-waitstat-perl -libproxool-java -libproxy -libprpc-perl -libpst -libpthread-stubs -libpthread-workqueue -libpuzzle -libqalculate -libqb -libqglviewer -libqt4pas -libquantum -libquantum-entanglement-perl -libquantum-superpositions-perl -libquartz-java -libquicktime -libquota-perl -libquvi -libquvi-scripts -libqxt -librabbitmq -libramaze-ruby -libranlip -librapi2 -librasterlite -libraw -libraw1394 -librcc -librcd -librcs-perl -librdf-acl-perl -librdf-closure-perl -librdf-crypt-perl -librdf-endpoint-perl -librdf-generator-void-perl -librdf-helper-perl -librdf-helper-properties-perl -librdf-icalendar-perl -librdf-kml-exporter-perl -librdf-linkeddata-perl -librdf-ns-perl -librdf-prefixes-perl -librdf-query-client-perl -librdf-query-perl -librdf-rdfa-generator-perl -librdf-rdfa-parser-perl -librdf-trin3-perl -librdf-trine-node-literal-xml-perl -librdf-trine-perl -librdf-trineshortcuts-perl -librdf-trinex-functions-perl -librdf-vcard-perl -librdmacm -libreadline-java -libreadonly-perl -libreadonly-xs-perl -librecad -libredis-perl -libregexp-assemble-perl -libregexp-common-email-address-perl -libregexp-common-net-cidr-perl -libregexp-common-perl -libregexp-common-time-perl -libregexp-grammars-perl -libregexp-ipv6-perl -libregexp-java -libregexp-optimizer-perl -libregexp-reggrp-perl -libregexp-shellish-perl -librelative-perl -librelaxng-datatype-java -librelp -libreoffice -libreoffice-voikko -librep -libreplaygain -librepository -libresample -librest -librest-application-perl -libreturn-value-perl -librg-blast-parser-perl -librg-utils-perl -librivescript-perl -librole-hasmessage-perl -librole-identifiable-perl -librole-tiny-perl -libromana-perligata-perl -libroman-perl -libropkg-perl -librose-datetime-perl -librose-db-object-perl -librose-db-perl -librose-object-perl -librose-uri-perl -librostlab -librostlab-blast -librouter-simple-perl -librpcsecgss -librpc-xml-perl -librra -librrdtool-oo-perl -librsl -librsvg -librsync -librtas -librt-client-rest-perl -librtfcomp -librtf-document-perl -librtf-writer-perl -librunapp-perl -libs3 -libsamplerate -libsane-perl -libsaxon-java -libsbsms -libscalar-defer-perl -libscalar-list-utils-perl -libscalar-number-perl -libscalar-properties-perl -libscalar-string-perl -libscalar-util-numeric-perl -libschedule-at-perl -libschedule-cron-perl -libschedule-ratelimiter-perl -libscope-guard-perl -libscope-upper-perl -libscriptalicious-perl -libsdl1.2 -libsdl-console -libsdl-perl -libsdl-sge -libsdp -libsearch-estraier-perl -libsearch-gin-perl -libsearch-queryparser-perl -libsearch-xapian-perl -libselinux -libsemanage -libsendmail-milter-perl -libsendmail-pmilter-perl -libsepol -libserializer -libset-infinite-perl -libset-intspan-perl -libset-nestedgroups-perl -libset-object-perl -libset-scalar-perl -libsexy -libsfml -libsgml-parser-opensp-perl -libsgmls-perl -libshairport -libshell-command-perl -libshell-perl -libshell-perl-perl -libshell-posix-select-perl -libshevek -libshout -libshr-glib -libsidplay -libsidplayfp -libsieve -libsigc++ -libsigc++-1.2 -libsigc++-2.0 -libsignatures-perl -libsigrok -libsigrokdecode -libsigsegv -libsimple-validation-java -libskinlf-java -libskk -libslf4j-java -libsm -libsmart-comments-perl -libsmbios -libsmf -libsmi -libsms-send-perl -libsndfile -libsnmp-extension-passpersist-perl -libsnmp-info-perl -libsnmp-mib-compiler-perl -libsnmp-multi-perl -libsnmp-ruby -libsnmp-session-perl -libsnowball-norwegian-perl -libsnowball-swedish-perl -libsoap-lite-perl -libsoap-wsdl-perl -libsocialtext-resting-perl -libsocialtext-resting-utils-perl -libsocialweb -libsocket6-perl -libsocket-getaddrinfo-perl -libsocket-linux-perl -libsocket-multicast6-perl -libsocket-perl -libsoftware-license-perl -libsoftware-release-perl -libsoil -libsort-fields-perl -libsort-key-perl -libsort-key-top-perl -libsort-naturally-perl -libsort-versions-perl -libsoundgen -libsoup2.4 -libspark-java -libspctag -libspectre -libspectrum -libspf2 -libsphinx-search-perl -libspiffy-perl -libspin-java -libspiro -libspnav -libspoon-perl -libspork-perl -libspreadsheet-parseexcel-perl -libspreadsheet-parseexcel-simple-perl -libspreadsheet-read-perl -libspreadsheet-writeexcel-perl -libspreadsheet-xlsx-perl -libspring-java -libspring-ldap-java -libspring-security-2.0-java -libspring-webflow-2.0-java -libsql-abstract-limit-perl -libsql-abstract-perl -libsql-reservedwords-perl -libsql-statement-perl -libsql-translator-perl -libsru-perl -libss7 -libssh -libssh2 -libstatgrab -libstatistics-basic-perl -libstatistics-descriptive-perl -libstatistics-distributions-perl -libstatistics-online-perl -libstatistics-r-perl -libstatistics-test-randomwalk-perl -libstatistics-test-sequence-perl -libstat-lsmode-perl -libstax2-api-java -libstax-java -libstrictures-perl -libstring-approx-perl -libstring-bufferstack-perl -libstring-camelcase-perl -libstring-crc32-perl -libstring-dirify-perl -libstring-errf-perl -libstring-escape-perl -libstring-flogger-perl -libstring-format-perl -libstring-formatter-perl -libstring-glob-permute-perl -libstring-koremutake-perl -libstring-mkpasswd-perl -libstring-parity-perl -libstring-random-perl -libstring-rewriteprefix-perl -libstring-shellquote-perl -libstring-similarity-perl -libstring-toidentifier-en-perl -libstring-tokenizer-perl -libstring-truncate-perl -libstroke -libstruct-compare-perl -libstruts1.2-java -libstxxl -libsub-current-perl -libsub-delete-perl -libsub-exporter-formethods-perl -libsub-exporter-globexporter-perl -libsub-exporter-perl -libsub-identify-perl -libsub-install-perl -libsub-name-perl -libsub-override-perl -libsub-prototype-perl -libsubtitles-perl -libsub-uplevel-perl -libsub-wrappackages-perl -libsuper-perl -libsvg-graph-perl -libsvg-perl -libsvg-tt-graph-perl -libsvm -libsvn-class-perl -libsvn-dump-perl -libsvn-hooks-perl -libsvn-look-perl -libsvn-notify-mirror-perl -libsvn-notify-perl -libsvn-svnlook-perl -libsvn-web-perl -libswarmcache-java -libswe -libswingx1-java -libswingx-java -libswish-api-common-perl -libswitch-perl -libsx -libsylph -libsynce -libsyncml -libsyntax-highlight-engine-kate-perl -libsyntax-highlight-engine-simple-languages-perl -libsyntax-highlight-engine-simple-perl -libsyntax-highlight-perl-improved-perl -libsyntax-keyword-gather-perl -libsyntax-perl -libsynthesis -libsysactivity -libsysadm-install-perl -libsys-cpuload-perl -libsys-cpu-perl -libsys-filesystem-perl -libsys-gamin-perl -libsys-hostname-long-perl -libsys-mmap-perl -libsys-sigaction-perl -libsys-statistics-linux-perl -libsys-syscall-perl -libsys-syslog-perl -libsystem-command-perl -libsys-utmp-perl -libsys-virt-perl -libtablelayout-java -libtaint-util-perl -libtangram-perl -libtap-formatter-html-perl -libtap-formatter-junit-perl -libtap-harness-archive-perl -libtap-parser-sourcehandler-pgtap-perl -libtar -libtask-weaken-perl -libtasn1-3 -libtcd -libtecla -libtelnet -libtemplate-alloy-perl -libtemplate-declare-perl -libtemplate-multilingual-perl -libtemplate-perl -libtemplate-plugin-calendar-simple-perl -libtemplate-plugin-class-perl -libtemplate-plugin-clickable-email-perl -libtemplate-plugin-clickable-perl -libtemplate-plugin-comma-perl -libtemplate-plugin-cycle-perl -libtemplate-plugin-datetime-format-perl -libtemplate-plugin-dbi-perl -libtemplate-plugin-gd-perl -libtemplate-plugin-gravatar-perl -libtemplate-plugin-javascript-perl -libtemplate-plugin-json-escape-perl -libtemplate-plugin-latex-perl -libtemplate-plugin-number-format-perl -libtemplate-plugin-textile2-perl -libtemplate-plugin-utf8decode-perl -libtemplate-plugin-xml-perl -libtemplate-plugin-yaml-perl -libtemplate-provider-encoding-perl -libtemplate-provider-fromdata-perl -libtemplates-parser -libtemplate-timer-perl -libtemplate-tiny-perl -libtenjin-perl -libterm-encoding-perl -libterm-filter-perl -libterm-progressbar-perl -libterm-prompt-perl -libterm-query-perl -libterm-readkey-perl -libterm-readline-gnu-perl -libterm-readline-perl-perl -libterm-readline-zoid-perl -libterm-readpassword-perl -libterm-shell-perl -libterm-shellui-perl -libterm-size-any-perl -libterm-size-perl -libterm-size-perl-perl -libterm-sk-perl -libterm-slang-perl -libterm-ttyrec-plus-perl -libterm-twiddle-perl -libterm-visual-perl -libterm-vt102-perl -libterralib -libtest-aggregate-perl -libtest-apocalypse-perl -libtest-assertions-perl -libtest-autoloader-perl -libtest-base-perl -libtest-bdd-cucumber-perl -libtest-block-perl -libtest-carp-perl -libtest-cgi-multipart-perl -libtest-checkchanges-perl -libtest-checkdeps-perl -libtest-checkmanifest-perl -libtest-classapi-perl -libtest-class-most-perl -libtest-class-perl -libtest-cmd-perl -libtest-command-perl -libtest-compile-perl -libtest-consistentversion-perl -libtest-corpus-audio-mpd-perl -libtest-cpan-meta-perl -libtest-cpan-meta-yaml-perl -libtest-cukes-perl -libtest-database-perl -libtest-data-perl -libtest-deep-perl -libtest-dependencies-perl -libtest-differences-perl -libtest-dir-perl -libtest-distmanifest-perl -libtest-distribution-perl -libtest-email-perl -libtest-eol-perl -libtest-exception-perl -libtest-exit-perl -libtest-expect-perl -libtest-fatal-perl -libtest-file-contents-perl -libtest-file-perl -libtest-file-sharedir-perl -libtest-fixme-perl -libtest-harness-perl -libtest-hasversion-perl -libtest-html-content-perl -libtest-html-w3c-perl -libtest-http-server-simple-perl -libtest-http-server-simple-stashwarnings-perl -libtest-identity-perl -libtest-image-gd-perl -libtest-indistdir-perl -libtest-inline-perl -libtest-inter-perl -libtest-json-perl -libtest-kwalitee-perl -libtest-leaktrace-perl -libtest-lectrotest-perl -libtest-log4perl-perl -libtest-log-dispatch-perl -libtest-longstring-perl -libtest-manifest-perl -libtest-memory-cycle-perl -libtest-minimumversion-perl -libtest-mockclass-perl -libtest-mock-lwp-perl -libtest-mockmodule-perl -libtest-mockobject-perl -libtest-mockrandom-perl -libtest-mock-redis-perl -libtest-mocktime-datecalc-perl -libtest-mocktime-perl -libtest-module-used-perl -libtest-most-perl -libtest-needsdisplay-perl -libtest-nobreakpoints-perl -libtest-notabs-perl -libtest-nowarnings-perl -libtest-number-delta-perl -libtest-object-perl -libtest-output-perl -libtest-perl-critic-perl -libtest-pod-content-perl -libtest-pod-coverage-perl -libtest-pod-no404s-perl -libtest-pod-perl -libtest-poe-client-tcp-perl -libtest-poe-server-tcp-perl -libtest-portability-files-perl -libtest-prereq-perl -libtest-rdf-doap-version-perl -libtest-rdf-perl -libtest-refcount-perl -libtest-regression-perl -libtest-reporter-perl -libtest-requires-perl -libtest-routine-perl -libtest-script-perl -libtest-script-run-perl -libtest-sharedfork-perl -libtest-signature-perl -libtest-simple-perl -libtest-simpleunit-perl -libtest-spec-perl -libtest-spelling-perl -libtest-strict-perl -libtest-subcalls-perl -libtest-synopsis-perl -libtest-taint-perl -libtest-tcp-perl -libtest-tempdir-perl -libtest-tester-perl -libtest-trap-perl -libtest-unit-perl -libtest-useallmodules-perl -libtest-use-ok-perl -libtest-utf8-perl -libtest-valgrind-perl -libtest-warn-perl -libtest-weaken-perl -libtest-without-module-perl -libtest-www-declare-perl -libtest-www-mechanize-catalyst-perl -libtest-www-mechanize-cgiapp-perl -libtest-www-mechanize-mojo-perl -libtest-www-mechanize-perl -libtest-www-mechanize-psgi-perl -libtest-www-selenium-perl -libtest-xml-perl -libtest-xml-simple-perl -libtest-xpath-perl -libtest-yaml-meta-perl -libtest-yaml-valid-perl -libtex-encode-perl -libtext-affixes-perl -libtext-aligner-perl -libtext-asciitable-perl -libtext-aspell-perl -libtext-autoformat-perl -libtext-bibtex-perl -libtext-bidi-perl -libtext-charwidth-perl -libtext-chasen-perl -libtext-context-eitherside-perl -libtext-context-perl -libtext-csv-encoded-perl -libtext-csv-perl -libtext-csv-xs-perl -libtext-dhcpleases-perl -libtext-diff-perl -libtext-findindent-perl -libtext-flow-perl -libtext-format-perl -libtext-formattable-perl -libtext-german-perl -libtext-glob-perl -libtext-greeking-perl -libtext-header-perl -libtext-hunspell-perl -libtext-iconv-perl -libtext-kakasi-perl -libtext-levenshtein-perl -libtext-levenshteinxs-perl -libtext-lorem-perl -libtext-markdown-discount-perl -libtext-markdown-perl -libtext-mecab-perl -libtext-mediawikiformat-perl -libtext-micromason-perl -libtext-microtemplate-perl -libtext-multimarkdown-perl -libtext-ngram-perl -libtext-password-pronounceable-perl -libtext-patch-perl -libtext-pdf-perl -libtext-qrcode-perl -libtext-quoted-perl -libtext-recordparser-perl -libtext-reflow-perl -libtext-reform-perl -libtext-rewriterules-perl -libtext-roman-perl -libtext-sass-perl -libtext-simpletable-perl -libtext-table-perl -libtext-tabulardisplay-perl -libtext-template-perl -libtext-textile-perl -libtext-trac-perl -libtext-trim-perl -libtext-typography-perl -libtext-unaccent-perl -libtext-unidecode-perl -libtext-vcard-perl -libtext-vfile-asdata-perl -libtext-vimcolor-perl -libtext-wikicreole-perl -libtext-wikiformat-perl -libtext-worddiff-perl -libtextwrap -libtext-wrapi18n-perl -libtext-wrapper-perl -libtfbs-perl -libtggraphlayout-java -libthai -libtheora -libtheschwartz-perl -libthread-pool-simple-perl -libthread-queue-any-perl -libthread-serialize-perl -libthreads-perl -libthreads-shared-perl -libthrowable-perl -libthrust -libticables -libticalcs -libticket-simple-perl -libticonv -libtie-array-iterable-perl -libtie-array-sorted-perl -libtie-cache-perl -libtie-cphash-perl -libtie-dbi-perl -libtie-dxhash-perl -libtie-encryptedhash-perl -libtie-hash-regex-perl -libtie-ical-perl -libtie-ixhash-perl -libtie-persistent-perl -libtie-refhash-weak-perl -libtie-shadowhash-perl -libtie-simple-perl -libtie-toobject-perl -libtifiles -libtime-clock-perl -libtimedate-perl -libtime-duration-parse-perl -libtime-duration-perl -libtime-fake-perl -libtime-format-perl -libtime-human-perl -libtime-modules-perl -libtime-period-perl -libtime-piece-mysql-perl -libtime-progress-perl -libtime-stopwatch-perl -libtime-warp-perl -libtime-y2038-perl -libtirpc -libtitanium-perl -libtk-dirselect-perl -libtk-filedialog-perl -libtk-gbarr-perl -libtk-histentry-perl -libtk-img -libtk-objscanner-perl -libtk-pod-perl -libtk-splashscreen-perl -libtk-tablematrix-perl -libtm-perl -libtnt -libtododb -libtokyocabinet-perl -libtomcrypt -libtommath -libtool -libtoolkit-perl -libtools-logging-clojure -libtorrent -libtorrent-rasterbar -libtpclient-py -libtpl -libtpproto-py -libtrace3 -libtrain -libtravel-routing-de-vrr-perl -libtree-dagnode-perl -libtree-multinode-perl -libtree-redblack-perl -libtree-simple-perl -libtree-simple-visitorfactory-perl -libtritonus-java -libtrue-perl -libtrycatch-perl -libtry-tiny-perl -libtut -libtuxcap -libtwin -libucimf -libui-dialog-perl -libunicode-collate-perl -libunicode-escape-perl -libunicode-japanese-perl -libunicode-linebreak-perl -libunicode-map8-perl -libunicode-map-perl -libunicode-maputf8-perl -libunicode-string-perl -libunicode-stringprep-perl -libuninameslist -libuninum -libunique -libunique3 -libunistring -libuniversal-can-perl -libuniversal-exports-perl -libuniversal-isa-perl -libuniversal-moniker-perl -libuniversal-require-perl -libunix-mknod-perl -libunix-syslog-perl -libunwind -libupnp -libupnp4 -liburcu -liburi-encode-perl -liburi-fetch-perl -liburi-find-delimited-perl -liburi-find-perl -liburi-perl -liburi-query-perl -liburi-smarturi-perl -liburi-template-perl -liburi-todisk-perl -libusb -libusbtc08 -libusbx -libuser -libuser-identity-perl -libuser-perl -libuser-simple-perl -libutempter -libutf8-all-perl -libuuid-perl -libuuid-tiny-perl -libv8 -libv8-i18n -libva -libvalhalla -libvalidate-net-perl -libvalidation-class-perl -libvamsas-client-java -libvariable-magic-perl -libvc -libvcs-lite-perl -libvdpau -libvendorlib-perl -libverilog-perl -libversion-next-perl -libversion-perl -libverto -libvformat -libvideo-capture-v4l-perl -libvideo-fourcc-info-perl -libvideo-ivtv-perl -libview -libvigraimpex -libvi-quickfix-perl -libvirt -libvirt-glib -libvisca -libvisio -libvisual -libvisual-plugins -libvitacilina-perl -libvldocking-java -libvncserver -libvoikko -libvorbis -libvorbisfile-ruby -libvorbisidec -libvorbisspi-java -libv-perl -libvpx -libwacom -libwant-perl -libwarnings-illegalproto-perl -libweather-com-perl -libwebapp-ruby -libwebcam -libweb-id-perl -libwebinject-perl -libwebp -libweb-scraper-perl -libwebservice-cia-perl -libwebservice-musicbrainz-perl -libwebservice-solr-perl -libwebservice-validator-css-w3c-perl -libwebservice-validator-html-w3c-perl -libwebservice-youtube-perl -libweb-simple-perl -libwfut -libwhisker2-perl -libwibble -libwiki-toolkit-formatter-usemod-perl -libwiki-toolkit-perl -libwiki-toolkit-plugin-categoriser-perl -libwiki-toolkit-plugin-diff-perl -libwiki-toolkit-plugin-json-perl -libwiki-toolkit-plugin-locator-grid-perl -libwiki-toolkit-plugin-ping-perl -libwiki-toolkit-plugin-rss-reader-perl -libwmf -libwnck -libwnck3 -libwoodstox-java -libwordnet-querydata-perl -libwpd -libwpg -libwps -libwrap-ruby -libws-commons-util-java -libwwwbrowser-perl -libwww-bugzilla-perl -libwww-cnic-perl -libwww-curl-perl -libwww-facebook-api-perl -libwww-finger-perl -libwww-freshmeat-perl -libwww-google-calculator-perl -libwww-indexparser-perl -libwww-mechanize-autopager-perl -libwww-mechanize-formfiller-perl -libwww-mechanize-gzip-perl -libwww-mechanize-perl -libwww-mechanize-shell-perl -libwww-mechanize-treebuilder-perl -libwww-mediawiki-client-perl -libwww-nicovideo-download-perl -libwww-opensearch-perl -libwww-perl -libwww-robotrules-perl -libwww-search-perl -libwww-shorten-perl -libwww-topica-perl -libwww-wikipedia-perl -libwx-perl -libwx-perl-datawalker-perl -libwx-perl-processstream-perl -libwx-scintilla-perl -libx11 -libx11-freedesktop-desktopentry-perl -libx11-guitest-perl -libx11-protocol-perl -libx500-dn-perl -libx86 -libxalan2-java -libxapool-java -libxau -libxaw -libxbase -libxbean-java -libxcb -libxcomposite -libxcrypt -libxcursor -libxdamage -libxdg-basedir -libxdmcp -libxerces2-java -libxext -libxfce4menu -libxfce4ui -libxfce4util -libxfcegui4 -libxfixes -libxfont -libxi -libxinerama -libxkbfile -libxklavier -libxml2 -libxml++2.6 -libxmlada -libxml-atom-fromowl-perl -libxml-atom-microformats-perl -libxml-atom-owl-perl -libxml-atom-perl -libxml-atom-service-perl -libxml-atom-simplefeed-perl -libxml-autowriter-perl -libxml-bare-perl -libxml-checker-perl -libxml-commonns-perl -libxml-commons-resolver1.1-java -libxml-csv-perl -libxml-dom-perl -libxml-dom-xpath-perl -libxml-dtdparser-perl -libxml-dt-perl -libxml-dumper-perl -libxml-easyobj-perl -libxml-easy-perl -libxml-encoding-perl -libxmlezout -libxml-feed-perl -libxml-feedpp-mediarss-perl -libxml-feedpp-perl -libxml-filter-buffertext-perl -libxml-filter-detectws-perl -libxml-filter-reindent-perl -libxml-filter-saxt-perl -libxml-filter-sort-perl -libxml-filter-xslt-perl -libxml-generator-perl -libxml-grddl-perl -libxml-grove-perl -libxml-handler-composer-perl -libxml-handler-printevents-perl -libxml-handler-trees-perl -libxml-handler-yawriter-perl -libxml-java -libxml-libxml-debugging-perl -libxml-libxml-iterator-perl -libxml-libxml-lazybuilder-perl -libxml-libxml-perl -libxml-libxml-simple-perl -libxml-libxslt-perl -libxml-mini-perl -libxml-namespacefactory-perl -libxml-namespace-perl -libxml-namespacesupport-perl -libxml-nodefilter-perl -libxml-node-perl -libxml-opml-perl -libxml-opml-simplegen-perl -libxml-parser-lite-tree-perl -libxml-parser-perl -libxml-perl -libxml-qofqsf-perl -libxml-quote-perl -libxml-regexp-perl -libxmlrpc3-java -libxml-rss-feed-perl -libxml-rss-libxml-perl -libxml-rsslite-perl -libxml-rss-perl -libxml-rss-simplegen-perl -libxml-sax-base-perl -libxml-sax-expat-incremental-perl -libxml-sax-expat-perl -libxml-sax-expatxs-perl -libxml-sax-machines-perl -libxml-sax-perl -libxml-sax-writer-perl -libxml-security-java -libxml-semanticdiff-perl -libxml-simpleobject-perl -libxml-simple-perl -libxml-smart-perl -libxml-stream-perl -libxml-tidy-perl -libxml-tmx-perl -libxmltok -libxml-tokeparser-perl -libxml-treebuilder-perl -libxml-treepp-perl -libxml-twig-perl -libxml-um-perl -libxml-validate-perl -libxml-validator-schema-perl -libxml-writer-perl -libxml-writer-simple-perl -libxml-writer-string-perl -libxml-xerces-perl -libxml-xpathengine-perl -libxml-xpath-perl -libxml-xql-perl -libxml-xslt-perl -libxml-xupdate-libxml-perl -libxmu -libxp -libxpm -libxpp2-java -libxpp3-java -libxr -libxrandr -libxray-absorption-perl -libxray-scattering-perl -libxray-spacegroup-perl -libxrd-parser-perl -libxrender -libxres -libxsettings -libxsettings-client -libxslt -libxss -libxstream-java -libxt -libxtst -libxv -libxvmc -libxxf86dga -libxxf86vm -libyahoo2 -libyaml -libyaml-appconfig-perl -libyaml-libyaml-perl -libyaml-perl -libyaml-shell-perl -libyaml-syck-perl -libyaml-tiny-perl -libyanfs-java -libydpdict -libytnef -libyubikey -libzeep -libzeitgeist -libzen -libzerg -libzerg-perl -libzip -libzip-ruby -libzn-poly -libzorpll -libzrtpcpp -lice -lice5 -licq -lie -liece -lifelines -lifeograph -liferea -liggghts -lightdm -lightdm-gtk-greeter -lightproof -lightspark -lightspeed -lightsquid -lighttpd -lightyears -lilo -lilo-installer -lilv -lilypond -linaro-image-tools -lincity -lincity-ng -lincredits -lingot -linkchecker -link-grammar -linklint -link-monitor-applet -links2 -linky -linphone -linpsk -linsmith -lintex -linthesia -lintian -linux -linux86 -linux-atm -linux-base -linuxdcpp -linuxdoc-tools -linux-ftpd -linux-ftpd-ssl -linux-igd -linuxinfo -linux-latest -linuxlogo -linux-ntfs -linux-patch-debianlogo -linux-patch-grsecurity2 -linux-tools -linuxtv-dvb-apps -linux-wlan-ng -lio-utils -liquidsoap -liquidwar -lirc -lire -lisaac -listadmin -listaller -literki -littler -littlewizard -live-boot -live-build -live-config -live-f1 -livehttpheaders -live-installer -live-manual -lives -live-tools -livetribe-jsr223 -liwc -lksctp-tools -lldpad -lldpd -llgal -ll-scope -lltag -llvm-2.9 -llvm-3.0 -llvm-3.1 -llvm-defaults -llvm-py -lmarbles -lme4 -lmemory -lmms -lmodern -lm-sensors -lmtest -lnpd -loadlin -loadmeter -loadwatch -localechooser -localepurge -localization-config -localizer -lockdev -lockfile-progs -lockout -log4c -log4cplus -log4cpp -log4cpp-doc -log4cxx -log4net -log4shib -logapp -logback -logcheck -logfs-tools -loggerhead -logidee-tools -logilab-astng -logilab-common -logilab-constraint -logisim -logjam -logreq -logrotate -logservice -logstalgia -logtool -logtools -logtop -logwatch -lojban-common -loki -londonlaw -longomatch -lookup -lookup-el -looptools -loqui -lordsawar -lostirc -lottanzb -loudmouth -louie -lout -love -lowmem -lowpan-tools -lpe -lpr -lprng -lprng-doc -lp-solve -lptools -lrslib -lrzip -lrzsz -lsat -lsb -lsdb -lsdvd -lshell -lsh-utils -lshw -lsmbox -lsof -lsscsi -lsyncd -ltpanel -ltrace -ltris -ltsp -ltsp-docs -ltspfs -ltt-control -lttoolbox -lttv -lua50 -lua5.1 -lua5.1-policy -lua5.2 -lua-apr -luabind -lua-bitop -lua-cgi -lua-copas -lua-cosmo -lua-coxpcall -lua-curl -lua-cyrussasl -lua-dbi -lua-doc -lua-event -lua-expat -lua-filesystem -lua-iconv -lua-json -luakit -lua-ldap -lua-leg -lua-lgi -lua-logging -lua-lpeg -lua-markdown -lua-md5 -lua-mode -lua-orbit -lua-penlight -lua-posix -lua-rexlib -lua-rings -luarocks -lua-sec -lua-soap -luasocket -lua-sql -luasseq -lua-svn -luatex -lua-wsapi -lua-xmlrpc -lua-zip -lua-zlib -lucene2 -lucene-solr -luckybackup -ludevit -lugaru -luminance-hdr -lunar -lunar-date -lunch -lunzip -luola -luola-levels -luola-nostalgy -lurker -lusernet.app -lush -lutefisk -luvcview -lv -lv2 -lv2core -lv2-c++-tools -lv2dynparam1 -lv2fil -lv2file -lv2proc -lv2vocoder -lvm2 -lvmcfg -lwatch -lwipv6 -lwjgl -lwm -lwt -lxappearance -lxappearance-obconf -lxc -lxctl -lxde-common -lxde-icon-theme -lxde-metapackages -lx-gdb -lxinput -lxlauncher -lxmenu-data -lxml -lxmms2 -lxmusic -lxpanel -lxpolkit -lxrandr -lxsession -lxsession-edit -lxshortcut -lxtask -lxterminal -lybniz -lynis -lynkeos.app -lynx-cur -lyskom-elisp-client -lyskom-server -lyx -lzip -lziprecover -lzlib -lzma -lzo2 -lzop -m16c-flash -m17n-contrib -m17n-db -m17n-docs -m17n-im-config -m17n-lib -m2300w -m2crypto -m2vrequantiser -m4 -macchanger -macchanger-gtk -mach -macopix -mactelnet -macutils -mac-widgets -madbomber -madison-lite -madlib -madplay -madwimax -maelstrom -mafft -magic -magicfilter -magic-haskell -magicmaze -magicor -magicrescue -magics++ -magit -magpierss -magyarispell -mah-jong -mailagent -mailavenger -mailcheck -mailcrypt -maildir-filter -maildirsync -maildir-utils -maildrop -mail-expire -mailfilter -mailfront -mailgraph -mailman -mail-notification -mailping -mailplate -mail-spf-perl -mailsync -mailtextbody -mailto -mailutils -main-menu -maint-guide -mairix -maitreya -makebootfat -makedev -make-dfsg -makedumpfile -makefs -makejail -makejvf -makepasswd -makepatch -makeself -makexvpics -mako -malaga -maloc -man2html -mana -mancala -man-db -mandelbulber -manderlbot -mandos -mangler -mango-lassi -manpages -manpages-de -manpages-es -manpages-es-extra -manpages-fr -manpages-fr-extra -manpages-hu -man-pages-it -manpages-ja -manpages-pl -manpages-pt -manpages-ru -manpages-tr -manpages-zh -mantis -mapivi -mapnik -mapserver -maptransfer -maq -maqview -maradns -marble -maria -markdown -markupsafe -mason -masqmail -massxpert -mat -matanza -matchbox -matchbox-common -matchbox-desktop -matchbox-keyboard -matchbox-panel -matchbox-panel-manager -matchbox-themes-extra -matchbox-window-manager -matchit -mathematica-fonts -mathgl -mathjax -mathomatic -mathpartir -mathpiper -mathtex -mathwar -matita -matlab-support -matplotlib -matrixssl -matroxset -maude -mauve -maven -maven2 -maven2-core -maven-ant-helper -maven-antrun-extended-plugin -maven-antrun-plugin -maven-ant-tasks -maven-archiver -maven-assembly-plugin -maven-bundle-plugin -maven-clean-plugin -maven-common-artifact-filters -maven-compiler-plugin -maven-debian-helper -maven-dependency-analyzer -maven-dependency-plugin -maven-dependency-tree -maven-docck-plugin -maven-doxia-tools -maven-ear-plugin -maven-ejb-plugin -maven-embedder -maven-enforcer -maven-file-management -maven-filtering -maven-hpi-plugin -maven-install-plugin -maven-invoker -maven-invoker-plugin -maven-jar-plugin -maven-javadoc-plugin -maven-parent -maven-plugin-testing -maven-plugin-tools -maven-project-info-reports-plugin -maven-repo-helper -maven-reporting-impl -maven-repository-builder -maven-resources-plugin -maven-scm -maven-shade-plugin -maven-shared-io -maven-shared-jar -maven-site-plugin -maven-stapler-plugin -maven-verifier -maven-war-plugin -mawk -maxima -maximus -mayavi2 -mazeofgalious -mb2md -mbot -mboxcheck -mboxgrep -mbr -mbt -mbtserver -mbuffer -mbw -mc -mcabber -mccs -mcdp -mcelog -mcl -mclibs -mcmcpack -mcollective -mcomix -mcpp -mcp-plugins -mcrl2 -mcron -mcrypt -mcs -mcu8051ide -md5deep -mdadm -mda-lv2 -mdbtools -mdbus -mdcfg -mdds -mdetect -mdf2iso -mdk -mdm -mdns-scan -mdp -meanwhile -mecab -mecab-ipadic -mecab-jumandic -mecab-naist-jdic -med-fichier -mediainfo -media-player-info -media-retriever -mediatomb -mediawiki -mediawiki-extensions -mediawiki-math -medicalterms -medit -mednafen -medusa -meep -meep-lam4 -meep-mpich2 -meep-mpi-default -meep-openmpi -megaglest -megaglest-data -melange -meld -meliae -melting -members -memcached -memcachedb -memchan -memdump -memlockd -memphis -memstat -memtest86 -memtest86+ -memtester -mencal -mendexk -menhir -mensis -menu -menu-cache -menu-l10n -menu-xdg -mercator -mercurial -mercurial-server -mergelog -merkaartor -mesa -mesa-demos -meschach -meshlab -mess-desktop-entries -metacam -metacity -metacity-themes -metaconfig -meta-gnome3 -meta-gnustep -metainf-services -metainit -meta-kde -meta-kde-telepathy -metalink -meta-ocaml -metapixel -metar -metastore -metatheme-gilouche -meta-unison -metche -meterbridge -meterec -me-tv -mew -mew-beta -mffm-fftw -mffm-timecode -mftrace -mg -mga-vid -mgcv -mgdiff -mgen -mgetty -mgm -mgp -mgt -mha4mysql-manager -mha4mysql-node -mhash -mh-book -mhc -mhddfs -mh-e -mhonarc -mhwaveedit -mic2 -microcode.ctl -microcom -microdc2 -micro-httpd -micro-inetd -micropolis-activity -micro-proxy -midge -mididings -midish -midori -mig -migrate -migrationtools -mii-diag -mikmatch -mikmod -milkytracker -milter-greylist -mime-construct -mimedefang -mimefilter -mimelib1 -mime-support -mimetex -mimetic -mimms -min12xxw -mina -mina2 -minbar -minbif -minc -minetest -ming -mingetty -mingw32 -mingw32-binutils -mingw32-runtime -mingw-ocaml -mingw-w64 -mini18n -minicom -mini-dinstall -minidjvu -minidlna -mini-httpd -minimodem -minirok -minisapserver -minisat+ -minisat2 -minissdpd -ministat -minit -miniupnpc -minlog -minpack -mipe -mira -mirage -miredo -mirmon -miro -mirrormagic -misc3d -miscfiles -misery -missidentify -missingh -mistelix -mitmproxy -mit-scheme -miwm -mixal -mixer.app -mixmaster -mixxx -mkcue -mkelfimage -mkgmap -mkgmapgui -mklibs -mknbi -mknfonts.tool -mksh -mktorrent -mkvtoolnix -mldonkey -mlgmp -mlmmj -mlocate -mlpcap -mlpost -mlpy -mlt -mlterm -mlton -mlv-smile -mm -mm3d -mmake -mmass -mm-common -mmm-mode -mmorph -mmpong -mmv -mnemosyne -mnemosyne-blog -mnormt -moap -mobile-atlas-creator -mobile-broadband-provider-info -moblin-cursor-theme -moblin-gtk-engine -moblin-icon-theme -moblin-menus -moblin-sound-theme -mobyle -mobyle-programs -moc -mochikit -mocker -mockito -mockobjects -mod-auth-mysql -mod-authn-webid -mod-dnssd -model-builder -modello -modello1.4 -modello-maven-plugin -modello-maven-plugin1.4 -modem-cmd -modemmanager -modestmaps-py -mod-gearman -modglue -mod-gnutls -mod-mime-xattr -mod-mono -modplugtools -mod-proxy-html -mod-ruby -modsecurity-apache -modsecurity-crs -mod-spamhaus -module-assistant -module-build-cipux -modules -mod-vhost-hash-alias -mod-vhost-ldap -mod-wsgi -moin -mojarra -mokomaze -molly-guard -mon -mona -monajat -monav -mon-client -mon-contrib -mondrian -mongodb -monit -monkeysphere -monkeystudio -monkeytail -mono -mono-addins -mono-basic -monobristol -monodevelop -monodevelop-database -monodevelop-debugger-gdb -mono-fuse -monogame -monopd -mono.reflection -monotone -monotone-viz -mono-tools -mono-uia -mono-uia-atkbridge -mono-uia-winforms -mono-upnp -mono-zeroconf -monster-masher -monsterz -moodbar -moon-buggy -moon-lander -mooproxy -moosic -mootools -moovida -moovida-plugins-bad -moovida-plugins-good -moovida-plugins-ugly -mopac7 -mopd -moreutils -morfologik-stemming -moria -morla -morse -morsegen -morse-simulator -mosh -mosquitto -most -mothur -motion -mountall -mountfloppy -mountmedia -mountpy -mouseemu -mousepad -mousetrap -mousetweaks -mova -movabletype-opensource -movixmaker-2 -mozart -mozart-stdlib -mozc -mozilla-devscripts -mozilla-dom-inspector -mozilla-noscript -mozjs -mozvoikko -mp -mp3blaster -mp3burn -mp3cd -mp3check -mp3diags -mp3fs -mp3gain -mp3info -mp3rename -mp3report -mp3roaster -mp3splt -mp3splt-gtk -mp3val -mp3wrap -mp4h -mp4v2 -mpack -mpage -mpb -mpc -mpc123 -mpclib -mpd -mpdcon.app -mpdcron -mpdris -mpdscribble -mpd-sima -mpdtoys -mpeg2dec -mpegdemux -mpfi -mpfr4 -mpg123 -mpg123-el -mpg321 -mpgtx -mpi4py -mpich2 -mpi-defaults -mpj -mplayer -mplayer2 -mplayer-blue -mpmath -mpop -mppenc -mpqc -mpris-remote -mpt-status -mr -mrb -mrbayes -mrd6 -mrename -mriconvert -mricron -mrmpi -mrtg -mrtg-ping-probe -mrtg-rrd -mrtgutils -mrtrix -mrxvt -mscgen -mscompress -msgpack -msgpack-python -msmtp -msnlib -msn-pecan -msort -msp430-libc -msp430mcu -mspdebug -msrtool -msr-tools -mssh -mstflint -msttcorefonts -msv -msva-perl -mswatch -mtasc -mtbl -mtdev -mtd-utils -mtink -mtj -mtkbabel -mtools -mtpaint -mtr -mt-st -mtx -m-tx -mu-cade -mu-cite -muddleftpd -mudita24 -mudlet -mueller -mule -multcomp -multex-base -multiboot -multicat -multiget -multimail -multimon -multipartposthandler -multipath-tools -multistrap -multitail -multitee -multiwatch -mumble -mumble-django -mummer -mummy -mumps -mumudvb -munge -munge-maven-plugin -munin -munin-libvirt-plugins -munin-plugins-openstack -munkres -muparser -mupdf -mupen64plus -mupen64plus-audio-sdl -mupen64plus-core -mupen64plus-input-sdl -mupen64plus-rsp-hle -mupen64plus-rsp-z64 -mupen64plus-ui-console -mupen64plus-video-arachnoid -mupen64plus-video-glide64 -mupen64plus-video-rice -mupen64plus-video-z64 -muroar -muroard -murrine-themes -muscle -muse -museek+ -muse-el -musescore -music -music123 -musicbrainzngs -musiclibrarian -musique -musixtex -mussh -mustang -mustang-plug -mutagen -mutextrace -mutrace -mutt -mutter -muttprint -muttprofile -mvel -mvtnorm -mwrap -mx -mxallowd -mxml -mydumper -myghty -myghtyutils -mygpoclient -mylvmbackup -myodbc -mypaint -myproxy -myrescue -myspell -myspell-el-gr -myspell-fa -myspell-hr -myspell-hy -myspell-ku -myspell-lv -myspell.pt -myspell-pt-br -myspell-sk -myspell-sl -mysql++ -mysql-5.5 -mysql-connector-c++ -mysql-connector-java -mysql-connector-net -mysql-connector-python -mysql-mmm -mysql-ocaml -mysql-proxy -mysqltcl -mysqltuner -mysql-utilities -mysql-workbench -mysqmail -mythes -mythes-it -mythtvfs-fuse -mythtv-status -mytop -mz -n2n -nabi -nacl -nadoka -naga -nagios3 -nagiosgrapher -nagios-images -nagios-nrpe -nagios-plugin-check-multi -nagios-plugins -nagios-plugins-contrib -nagios-plugins-openstack -nagios-snmp-plugins -nagircbot -nagstamon -nagvis -nagzilla -nailgun -naist-jdic -nam -nama -namazu2 -namebench -nana -nano -nanoblogger -nanoblogger-extra -nant -nap -nas -nasm -naspro-bridge-it -naspro-bridges -naspro-core -nast -nasty -nat -natbraille -naturaldocs -nautilus -nautilus-actions -nautilus-compare -nautilus-filename-repairer -nautilus-image-converter -nautilus-image-manipulator -nautilus-open-terminal -nautilus-pastebin -nautilus-python -nautilus-scripts-manager -nautilus-sendto -nautilus-share -nautilus-wipe -navi2ch -navit -nbd -nbibtex -nbtscan -nc6 -ncap -ncbi-blast+ -ncbi-tools6 -ncc -ncdt -ncdu -ncftp -ncmpc -ncmpcpp -nco -ncompress -ncpfs -ncurses -ncurses-hexedit -ncview -nd -ndesk-dbus -ndesk-dbus-glib -ndisc6 -ndisgtk -ndiswrapper -ndoutils -ndpmon -ne -neartree -nec -nec2c -necpp -nedit -neko -nekobee -nekohtml -nemiver -neo -neobio -neon27 -net6 -net-acct -netanim -netatalk -netbase -netbeans -netbeans-cvsclient -netcat -netcat-openbsd -netcdf -netcf -netcfg -netdiag -netdisco -netdisco-mibs-installer -netdiscover -net-dns-fingerprint -netemul -netenv -netexpect -nethack -nethack-el -nethack-spoilers -nethogs -netifaces -netio230a -netkit-bootparamd -netkit-ftp -netkit-ftp-ssl -netkit-ntalk -netkit-rsh -netkit-rusers -netkit-rwall -netkit-rwho -netkit-telnet -netkit-telnet-ssl -netkit-tftp -netlib-java -net-luminis-build-plugin -netmask -netmaze -netmrg -netpanzer -netpbm-free -netperfmeter -netpipe -netpipes -netplug -netqmail -netrek-client-cow -net-retriever -netrik -netris -netrw -netscript-2.4 -netsed -netselect -netsend -netsniff-ng -net-snmp -netspeed -netstat-nat -netsurf -net-telnet-cisco -nettle -nettoe -net-tools -netty -netty3.1 -netw-ib-ox-ag -network-config -network-console -networkmanagement -network-manager -network-manager-applet -network-manager-iodine -network-manager-openconnect -network-manager-openvpn -network-manager-pptp -network-manager-strongswan -network-manager-vpnc -neverball -nevow -newbiedoc -newlib -newmail -newmat -newsbeuter -newt -newtonsoft-json -nexuiz -nexuiz-data -nexus -nfdump -nflog-bindings -nfoview -nfqueue-bindings -nfs4-acl-tools -nfs-utils -nfswatch -ng -nget -ngetty -nginx -ngircd -nglister -ngorca -ngraph-gtk -ngrep -ng-utils -nibabel -nickle -nicotine -nicovideo-dl -nictools-pci -nifticlib -nikwi -nilfs-tools -nini -ninix-aya -ninja -ninvaders -nip2 -nipype -nis -nitime -nitpic -nitrogen -njam -njplot -nkf -nlkt -nlme -nload -nlpsolver -nmap -nmapsi4 -nmh -nml -nmon -nmzmail -nn -nobootloader -nodau -node -nodebox-web -nodm -noiz2sa -nomarch -nomnom -nordugrid-arc-doc -normalize-audio -norwegian -nose -nosexcover -nosquint -nostalgy -note -notebook -notification-daemon -notify-osd -notify-python -notify-sharp -notmuch -nova -novnc -noweb -npapi-vlc -npth -nqc -nqp -nrg2iso -nrss -ns2 -nsca -nsd3 -nsis -nslint -nspr -nss -nsscache -nss-mdns -nss-pam-ldapd -nss-passwords -nss-updatedb -nstreams -nted -ntfs-3g -ntfs-config -ntfsdoc -ntl -ntlmaps -ntop -ntp -ntrack -nuapplet -nufw -nukeimage -nullidentd -nullmailer -nulog -numactl -numdiff -numexpr -numlockx -numm -numptyphysics -num-utils -nunit -nurpawiki -nusoap -nut -nut-nutrition -nuttcp -nvclock -nvi -nvidia-settings -nvidia-settings-legacy-173xx -nvidia-support -nvidia-texture-tools -nvidia-xconfig -nvramtool -nvram-wakeup -nvtv -nwall -nwchem -nwdiag -nwrite -nwsclient -nwsserver -nxcl -nx-libs-lite -nxt-python -nyancat -nyquist -nzb -nzbget -oaklisp -oar -oasis -oasis3 -oath-toolkit -oauth-signpost -obby -obconf -obdgpslogger -obexd -obex-data-server -obexfs -obexftp -obexpushd -obfsproxy -objcryst-fox -objenesis -objgraph -obmenu -obnam -oboinus -obrowser -obus -ocaml -ocamlagrep -ocaml-alsa -ocaml-ao -ocaml-atd -ocaml-batteries -ocaml-benchmark -ocaml-bitstring -ocaml-bjack -ocamlbricks -ocaml-config-file -ocamlcreal -ocaml-cry -ocaml-csv -ocaml-curses -ocamldap -ocaml-data-notation -ocaml-dbus -ocaml-deriving -ocaml-deriving-ocsigen -ocamldsort -ocaml-dssi -ocaml-dtools -ocamlduce -ocaml-duppy -ocaml-expat -ocaml-expect -ocaml-extunix -ocaml-faad -ocaml-fileutils -ocaml-flac -ocaml-gavl -ocaml-getopt -ocaml-gettext -ocaml-gnuplot -ocamlgraph -ocamlgsl -ocaml-gstreamer -ocaml-http -ocamlify -ocaml-inifiles -ocaml-inotify -ocaml-ladspa -ocaml-lame -ocaml-lastfm -ocaml-libvirt -ocaml-lo -ocaml-mad -ocaml-magic -ocamlmakefile -ocaml-melt -ocaml-mm -ocamlmod -ocamlnet -ocamlodbc -ocaml-ogg -ocamlpam -ocaml-portaudio -ocaml-pulseaudio -ocaml-reins -ocaml-res -ocaml-samplerate -ocaml-schroedinger -ocamlsdl -ocaml-sha -ocaml-shout -ocaml-soundtouch -ocaml-speex -ocaml-sqlexpr -ocaml-sqlite3 -ocaml-ssl -ocaml-taglib -ocaml-text -ocaml-theora -ocaml-tools -ocaml-usb -ocamlviz -ocaml-voaacenc -ocaml-vorbis -ocamlwc -ocamlweb -ocaml-xmlplaylist -ocaml-zarith -oce -ocfs2-tools -ocl-icd -ocp -ocr4gamera -ocrad -ocrfeeder -ocrodjvu -ocsigen -ocsigenserver -ocsinventory-agent -ocsinventory-server -octave -octave-audio -octave-benchmark -octave-communications -octave-control -octave-dataframe -octave-data-smoothing -octave-econometrics -octave-epstk -octave-financial -octave-fixed -octave-fpl -octave-ga -octave-general -octave-geometry -octave-gsl -octave-image -octave-io -octave-java -octave-linear-algebra -octave-mapping -octave-miscellaneous -octave-missing-functions -octave-nan -octave-nnet -octave-nurbs -octave-ocs -octave-octcdf -octave-octgpr -octave-odepkg -octave-openmpi-ext -octave-optim -octave-optiminterp -octave-pkg-dev -octave-plot -octave-quaternion -octave-secs1d -octave-secs2d -octave-signal -octave-sockets -octave-specfun -octave-splines -octave-statistics -octave-strings -octave-struct -octave-symbolic -octave-tsa -octave-vrml -octave-zenity -ocurl -ode -odin -odot -odt2txt -ofed-docs -offlineimap -oflib -ofono -ofono-phonesim -ogamesim -ogdi-dfsg -oggconvert -oggfwd -oggvideotools -ogmtools -ognl -ogre -ogre-1.8 -ohai -ohcount -oidentd -oidua -oinkmaster -ois -okular -olap4j -oldsys-preseed -olive -olpc-kbdshim -olpc-powerd -olpc-xo1 -olsrd -omake -omega-rpg -omegat -omegat-plugin-tokenizer -omhacks -omins -omnievents -omniorb-dfsg -omt -onak -oneisenough -oneko -oneliner-el -onesixtyone -onetime -onioncat -onscripter -ontv -oocairo -oolite -ooo2dbk -ooolib-perl -ooolib-python -ooo-thumbnailer -oopango -opal -opalmod -opari -openafs -openais -openal-soft -openam -openarena -openarena-085-data -openarena-088-data -openarena-data -openarena-maps -openarena-misc -openarena-players -openarena-players-mature -openarena-textures -open-axiom -openbabel -openbios-ppc -openbios-sparc -openblas -openbmap-logger -openbox -openbox-themes -openbsd-inetd -openbve -openbve-data -opencc -openchange -opencity -openclipart -openclipart2 -open-cobol -openconnect -opencore-amr -opencryptoki -opencsg -openct -opencv -opendict -opendict-lingvosoft -opendkim -opendnssec -openexr -openexr-viewers -openfetion -open-font-design-toolkit -open-gram -openguides -openhackware -openhpi -openid4java -openigtlink -openimageio -openinbrowser -open-invaders -openipmi -open-iscsi -openjade -openjade1.3 -openjdk-6 -openjdk-7 -openjpa -openjpeg -open-jtalk -openlayers -openldap -openload -openlp -openmcdf -openmeeg -openmpi -openmsx -openmsx-catapult -openmsx-debugger -openmx -opennebula -openntpd -openocd -openoffice.org -openoffice.org-dictionaries -openoffice.org-en-au -openoffice.org-hyphenation-pl -openoffice.org-thesaurus-pl -openoffice-python -openopt -openpref -openpyxl -openr2 -openresolv -openrocket -opensaml2 -opensc -openscad -openscap -openscenegraph -opense-basic -openshot -openslide -openslp-dfsg -opensm -opensp -opensrs-client -openssh -openssh-blacklist -openssl -openssl-blacklist -openssn -openstack-common -openstereogram -openstreetmap-map-icons -openstv -openswan -openteacher -openthesaurus -opentk -opentoken -openttd -openttd-opengfx -openttd-openmsx -openturns -openuniverse -openvanilla-modules -open-vm-tools -openvpn -openvpn-auth-ldap -openvpn-auth-radius -openvpn-blacklist -openvrml -openvswitch -openwalnut -openwince-include -openwince-jtag -openxenmanager -openyahtzee -ophcrack -op-panel -opsin -opt -optcomplete -optgeo -opticalraytracer -optipng -opus -opus-tools -ora2pg -orafce -orage -orange -orbit2 -orbital-eunuchs-sniper -orc -oregano -org-mode -origami -original-awk -oroborus -orpie -orville-write -osc -oscache -oscpack -osdclock -osdsh -osgearth -osgi-compendium -osgi-core -osgi-foundation-ee -osm2pgsql -osm-gps-map -osmium -osmo -osmosis -osmpbf -os-prober -osptoolkit -oss4 -oss-compat -ossim -oss-preserve -osspsa -ossp-uuid -otags -otcl -otf -otf2bdf -otp -otpw -otrs2 -otrs2-doc -ots -otter -ounit -outguess -overgod -ovito -owasp-java-html-sanitizer -owfs -owl -ow-util-ant-tasks -owx -oxref -oxygencursors -oxygen-gtk3 -oxygen-icons -p0f -p10cfgd -p11-kit -p3scan -p7zip -p910nd -p9m4 -pacemaker -pachi -packagekit -packagesearch -packaging-dev -packaging-tutorial -packeth -packit -packup -pacman -pacman4console -paco -pacparser -pacpl -padre -pads -page-crunch -pagodacf -paje.app -pal -palbart -palp -pam -paman -pam-dbus -pam-krb5-migrate -pam-mysql -pam-p11 -pam-pgsql -pam-pkcs11 -pam-python -pam-shield -pam-tmpdir -pan -pandas -pandoc -pandora-build -pandorafms-agent -pango1.0 -pango-graphite -pangomm -pangzero -pantomime1.2 -papercut -paperkey -paprass -paprefs -paps -par -par2cmdline -parallel -parallelpython -paramiko -paraview -parcellite -parchive -parcimonie -paredit-el -pari -pari-elldata -pari-extra -pari-galdata -pari-galpol -pari-seadata -paris-traceroute -parley -parole -parprouted -parrot -parsec47 -parsedatetime -parser -parser-mysql -parsewiki -partclone -partconf -parted -partimage -partimage-doc -partitionmanager -partman-auto -partman-auto-crypto -partman-auto-lvm -partman-auto-raid -partman-base -partman-basicfilesystems -partman-basicmethods -partman-btrfs -partman-crypto -partman-efi -partman-ext3 -partman-jfs -partman-lvm -partman-md -partman-multipath -partman-nbd -partman-partitioning -partman-reiserfs -partman-target -partman-ufs -partman-xfs -pasco -pasmo -passage -passepartout -passwdqc -password-gorilla -passwordmaker-cli -paste -pastebinit -pastedeploy -pastescript -pastewebkit -patch -patchage -patcher -patchutils -pathfinder -pathogen -pathological -pathological-music -pauker -paulstretch -pavucontrol -pavuk -pavumeter -paw -pax -paxctl -pax-utils -pbnj -pbs -pbs-drmaa -pbuilder -pbzip2 -pcal -pcalendar -pcaputils -pcapy -pcb -pcb2gcode -pccts -pcf2bdf -pchar -pciutils -pclock -pcmanfm -pcmanx-gtk2 -pcmciautils -pconsole -pcre3 -pcre-ocaml -pcscada -pcsc-cyberjack -pcsc-lite -pcsc-perl -pcsc-tools -pcsxr -pct-scanner-scripts -pd-arraysize -pdb2pqr -pd-bassemu -pd-beatpipe -pd-boids -pd-bsaylor -pd-comport -pd-cxc -pd-cyclone -pd-earplug -pd-ekext -pd-ext13 -pdf2djvu -pdf2svg -pdfchain -pdfcrack -pdfcube -pdfgrep -pd-flite -pdfminer -pdfmod -pdfposter -pdf-presenter-console -pd-freeverb -pdfresurrect -pdfrw -pdfsam -pdfshuffler -pdftk -pdftoipe -pd-ggee -pd-hcs -pd-hid -pd-iemambi -pd-iemmatrix -pd-iemnet -pd-jmmmp -pdl -pd-libdir -pd-list-abs -pdlzip -pd-mapping -pd-markex -pd-maxlib -pdmenu -pd-mjlib -pd-moonlib -pd-motex -pdns -pdnsd -pdns-recursor -pd-osc -pdp -pd-pan -pd-pddp -pd-pdogg -pd-plugin -pd-pmpd -pd-purepd -pd-readanysf -pdsh -pd-sigpack -pd-smlib -pd-vbap -pd-wiimote -pd-windowing -pd-zexy -pear-horde-channel -pearpc -pear-phpunit-channel -pear-symfony-project-channel -pebl -pecomato -pegasus-wms -peg-e -pegsolitaire -peg-solitaire -pekwm -pekwm-themes -pen -penguin-command -pennmush -pentaho-reporting-flow-engine -pente -pentium-builder -pentobi -pep8 -perceptualdiff -percona-toolkit -perdition -perforate -performous -perftest -perl -perl4caml -perlbal -perlbrew -perl-byacc -perlconsole -perl-depends -perl-doc-html -perlindex -perlipq -perlpanel -perlprimer -perltidy -perl-tk -permute -perroquet -personasplus -perspectives-extension -pescetti -pesto -petit -petitboot -petri-foo -petris -petsc -pev -pexec -pexpect -pfb2t1c2pfb -pflogsumm -pfm -pfqueue -pfstmo -pfstools -pgadmin3 -pgagent -pgapack -pgbouncer -pgdbf -pgf -pgfincore -pgfouine -pgloader -pgmemcache -pgn2web -pgn-extract -pgocaml -pgpdump -pgpgpg -pgpool2 -pgsnap -pgstaging -pgtap -pgtcl -pgtune -pgxnclient -phalanx -phamm -phasex -phat -phatch -phenny -phlipple -phnxdeco -phonefsod -phoneui-apps -phoneuid -phonon -phonon-backend-gstreamer -phonon-backend-vlc -phoronix-test-suite -photofilmstrip -photon -photopc -photoprint -php5 -php-adodb -php-apc -php-arc -php-auth -php-auth-http -php-auth-sasl -phpbb3 -php-cache -php-cache-lite -php-cas -php-codecoverage -php-codesniffer -php-compat -php-config -php-console-table -php-crypt-blowfish -php-crypt-cbc -php-date -php-db -php-doc -php-elisp -php-event-dispatcher -php-file -php-file-iterator -php-fpdf -php-geoip -php-getid3 -php-gettext -php-html-common -php-htmlpurifier -php-html-safe -php-html-template-it -php-http -php-http-request -php-http-upload -php-http-webdav-server -php-image-text -php-imagick -php-imlib -php-invoker -phpldapadmin -php-letodms-core -php-letodms-lucene -php-log -php-mail -php-mail-mime -php-mail-mimedecode -php-mdb2 -php-mdb2-driver-mysql -php-mdb2-driver-pgsql -php-mdb2-schema -php-memcache -php-memcached -php-mime-type -phpmyadmin -php-net-checkip -php-net-dime -php-net-dnsbl -php-net-ftp -php-net-imap -php-net-ipv4 -php-net-ipv6 -php-net-ldap -php-net-ldap2 -php-net-lmtp -php-net-nntp -php-net-portscan -php-net-sieve -php-net-smartirc -php-net-smtp -php-net-socket -php-net-url -php-net-url2 -php-net-whois -php-numbers-words -php-openid -php-pager -phppgadmin -php-ps -php-radius -phpreports -php-rrd -php-sasl -php-services-json -php-services-weather -php-soap -php-ssh2 -php-svn -php-symfony-yaml -phpsysinfo -php-text-captcha -php-text-figlet -php-text-password -php-text-template -php-text-wiki -php-timer -php-token-stream -php-tokyo-tyrant -phpunit -phpunit-mock-object -phpunit-selenium -phpunit-story -php-validate -phpwebcounter -phpwebcounter-extra -php-xajax -php-xml-dtd -php-xml-htmlsax3 -php-xml-parser -php-xml-rpc -php-xml-rpc2 -php-xml-rss -php-xml-serializer -phyml -pianobar -pianobooster -picard -picard-tools -picocom -picolisp -picosat -picprog -picviz -pida -pidentd -pidgin -pidgin-audacious -pidgin-awayonlock -pidgin-blinklight -pidgin-encryption -pidgin-extprefs -pidgin-festival -pidgin-gmchess -pidgin-hotkeys -pidgin-lastfm -pidgin-latex -pidgin-librvp -pidgin-microblog -pidgin-mpris -pidgin-mra -pidgin-musictracker -pidgin-nateon -pidgin-openfetion -pidgin-openpgp -pidgin-otr -pidgin-privacy-please -pidgin-sipe -pidgin-skype -pidgin-twitter -piespy -pigment -pigment-python -pigz -pilot-link -pilot-manager -pimd -pinball -pinentry -pinfo -pingus -pinot -pinpoint -pinta -pinyin-database -pioneers -pion-net -pipebench -pipemeter -pipenightdreams -pipewalker -pisa -pisg -pithos -pitivi -piuparts -pius -pivy -piwi -pixbros -pixelize -pixelmed -pixfrogger -pixman -pixmap -pkcs11-data -pkcs11-dump -pkcs11-helper -pkg-components -pkg-config -pkg-kde-tools -pkglab -pkg-mozilla-archive-keyring -pkg-php-tools -pkgsel -pkgsync -pkpgcounter -pktstat -plait -plan -planets -planet-venus -planner -planner-el -plasma-widget-adjustableclock -plasma-widget-cwp -plasma-widget-fastuserswitch -plasma-widget-menubar -plasma-widget-message-indicator -plasma-widget-smooth-tasks -plasma-widget-yawp -plasmidomics -plastex -plastimatch -player -playitslowly -playmidi -playonlinux -plee-the-bear -pleiades -plexus-active-collections -plexus-ant-factory -plexus-archiver -plexus-bsh-factory -plexus-build-api -plexus-cdc -plexus-cipher -plexus-classworlds -plexus-classworlds2 -plexus-cli -plexus-compiler -plexus-component-api -plexus-component-metadata -plexus-container-default -plexus-containers -plexus-containers1.5 -plexus-digest -plexus-i18n -plexus-interactivity-api -plexus-interpolation -plexus-io -plexus-maven-plugin -plexus-sec-dispatcher -plexus-utils -plexus-utils2 -plexus-velocity -plib -plib-doc -plink -ploader -plopfolio.app -plotdrop -ploticus -ploticus-doc -plotmm -plotutils -plplot -plptools -plr -plucker -plum -ply -plymouth -plywood -plzip -pmacct -pmailq -pmake -pmccabe -pmidi -pmk -pmount -pms -pmtools -pm-utils -pmw -pmx -png++ -png23d -png2html -pngcheck -pngcrush -png-definitive-guide -pnglite -pngmeta -pngnq -pngphoon -pngquant -png-sixlegs -pngtools -pnm2ppa -pnopaste -pnp4nagios -pnscan -po4a -poa -pocketpc-cab -poco -poco-doc -poc-streamer -pod2pdf -podbrowser -po-debconf -podget -podracer -poe.app -poedit -poker-eval -pokerth -polarssl -poldi -polib -policycoreutils -policyd-weight -policykit-1 -policykit-1-gnome -policyrcd-script-zg2 -polipo -polkit-kde-1 -polkit-qt-1 -polspline -polybori -polygen -polyglot -polygraph -polylib -polyml -polyorb -pommed -pondus -pong2 -pop3browser -popa3d -poppass-cgi -poppassd -poppler -poppler-data -popplerkit.framework -poppler-sharp -popt -popularity-contest -populations -pork -portabase -portaudio -portaudio19 -portlet-api-2.0-spec -portmidi -portreserve -portsentry -portslave -portsmf -posh -posixlock -posixtestsuite -postal -post-el -poster -posterazor -post-faq -postfix -postfixadmin -postfix-cluebringer -postfix-gld -postfix-policyd-spf-perl -postfwd -postgis -postgresql-8.4 -postgresql-9.1 -postgresql-autodoc -postgresql-common -postgresql-debversion -postgresql-filedump -postgresql-ocaml -postgresql-pgmp -postgresql-pljava -postgresql-pllua -postgresql-plproxy -postgresql-plsh -postgrey -postmark -postnews -postpone -postr -potool -potrace -pound -powerman -powermanga -powermgmt-base -powertop -powstatd -pperl -ppl -ppmd -ppp -pppconfig -pppoeconf -pp-popularity-contest -pps-tools -pptpd -pptp-linux -pqiv -praat -prads -prayer -prboom -prctl -predict -prefix -prelink -preload -prelude-correlator -prelude-lml -prelude-manager -prelude-notify -premail -premake -preprepare -preprocess -prerex -presage -preseed -prettytable -pretzel -preview.app -prewikka -prey -price.app -prima -primaxscan -prime -prime-dict -primer3 -primrose -printer-applet -printfilters-ppd -printing-metas -prips -prison -pristine-tar -privbind -privoxy -probalign -probcons -processing-core -procinfo -procmail -procmail-lib -procmeter3 -procps -procserv -proda -profnet -profphd -profphd-utils -proftmb -proftpd-dfsg -proftpd-mod-autohost -proftpd-mod-case -proftpd-mod-clamav -proftpd-mod-dnsbl -proftpd-mod-fsync -proftpd-mod-geoip -proftpd-mod-msg -proftpd-mod-tar -proftpd-mod-vroot -proguard -proj -projectcenter.app -projectl -projectm -proj-ps-doc -prolix -proll -prolog-el -promoe -proofgeneral -propaganda-debian -prophet -prosody -prosper -protoaculous -protobuf -protobuf-c -prototypejs -prover9-manual -proxsmtp -proxychains -proxycheck -proxy-suite -proxytunnel -ps2eps -psad -pscan -psensor -psgml -psi -psicode -psignifit -psignifit3 -psimedia -psi-plus -psi-translations -pslib -pslist -psmisc -pspp -pspresent -psqlodbc -psrip -pssh -pstack -pstoedit -pstotext -pstreams -psutils -ps-watcher -psychopy -psychtoolbox-3 -psycopg2 -ptex2tex -ptex-base -ptex-buildsupport -pth -ptlib -ptop -ptouch-driver -ptpd -ptunnel -publib -publican -publican-debian -pubtal -pudb -puddletag -puf -pugl -pulseaudio -pump -puppet -puppet-lint -puredata -puredata-import -pure-ftpd -purelibc -purifyeps -purity -purity-ng -purity-off -purple-plugin-pack -putty -pv -pvclust -pvm -pvpgn -pvrg-jpeg -pwauth -pwdhash -pwgen -pwget -pwman3 -pwrkap -pxe -pxe-kexec -pxlib -pxljr -pxp -pxsl-tools -py3cairo -py3dns -pyacidobasic -pyacoustid -pyaimt -pyalsaaudio -pyamf -pyao -pyasn1 -py-asterisk -pyatspi -pybik -pybliographer -pyblosxom -pybluez -pybridge -pybtex -pyca -pycairo -pycalendar -pycallgraph -pycaml -pycaptcha -pycha -pychecker -pychess -pychm -pyclamd -pycmail -pycocuma -pycountry -pycparser -pycryptopp -pycuda -pycurl -pycxx -pydap -pydb -pydf -pydhcplib -pydicom -pydirector -pydoctor -pydot -pyecm -pyenchant -pyentropy -pyepl -pyepr -pyevolve -pyew -pyexcelerator -pyexiv2 -pyfai -pyfiglet -pyfits -pyflakes -pyfltk -pyformex -pyfribidi -pyftpd -pyg -pygame -pygccxml -pygdchart2 -pyglet -pygments -pygmy -pygobject -pygobject-2 -pygoocanvas -pygooglechart -pygopherd -pygpgme -pygpiv -pygrace -pygresql -pygrib -pygtk -pygtkmvc -pygtksourceview -pyhamcrest -pyicqt -pyicu -pyimport-relative -pyinotify -pyip -pyjavaproperties -pyjunitxml -pykaraoke -pykcs11 -pykde4 -pyke -pykerberos -pykickstart -pylast -pyliblo -pylibmc -py-libmpdclient -pylibravatar -pylibssh2 -pylint -pylirc -pylogsparser -pylons -pylucene -pymacs -pymad -pymca -pyme -pymecavideo -pymetrics -pymilter -pymilter-milters -pymissile -pymodbus -pymol -pymongo -pymsnt -pymssql -pymtbl -pymtp -pymvpa -pymvpa2 -pynagram -pyneighborhood -pynetsnmp -pynifti -pynn -pyntor -pyodbc -pyode -pyogg -pyopencl -pyopengl -pyopenssl -pyoptical -pyorbit -pyp -pypar2 -pyparallel -pyparsing -pyparted -pype -pypibrowser -pyplusplus -pypolicyd-spf -py-postgresql -pyppd -pyprotocols -pypureomapi -pyquery -pyqwt3d -pyqwt5 -pyracerz -pyrad -py-radix -pyragua -pyramid-beaker -pyrenamer -pyrex -pyrit -pyrite-publisher -pyro -pyroman -pyroom -pyrrd -pysatellites -pyscard -pyscrabble -pyscript -py-sendfile -pyserial -pysesame -pyshp -pyside -pyside-tools -pysieved -pysmbc -pysolfc -pysolfc-cardsets -pysparse -pyspatialite -pyspf -pyspi -pyspread -pystatgrab -pystemmer -pysubnettree -pysurfer -pysvn -pysycache -pytables -pytagsfs -pytango -pytest -pytest-xdist -pyth -pythia8 -python2.6 -python2.7 -python3.2 -python3-chardet -python3-dateutil -python3-defaults -python3-stdlib-extensions -python-aalib -python-adns -python-adodb -python-aiml -python-amqplib -python-anyjson -python-application -python-apptools -python-apsw -python-apt -python-ase -python-aspects -python-async -python-augeas -python-authkit -python-avc -python-axiom -python-babel -python-bibtex -python-biggles -python-biopython -python-bitarray -python-bitbucket -python-bloomfilter -python-boto -python-bottle -python-box2d -python-bsddb3 -python-buzhug -python-byteplay -python-bzutils -pythoncad -pythoncard -python-carrot -python-cdd -python-cddb -python-central -python-chaco -python-chameleon -python-cherrypy -python-cjson -python-cl -python-clamav -python-cliapp -python-clint -python-cloudfiles -python-cloudservers -python-cluster -python-cobe -python-cogent -python-colorama -python-concurrent.futures -python-configglue -python-contract -python-couchdb -python-couchdbkit -python-coverage -python-coverage-test-runner -python-cpl -python-crypto -python-csa -python-cssselect -python-ctypeslib -python-cups -python-daap -python-daemon -python-dateutil -python-debian -python-debianbts -python-decorator -python-defaults -python-defer -python-demgengeo -python-demjson -python-dexml -python-dhm -pythondialog -python-dingus -python-distutils-extra -python-django -python-django-contact-form -python-django-debug-toolbar -python-django-djapian -python-django-extdirect -python-django-feincms -python-django-formfieldset -python-django-lint -python-django-localeurl -python-django-mptt -python-django-registration -python-django-rosetta -python-django-shorturls -python-django-social-auth -python-django-south -python-django-tagging -python-django-threadedcomments -python-django-tinymce -python-django-treebeard -python-django-voting -python-django-websocket -python-djvulibre -python-dmidecode -python-dns -python-docutils -python-dpkt -python-drizzle -python-dsv -python-easygui -python-edbus -python-elements -python-enable -python-enet -python-enthoughtbase -python-enum -python-envisage -python-envisagecore -python-envisageplugins -python-espeak -python-ethtool -python-eventlet -python-exif -python-fabio -python-facebook -python-fastimport -python-feedvalidator -python-fftw -python-fixtures -python-flexmock -python-flickrapi -python-formalchemy -python-formencode -python-fs -python-fudge -python-fuse -python-gasp -python-gd -python-gdata -python-gearman -python-geoclue -python-geohash -python-geoip -python-gevent -python-gflags -python-git -python-gitdb -python-glpk -python-gmpy -python-gnatpython -python-gnupg -python-gnuplot -python-gnutls -python-goopy -python-graph -python-greenlet -python-gtk2-tutorial -python-gtkglext1 -python-gudev -python-gvgen -python-hl7 -python-html2text -python-htmltmpl -python-httplib2 -python-http-parser -python-id3 -python-igraph -python-imaging -python-imaging-doc-handbook -python-iniparse -python-initgroups -python-iowait -python-ipaddr -python-ipcalc -python-iplib -python-irclib -python-iso8583 -python-iso8601 -python-jpype -python-jsonrpc2 -python-jsonschema -python-jswebkit -python-kajiki -python-keyczar -python-keyring -python-keystoneclient -python-kinterbasdb -python-krbv -python-lamson -python-larch -python-launchpadlib -python-ldap -python-ldap-doc -python-lepl -python-leveldb -python-levenshtein -python-liblas -python-libpcap -python-lightblue -python-llfuse -python-lockfile -python-logging-extra -python-lzma -python-lzo -python-macaron -pythonmagick -python-mailer -python-markdown -python-mecab -python-mechanize -python-medusa -python-melangeclient -python-meld3 -python-memcache -python-messaging -python-mhash -python-midiutil -python-mimeparse -python-minimock -python-mock -python-mode -python-mod-pywebsocket -python-mongoengine -python-mox -python-mpd -python-mrjob -python-musicbrainz2 -python-mysqldb -python-netaddr -python-netfilter -python-networkx -python-neuroshare -python-nids -python-nmap -python-notify2 -python-novaclient -python-nss -python-numpy -python-oauth -python-oauth2 -python-oauthlib -python-old-doctools -python-omniorb -python-openid -python-opster -python-osd -python-otr -python-pam -python-passfd -python-passlib -python-pcs -python-pdftools -python-peak.rules -python-peak.util -python-pefile -python-pgmagick -python-phoneutils -python-pika -python-pip -python-pipeline -python-plwm -python-pmw -python-popcon -python-poppler -python-poppler-qt4 -python-poster -python-pqueue -python-prctl -python-progressbar -python-protobuf.socketrpc -python-prowlpy -python-psutil -python-ptrace -python-pyalsa -python-pyaudio -python-pychart -python-pyds9 -python-pyface -python-pyftpdlib -python-pygraphviz -python-pyhsm -python-pylibacl -python-pymetar -python-pynast -python-pyo -python-pypcap -python-pypdf -python-pypm -python-pyproj -python-pyramid -python-pyramid-tm -python-pyramid-zcml -python-pyrss2gen -python-pysearch -python-pysnmp4 -python-pysnmp4-apps -python-pysnmp4-mibs -python-pysolr -python-pysqlite1.1 -python-pysqlite2 -python-pytc -python-pytils -python-pytyrant -python-pywcs -python-pyxattr -python-qrencode -pythonqt -python-qt4 -python-quantities -python-quantumclient -python-recaptcha -python-redis -python-regex -python-reportlab -python-repoze.lru -python-repoze.sphinx.autointerface -python-repoze.tm2 -python-repoze.what -python-repoze.what-plugins -python-repoze.who -python-repoze.who-plugins -python-restkit -python-scientific -python-scipy -python-scrapy -python-scriptutil -python-setproctitle -python-setupdocs -python-sfml -python-shapely -python-simpy -python-slimmer -python-smbpasswd -python-smmap -python-snappy -python-soaplib -python-soappy -python-socketpool -python-socksipy -python-sponge -python-sptest -python-sqlite -python-stdlib-extensions -python-stdnum -python-stompy -python-sunlight -python-support -python-tcpwrap -python-tempita -python-testscenarios -python-testtools -python-textile -python-tgext.admin -python-tidylib -python-torctl -python-tornado -python-toscawidgets -pythontracer -python-tracing -python-traits -python-traitsbackendqt -python-traitsbackendwx -python-traitsgui -python-traitsui -python-translationstring -python-trml2pdf -python-ttystatus -python-txosc -python-tz -python-ucltip -python-unac -python-unicodecsv -python-uniconvertor -python-unipath -python-unit -python-unshare -python-urllib3 -python-utmp -python-venusian -python-virtualenv -python-visual -python-vobject -python-vsgui -python-w3lib -python-wadllib -python-weberror -python-webflash -python-weblib -python-webob -python-webunit -python-werkzeug -python-whisper -python-whiteboard -python-whois -python-whoosh -python-wordpress-library -python-wxmpl -python-xattr -python-xklavier -python-xlib -python-xlrd -python-xmlrunner -python-xmltv -python-xmpp -python-yenc -python-yubico -pytimechart -pytone -pytools -pytracer -pytrainer -pyudev -pyusb -pyvnc2swf -pyvorbis -pyvtk -pywapi -pywavelets -pywbem -pywebdav -pywebkitgtk -pyx -pyxdg -pyxid -pyxine -pyxmpp -pyxnat -pyxpcom -pyxplot -pyyaml -pyzmq -pyzor -q4wine -qalculate-gtk -qantenna -qapt -qastools -qbankmanager -qbittorrent -qbrew -qbzr -qca2 -qca2-plugin-gnupg -qca2-plugin-ossl -qca-cyrus-sasl -qcad -qcomicbook -qconf -qct -qd -qdacco -qdbm -qdjango -qdox -qedje -qelectrotech -qemu -qemuctl -qemu-kvm -qemu-launcher -qfits -qgis -qgit -qgo -qhull -qiime -qimageblitz -qimhangul -qingy -qiv -qjackctl -qjackrcd -qjson -qlandkartegt -qla-tools -qliss3d -qlvnictools -qmail-run -qmail-tools -qmc -qmf -qmhandle -qmidiarp -qmidinet -qmidiroute -qmmp -qmpdclient -qmtest -qnapi -qoauth -qof -qonk -qpdf -qpdfview -qpid-cpp -qpid-python -qpid-qmf -qpid-tools -qprint -qpsmtpd -qpxtool -qrencode -qrfcview -qrq -qr-tools -qrupdate -qsampler -qsapecng -qscintilla2 -qsf -qsstv -qstardict -qstat -qsynth -qt4-perl -qt4-x11 -qtads -qt-assistant-compat -qt-at-spi -qtcreator -qtemu -qterm -qtexengine -qt-gstreamer -qthid-fcd-controller -qtiplot -qtl -qtm -qtmobility -qtoctave -q-tools -qtractor -qtruby -qtscriptgenerator -qtscrob -qt-sdk -qtsmbstatus -qtwebkit -qtzeitgeist -quadprog -quagga -quake -quake3 -quakespasm -quantlib -quantlib-refman-html -quantlib-swig -quantum -quarry -quassel -quelcom -quesoglc -queuegraph -quicklisp -quickml -quickplot -quicksynergy -quilt -quilt-el -quisk -quitcount -quixote -quixote1 -quodlibet -quodlibet-plugins -quota -quotatool -quotecolors -qutecom -qutecsound -qutemol -quvi -qviaggiatreno -qwbfsmanager -qwo -qwt -qwt5 -qwtplot3d -qxmlrpc -qxmpp -qxw -qzion -r5rs-doc -rabbit -rabbitmq-server -rabbitsign -rabbitvcs -rabbyt -racc -raccoon -racket -radare2 -radare2-bindings -radeontool -radiance -radicale -radioclk -radiotray -radiusclient -radiusclient-ng -radiusd-livingston -radsecproxy -radvd -rafkill -ragel -raidutils -rail -rails -rainbow -raincat -rakarrack -rake -rake-compiler -rakudo -ramond -rancid -randomize-lines -randomplay -randomsound -randtype -ranger -rant -rapid-photo-downloader -rapid-spring -rapidsvn -raptor -raptor2 -rarian -rarpd -raschsampler -rasmol -raspell -rasqal -raster3d -rastertosag-gdi -rat -ratbox-services -ratfor -ratmenu -ratpoison -ratproxy -rats -raul -rawdog -rawstudio -rawtherapee -raxml -razor -r-base -rbenv -r-bioc-biobase -r-bioc-biocgenerics -r-bioc-cummerbund -r-bioc-edger -r-bioc-hilbertvis -r-bioc-limma -r-bioc-qvalue -rblcheck -rbldnsd -rbootd -rbot -rbtools -rc -rcconf -rcmdr -rcolorbrewer -rcov -rcpp -r-cran-amelia -r-cran-amore -r-cran-bayesm -r-cran-class -r-cran-coda -r-cran-colorspace -r-cran-combinat -r-cran-deal -r-cran-diagnosismed -r-cran-digest -r-cran-domc -r-cran-dosnow -r-cran-eco -r-cran-epi -r-cran-epibasix -r-cran-epicalc -r-cran-epir -r-cran-epitools -r-cran-evd -r-cran-foreach -r-cran-gam -r-cran-g.data -r-cran-genabel -r-cran-genetics -r-cran-getopt -r-cran-ggplot2 -r-cran-gmaps -r-cran-haplo.stats -r-cran-hdf5 -r-cran-inline -r-cran-int64 -r-cran-iterators -r-cran-lpsolve -r-cran-mapdata -r-cran-mapproj -r-cran-maps -r-cran-mass -r-cran-medadherence -r-cran-mnp -r-cran-msm -r-cran-multicore -r-cran-nnet -r-cran-nws -r-cran-plotrix -r-cran-plyr -r-cran-proto -r-cran-pscl -r-cran-psy -r-cran-randomforest -r-cran-reshape -r-cran-reshape2 -r-cran-rjags -r-cran-rms -r-cran-rocr -r-cran-rsqlite -r-cran-runit -r-cran-slam -r-cran-sn -r-cran-sp -r-cran-spatial -r-cran-spc -r-cran-stabledist -r-cran-stringr -r-cran-surveillance -r-cran-teachingdemos -r-cran-timedate -r-cran-timeseries -r-cran-vcd -r-cran-vegan -r-cran-vgam -r-cran-xml -r-cran-xtable -rcs -rcs-blame -rcs-latex -rdate -rdd -rdesktop -rdfind -rdflib -rdiff-backup -rdiff-backup-fs -rdist -rdkit -rds-tools -rdtool -rdup -re -re2c -react -readahead-fedora -read-edid -readline5 -readline6 -readseq -realpath -realtimebattle -reaver -rebuildd -recite -recode -recoll -reconf-inetd -recordmydesktop -recover -recoverdm -recoverjpeg -recutils -red5 -redeclipse -redet -redhat-cluster -redir -redis -redland -redland-bindings -redmine -redmine-plugin-botsfilter -rednotebook -redshift -redsocks -ree -refcard -refcontrol -referencer -refit -refpolicy -regexxer -regina-normal -regina-rexx -regionset -reglookup -reinteract -reiser4progs -reiserfsprogs -rekonq -relational -relatorio -relimp -remake -remctl -remem -remember-el -remind -reminiscence -remmina -remotetea -remote-tty -remuco -renaissance -renameutils -renattach -reniced -renpy -renrot -rep-gtk -rephrase -reportbug -reportbug-ng -reprepro -reprof -reptyr -requestpolicy -requests -request-tracker4 -resample -rescue -resiprocate -resolvconf -resource-agents -rest2web -restartd -retext -revelation -rev-plugins -rexima -rfdump -rfkill -rfoo -rgain -rgbpaint -rggobi -rgl -rglpk -rgtk2 -rhash -rheolef -rhino -rhinote -rhn-client-tools -rhnlib -rhythmbox -ricochet -riece -rifiuti -rifiuti2 -rig -ri-li -rinetd -rinse -ripit -ripole -ripperx -ristretto -rivet -rjava -rkhunter -rkward -rlinetd -rlog -rlplot -rlpr -rlvm -rlwrap -rmagic -rman -rmatrix -rmpi -rmysql -rnahybrid -rnc-mode -rng-tools -roaraudio -roarplaylistd -robert-hooke -robocode -robocut -robojournal -robotfindskitten -robustbase -robust-http-client -rockdodger -rocksndiamonds -rocs -rodbc -roffit -rofs-fuse -rolldice -rome -rootskel -rootskel-gtk -rootstrap -root-system -root-tail -rope -ropemacs -rosegarden -r-other-bio3d -r-other-mott-happy -rotix -rott -rotter -roundcube -roundcube-plugins-extra -roundup -routeplanner -routes -routino -rovclock -rox -roxterm -rpart -rpcbind -rpl -rplay -rpm -rpm2html -rp-pppoe -rpy -rpy2 -rquantlib -rrdcollect -rrdtool -rrep -rrootage -rs -rsakeyfind -rserve -rsh-redone -rsibreak -rsnapshot -rsprng -rsrce -rss2email -rss2irc -rss-glx -rssh -rsskit -rsstail -rst2pdf -rstatd -rsymphony -rsync -rsyncrypto -rsyntaxtextarea -rsyslog -rtai -rtaudio -rt-authen-externalauth -rt-extension-assettracker -rtfilter -rtgui -rtirq -rtkit -rtmidi -rtmpdump -rtorrent -rtpg -rtpproxy -rtslib -rt-tests -rttool -rubber -rubberband -rubrica -ruby1.8 -ruby1.9.1 -ruby-actionmailer-2.3 -ruby-actionmailer-3.2 -ruby-actionpack-2.3 -ruby-actionpack-3.2 -ruby-activeldap -ruby-activemodel-3.2 -ruby-activerecord-2.3 -ruby-activerecord-3.2 -ruby-activeresource-2.3 -ruby-activeresource-3.2 -ruby-activesupport-2.3 -ruby-activesupport-3.2 -ruby-addressable -ruby-aggregate -ruby-albino -ruby-algorithm-diff -ruby-amazon -ruby-amazon-ec2 -ruby-amq-client -ruby-amqp -ruby-amq-protocol -ruby-amrita -ruby-amrita2 -ruby-archive-tar-minitar -ruby-arel -ruby-ascii85 -ruby-bacon -ruby-barby -ruby-bcrypt -ruby-bdb -ruby-bio -ruby-blankslate -ruby-bluecloth -ruby-bsearch -ruby-build -ruby-builder -ruby-bunny -ruby-cairo -ruby-capistrano-colors -ruby-cassiopee -ruby-childprocess -ruby-chronic -ruby-chunky-png -ruby-classifier -ruby-cmdparse -ruby-color-tools -ruby-commandline -ruby-compass -ruby-contest -ruby-daemons -ruby-dataobjects -ruby-dataobjects-mysql -ruby-dataobjects-postgres -ruby-dataobjects-sqlite3 -ruby-dbd-mysql -ruby-dbd-odbc -ruby-dbd-pg -ruby-dbd-sqlite3 -ruby-dbi -ruby-dbus -ruby-debian -ruby-defaults -ruby-deprecated -ruby-dep-selector -ruby-diff-lcs -ruby-directory-watcher -ruby-domain-name -ruby-dust -ruby-eb -ruby-echoe -ruby-eim-xml -ruby-em-http-request -ruby-erubis -ruby-escape-utils -ruby-event-loop -ruby-eventmachine -ruby-excon -ruby-exif -ruby-extlib -ruby-facets -ruby-fakefs -ruby-fastercsv -ruby-fast-gettext -ruby-fast-stemmer -ruby-fast-xs -ruby-feedparser -ruby-feedtools -ruby-ferret -ruby-ffi -ruby-fftw3 -ruby-file-tail -rubyfilter -ruby-flexmock -ruby-fog -ruby-formatador -ruby-fssm -ruby-fusefs -ruby-gd -ruby-gelf -rubygems -rubygems-integration -ruby-gettext -ruby-gettext-activerecord -ruby-gettext-rails -ruby-gherkin -ruby-gir-ffi -ruby-git -ruby-globalhotkeys -ruby-gnome2 -ruby-gnuplot -ruby-god -ruby-googlecharts -ruby-gpgme -ruby-graffiti -ruby-grib -ruby-gruff -ruby-gsl -ruby-haml -ruby-hdfeos5 -ruby-heckle -ruby-hiera -ruby-hiera-puppet -ruby-highline -ruby-hike -ruby-hikidoc -ruby-hmac -ruby-hoe -ruby-hpricot -ruby-htmlentities -ruby-httpclient -ruby-i18n -ruby-ihelp -ruby-image-science -ruby-imagesize -ruby-indentation -ruby-inline -ruby-innate -ruby-inotify -ruby-instantiator -ruby-introspection -ruby-ipaddress -ruby-journey -ruby-jquery-rails -ruby-json -ruby-kakasi -ruby-kgio -ruby-kramdown -ruby-krb5-auth -ruby-lapack -ruby-ldap -ruby-libvirt -ruby-libxml -ruby-liquid -ruby-locale -ruby-locale-rails -ruby-lockfile -ruby-log4r -rubyluabridge -ruby-mab -ruby-magic -ruby-mail -ruby-maruku -ruby-mathml -ruby-mecab -ruby-mechanize -ruby-memcache-client -ruby-merb-assets -ruby-merb-core -ruby-merb-haml -ruby-merb-helpers -ruby-merb-param-protection -ruby-metaclass -ruby-metaid -ruby-method-source -ruby-mime-types -ruby-minitest -ruby-mixlib-authentication -ruby-mixlib-cli -ruby-mixlib-config -ruby-mixlib-log -ruby-mixlib-shellout -ruby-mkrf -ruby-mocha -ruby-moneta -ruby-mp3info -ruby-mp3tag -ruby-msgpack -ruby-multibitnums -ruby-multi-json -ruby-mustache -ruby-mysql -ruby-narray -ruby-narray-miss -ruby-ncurses -ruby-netcdf -ruby-net-http-digest-auth -ruby-net-http-persistent -ruby-net-irc -ruby-net-ldap -ruby-net-netrc -ruby-net-scp -ruby-net-sftp -ruby-net-ssh -ruby-net-ssh-gateway -ruby-net-ssh-multi -ruby-nokogiri -ruby-nora -ruby-ntlm -ruby-oauth -ruby-odbc -ruby-ogginfo -ruby-oily-png -ruby-ole -ruby-open4 -ruby-opengl -ruby-openid -ruby-packet -ruby-parser -ruby-parsetree -ruby-passenger -ruby-password -ruby-pcap -ruby-pdf-inspector -ruby-pdf-reader -ruby-peach -ruby-pg -ruby-pgplot -ruby-pkg-config -ruby-pkg-tools -ruby-platform -ruby-polyglot -ruby-popen4 -ruby-posix-spawn -ruby-prawn -ruby-prof -ruby-progressbar -ruby-rack -ruby-rack-cache -ruby-rack-protection -ruby-rack-ssl -ruby-rack-test -ruby-rails-2.3 -ruby-rails-3.2 -ruby-railties-3.2 -ruby-raindrops -ruby-rb-inotify -ruby-rc4 -ruby-rchardet -ruby-rdiscount -ruby-redcarpet -ruby-redcloth -ruby-rest-client -ruby-revolution -ruby-rmagick -ruby-romkan -ruby-ronn -ruby-rqrcode -ruby-rr -ruby-rspec -ruby-rspec-core -ruby-rspec-expectations -ruby-rspec-mocks -ruby-ruby2ruby -ruby-rubyforge -ruby-rubymail -ruby-rubytorrent -ruby-sass -ruby-sass-rails -ruby-sdl -ruby-sequel -ruby-sequel-pg -ruby-serialport -ruby-session -ruby-setup -ruby-sexp-processor -ruby-shadow -ruby-shoulda -ruby-shoulda-context -ruby-shoulda-matchers -ruby-sigar -ruby-sinatra -ruby-slop -ruby-sourcify -ruby-spreadsheet -ruby-sprockets -ruby-sqlite3 -ruby-stomp -ruby-svg-graph -ruby-switch -ruby-systemtimer -ruby-systemu -ruby-taglib2 -ruby-term-ansicolor -ruby-termios -ruby-test-declarative -ruby-test-spec -ruby-test-unit -ruby-text -ruby-text-format -ruby-thor -ruby-tidy -ruby-tilt -ruby-tioga -ruby-tmail -ruby-tokyocabinet -ruby-transaction-simple -ruby-treetop -ruby-trollop -ruby-ttfunk -ruby-twitter4r -ruby-tzinfo -ruby-uconv -ruby-unf -ruby-unf-ext -ruby-usb -ruby-uuidtools -ruby-validatable -ruby-webrobots -ruby-whitewash -ruby-will-paginate -ruby-wirble -ruby-xmlparser -ruby-xml-simple -ruby-yajl -ruby-yard-sinatra -ruby-zoom -rudecgi -ruli -rumor -rungetty -runit -runlim -runsnakerun -rush -rus-ispell -rxp -rxtx -rxvt -rxvt-beta -rxvt-unicode -rygel -rzip -r-zoo -s2tc -s3cmd -s3d -s3ql -s5 -s51dude -sablecc -sabnzbdplus -sac -sacjava -sa-exim -safecat -safecopy -safe-hole-perl -safe-rm -sagan -sagan-rules -sagasu -sage -sage-extension -sailcut -saint -sakura -sa-learn-cyrus -salliere -sam2p -samba -samba4 -samdump2 -samhain -samidare -samizdat -sampleicc -samtools -sandboxgamemaker -sanduhr -sandwich -sane-backends -sane-backends-extras -sane-frontends -sanitizer -sanlock -saods9 -sapgui-package -sapphire -sarg -sary -sary-ruby -sash -sass-elisp -sat4j -sauce -sauerbraten -sauerbraten-wake6 -savi -sawfish -sawfish-merlin-ugliness -sawfish-themes -saxonb -saytime -sbcl -sbjson -sbnc -sbox-dtc -sbrsh -sbuild -sc -scala -scalable-cyrfonts -scala-mode-el -scalapack -scalapack-doc -scalc -scalpel -scamper -scanbuttond -scanlogd -scanmem -scanssh -scantool -scapy -scatterplot3d -scgi -schedtool -scheme2c -scheme48 -scheme9 -schism -schleuder -schroedinger -schroot -scid -scidavis -scid-rating-data -scid-spell-data -scikit-learn -scilab -scilab-ann -scilab-celestlab -scilab-jims -scilab-plotlib -scilab-scimysql -scim -scim-canna -scim-chewing -scim-kmfl-imengine -scim-m17n -scim-skk -scim-tables -scim-thai -scim-unikey -sciplot -scirenderer -sciscipy -scite -sciteproj -scitools -sclapp -scli -scm -scmail -scmxx -scolasync -scons -scons-doc -scorched3d -scotch -scottfree -scour -scowl -scrapbook -scratch -scratchbox2 -screader -screen -screenie -screenie-qt -screenlets -screen-message -screenruler -screentest -scribble -scribes -scribus -scribus-ng -scribus-template -scriptaculous -scrollz -scrot -scrounge-ntfs -scrub -scrypt -scsh-0.6 -scsh-defaults -scsh-install-lib -scsitools -scummvm -scute -scuttle -scythestat -sdate -sdcc -sdcv -sdf -sdic -sdl-ball -sdlbasic -sdlgfx -sdl-image1.2 -sdl-mixer1.2 -sdl-net1.2 -sdlpango -sdl-sound1.2 -sdl-stretch -sdl-ttf2.0 -sdo-api-java -sdop -sdpa -sdparm -sdpnetstat -seabios -seahorse -searchandrescue -searchandrescue-data -search-ccsb -search-citeseer -searchload-options -searchmonkey -sec -seccure -secpanel -secure-delete -secvpn -sed -see -seed -seesat5 -segment -seivot -select-xface -selinux-basics -semi -semweb -sendemail -sendfile -sendip -sendmail -sendpage -sendxmpp -sensible-utils -sensors-applet -sentinella -sepia -sepolgen -seq24 -seqan -seqdiag -ser2net -serd -serf -series60-remote -serp -servefile -serverstats -service-wrapper-java -setcd -set-crontab-perl -setools -setpwc -setserial -sexplib310 -sextractor -seyon -sezpoz -sfact -sfftobmp -sffview -sflphone -sfront -sfst -sg3-utils -sgf2dg -sgml2x -sgml-base -sgml-base-doc -sgml-data -sgml-spell-checker -sgmltools-lite -sgrep -sgt-puzzles -shadow -shake -shanty -shapelib -shaperd -shapetools -shared-desktop-ontologies -shared-mime-info -sharutils -shatag -shed -shedskin -shelldap -shell-fm -shellinabox -shelltestrunner -shelr -shelxle -shhmsg -shhopt -shibboleth-sp2 -shiboken -shiki-colors-murrine -shinken -shisen.app -shishi -shntool -shoes -shorewall -shorewall6 -shorewall6-lite -shorewall-core -shorewall-doc -shorewall-init -shorewall-lite -shotdetect -shotwell -showq -shrinksafe -shr-specs -shtool -shunit2 -shush -shutdown-at-night -shutdown-qapps -shutter -sibsim4 -sic -sidplay -sidplay-base -sidplayfp -sidplay-libs -siege -sieve-connect -sieve-extension -siggen -sigma-align -signify -signing-party -sigrok -sigrok-cli -sigscheme -sigviewer -sikuli -silentjack -silgraphite2.0 -silly -silo-llnl -sim4 -simage -simba -simgrid -simh -simhash -similarity-tester -simile-timeline -simple-cdd -simplegeneric -simpleid -simpleid-ldap -simple-image-reducer -simplejson -simplelist -simpleparse -simplepie -simpleproxy -simplesamlphp -simple-scan -simpletal -simple-xml -simplyhtml -simulavr -simulpic -simutrans -simutrans-pak128.britain -simutrans-pak64 -since -sineshaper -sinfo -singularity -singularity-music -sinntp -sip4 -sipcalc -sipcrack -siproxd -sipsak -sip-tester -sipwitch -sisc -siscone -sispmctl -sisu -sisu-guice -sisu-ioc -sitecopy -sitemesh -sitesummary -sitplus -six -sixpack -sjeng -sjfonts -skalibs -skanlite -sketch -skimage -skinedit -skipfish -skkdic -skksearch -skktools -skrooge -sks -sks-ecc -skstream -skyeye -skytools -sl -slack -slang2 -slashem -slashtime -slay -slbackup -slbackup-php -slcfitsio -slcurl -sleekxmpp -sleepd -sleepenh -slepc -sleuthkit -slexpat -slgdbm -slgsl -slhist -slib -slice -slides -slim -slimbox -slime -slimevolley -slimit -slimrat -slingshot -slirp -slmon -sloccount -slpvm -slrn -slrnface -slsqlite -sludge -slugimage -slurm -slurm-drmaa -slurm-llnl -slv2 -slwildcard -slxfig -sm -sma -sm-archive -smart -smartlist -smartmontools -smart-notifier -smarty3 -smarty-gettext -smartypants -smarty-validate -smb2www -smb4k -smbc -smbldap-tools -smbnetfs -smc -smcroute -smem -sml-mode -smlnj -smokegen -smokekde -smokeping -smokeqt -smooth-themes -smpeg -smplayer -smplayer-themes -smp-utils -smsclient -smstools -smtm -smuxi -sn -snacc -snack -snake4 -snakefood -snappea -snappy -snappy-java -snappy-player -snarf -snd -sndfile-tools -sndobj -sng -sniffit -snimpy -snmpkit -snmptrapfmt -snmptt -snooper -snoopy -snort -snow -snowball -snowballz -snowdrop -sntop -sobby -socat -socket -socklog -socks4-server -sockstat -socnetv -sofa-framework -sofia-sip -softcatala-spell -softflowd -softhsm -software-center -software-properties -sogo -solarpowerlog -solarwolf -solfege -solid-pop3d -sombok -sonata -songwrite -sonic -sooperlooper -sope -soprano -sopwith -soqt -sord -sorl-thumbnail -sortmail -sortsmill-tools -so-synth-lv2 -soundconverter -sound-icons -sound-juicer -soundkonverter -soundmodem -sound-theme-freedesktop -soundtouch -sourcecodegen -source-highlight -sox -soya -soya-doc -sozi -spacearyarya -spacenavd -spacezero -spamassassin -spamassassin-heatu -spamass-milter -spambayes -spamoracle -spampd -spamprobe -spandsp -spark -sparkleshare -sparkline-php -sparql-wrapper-python -sparsehash -sparskit -spass -spatialindex -spatialite -spawn-fcgi -spd -spe -speakup -speakup-tools -specimen -spectacle -spectemu -specto -spectools -spectrwm -speechd-el -speech-dispatcher -speechd-up -speech-tools -speedcrunch -speedometer -speedy-cgi-perl -speex -spek -spell -spellutils -spew -sp-gxmlcpp -spherepack -sphinx -sphinxcontrib-actdiag -sphinxcontrib-blockdiag -sphinxcontrib-nwdiag -sphinxcontrib-seqdiag -sphinxcontrib-spelling -sphinx-issuetracker -sphinxsearch -spice -spice-gtk -spice-protocol -spice-vdagent -spim -spinner -spip -spkproxy -spl -splat -splay -spline -splint -splitvt -splix -spooles -spotlighter -spotweb -spout -spring -spring-build -springlobby -springpython -sprng -sprox -sputnik -spyder -sqcwa -sqlalchemy -sqldeveloper-package -sqlgrey -sqlheavy -sqlite -sqlite3 -sqlitebrowser -sqliteodbc -sqlkit -sql-ledger -sqlline -sqlobject -sqlparse -sqsh -squaremap -squareness -squashfs-tools -squeak-plugins-scratch -squeak-vm -squeeze -squid -squid3 -squidguard -squid-langpack -squid-prefetch -squidtaild -squidview -squirrelmail -squirrelmail-compatibility -squirrelmail-decode -squirrelmail-locales -squirrelmail-lockout -squirrelmail-logger -squirrelmail-quicksave -squirrelmail-secure-login -squirrelmail-sent-confirmation -squirrelmail-spam-buttons -squirrelmail-viewashtml -squizz -sqwebmail-de -sra-sdk -sratom -src2tex -srecord -sredird -srf -srg -srptools -srtp -ssake -ssdeep -ssed -ssft -ssh-askpass -ssh-askpass-fullscreen -ssh-contact -sshfp -sshfs-fuse -sshguard -sshmenu -sshpass -sshuttle -ssl-cert -ssl-cert-check -ssldump -sslh -sslscan -sslsniff -sslstrip -ssmping -ssmtp -ssreflect -sssd -ssss -ssvnc -st -stackapplet -staden-io-lib -stalin -stalonetray -stapler -stapler-adjunct-codemirror -stapler-adjunct-timeline -stardata-common -stardict -stardict-czech -stardict-tools -stardict-xmlittre -starfighter -starlink-ast -starlink-pal -starman -starplot -starpu -starpu-contrib -starpy -startupmanager -startup-notification -starvoyager -statcvs -statnews -statserial -statsmodels -statsvn -status-4-evar -stax -stax-utils -stda -stdeb -steadyflow -stealth -steghide -stella -stellarium -step -stepbill.app -stepic -steptalk -stfl -stgit -stimfit -stk -stl-manual -stockfish -stompserver -stone -stopmotion -stops -stopwatch -storebackup -storm -stormbaancoureur -stow -strace -streamripper -streamtuner2 -stress -stressapptest -stretchplayer -strigi -stringtemplate -strongswan -strongwind -strophejs -strucchange -structure-synth -stsci.distutils -stterm -stud -stumpwm -stun -stunnel4 -stx2any -stx-btree -stylebook -stymulator -styx -subcommander -sublib -subnetcalc -substance -subsurface -subtitlecomposer -subtitleeditor -subtle -subunit -subversion -subvertpy -suck -suckless-tools -sucrack -sudo -sudoku -suds -suede -sugar-0.96 -sugar-artwork-0.84 -sugar-artwork-0.88 -sugar-artwork-0.96 -sugar-base-0.84 -sugar-base-0.88 -sugar-base-0.96 -sugar-calculate-activity -sugar-connect-activity -sugar-datastore-0.84 -sugar-datastore-0.88 -sugar-datastore-0.96 -sugar-etoys-activity -sugar-irc-activity -sugar-memorize-activity -sugar-physics-activity -sugar-pippy-activity -sugarplum -sugar-presence-service-0.84 -sugar-presence-service-0.88 -sugar-presence-service-0.90 -sugar-record-activity -sugar-terminal-activity -sugar-toolkit-0.84 -sugar-toolkit-0.88 -sugar-toolkit-0.96 -sugar-toolkit-gtk3 -suikyo -suil -suitesparse -suitesparse-metis -summain -sumo -sunclock -sundials -sunflow -sunpinyin -suomi-malaga -sup -super -supercat -supercollider -superiotool -superkaramba -superlu -supertransball2 -supertux -supertuxkart -supervisor -suphp -sup-mail -supybot -surefire -surf -surfraw -suricata -survex -survival -sushi -susv2 -susv3 -sux -svgalib -svgpart -svgsalamander -svgtoipe -svn2cl -svn-all-fast-export -svn-buildpackage -svnclientadapter -svnkit -svn-load -svnmailer -svn-workbench -svrcore -svtools -swac-explore -swac-get -swaks -swami -swaml -swapspace -swatch -swath -swedish -sweep -sweeper -sweethome3d -swe-standard-data -swfmill -swftools -swh-lv2 -swh-plugins -swift -swift-im -swig2.0 -swiginac -swing-layout -swi-prolog -swi-prolog-doc -swish++ -swish-e -swissknife -swisswatch -switchconf -switchsh -sword -sword-comm-mhcc -sword-comm-scofield -sword-comm-tdavid -sword-dict-naves -sword-dict-strongs-greek -sword-dict-strongs-hebrew -sword-text-kjv -sword-text-sparv -sword-text-web -swtcalendar -swtchart -swt-gtk -swt-paperclips -sxid -sxiv -syfi -sylpheed -sylpheed-doc -sylph-searcher -sylseg-sk -symeig -symlinks -symmetrica -sympa -sympow -sympy -synaesthesia -synapse -synaptic -synaptiks -syncache -syncbbdb -synce-gnomevfs -synce-hal -synce-serial -synce-trayicon -syncevolution -syncmaildir -syncplaces -synergy -synfig -synfigstudio -synopsis -syrep -syrthes -sysadmin-guide -sysbench -sysconftool -sysfsutils -sysinfo -syslinux -syslinux-themes-debian -syslog-ng -syslog-ocaml -syslog-summary -sysnews -sysprof -sysprofile -sysrqd -sysstat -system-config-cluster -system-config-lvm -system-config-printer -systemd -systempreferences.app -systemtap -system-tools-backends -systraq -systune -sysvbanner -sysvinit -sysv-rc-conf -t1lib -t1utils -t2html -t38modem -tabble -tabix -tableau-parm -tablix2 -tabmixplus -tacacs+ -tachyon -tack -tads2-mode -tagainijisho -tagcloud -tagcoll2 -taggrepper -taglib -taglib-extras -taglib-sharp -taglog -tagpy -tagtool -tagua -tahoe-lafs -tailor -taktuk -talksoup.app -talloc -tamil-gtk2im -tamuanova -tangerine -tanglet -tango -tango-icon-theme -taningia -taoframework -tapecalc -tap-plugins -tap-plugins-doc -tar -tarantool -tardiff -tardy -targetcli -tart -task -tasks -tasksel -task-spooler -tasque -tatan -tau -taurus -tayga -tbb -tcc -tcd-utils -tcl8.4 -tcl8.5 -tclap -tclcl -tclcurl -tclex -tclgeoip -tcllib -tclodbc -tclreadline -tcl-signal -tclthread -tcltk-defaults -tcltls -tcltrf -tcludp -tclvfs -tclx8.4 -tclxml -tcm -tcng -t-code -t-coffee -tcpdump -tcpflow -tcpick -tcpreen -tcpreplay -tcpser -tcpslice -tcpspy -tcpstat -tcptrace -tcptraceroute -tcptrack -tcputils -tcpwatch-httpproxy -tcp-wrappers -tcpxtract -tcs -tcsh -td2planet -tdb -tdc -tdfsb -tdiary -tdiary-contrib -tdl -tdom -tea -tecnoballz -teem -teeworlds -teg -tegaki-pygtk -tegaki-python -tegaki-recognize -tegaki-tools -tegaki-train -tegaki-zinnia-japanese -tegaki-zinnia-simplified-chinese -telak -telegnome -telepathy-farstream -telepathy-gabble -telepathy-glib -telepathy-haze -telepathy-idle -telepathy-logger -telepathy-logger-qt -telepathy-mission-control-5 -telepathy-python -telepathy-qt -telepathy-rakia -telepathy-salut -telepathy-spec -teleport -tellico -tempest-for-eliza -templayer -tenace -tenmado -tennix -tenshi -terminal.app -terminator -terminatorx -termit -termsaver -terraintool -teseq -tess -tessa -tesseract -tesseract-afr -tesseract-ara -tesseract-aze -tesseract-bel -tesseract-ben -tesseract-bul -tesseract-cat -tesseract-ces -tesseract-chi-sim -tesseract-chi-tra -tesseract-chr -tesseract-dan -tesseract-deu -tesseract-deu-frak -tesseract-ell -tesseract-eng -tesseract-enm -tesseract-epo -tesseract-equ -tesseract-est -tesseract-eus -tesseract-fin -tesseract-fra -tesseract-frk -tesseract-frm -tesseract-glg -tesseract-heb -tesseract-hin -tesseract-hrv -tesseract-hun -tesseract-ind -tesseract-isl -tesseract-ita -tesseract-ita-old -tesseract-jpn -tesseract-kan -tesseract-kor -tesseract-lav -tesseract-lit -tesseract-mal -tesseract-mkd -tesseract-mlt -tesseract-msa -tesseract-nld -tesseract-nor -tesseract-osd -tesseract-pol -tesseract-por -tesseract-ron -tesseract-rus -tesseract-slk -tesseract-slk-frak -tesseract-slv -tesseract-spa -tesseract-spa-old -tesseract-sqi -tesseract-srp -tesseract-swa -tesseract-swe -tesseract-tam -tesseract-tel -tesseract-tgl -tesseract-tha -tesseract-tur -tesseract-ukr -tesseract-vie -testdisk -testng -testrepository -testresources -tetex-brev -tetradraw -tetraproc -tetrinet -tetrinetx -tetzle -tevent -tex4ht -tex-common -tex-gyre -texi2html -texify -texinfo -texlive-base -texlive-bin -texlive-doc -texlive-extra -texlive-lang -texmacs -texmacs-extra-fonts -texmaker -texstudio -textdraw -textedit.app -texworks -tf -tf5 -tfdocgen -tftp-hpa -tftpy -tg.devtools -tgif -tgt -thailatex -thaixfonts -the -themole -themonospot -thepeg -therion -theseus -thewidgetfactory -thin -thinkfan -thp -threadscope -thrust -thuban -thunar -thunar-archive-plugin -thunar-media-tags-plugin -thunar-vcs-plugin -thunar-vfs -thunar-volman -ticgit -ticker -tickr -tictactoe-ng -tidy -tidy-proxy -tiemu -tiff -tiff3 -tifffile -tig -tiger -tiger-types -tightvnc -tightvnc-java -tigr-glimmer -tilda -tilecache -tiled-qt -tilelite -tiles -tilestache -tilp2 -timbl -timblserver -time -timelimit -timemachine -timemon.app -timidity -timingframework -timps -tin -tina -tinc -tint -tint2 -tintii -tintin++ -tinyca -tinycdb -tinydyndns -tinyeartrainer -tinyirc -tinymce -tinymux -tinyproxy -tinyscheme -tinywm -tinyxml -tinyxml2 -tiobench -tipa -titanion -tix -tk2 -tk5 -tk707 -tk8.4 -tk8.5 -tkabber -tkabber-plugins -tk-brief -tkcon -tkcvs -tkdesk -tkgate -tk-html3 -tkinfo -tkinspect -tklib -tkpng -tkrplot -tk-table -tktray -tktreectrl -tla -tlslite -tmake -tm-align -tmexpand -tmispell-voikko -tmpreaper -tmux -tmview -tmw -tmw-music -tnat64 -tnef -tnftp -tntdb -tntnet -tofrodos -tofu -toga2 -toggle-proxy -togl -toilet -tokyocabinet -tokyocabinet-haskell -tokyotyrant -tolua -tolua++ -tomatoes -tomboy -tomboy-latex -tomcat6 -tomcat7 -tomcatjss -tomcat-maven-plugin -tomcat-native -tomoe -tomoyo-tools -toonloop -topal -topgit -tophide -toppler -tor -tora -tor-arm -torch3 -torchat -torcs -torque -torrentflux -torrus -torsocks -tortoisehg -torus-trooper -toshset -totem -totem-pl-parser -totem-plugin-arte -tourney-manager -towitoko -tpb -tpclient-pywx -tpconfig -tpm-tools -t-prot -tp-smapi -tqsllib -trac -trac-accountmanager -trac-announcer -trac-authopenid -trac-batchmodify -trac-bitten -trac-bzr -trac-customfieldadmin -trac-datefieldplugin -trac-diavisview -traceroute -trac-git -trac-graphviz -trac-httpauth -trac-icalviewplugin -trac-ja-resource -trac-jsgantt -trackballs -trackballs-music -tracker -trac-mastertickets -trac-mercurial -trac-odtexport -trac-privateticketsplugin -trac-roadmap -trac-sensitivetickets -trac-subtickets -trac-tags -trac-virtualticketpermissions -trac-wikiprint -trac-wikitablemacro -trac-wysiwyg -trac-xmlrpc -trafficserver -tralics -transaction -transcalc -transcend -transcode -transfermii -transfig -transgui -transifex-client -translate -translate-docformat -translate-toolkit -translatoid -transmageddon -transmission -transmission-remote-cli -transmissionrpc -transtermhp -trash-cli -traverso -trayer -tre -tree -treeline -tree-puzzle -tree-style-tab -treeviewx -treil -trend -trickle -trident -triggerhappy -trigger-rally -trigger-rally-data -trilead-putty-extension -trilead-ssh2 -trimage -triplane -triplea -tripwire -tritium -trivial-features -trivial-gray-streams -troffcvt -trophy -trousers -trovacap -trove -trove3 -trscripts -trueprint -trustedqsl -tryton-client -tryton-meta -tryton-modules-account -tryton-modules-account-be -tryton-modules-account-de-skr03 -tryton-modules-account-invoice -tryton-modules-account-invoice-history -tryton-modules-account-invoice-line-standalone -tryton-modules-account-product -tryton-modules-account-statement -tryton-modules-analytic-account -tryton-modules-analytic-invoice -tryton-modules-analytic-purchase -tryton-modules-analytic-sale -tryton-modules-calendar -tryton-modules-calendar-classification -tryton-modules-calendar-scheduling -tryton-modules-calendar-todo -tryton-modules-company -tryton-modules-company-work-time -tryton-modules-country -tryton-modules-currency -tryton-modules-dashboard -tryton-modules-google-maps -tryton-modules-ldap-authentication -tryton-modules-ldap-connection -tryton-modules-party -tryton-modules-party-siret -tryton-modules-party-vcarddav -tryton-modules-product -tryton-modules-product-cost-fifo -tryton-modules-product-cost-history -tryton-modules-product-price-list -tryton-modules-project -tryton-modules-project-plan -tryton-modules-project-revenue -tryton-modules-purchase -tryton-modules-purchase-invoice-line-standalone -tryton-modules-sale -tryton-modules-sale-opportunity -tryton-modules-sale-price-list -tryton-modules-stock -tryton-modules-stock-forecast -tryton-modules-stock-inventory-location -tryton-modules-stock-location-sequence -tryton-modules-stock-product-location -tryton-modules-stock-supply -tryton-modules-stock-supply-day -tryton-modules-timesheet -tryton-neso -tryton-proteus -tryton-server -tsdecrypt -tse3 -tseries -tslib -tsocks -tstools -tsung -ttb -ttf2ufm -ttf-adf -ttf-aenigma -ttf-alee -ttf-ancient-fonts -ttf-atarismall -ttfautohint -ttf-bitstream-vera -ttf-cjk-compact -ttf-dejavu -ttf-engadget -ttf-femkeklaver -ttf-freefont -ttf-goudybookletter -ttf-indic-fonts -ttf-isabella -ttf-jsmath -ttf-kochi -ttf-lao -ttf-marvosym -ttf-radisnoir -ttf-sazanami -ttf-staypuft -ttf-summersby -ttf-tagbanwa -ttf-tiresias -ttf-wqy-microhei -ttf-wqy-zenhei -tth -tthsum -ttt -tty-clock -ttyload -ttylog -ttyrec -ttysnoop -tua -tuareg-mode -tucnak2 -tudu -tulip -tumbler -tumgreyspf -tumiki-fighters -tunapie -tunnelx -tupi -turbogears2 -turbogears2-doc -turbojson -turbokid -turnin-ng -turpial -turtleart -tuxcmd -tuxcmd-modules -tuxfootball -tuxguitar -tuxmath -tuxonice-userui -tuxpaint -tuxpaint-config -tuxpaint-stamps -tuxpuck -tuxracer-extras -tuxtype -tvdb-api -tvflash -tv-fonts -tvnamer -tvtime -twatch -twclock -tweak -tweepy -twiggy -twill -twisted -twisted-conch -twisted-lore -twisted-mail -twisted-names -twisted-news -twisted-runner -twisted-web -twisted-web2 -twisted-words -twittering-mode -twm -twms -twofish -twoftpd -twolame -tworld -twpsk -txaws -txlibravatar -txt2html -txt2man -txt2pdbdoc -txt2regex -txt2tags -txtreader -txw2 -txzookeeper -type-conv -typespeed -typo3-src -typogrify -tyxml -tzc -tzdata -tzsetup -u3-tool -uae -uanytun -uapevent -uaputl -ubiquity-extension -u-boot -ubuntu-dev-tools -ubuntulooks -ucarp -ucblogo -ucf -uchardet -ucimf-chewing -ucimf-openvanilla -ucimf-sunpinyin -ucl -uclibc -uclmmbase -ucommon -ucspi-proxy -ucspi-tcp -ucspi-unix -ucto -udav -uddi4j -udev -udftools -udisks -udisks-glue -udo -udpcast -udpkg -udptunnel -udt -udunits -ufc -ufiformat -ufl -ufraw -ufsutils -ufw -uget -uhd -uhub -uicilibris -uif -uif2iso -uim -uima-addons -uima-as -uimaj -uim-chewing -uisp -ukolovnik -ukopp -ulatencyd -ulex -ulex0.8 -uligo -ulogd -umlet -uml-utilities -umview -unac -unace -unadf -unagi -unalz -unar -unattended-upgrades -unbound -unburden-home-dir -uncertainties -unclutter -uncrustify -undbx -underscore -undertaker -unetbootin -unhide -unhide.rb -unhtml -uni2ascii -unicap -unicode -unicode-data -unicode-screensaver -unicon -unicorn -unidecode -unifdef -unifont -unionfs-fuse -unison -unison2.27.57 -unison2.32.52 -units -units-filter -unittest++ -unittest2 -uniutils -universalindentgui -unixcw -unixodbc -unixodbc-gui-qt -unknown-horizons -unmass -unmo3 -unoconv -unp -unpaper -unrar-free -unrtf -unscd -unshield -unsort -untex -unworkable -unzip -update-inetd -update-manager -update-notifier -upgrade-system -uphpmvault -up-imapproxy -upnp-inspector -upnp-router-control -upower -uppity -upse -upslug2 -upstart -uptimed -upx-ucl -uqm -uqm-russian -uqwk -urca -urfkill -urg -uriparser -urjtag -urlgrabber -urlscan -urlview -urlwatch -uruk -urwid -usb-discover -usb-modeswitch -usb-modeswitch-data -usbmount -usbmuxd -usbprog -usbredir -usbtc08-python -usbutils -usbview -usemod-wiki -usepackage -useragentswitcher -userdevfs -user-he -userinfo -usermode -user-mode-linux -user-mode-linux-doc -user-setup -userv -ussp-push -ust -ustr -uswsusp -utalk -utf8-migration-tool -uthash -utidylib -util-linux -uuagc -uucp -uucpsend -uudeview -uuidm -uvccapture -uw-imap -uwsgi -uzbek-wordlist -uzbl -v4l2loopback -v4l2ucp -v4l-utils -v86d -vacation -vagalume -vagrant -vala-0.14 -vala-0.16 -valabind -vala-dbus-binding-tool -valadoc -val-and-rick -vala-terminal -valatoys -valgrind -valknut -valkyrie -vamp-plugin-sdk -vamps -vanessa-adt -vanessa-logger -vanessa-socket -van.pydeb -varconf -varmon -varnish -vatnumber -vavoom -vbackup -vbetool -vbindiff -vblade -vblade-persist -vbrfix -vcdimager -vcftools -vcheck -vclt-tools -vco-plugins -vcsh -vde2 -vdesk -vdetelweb -vdk2 -vdk2-tutorial -vdkbuilder2 -vdk-doc -vdkxdb2 -vdmfec -vdpauinfo -vdpau-video -vdr -vdradmin-am -vdr-plugin-dvd -vdr-plugin-epgsearch -vdr-plugin-epgsync -vdr-plugin-femon -vdr-plugin-fritzbox -vdr-plugin-games -vdr-plugin-infosatepg -vdr-plugin-live -vdr-plugin-mp3 -vdr-plugin-osdserver -vdr-plugin-osdteletext -vdr-plugin-prefermenu -vdr-plugin-remote -vdr-plugin-remoteosd -vdr-plugin-skinenigmang -vdr-plugin-spider -vdr-plugin-streamdev -vdr-plugin-sudoku -vdr-plugin-svdrposd -vdr-plugin-svdrpservice -vdr-plugin-vcd -vdr-plugin-weather -vdr-plugin-xine -vdr-plugin-xineliboutput -vecmath -vectoroids -velocity -velocity-tools -velvet -vera -verbiste -verilator -veromix -verse -veusz -vflib3 -vftool -vfu -vgabios -vgrabbj -via -vice -vidalia -videocut -videogen -videolan-doc -viennacl -viewmol -viewpdf.app -viewvc -vifm -vigor -viking -vile -vilistextum -vim -vim-addon-manager -vimhelp-de -vim-latexsuite -vimoutliner -vimperator -vim-rails -vim-scripts -vim-syntax-gtk -vim-vimerl -vinagre -vinetto -vino -viper -vips -viridian -virtaal -virt-goodies -virtinst -virt-manager -virt-top -virtualbox -virtualbricks -virtualenvwrapper -virtuoso-opensource -virt-viewer -virt-what -viruskiller -visitors -visolate -vistrails -visualboyadvance -visual-regexp -vitables -vite -vkeybd -vlan -vlc -vlock -vlogger -vm -vmfs-tools -vmm -vmmlib -vmpk -vmware-manager -vmware-view-open-client -vnc4 -vnc-java -vncsnapshot -vnstat -vo-aacenc -vo-amrwbenc -vobcopy -vocproc -vodovod -volpack -volti -volumecontrol.app -volumeicon -volview -voms -voms-api-java -voms-mysql-plugin -vor -vorbisgain -vorbis-tools -vowpal-wabbit -voxbo -vpb-driver -vpim -vpnc -vpnc-scripts -vrb -vrfy -vrms -vrrpd -vsdump -vsftpd -v-sim -vstream-client -vte -vte3 -vtgrab -vtk -vtkdata -vtkedge -vtprint -vttest -vtun -vtwm -vusb-analyzer -vxl -vym -vzctl -vzdump -vzquota -w2do -w3af -w3cam -w3c-dtd-xhtml -w3c-linkchecker -w3c-markup-validator -w3c-sgml-lib -w3-dtd-mathml -w3m -w3m-el -w3m-el-snapshot -w9wm -wacomtablet -wader -wagon -wagon2 -wah-plugins -waili -wajig -wakeonlan -wammu -wapiti -wapua -warmux -watchdog -wav2cdr -wavbreaker -wavemon -wavesurfer -wavpack -wayland -wayv -wbar -wbox -wbxml2 -wcalc -wcd -wcslib -wcstools -wdg-html-validator -wdiff -wdm -wdq2wav -weathermap4rrd -weather-util -web2py -webalizer -webauth -webcamd -webcheck -webcit -webcolors -webdeveloper -webdruid -webfs -webgen0.4 -webgen0.5 -webhelpers -webissues -webissues-server -webkit -webkit2pdf -webkit-image -webkitkde -webkit-sharp -webmagick -weboob -weborf -webpy -webrtc-audio-processing -webserver-package -websvn -webtest -weechat -weechat-scripts -weex -weirdx -weka -welcome2l -weplab -werken.xpath -wesnoth-1.10 -west-chamber -wfmath -wfo -wfrench -wget -whatsnewfm -whatweb -when -whereami -whichman -whichwayisup -whiff -whitedune -whizzytex -whohas -whois -whowatch -why -whysynth -whyteboard -wicd -wicd-kde -wide-dhcpv6 -widelands -widemargin -wifi-radar -wiggle -wiipdf -wiki2beamer -wikidiff2 -wikipedia2text -wikipediafs -wildmidi -wiliki -wily -wims-help -win32-loader -windowlab -windows-el -wine -wine-doc -wine-gecko-1.4 -winetricks -winff -wing -wings3d -wininfo -winpdb -winwrangler -wipe -wireless-regdb -wireless-tools -wireshark -wise -witalian -witty -wizznic -wkhtmltopdf -wl -wl-beta -wm2 -wmacpi -wmail -wmaker -wmaker-data -wmaloader -wmanager -wmauda -wmbattery -wmbiff -wmbubble -wmbutton -wmcalclock -wmcdplay -wmclock -wmclockmon -wmcoincoin -wmcpu -wmcpuload -wmctrl -wmdate -wmdiskmon -wmdrawer -wmf -wmforkplop -wmfrog -wmhdplop -wm-icons -wmifinfo -wmifs -wmii -wmii-doc -wmitime -wmix -wml -wmlongrun -wmmatrix -wmmemload -wmmixer -wmmon -wmmoonclock -wmnd -wmnet -wmnut -wmpinboard -wmppp.app -wmpuzzle -wmrack -wmressel -wmshutdown -wmtemp -wmtime -wmtv -wmwave -wmweather -wmweather+ -wmwork -wmxmms2 -wmxres -wnn6-sdk -wnn7egg -wokkel -wolf4sdl -wondershaper -woof -wordgrinder -wordnet -wordplay -wordpress -wordpress-openid -wordpress-shibboleth -wordpress-xrds-simple -worker -worklog -workrave -wot -wotsap -wp2x -wpa -wpp -wput -wraplinux -wrapperfactory.app -wrapsrv -wreport -writer2latex -writerperfect -writetype -w-scan -wsdl2c -wsdl4j -wsil4j -wsjt -wspanish -wss4j -wsynth-dssi -wtforms -wuzzah -wv -wv2 -wvdial -wvstreams -wwl -wwwconfig-common -wwwstat -wxgeometrie -wxglade -wxmaxima -wxsqlite3 -wxsvg -wxwidgets2.8 -wyg -wyrd -wysihtml -wzdftpd -wzip -x11-apps -x11proto-bigreqs -x11proto-composite -x11proto-core -x11proto-damage -x11proto-dmx -x11proto-dri2 -x11proto-fixes -x11proto-fonts -x11proto-gl -x11proto-input -x11proto-kb -x11proto-print -x11proto-randr -x11proto-record -x11proto-render -x11proto-resource -x11proto-scrnsaver -x11proto-video -x11proto-xcmisc -x11proto-xext -x11proto-xf86bigfont -x11proto-xf86dga -x11proto-xf86dri -x11proto-xf86vidmode -x11proto-xinerama -x11-session-utils -x11-utils -x11vnc -x11-xfs-utils -x11-xkb-utils -x11-xserver-utils -x2 -x264 -x2goclient -x2vnc -x2x -x52pro -x86info -xa -xabacus -xacobeo -xalan -xaos -xapian-bindings -xapian-core -xapian-omega -xappy -xarchiver -xarclock -xauth -xautolock -xautomation -xavante -xaw3d -xawtv -xbacklight -xbae -xball -xbattbar -xbattle -xbill -xbindkeys -xbindkeys-config -xbitmaps -xblast-tnt -xblast-tnt-images -xblast-tnt-levels -xblast-tnt-models -xblast-tnt-musics -xblast-tnt-sounds -xbmc -xboard -xboing -xbomb -xboxdrv -xbs -xbubble -xbuffy -xca -xcache -xcal -xcalib -xcb -xcb-proto -xcb-util -xcb-util-image -xcb-util-keysyms -xcb-util-renderutil -xcb-util-wm -xcfa -xcftools -xchain -xchat -xchat-gnome -xchat-guile -xchat-xsys -xchm -xcircuit -xcite -xclip -xcolmix -xcolors -xcolorsel -xcompmgr -xcowsay -xcp-eliloader -xcp-storage-managers -xcp-vncterm -xcrysden -xcursor-themes -xd -xdaliclock -xdb -xdeb -xdebug -xdelta -xdelta3 -xdemineur -xdemorse -xdesktopwaves -xdffileio -xdg-user-dirs -xdg-user-dirs-gtk -xdg-utils -xdiskusage -xdm -xdmf -xdms -xdot -xdotool -xdrawchem -xdu -xdvik-ja -xen -xen-api -xen-api-libs -xenomai -xen-tools -xenwatch -xerces-c -xerces-c2 -xevil -xf86-input-mtrack -xf86-input-multitouch -xf86-input-wacom -xf86-video-glamo -x-face-el -xfaces -xfburn -xfce4 -xfce4-appfinder -xfce4-artwork -xfce4-battery-plugin -xfce4-cellmodem-plugin -xfce4-clipman-plugin -xfce4-cpufreq-plugin -xfce4-cpugraph-plugin -xfce4-datetime-plugin -xfce4-dev-tools -xfce4-dict -xfce4-diskperf-plugin -xfce4-fsguard-plugin -xfce4-genmon-plugin -xfce4-goodies -xfce4-hdaps -xfce4-indicator-plugin -xfce4-linelight-plugin -xfce4-mailwatch-plugin -xfce4-messenger-plugin -xfce4-mixer -xfce4-mount-plugin -xfce4-mpc-plugin -xfce4-netload-plugin -xfce4-notes-plugin -xfce4-notifyd -xfce4-panel -xfce4-places-plugin -xfce4-power-manager -xfce4-quicklauncher-plugin -xfce4-radio-plugin -xfce4-screenshooter -xfce4-sensors-plugin -xfce4-session -xfce4-settings -xfce4-smartbookmark-plugin -xfce4-systemload-plugin -xfce4-taskmanager -xfce4-terminal -xfce4-timer-plugin -xfce4-utils -xfce4-verve-plugin -xfce4-volumed -xfce4-wavelan-plugin -xfce4-weather-plugin -xfce4-wmdock-plugin -xfce4-xkb-plugin -xfconf -xfdesktop4 -xfe -xfig -xfingerd -xfireworks -xfishtank -xflip -xflr5 -xfm -xfmpc -xfoil -xfonts-100dpi -xfonts-75dpi -xfonts-a12k12 -xfonts-ayu -xfonts-baekmuk -xfonts-base -xfonts-biznet -xfonts-bolkhov -xfonts-cronyx -xfonts-cyrillic -xfonts-efont-unicode -xfonts-encodings -xfonts-jisx0213 -xfonts-jmk -xfonts-kaname -xfonts-kappa20 -xfonts-marumoji -xfonts-mathml -xfonts-mona -xfonts-mplus -xfonts-nexus -xfonts-scalable -xfonts-shinonome -xfonts-terminus -xfonts-traditional -xfonts-utils -xfonts-wqy -xfprint4 -xfpt -xfrisk -xfs -xfsdump -xfsprogs -xfstt -xfswitch-plugin -xft -xfwm4 -xfwm4-themes -xgalaga -xgalaga++ -xgammon -xgraph -xgridfit -xhtmlrenderer -xicc -xindy -xine-lib -xine-lib-1.2 -xine-plugin -xinetd -xine-ui -xinit -xinput -xinv3d -xiphos -xipmsg -xiterm+thai -xjadeo -xjdic -xjig -xjobs -xjokes -xjump -xkbind -xkbset -xkeyboard-config -xkeycaps -xl2tpd -xlassie -xlbiff -xless -xletters -xlhtml -xli -xloadimage -xlog -xlwt -xmacro -xmahjongg -xmail -xmakemol -xmanpages-ja -xmbmon -xmds -xmds-doc -xmedcon -xmem -xmhtml -xmille -xmix -xml2 -xmlbeans -xmlbeans-maven-plugin -xml-commons-external -xmlcopyeditor -xml-core -xml-crimson -xmldiff -xmlextras -xmlgraphics-commons -xmlindent -xml-light -xmlm -xmlmarshaller -xmlroff -xmlrpc-c -xmlrpc-epi -xmlrpc-light -xmlsec1 -xml-security-c -xmlstarlet -xmltex -xmlto -xmltoman -xmltooling -xmltv -xmlunit -xmms2 -xmms2-scrobbler -xmms2tray -xmobar -xmonad -xmonad-contrib -xmorph -xmotd -xmoto -xmount -xmountains -xmp -xmpi -xnbd -xnec2c -xnecview -xnee -xnetcardconfig -xneur -xom -xonix -xoo -xorg -xorg-docs -xorg-server -xorg-sgml-doctools -xorp -xoscope -xosd -xosview -xotcl -xournal -xpa -xpad -xpaint -xpat2 -xpdf -xpenguins -x-pgp-sig-el -xphoon -xpilot-extra -xpilot-ng -xplanet -xplc -xplot -xplot-xplot.org -xpn -xpp -xppaut -xpra -xprintidle -xprobe -xpuzzles -xpyb -xqf -xqilla -xracer -xrdp -xresprobe -xrestop -xringd -xrootconsole -xrsh -xsane -xscavenger -xscorch -xscreensaver -xsd -xsddiagram -xsel -xsensors -xserver-xorg-input-acecad -xserver-xorg-input-aiptek -xserver-xorg-input-elographics -xserver-xorg-input-evdev -xserver-xorg-input-joystick -xserver-xorg-input-keyboard -xserver-xorg-input-mouse -xserver-xorg-input-mutouch -xserver-xorg-input-synaptics -xserver-xorg-input-vmmouse -xserver-xorg-input-void -xserver-xorg-video-apm -xserver-xorg-video-ark -xserver-xorg-video-ati -xserver-xorg-video-chips -xserver-xorg-video-cirrus -xserver-xorg-video-dummy -xserver-xorg-video-fbdev -xserver-xorg-video-geode -xserver-xorg-video-glide -xserver-xorg-video-glint -xserver-xorg-video-i128 -xserver-xorg-video-i740 -xserver-xorg-video-intel -xserver-xorg-video-ivtvdev -xserver-xorg-video-mach64 -xserver-xorg-video-mga -xserver-xorg-video-modesetting -xserver-xorg-video-neomagic -xserver-xorg-video-nouveau -xserver-xorg-video-openchrome -xserver-xorg-video-qxl -xserver-xorg-video-r128 -xserver-xorg-video-rendition -xserver-xorg-video-s3 -xserver-xorg-video-s3virge -xserver-xorg-video-savage -xserver-xorg-video-siliconmotion -xserver-xorg-video-sis -xserver-xorg-video-sisusb -xserver-xorg-video-tdfx -xserver-xorg-video-tga -xserver-xorg-video-trident -xserver-xorg-video-tseng -xserver-xorg-video-vesa -xserver-xorg-video-vmware -xserver-xorg-video-voodoo -xsettings-kde -xshisen -xskat -xslthl -xsmc-calc -xsok -xsol -xsoldier -xsp -xstarfish -xstow -xstr -xstrp4 -xsunpinyin -xsynth-dssi -xsysinfo -xsystem35 -xtables-addons -xtail -xtalk -xteddy -xtel -xtell -xterm -xtermcontrol -xtermset -xtide -xtide-coastline -xtide-data -x-tile -xtitle -xtrace -xtrans -xtrkcad -xtrlock -xtron -xtrs -xttitle -xtux -xtv -xul-ext-monkeysphere -xul-ext-zotero -xutils-dev -xuxen-eu-spell -xvba-video -xvidcore -xvier -xview -xvkbd -xvt -xwatch -xwax -xwelltris -xwit -xword -xwpe -xwrits -xxgdb -xxkb -xxxterm -xye -xylib -xymon -xyscan -xzgv -xzip -xz-java -xzoom -xz-utils -yabause -yacas -yacpi -yade -yafaray -yafaray-exporter -yafc -yagf -yagiuda -yagtd -yahoo2mbox -yahtzeesharp -yajl -yakuake -yamdi -yaml-cpp -yaml-mode -yample -yap -yapet -yapps2 -yappy -yapra -yard -yardradius -yaret -yarssr -yasat -yash -yaskkserv -yasm -yasnippet -yasr -yate -yatex -yatm -yauap -yaws -yaz -yc-el -ydpdict -yeahconsole -yecht -yelp -yelp-tools -yelp-xsl -yersinia -yforth -ygl -ygraph -yics -yiyantang -ykclient -yocto-reader -yodl -yojson -yokadi -yorick -yorick-av -yorick-cubeview -yorick-curses -yorick-gl -yorick-hdf5 -yorick-imutil -yorick-mira -yorick-ml4 -yorick-mpeg -yorick-optimpack -yorick-soy -yorick-spydr -yorick-yao -yorick-yeti -yorick-yutils -yorick-z -yoshimi -yp-svipc -ytalk -ytree -yubico-pam -yubikey-personalization -yubikey-personalization-gui -yubikey-server-c -yubiserver -yudit -yue-sounds-fso -yui -yui3 -yui-builder -yui-compressor -yum -yum-metadata-parser -yydebug -z80asm -z80dasm -z80ex -z8530-utils2 -z88 -z88dk -zanshin -zapping -zarafa-drag-n-drop -zatacka -zathura -zathura-extras -zaz -zbar -zc.buildout -zc.lockfile -zconfig -zdaemon -zec -zeitgeist -zeitgeist-datahub -zeitgeist-sharp -zelig -zemberek -zemberek-ooo -zemberek-server -zendframework -zenity -zephyr -zeroc-ice -zeroc-icee -zeroc-icee-java -zeroc-icee-translators -zerofree -zeroinstall-injector -zeromq -zeya -zfec -zfs-fuse -zgv -zh-autoconvert -zhcon -zhpy -zile -zim -zimpl -zine -zinnia -zip -zipios++ -zipper.app -ziproxy -zita-ajbridge -zita-alsa-pcmi -zita-at1 -zita-convolver -zita-lrx -zita-resampler -zita-rev1 -zivot -zlib -zlibc -zmakebas -znc -zodb -zoem -zomg -zonecheck -zoneminder -zoo -zookeeper -zoomer -zope2.12 -zope.authentication -zope.browser -zope.cachedescriptors -zope-common -zope.component -zope.configuration -zope.contenttype -zope.copy -zope-debhelper -zope.deprecation -zope.dottedname -zope.event -zope.exceptions -zope.fixers -zope.hookable -zope.i18n -zope.i18nmessageid -zope.interface -zope.location -zope-maildrophost -zope-mysqlda -zope.proxy -zope.publisher -zope-quotafolder -zope-replacesupport -zope.schema -zope.security -zope.sendmail -zope.sqlalchemy -zope.testbrowser -zope.testing -zope.testrunner -zope.traversing -zorp -zp -zpaq -zpb-ttf -zpspell -zsh -zsh-beta -zshdb -zsi -zssh -zsync -zthreads -zutils -zvbi -zyn -zynaddsubfx -zynjacku -zziplib -zzuf diff --git a/src/musketeer/experiments/goto-runner/pkgs-jenkins-paper b/src/musketeer/experiments/goto-runner/pkgs-jenkins-paper deleted file mode 100644 index 429e961590a..00000000000 --- a/src/musketeer/experiments/goto-runner/pkgs-jenkins-paper +++ /dev/null @@ -1,10 +0,0 @@ -blktrace -dnshistory -ghostess -lingot -memcached -proxsmtp -ptunnel -see -timemachine -weborf diff --git a/src/musketeer/experiments/goto-runner/pkgs-qm-all b/src/musketeer/experiments/goto-runner/pkgs-qm-all deleted file mode 100644 index c92718e0cf7..00000000000 --- a/src/musketeer/experiments/goto-runner/pkgs-qm-all +++ /dev/null @@ -1,9121 +0,0 @@ -0ad -0xffff -389-admin -389-adminutil -389-ds-base -389-dsgw -3dchess -3depict -3dldf -4digits -4g8 -6tunnel -7kaa -9menu -9mount -9wm -a2jmidid -a52dec -a56 -aa3d -aalib -aaphoto -abcm2ps -abcmidi -abduco -abe -abinit -abiword -abook -aboot -abootimg -abr2gbr -abx -accerciser -accountsservice -acct -ace -aces3 -acfax -achilles -acl -acl2 -acorn-fdisk -acoustid-fingerprinter -acpi -acpi-support -acpica-unix -acpid -acpitail -acpitool -acr -acr38 -acsccid -activiz.net -adabrowse -adanaxisgpl -adasockets -adcli -adios -adjtimex -admesh -adns -adolc -adonthell-data -adonthell -adplay -adplug -adun.app -advancecomp -advi -adwaita-icon-theme -aegis -aegisub -aes2501-wy -aeskulap -aespipe -aevol -aewan -aewm++-goodies -aewm -afflib -afuse -agave -agda -agda-stdlib -agedu -agenda.app -agg -aggregate -aghermann -aha -ahcpd -aiccu -aide -aiksaurus -air-quality-sensor -airspy-host -airstrike -aisleriot -aj-snapshot -akonadi-googledata -alacarte -alarm-clock-applet -alarm-clock -alberta -aldo -ale -alevt -alex -alex4 -algol68g -allegro4.4 -allegro5 -alleyoop -alltray -almanah -alpine -alsa-lib -alsa-oss -alsa-plugins -alsa-utils -alsaequal -alsamixergui -alsaplayer -alsoft-conf -altermime -altree -alure -amarok -amavisd-milter -amide -amideco -amiga-fdisk -amor -amora-server -ample -ampliconnoise -ams -amsn -amsynth -amtterm -amule-emc -an -anacron -analitza -analog -and -android-androresolvd -android-platform-build -android-platform-system-core -anfo -angband -anjuta-extras -ann -anna -anomaly -antennavis -anthy -antigrav -antiword -antlr -antpm -ants -anypaper -anyremote -aoetools -aoeui -aolserver4-nsldap -aolserver4-nsmysql -aolserver4-nsopenssl -aolserver4-nspostgres -aolserver4-nssha1 -aolserver4-nssqlite3 -aolserver4-nsxml -apache-mod-auth-ntlm-winbind -apache-upload-progress-module-goto-binaries.tar..> -apache2 -apbs -apcalc -apcupsd -apertium -apertium-tolk -apf -apg -aplus-fsf -apmd -apng2gif -apngasm -apngdis -apngopt -apophenia -apparix -apparmor -appdata-tools -apper -appmenu-qt -appstream-glib -appstream -apq-postgresql -apr -apr-util -apron -aprsd -aprsdigi -apt-build -apt-cacher-ng -apt-dater -apt -apt-transport-tor -apt-watch -aptitude -aptsh -apvlv -apwal -aqemu -aqsis -aragorn -arbtt -arc-gui-clients -archivemount -ardour3 -argtable2 -argus -argyll -aria2 -aribas -ario -arj -ark -armada-backlight -armagetronad -arp-scan -arpack++ -arpack -arpalert -arping -arptables -arpwatch -array-info -artha -as31 -asc -ascdc -ascii -ascii2binary -asclock -asedriveiiie -aseprite -asio -asmail -asmix -asmixer -asmon -asp -aspcud -aspectc++ -aspell -aspic -assaultcube -assimp -aster -asterisk-testsuite -astromenace -astronomical-almanac -asunder -asymptote -at -at-spi2-atk -at-spi2-core -atari800 -aterm -atheme-services -athena-jot -atk1.0 -atkmm1.6 -atlas-cpp -atlas -atlc -atomicparsley -atomix -atril -atsar -attic -attica -attica-kf5 -attr -aubio -audacious -audex -audiocd-kio -audiofile -audiopreview -aufs-tools -augeas -aumix -authbind -auto-07p -auto-apt -autoclass -autoconf-dickey -autocutsel -autodir -autodocksuite -autofs -autogen -autolog -automoc -autoproject -autossh -autotalent -autounit -avahi -avahi-sharp -avarice -avfs -aview -avifile -avis-client-c -avogadro -avr-evtd -avrprog -awardeco -away -aweather -awesfx -awesome -awffull -ax25-apps -ax25-tools -axiom -aylet -ayttm -b43-fwcutter -babeld -babeltrace -babl -backuppc -bacula -balance -balder2d -ball -ballerburg -ballz -baloo -baloo-kcmadv -baloo-widgets -balsa -bam -bambamc -bamf -bamtools -bandwidthcalc -bandwidthd -bangarang -banshee-community-extensions -banshee -baobab -bar -barada-pam -barcode -bareftp -bareos -barrage -base-installer -base-passwd -basilisk2 -basket -batctl -batmand -baycomepp -baycomusb -bbe -bbmail -bbpager -bbrun -bbtime -bcache-tools -bchunk -bcpp -bcrypt -bdfresize -beanstalkd -bear -beast-mcmc -beav -beecrypt -beef -beep -belle-sip -ben -berkeley-abc -berusky -berusky2 -bespin -betaradio -bfbtester -bfgminer -bfm -bglibs -bibclean -bibcursed -bible-kjv -bibledit-bibletime -bibledit-gtk -bibledit-xiphos -bibletime -bibtexconv -bibtool -bibutils -bidiv -biff -bijiben -billiard -biloba -bin-prot -binclock -bind-dyndb-ldap -bind9 -bindechexascii -bindfs -binfmt-support -binfmtc -bing -biniax2 -binkd -bino -binstats -binutils-h8300-hms -binutils-m68hc1x -binutils-msp430 -binwalk -bio2jack -biosig4c++ -biosquid -bip -bird -birdfont -birthday -bisho -bison++ -bison -bist -bitlbee -bitops -bitpim -bitstormlite -bittwist -black-box -blackbox -blacs-mpi -blacs-pvm -bladerf -blahtexml -blam -blas -blcr -bld -blender -blepvco -bless -blinken -blist -blitz++ -blktool -blktrace -blobby -blockattack -blockout2 -blocks-of-the-undead -blop -bluedevil -blueman -bluemon -bluetile -bluez -bluez-tools -bmake -bmf -bml -bmon -bnfc -bochs -bognor-regis -bogofilter -boinc-app-seti -boinc -boinctui -bombardier -bomber -bomberclone -bomstrip -bonnie++ -boolector -boolstuff -boost1.55 -bootchart2 -booth -bootpc -bopm -bosh -bosixnet -boswars -bottlerocket -bovo -box2d -boxes -boxshade -bplay -bpm-tools -bppphyview -brandy -brasero -brewtarget -brian -brickos -bridge-utils -brightd -brightside -briquolo -browser-history -brp-pacu -brutalchess -brutefir -bs2b-ladspa -bsd-finger -bsd-mailx -bsdiff -bsdmainutils -btag -btanks -bti -btscanner -btyacc -buffer -buffy -bugsquish -buildtorrent -bullet -bum -bumprace -bup -burgerspace -burp -bustle -busybox -buthead -bwa -bwbar -bwbasic -bwm-ng -byacc -byacc-j -byzanz -bzflag -bzip2 -bzr -c-ares -c-icap -c-icap-modules -c2050 -c2esp -c2hs -cabal-debian -cabextract -cableswig -cachefilesd -cacti-spine -cadaver -cairo-clock -cairo-dock -cairo-ocaml -cairodevice -cairomm -caja-extensions -caja -cal -cal3d -calcoo -calf -calibre -calife -calligra -calligra-l10n -cam -camitk -camlbz2 -camldbm -camlidl -camlimages -camljava -camlzip -camorama -camp -can-utils -canl-c++ -canl-c -canlock -cantata -canto -cantor -capi4hylafax -capnproto -capstone -cardpeek -carettah -caribou -casablanca -cassiopee -catdoc -catdvi -catools -cattle-1.0 -cavezofphear -cb2bib -cbedic -cbflib -cbm -cbmplugs -cbootimage -cbrpager -cc1111 -ccache -cccd -ccd2iso -ccid -cciss-vol-status -cclive -ccontrol -cconv -ccrypt -ccze -cd-discid -cd5 -cdargs -cdbackup -cdbs -cdcd -cdck -cdde -cddlib -cdebconf-entropy -cdebconf -cdebconf-terminal -cdebootstrap -cdecl -cdo -cdparanoia -cdpr -cdrdao -cdrom-checker -cdtool -ceferino -cegui-mk2 -celestia -ceph -certmonger -cervisia -cfingerd -cfitsio -cfitsio3 -cflow -cfourcc -cgal -cgdb -cgiemail -cgilib -cgit -cgmanager -cgminer -cgoban -cgsi-gsoap -charls -charybdis -chase -chasen -chealpix -check -checkinstall -checkpolicy -cheese -cheetah -chemfp -chemical-mime-data -chemical-structures -chessx -chiark-tcl -chiark-utils -chicken -chimera2 -chise-base -chktex -chmlib -chntpw -choose-mirror -choosewm -choqok -chordii -choreonoid -chromaprint -chromium-bsu -chron -chrony -chrootuid -chrpath -chuck -cifs-utils -cigi-ccl -cinnamon-control-center -cinnamon-desktop -cinnamon -cinnamon-menus -cinnamon-screensaver -cinnamon-session -cinnamon-settings-daemon -circuslinux -citadel-client -cjet -cjk -cjs -cksfv -cl-sql -cl-uffi -clam -clamav -clamfs -clamsmtp -clamz -clanlib -cldump -clearcut -clearsilver -clementine -clex -clinfo -cliofetion -clipit -clipper -clippoly -clips -cliquer -cln -clock-setup -clog -cloog -cloog-ppl -cloop -clp -clsync -clucene-core -clustalo -clustalw -cluster-agents -cluster -clutter-gst-2.0 -clutter-gst -clutter-gtk -clutter-imcontext -clzip -cmatrix -cmdpack -cmigemo -cminpack -cmip5-cmor-tables -cmocka -cmor -cmospwd -cmph -cmtk -cmus -cnf -cnrun -cntlm -coala -coccinelle -code-saturne -codegroup -codelite -coils -coin3 -coinmp -coinor-cbc -coinor-cgl -coinor-csdp -coinor-dylp -coinor-flopc++ -coinor-osi -coinor-symphony -coinor-vol -coinst -coinutils -coldfire -colibri -collectd -colobot -colorblind -colord -colord-gtk -colorhug-client -colortail -colpack -colrconv -comedilib -comgt -commons-daemon -compartment -compiz-fusion-bcop -composite -compton -concalc -concordance -condor -conduit -confetti -confget -config-manager -confuse -conkeror -connect-proxy -connectome-workbench -connman -connman-ui -conntrack -conquest-dicom-server -console-braille -console-bridge -consolekit -conspy -converseen -cookietool -coolkey -coolmail -copyfs -coq -core-network -coriander -corkscrew -coturn -courier-authlib -couriergrey -courierpassd -cowbell -cowdancer -cp2k -cpipe -cpl-plugin-fors -cpl-plugin-giraf -cpl-plugin-hawki -cpl-plugin-kmos -cpl-plugin-sinfo -cpl-plugin-uves -cpl-plugin-xshoo -cpm -cpmtools -cpp-netlib -cppad -cppdb -cpphs -cppunit -cpputest -cpqarrayd -cproto -cpufreqd -cpulimit -cputool -cqrlib -crack-attack -crack -cracklib2 -cramfs -cramfsswap -crashmail -crashme -crda -creduce -cricket -crimson -criticalmass -crm114 -crmsh -cron -cronolog -cronutils -crossfire-client -crossfire -crrcsim -crtmpserver -cruft -crunch -cryptcat -cryptkeeper -cryptmount -cryptokit -cryptsetup -crystalhd -crystalspace-glshader-cg -cscope -csh -csmash -cssc -cstream -csv2latex -csync2 -ctdb -ctemplate -ctfutils -cthumb -ctn -ctorrent -ctpl -ctpp2 -ctsim -ctwm -cudf -cue2toc -cuetools -cunit -cups-bjnp -cups-filters -cups-pdf -cups-pk-helper -cupt -curl -curlpp -curseofwar -cutecom -cutils -cutter -cvc3 -cvector -cvm -cvs -cvsd -cvsgraph -cvsps -cwdaemon -cwidget -cwiid -cwirc -cwm -cxxtools -cyassl -cyclades-serial-client -cynthiune.app -cyrus-imspd -cytadela -cython -d-conf -d-feet -d52 -daa2iso -dact -dadadodo -daemon -daemonlogger -daemontools -daisy-player -dancer-xml -dangen -dapl -daq -dar -darcs -darcs-monitor -dares -darkice -darkplaces -darksnow -darkstat -darnwdl -darts -das-watchdog -dash -dasher -datamash -datapacker -dataquay -date -datefudge -dateutils -dav-text -davfs2 -davix -dawgdic -db -db1-compat -db5.3 -dballe -dbar -dbench -dbf2mysql -dbmix -dbskkd-cdb -dbus-c++ -dbus-glib -dbus -dbusada -dbuskit -dbview -dc3dd -dcap -dclock -dcraw -dctrl-tools -ddate -ddccontrol-db -ddccontrol -ddd -ddns3-client -ddpt -dds -dds2tar -deal -deal.ii -deb-gview -debconf-kde -debdelta -debfoster -debian-edu-artwork -debian-installer-utils -debian-xcontrol -debianutils -deborphan -debram -debsig-verify -debtags -dee -deets -defendguin -deja-dup -dejagnu -delta -deltarpm -denemo -depqbf -desklaunch -deskmenu -desktop-file-utils -desktopnova -desmume -desproxy -detox -deutex -devhelp -device-tree-compiler -devil -devilspie -devilspie2 -devio -devscripts -dfc -dff -dfu-programmer -dfu-util -dh-exec -dhcp-helper -dhcp-probe -dhcpcd-dbus -dhcpcd-ui -dhcpcd5 -dhcpdump -dhcping -dhex -dhis-client -dhis-dns-engine -dhis-mx-sendmail-engine -dhis-server -dhis-tools-dns -di -dia-newcanvas -dia-shapes -dia2code -diagnostics -dialign -dialign-t -dialog -dico -dicomnifti -dicomscope -dict-gcide -dictconv -dictd -diction -didiwiki -diet -diffstat -diffutils -digikam -digitemp -dillo -dimbl -dime -din -ding-libs -dino -diod -diodon -dipy -dirac -dircproxy -dirdiff -directvnc -direwolf -dirmngr -discosnp -discount -discover -disk-manager -diskscan -disktype -dispcalgui -display-dhammapada -dist -distcc -distorm3 -distorm64 -distro-info -disulfinder -djinn -djmount -djtools -djview4 -djvulibre -dleyna-connector-dbus -dleyna-core -dleyna-renderer -dleyna-server -dlume -dlz-ldap-enum -dma -dmalloc -dmapi -dmg2img -dmidecode -dmraid -dmtcp -dmtx-utils -dmucs -dns-flood-detector -dnshistory -dnsmasq -dnsproxy -dnssec-trigger -dnstop -dnstracer -docbook-to-man -docbook2x -dochelp -docker -docky -docsis -dogtag-pki -dolfin -dolphin-plugins -donkey -doodle -dopewars -doris -dos2unix -dosbox -doscan -doschk -dose3 -dosfstools -dossizola -dot-forward -dotconf -dov4l -dovecot -downtimed -doxygen -doxymacs -drac -dracut -dradio -dragon -drawtiming -drawtk -dreamchess -driftnet -drizzle -dropbear -drumkv1 -dsbltesters -dsc-statistics -dsdp -dsh -dssi -dsyslog -dtach -dtaus -dulwich -duma -dumpasn1 -dumpet -dune-common -dune-geometry -dune-grid-glue -dune-grid -dune-istl -dune-localfunctions -dune-pdelab -dune-typetree -dunst -duo-unix -duplicity -dv4l -dvbackup -dvbcut -dvblast -dvbsnoop -dvbstream -dvbstreamer -dvbtune -dvd+rw-tools -dvdbackup -dvdtape -dvgrab -dvi2dvi -dvi2ps -dvidvi -dvipng -dvipost -dvipsk-ja -dvorak7min -dwarfutils -dwarves-dfsg -dwdiff -dwm -dwww -dwz -dxflib -dymo-cups-drivers -dynalogin -dynamite -dynare -dzen2 -e00compr -e17 -e2ps -e2tools -easychem -easyh10 -easymp3gain -easyspice -easytag -eblook -ebnetd -ebook-speaker -ebook-tools -ebook2cw -ebtables -ecasound -echoping -ecl -eclib -eclipse-cdt -ecryptfs-utils -ed -ed2k-hash -edac-utils -edbrowse -edbus -edfbrowser -edflib -editline -editorconfig-core -eegdev -eep24c -efax -efax-gtk -efi-reader -efibootmgr -efingerd -efivar -eflite -efreet -efte -egenix-mx-base -eiciel -eigen3 -einspline -eiskaltdcpp -eject -ekeyd -ekg -ekiga -elastix -electric-fence -elementary -elementtidy -elfrc -elilo -elk -elog -elpa -elvis-tiny -emacs24 -emacspeak-ss -email2trac -embassy-domainatrix -embassy-domalign -embassy-domsearch -ember -emerillon -emms -empire -empire-hub -empire-lafe -empty-expect -emu8051 -enblend-enfuse -enca -encfs -enchant -enet -engine-pkcs11 -engrampa -enigma -enscribe -enscript -ent -entangle -entr -enum -envstore -eog -eog-plugins -eot-utils -eperl -epic4 -epic5 -epiphany -epix -epm -epr-api -epson-inkjet-printer-escpr -epstool -epwutil -eq10q -eql -eqonomize -erfa -ergo -eris -erlang-bitcask -erlang-cherly -erlang-cl -erlang-jiffy -erlang-p1-iconv -erlang-p1-pam -erlang-p1-sip -erlang-p1-stringprep -erlang-p1-tls -erlang-p1-xml -erlang-p1-yaml -erlang-p1-zlib -erm -esdl -esekeyd -esmtp -esniper -esorex -espctag -espeak -espeakup -espresso -esys-particle -eterm -etherape -etherpuppet -etherwake -ethstatus -etl -eukleides -euler -evas-loaders -evemu -event-dance -eventlog -eventstat -evilvte -evilwm -evince -evince-hwp -evolution-ews -evolution-mapi -evolution-rss -evtest -eweouz -exactimage -excellent-bifurcation -exempi -exfat-utils -exif -exifprobe -exiftags -exiv2 -exo -exodusii -expat -expect -expeyes -exrtools -ext3grep -ext4magic -extace -extra-cmake-modules -extra-xdg-menus -extremetuxracer -extundelete -exuberant-ctags -exult -ez-ipupdate -ezmlm-browse -ezstream -eztrace -f-irc -f2c -f2fs-tools -f3 -faad2 -fabulous -faifa -fair -fairymax -fake -fakepop -fakeroot -fakeroot-ng -faketime -falconpl -falselogin -fam -fapg -farpd -farstream-0.2 -farstream -fastdnaml -fastforward -fastjar -fastjet -fasttree -fastx-toolkit -fatattr -fatcat -fatrace -fatrat-czshare -fatrat-opensubtitles -fatresize -fatsort -faucc -fauhdlc -faulthandler -fbasics -fbcat -fbi -fbpager -fbpanel -fbset -fbterm -fbterm-ucimf -fbxkb -fbzx -fceux -fcgiwrap -fcitx-anthy -fcitx-chewing -fcitx-cloudpinyin -fcitx-configtool -fcitx-fbterm -fcitx-googlepinyin -fcitx -fcitx-hangul -fcitx-libpinyin -fcitx-m17n -fcitx-qt5 -fcitx-rime -fcitx-sayura -fcitx-skk -fcitx-sunpinyin -fcitx-ui-light -fcitx-unikey -fcl -fcode-utils -fcopulae -fcrackzip -fdflush -fdm -fdmdv2 -fdsend -fdupes -fdutils -feel++ -feh -ferret-vis -festival -fetchmail -ffcall -ffe -fflas-ffpack -ffmpeg2theora -ffmpegthumbnailer -ffmpegthumbs -ffms2 -ffrenzy -fftw -fftw3 -fgetty -fgrun -fhist -figlet -file -file-kanji -file-roller -filelight -fileschanged -filetea -fillets-ng -filter -findimagedupes -findlib -fio -firebird2.5 -firedns -firestring -firewalld -fische -fitsverify -fityk -five-or-more -fizmo -fl-cow -flac -flactag -flake -flam3 -flamerobin -flann -flare-engine -flare-game -flare -flashbench -flashcache -flashplugin-nonfree-extrasound-goto-binaries.ta..> -flashrom -flasm -flatzebra -fldiff -fldigi -flex-old -flexbar -flexloader -flexml -flickcurl -flightgear -flip -flmsg -floatbg -flog -florence -flowgrind -flpsed -flrig -fltk1.1 -fltk1.3 -fluidsynth-dssi -flush -fluxbox -flvmeta -flvstreamer -flwm -flwrap -fmit -fmtools -fntsample -folks -fondu -font-manager -fontconfig -fontforge-extras -fonttools -foo2zjs -foobillardplus -fookb -foomatic-db-engine -foomatic-filters -foreign -foremost -forked-daapd -forkstat -fort77 -fortune-mod -fortunes-es -fosfat -fossil -four-in-a-row -fox1.6 -foxtrotgps -fpart -fped -fpgatools -fping -fplll -fpm2 -fprint-demo -fprintd -fprobe -fprobe-ulog -fqterm -fractalnow -frama-c -frame -francine -freealut -freebirth -freebsd-glue -freebsd-libs -freecad -freecdb -freecell-solver -freeciv -freecontact -freedink-dfarc -freedroid -freefem++ -freefem -freefem3d -freefoam -freegish -freehdl -freeimage -freeipmi -freemat -freeorion -freeradius -freespace2-launcher-wxlauncher-goto-binaries.ta..> -freesweep -freetds -freetuxtv -freetype -freewheeling -freexl -frei0r -freqtweak -fribid -fritzing -frog -frogr -frotz -frown -frozen-bubble -fs-uae -fsarchiver -fslview -fsmark -fso-datad -fso-deviced -fso-gpsd -fso-gsm0710muxd -fso-gsmd -fso-usaged -fspanel -fsplib -fspy -fstrcmp -fswebcam -ftdi-eeprom -fteqcc -ftgl -ftjam -ftnchek -ftools-fv -ftphs -ftplib -ftpmirror -fullquottel -funguloids -funnelweb -fuse-convmvfs -fuse-emulator-utils -fuse-exfat -fuse -fuse-posixovl -fuse-umfuse-ext2 -fuse-umfuse-fat -fuse-umfuse-iso9660 -fusedav -fuseiso -fusesmb -fuzz -fvwm1 -fwbuilder -fwknop -fwlogwatch -fxload -fyba -fyre -g-wrap -g15composer -g15macro -g15mpd -g15stats -g2clib -g2ipmsg -g3data -g3dviewer -gadap -gadfly -gadmin-bind -gadmin-openvpn-client -gadmin-openvpn-server -gadmin-proftpd -gadmin-rsync -gadmin-samba -gajim -galax -galculator -galib -galleta -gamazons -gambc -game-music-emu -gamin -gamine -gammaray -ganeti -ganglia -ganglia-modules-linux -ganv -ganyremote -gap-float -gap -gap-guava -gap-io -garcon -garden-of-coloured-lights -garmin-forerunner-tools -garmin-plugin -garmindev -gatling -gauche-c-wrapper -gauche -gauche-gtk -gaviotatb -gavl -gazebo -gbase -gbatnav -gbemol -gbgoffice -gbonds -gbrainy -gbrowse -gbsplay -gcal -gcb -gcc-4.8 -gcc-arm-none-eabi -gcc-avr -gcc-mingw-w64 -gcl -gcolor2 -gcompris -gconf-editor -gconf -gconfmm2.6 -gconjugue -gcpegg -gcx -gd4o -gdbm -gdesklets -gdigi -gdis -gdk-pixbuf -gdl -gdm3 -gdmap -gdnsd -gdome2 -gdpc -geant321 -geany -geany-plugins -gearman-interface -gearmand -geary -gecko-mediaplayer -gecode -geda-gaf -geda-xgsch2pcb -gedit -gedit-latex-plugin -gedit-plugins -geekcode -geeqie -geis -geki2 -geki3 -gelemental -gem -gemanx-gtk2 -gemdropx -gemrb -gems -genders -genext2fs -gengetopt -genisovh -genius -genometools -genparse -genromfs -genshi -gentle -geoclue-2.0 -geoclue -geocode-glib -geogebra-kde -geographiclib -geoip -geomview -geos -gerbv -gerstensaft -gesftpserver -getdns -getstream -gexec -gexiv2 -gf-complete -gf2x -gfal2 -gfarm -gfarm2fs -gfax -gfbgraph -gff2aplot -gflags -gfm -gforth -gfpoken -gfs2-utils -gfsview -gftp -gfxboot -ggcov -ggobi -ghc -ghc-mod -ghc-testsuite -ghemical -ghex -ghostess -giblib -gif2apng -gif2png -giflib -gifsicle -gifticlib -giftrans -gigedit -giggle -gigolo -gimagereader -gimmix -gimp-dcraw -gimp-dds -gimp-gap -gimp-texturize -ginac -ginkgocadx -girara -git-annex -git-repair -gitg -github-backup -gitit -givaro -gjacktransport -gjay -gjiten -gjs -gkdebconf -gkermit -gkrellkam -gkrellm -gkrellm-leds -gkrellm-mailwatch -gkrellm-radio -gkrellm-reminder -gkrellm-thinkbat -gkrellm-volume -gkrellm-x86info -gkrellm-xkb -gkrellm2-cpufreq -gkrellmitime -gkrellmoon -gkrellmwireless -gkrellshoot -gkrelltop -gkrelluim -gkrellweather -gkremldk -gksu -gl-117 -gl2ps -glabels -glade -gladtex -glam2 -gle -glee -glew -glfer -glfw -glfw3 -glib-networking -glibmm2.4 -glide -glm -glob2 -global -globs -globus-authz-callout-error -globus-authz -globus-callout -globus-common -globus-core -globus-ftp-client -globus-ftp-control -globus-gass-cache -globus-gass-cache-program -globus-gass-copy -globus-gass-server-ez -globus-gass-transfer -globus-gatekeeper -globus-gfork -globus-gram-client -globus-gram-client-tools -globus-gram-job-manager-callout-error-goto-bina..> -globus-gram-job-manager-fork -globus-gram-job-manager -globus-gram-job-manager-lsf -globus-gram-job-manager-pbs -globus-gram-job-manager-scripts-goto-binaries.t..> -globus-gram-job-manager-sge -globus-gram-job-manager-slurm-goto-binaries.tar..> -globus-gram-protocol -globus-gridftp-server-control-goto-binaries.tar..> -globus-gridftp-server -globus-gridmap-callout-error -globus-gridmap-eppn-callout -globus-gridmap-verify-myproxy-callout-goto-bina..> -globus-gsi-callback -globus-gsi-cert-utils -globus-gsi-credential -globus-gsi-openssl-error -globus-gsi-proxy-core -globus-gsi-proxy-ssl -globus-gsi-sysconfig -globus-gss-assist -globus-gssapi-error -globus-gssapi-gsi -globus-io -globus-openssl-module -globus-proxy-utils -globus-rls-client -globus-rls-server -globus-rsl -globus-scheduler-event-generator-goto-binaries...> -globus-usage -globus-xio -globus-xio-gridftp-driver -globus-xio-gridftp-multicast -globus-xio-gsi-driver -globus-xio-pipe-driver -globus-xio-popen-driver -globus-xio-rate-driver -globus-xio-udt-driver -globus-xioperf -glogic -gloox -glosstex -glotski -glpk -glpk-java -gltron -gluegen2 -glurp -glw -glyr -gmanedit -gmchess -gmediaserver -gmemusage -gmerlin-avdecoder -gmerlin-encoders -gmerlin -gmetadom -gmfsk -gmidimonitor -gmime -gmlive -gmorgan -gmotionlive -gmp-ecm -gmp -gmpc -gmpc-plugins -gmrender-resurrect -gmrun -gmt -gmtk -gmtp -gmult -gnac -gnarwl -gnat-gps -gnat-mingw-w64 -gnet -gniall -gnoemoe -gnomad2 -gnome-applets -gnome-backgrounds -gnome-boxes -gnome-breakout -gnome-btdownload -gnome-calculator -gnome-chemistry-utils -gnome-chess -gnome-clocks -gnome-color-chooser -gnome-color-manager -gnome-commander -gnome-control-center -gnome-desktop -gnome-desktop-sharp2 -gnome-desktop-testing -gnome-desktop3 -gnome-dictionary -gnome-disk-utility -gnome-do -gnome-do-plugins -gnome-doc-utils -gnome-documents -gnome-flashback -gnome-font-viewer -gnome-hearts -gnome-hwp-support -gnome-icon-theme -gnome-js-common -gnome-keyring-sharp -gnome-klotski -gnome-logs -gnome-mahjongg -gnome-main-menu -gnome-maps -gnome-mastermind -gnome-media -gnome-menus -gnome-menus2 -gnome-mime-data -gnome-mines -gnome-mplayer -gnome-mud -gnome-music -gnome-nds-thumbnailer -gnome-nettool -gnome-nibbles -gnome-online-accounts -gnome-online-miners -gnome-orca -gnome-osd -gnome-packagekit -gnome-paint -gnome-panel -gnome-phone-manager -gnome-photos -gnome-pie -gnome-power-manager -gnome-ppp -gnome-python-desktop -gnome-python-extras -gnome-python -gnome-robots -gnome-schedule -gnome-screensaver -gnome-screenshot -gnome-search-tool -gnome-settings-daemon -gnome-sharp2 -gnome-shell-extension-weather-goto-binaries.tar..> -gnome-shell-extensions -gnome-shell -gnome-shell-mailnag -gnome-shell-pomodoro -gnome-software -gnome-sound-recorder -gnome-specimen -gnome-speech -gnome-subtitles -gnome-sudoku -gnome-sushi -gnome-system-log -gnome-system-monitor -gnome-system-tools -gnome-terminal -gnome-tetravex -gnome-themes-extras -gnome-themes -gnome-themes-standard -gnome-tweak-tool -gnome-user-share -gnome-vfs -gnome-video-arcade -gnome-video-effects -gnome-web-photo -gnome-xcf-thumbnailer -gnomekiss -gnomeradio -gnomint -gnonlin -gnonlin1.0 -gnote -gnotime -gnu-efi -gnu-smalltalk -gnuais -gnubg -gnubiff -gnubik -gnuboy -gnuchess -gnudatalanguage -gnugk -gnugo -gnuift -gnuit -gnujump -gnunet-fuse -gnunet -gnunet-gtk -gnupg-pkcs11-scd -gnuplot5 -gnurobbo -gnurobots -gnuserv -gnushogi -gnusim8085 -gnustep-back -gnustep-base -gnustep-dl2 -gnustep-gui -gnustep-make -gnustep-netclasses -gnustep-sqlclient -gnuvd -goaccess -gob2 -goban -gobby -gobby-infinote -gobi-loader -gobject-introspection -gocr -goffice-0.8 -goffice -gofigure2 -gogoc -goldencheetah -goldendict -golly -gom -goo -goobox -goocanvas -goocanvasmm -google-authenticator -google-glog -google-mock -google-perftools -gopchop -gopher -goplay -gosmore -gource -gozer -gp2c -gpaint -gpart -gparted -gpaste -gpdftext -gperiodic -gpgme1.0 -gphotofs -gphpedit -gpick -gpicview -gpiv -gpivtools -gplanarity -gpp -gpr -gpredict -gpsbabel -gpscorrelate -gpsd -gpsim -gpsk31 -gpsmanshp -gpt -gputils -gpw -gpx -gpx2shp -gqrx-sdr -gr-air-modes -gr-fcdproplus -gr-iqbal -gr-osmosdr -grabc -grail -gramadoir -gramofile -granatier -grantlee -granule -graphite2 -gravit -gravitywars -grcompiler -grdesktop -greed -grep -grepcidr -grhino -gri -gridlock.app -grig -grilo -grilo-plugins -gringotts -grisbi -grive -groff -gromacs -gromit -gromit-mpx -gross -groundhog -grsync -grub-installer -grun -gscanbus -gsetroot -gsettings-desktop-schemas -gshare -gsl -gsm0710muxd -gsmartcontrol -gsmlib -gsnmp -gsoap -gss -gssdp -gst-chromaprint -gst-fluendo-mp3 -gst-libav1.0 -gst-plugins-bad1.0 -gst-plugins-good0.10 -gst-plugins-ugly0.10 -gst-plugins-ugly1.0 -gst-python1.0 -gst0.10-python -gst123 -gstm -gstreamer-editing-services1.0-goto-binaries.tar..> -gstreamer-hplugins -gstreamer-sharp -gstreamer-vaapi -gstreamer0.10-dvswitch -gstreamer0.10-editing-services-goto-binaries.ta..> -gstreamer0.10 -gstreamer0.10-rtsp -gtamsanalyzer.app -gtans -gtest -gtetrinet -gtg-trace -gthumb -gtick -gtimer -gtk+2.0 -gtk-chtheme -gtk-doc -gtk-gnutella -gtk-im-libthai -gtk-nodoka-engine -gtk-recordmydesktop -gtk-sharp2 -gtk-sharp3 -gtk-theme-config -gtk-theme-switch -gtk-vector-screenshot -gtk-vnc -gtk2-engines-aurora -gtk2-engines-cleanice -gtk2-engines -gtk2-engines-magicchicken -gtk2-engines-murrine -gtk2-engines-oxygen -gtk2-engines-qtcurve -gtk2-engines-wonderland -gtk2-engines-xfce -gtk2hs-buildtools -gtkam -gtkatlantic -gtkballs -gtkcookie -gtkdataboxmm -gtkextra -gtkgl2 -gtkglextmm -gtkguitune -gtkhash -gtkhotkey -gtkhtml3.14 -gtkhtml4.0 -gtkimageview -gtkmathview -gtkmm2.4 -gtkmm3.0 -gtkorphan -gtkperf -gtkpod -gtkpool -gtksourceview2 -gtksourceview3 -gtkspell -gtkspell3 -gtkspellmm -gtools -gtranslator -gtrayicon -gts -gtypist -guacamole-server -guake -guake-indicator -guava -guayadeque -gucharmap -guessnet -guichan -guifications -guile-1.8 -guile-cairo -guile-gnome-platform -guiqwt -gummi -gup -gupnp-av -gupnp-dlna -gupnp -gupnp-igd -gurlchecker -gutenprint -guvcview -gv -gvfs -gvpe -gwaei -gwaterfall -gwave -gweled -gwenview -gworkspace -gworldclock -gwyddion -gxine -gxkb -gxmessage -gxmms2 -gxneur -gyoto -gyrus -gzip -gzrt -h5py -h5utils -ha -hachu -hackrf -haildb -halibut -hama-slide-mouse-control -hamlib -handlersocket -hapm -happy -haproxy -hardening-wrapper -hardinfo -hardlink -harfbuzz -harminv -harvid -hasciicam -haserl -hashalot -hashcash -haskell-abstract-deque -haskell-abstract-par -haskell-acid-state -haskell-active -haskell-adjunctions -haskell-aeson -haskell-aeson-pretty -haskell-alut -haskell-ami -haskell-ansi-terminal -haskell-ansi-wl-pprint -haskell-appar -haskell-arrows -haskell-asn1-data -haskell-asn1-encoding -haskell-asn1-parse -haskell-asn1-types -haskell-async -haskell-attoparsec-enumerator-goto-binaries.tar..> -haskell-attoparsec -haskell-augeas -haskell-authenticate -haskell-authenticate-oauth -haskell-aws -haskell-base-unicode-symbols -haskell-base16-bytestring -haskell-base64-bytestring -haskell-basic-prelude -haskell-bifunctors -haskell-binary-communicator -haskell-binary -haskell-binary-shared -haskell-bindings-dsl -haskell-bindings-gpgme -haskell-bindings-libzip -haskell-bindings-nettle -haskell-bindings-sane -haskell-bitarray -haskell-blaze-builder-enumerator-goto-binaries...> -haskell-blaze-builder -haskell-blaze-html -haskell-blaze-markup -haskell-blaze-svg -haskell-blaze-textual -haskell-bloomfilter -haskell-bmp -haskell-boolean -haskell-boomerang -haskell-boundedchan -haskell-boxes -haskell-brainfuck -haskell-byteable -haskell-bytedump -haskell-byteorder -haskell-bytestring-lexing -haskell-bytestring-mmap -haskell-bytestring-nums -haskell-bytestring-progress -haskell-bytestring-show -haskell-bzlib -haskell-cabal-file-th -haskell-cabal -haskell-cabal-install -haskell-cairo -haskell-case-insensitive -haskell-cassava -haskell-categories -haskell-cautious-file -haskell-cereal-conduit -haskell-cereal -haskell-certificate -haskell-cgi -haskell-charset -haskell-chart -haskell-chasingbottoms -haskell-chell -haskell-chell-hunit -haskell-chell-quickcheck2 -haskell-chunked-data -haskell-cipher-aes -haskell-cipher-blowfish -haskell-cipher-camellia -haskell-cipher-des -haskell-cipher-rc4 -haskell-citeproc-hs -haskell-classy-prelude-conduit-goto-binaries.ta..> -haskell-classy-prelude -haskell-clientsession -haskell-clock -haskell-clocked -haskell-cmdargs -haskell-colour -haskell-comonad -haskell-comonad-transformers -haskell-concrete-typerep -haskell-cond -haskell-conduit-combinators -haskell-conduit -haskell-configfile -haskell-configurator -haskell-connection -haskell-contravariant -haskell-control-monad-free -haskell-control-monad-loop -haskell-convertible -haskell-cookie -haskell-cprng-aes -haskell-cpu -haskell-crypto-api -haskell-crypto-cipher-tests -haskell-crypto-cipher-types -haskell-crypto-conduit -haskell-crypto -haskell-crypto-numbers -haskell-crypto-pubkey -haskell-crypto-pubkey-types -haskell-crypto-random-api -haskell-crypto-random -haskell-cryptocipher -haskell-cryptohash-conduit -haskell-cryptohash-cryptoapi -haskell-cryptohash -haskell-css-text -haskell-csv-conduit -haskell-csv -haskell-curl -haskell-data-accessor -haskell-data-accessor-mtl -haskell-data-accessor-template-goto-binaries.ta..> -haskell-data-binary-ieee754 -haskell-data-default-class -haskell-data-default -haskell-data-default-instances-base-goto-binari..> -haskell-data-default-instances-containers-goto-..> -haskell-data-default-instances-dlist-goto-binar..> -haskell-data-default-instances-old-locale-goto-..> -haskell-data-hash -haskell-data-inttrie -haskell-data-lens -haskell-data-lens-template -haskell-data-memocombinators -haskell-data-pprint -haskell-dataenc -haskell-datetime -haskell-dav -haskell-dbus -haskell-debian -haskell-deepseq-generics -haskell-dependent-map -haskell-dependent-sum -haskell-dependent-sum-template-goto-binaries.ta..> -haskell-derive -haskell-diagrams-cairo -haskell-diagrams-core -haskell-diagrams-gtk -haskell-diagrams-lib -haskell-diagrams-svg -haskell-diff -haskell-digest -haskell-dimensional -haskell-directory-tree -haskell-distributive -haskell-djinn-ghc -haskell-djinn-lib -haskell-dlist -haskell-dlist-instances -haskell-dns -haskell-doctest -haskell-download-curl -haskell-dpkg -haskell-dual-tree -haskell-dyre -haskell-edison-api -haskell-edison-core -haskell-edit-distance -haskell-editline -haskell-either -haskell-email-validate -haskell-enclosed-exceptions -haskell-entropy -haskell-enumerator -haskell-equivalence -haskell-erf -haskell-errors -haskell-esqueleto -haskell-event-list -haskell-exception-transformers-goto-binaries.ta..> -haskell-exceptions -haskell-executable-path -haskell-explicit-exception -haskell-extensible-exceptions-goto-binaries.tar..> -haskell-failure -haskell-fast-logger -haskell-fastcgi -haskell-fb -haskell-fclabels -haskell-fdo-notify -haskell-feed -haskell-fgl -haskell-file-embed -haskell-file-location -haskell-filemanip -haskell-filestore -haskell-fingertree -haskell-foldl -haskell-free -haskell-fsnotify -haskell-gconf -haskell-gd -haskell-generic-deriving -haskell-geniplate -haskell-ghc-events -haskell-ghc-mtl -haskell-ghc-paths -haskell-ghc-syb-utils -haskell-gio -haskell-github -haskell-gitlib -haskell-glade -haskell-glfw -haskell-glib -haskell-glob -haskell-gloss -haskell-gluraw -haskell-glut -haskell-gnuidn -haskell-gnutls -haskell-graceful -haskell-graphviz -haskell-groups -haskell-gsasl -haskell-gstreamer -haskell-gtk -haskell-gtk-traymanager -haskell-gtk3 -haskell-gtkglext -haskell-gtksourceview2 -haskell-haddock -haskell-hakyll -haskell-hamlet -haskell-happstack-authenticate-goto-binaries.ta..> -haskell-happstack -haskell-happstack-heist -haskell-happstack-hsp -haskell-happstack-server -haskell-harp -haskell-hashable -haskell-hashed-storage -haskell-hashmap -haskell-hashtables -haskell-haskeline -haskell-haskell-src -haskell-haskore -haskell-hastache -haskell-haxr -haskell-hcard -haskell-hcwiid -haskell-hedis -haskell-heist -haskell-hfuse -haskell-hgettext -haskell-hgl -haskell-hinotify -haskell-hint -haskell-hit -haskell-hjavascript -haskell-hjscript -haskell-hjsmin -haskell-hledger -haskell-hledger-interest -haskell-hledger-lib -haskell-hledger-web -haskell-hmatrix -haskell-hoauth2 -haskell-hoogle -haskell-hopenpgp -haskell-hopenpgp-tools -haskell-hostname -haskell-hourglass -haskell-hs-bibutils -haskell-hs3 -haskell-hscurses -haskell-hsemail -haskell-hsh -haskell-hslua -haskell-hsmagick -haskell-hsp -haskell-hspec-expectations -haskell-hspec -haskell-hsql -haskell-hsql-mysql -haskell-hsql-odbc -haskell-hsql-postgresql -haskell-hsql-sqlite3 -haskell-hssyck -haskell-hstringtemplate -haskell-hsx -haskell-hsx-jmacro -haskell-hsx2hs -haskell-hsyslog -haskell-html-conduit -haskell-html -haskell-http-attoparsec -haskell-http-client-conduit -haskell-http-client -haskell-http-client-tls -haskell-http-conduit -haskell-http-date -haskell-http -haskell-http-reverse-proxy -haskell-http-types -haskell-hunit -haskell-hxt-cache -haskell-hxt-charproperties -haskell-hxt-curl -haskell-hxt -haskell-hxt-http -haskell-hxt-regex-xmlschema -haskell-hxt-relaxng -haskell-hxt-tagsoup -haskell-hxt-unicode -haskell-hxt-xpath -haskell-hxt-xslt -haskell-iconv -haskell-idna -haskell-ieee754 -haskell-ifelse -haskell-incremental-parser -haskell-intern -haskell-intervals -haskell-io-choice -haskell-io-storage -haskell-io-streams -haskell-iospec -haskell-iproute -haskell-irc -haskell-ircbot -haskell-iteratee -haskell-ixset -haskell-jmacro -haskell-json -haskell-juicypixels -haskell-keys -haskell-knob -haskell-lambdabot-utils -haskell-language-c -haskell-language-haskell-extract-goto-binaries...> -haskell-language-javascript -haskell-language-python -haskell-largeword -haskell-lazysmallcheck -haskell-leksah -haskell-leksah-server -haskell-lens -haskell-lexer -haskell-libsystemd-journal -haskell-libtagc -haskell-libxml-sax -haskell-libzip -haskell-lifted-async -haskell-lifted-base -haskell-listlike -haskell-logict -haskell-lrucache -haskell-ltk -haskell-maccatcher -haskell-markdown -haskell-markov-chain -haskell-math-functions -haskell-maths -haskell-maybet -haskell-mbox -haskell-memoize -haskell-memotrie -haskell-mersenne-random -haskell-mersenne-random-pure64-goto-binaries.ta..> -haskell-midi -haskell-mime-mail -haskell-mime-types -haskell-mmap -haskell-mmorph -haskell-monad-control -haskell-monad-journal -haskell-monad-logger -haskell-monad-loops -haskell-monad-par-extras -haskell-monad-par -haskell-monadcatchio-mtl -haskell-monadcatchio-transformers-goto-binaries..> -haskell-monadcryptorandom -haskell-monadprompt -haskell-monadrandom -haskell-monads-tf -haskell-mono-traversable -haskell-monoid-extras -haskell-monoid-subclasses -haskell-monoid-transformer -haskell-mtl -haskell-mtlparse -haskell-mueval -haskell-murmur-hash -haskell-mwc-random -haskell-nats -haskell-ncurses -haskell-nettle -haskell-netwire -haskell-network -haskell-network-info -haskell-network-multicast -haskell-network-protocol-xmpp-goto-binaries.tar..> -haskell-newtype -haskell-non-negative -haskell-notmuch-web -haskell-numbers -haskell-numeric-extras -haskell-numeric-quest -haskell-numinstances -haskell-numtype -haskell-objectname -haskell-oeis -haskell-ofx -haskell-openal -haskell-opengl -haskell-openglraw -haskell-openpgp-asciiarmor -haskell-openpgp -haskell-operational -haskell-options -haskell-optparse-applicative -haskell-osm -haskell-pandoc-citeproc -haskell-pandoc-types -haskell-pango -haskell-parallel -haskell-parseargs -haskell-parsec -haskell-parsers -haskell-pastis -haskell-path-pieces -haskell-patience -haskell-pcap -haskell-pcre-light -haskell-pem -haskell-persistent -haskell-persistent-postgresql-goto-binaries.tar..> -haskell-persistent-sqlite -haskell-persistent-template -haskell-pipes-aeson -haskell-pipes-attoparsec -haskell-pipes-bytestring -haskell-pipes -haskell-pipes-group -haskell-pipes-parse -haskell-pipes-safe -haskell-pipes-zlib -haskell-pointed -haskell-pointedlist -haskell-polyparse -haskell-postgresql-libpq -haskell-postgresql-simple -haskell-prelude-extras -haskell-pretty-show -haskell-primes -haskell-primitive -haskell-process-conduit -haskell-process-extras -haskell-profunctors -haskell-project-template -haskell-psqueue -haskell-publicsuffixlist -haskell-punycode -haskell-puremd5 -haskell-pwstore-fast -haskell-qrencode -haskell-quickcheck -haskell-quickcheck-instances -haskell-quickcheck-io -haskell-random -haskell-random-shuffle -haskell-ranged-sets -haskell-ranges -haskell-reactive-banana -haskell-readargs -haskell-readline -haskell-recaptcha -haskell-reducers -haskell-reflection -haskell-reform-blaze -haskell-reform -haskell-reform-hamlet -haskell-reform-happstack -haskell-reform-hsp -haskell-regex-base -haskell-regex-compat -haskell-regex-pcre -haskell-regex-posix -haskell-regex-tdfa -haskell-regex-tdfa-utf8 -haskell-regexpr -haskell-repa -haskell-representable-functors-goto-binaries.ta..> -haskell-resource-pool -haskell-resourcet -haskell-rosezipper -haskell-rsa -haskell-safe -haskell-safecopy -haskell-safesemaphore -haskell-sandi -haskell-scientific -haskell-scrobble -haskell-sdl-gfx -haskell-sdl -haskell-sdl-image -haskell-sdl-mixer -haskell-sdl-ttf -haskell-securemem -haskell-semigroupoids -haskell-semigroups -haskell-sendfile -haskell-set-extra -haskell-setenv -haskell-setlocale -haskell-sfml-audio -haskell-sha -haskell-shakespeare-css -haskell-shakespeare -haskell-shakespeare-i18n -haskell-shakespeare-js -haskell-shakespeare-text -haskell-shellac -haskell-show -haskell-silently -haskell-simple-reflect -haskell-simple-sendfile -haskell-simpleea -haskell-simpleirc -haskell-skein -haskell-smallcheck -haskell-smtpclient -haskell-snap-core -haskell-snap -haskell-snap-loader-dynamic -haskell-snap-loader-static -haskell-snap-server -haskell-snaplet-acid-state -haskell-sockaddr -haskell-socks -haskell-split -haskell-src-exts -haskell-src-meta -haskell-statestack -haskell-statevar -haskell-static-hash -haskell-statistics -haskell-stm-chans -haskell-stm -haskell-stmonadtrans -haskell-storable-complex -haskell-stream -haskell-streaming-commons -haskell-strict-concurrency -haskell-strict -haskell-stringbuilder -haskell-stringprep -haskell-stringsearch -haskell-strptime -haskell-svgcairo -haskell-swish -haskell-syb -haskell-syb-with-class -haskell-syb-with-class-instances-text-goto-bina..> -haskell-system-fileio -haskell-system-filepath -haskell-tabular -haskell-tagged -haskell-tagsoup -haskell-tagstream-conduit -haskell-tar -haskell-tasty-golden -haskell-tasty -haskell-tasty-hspec -haskell-tasty-hunit -haskell-tasty-quickcheck -haskell-tasty-rerun -haskell-tasty-th -haskell-template -haskell-temporary -haskell-tensor -haskell-terminal-progress-bar-goto-binaries.tar..> -haskell-terminfo -haskell-test-framework -haskell-test-framework-hunit -haskell-test-framework-quickcheck2-goto-binarie..> -haskell-test-framework-th -haskell-test-framework-th-prime-goto-binaries.t..> -haskell-texmath -haskell-text -haskell-text-icu -haskell-tf-random -haskell-th-extras -haskell-th-lift -haskell-th-orphans -haskell-threads -haskell-time-compat -haskell-tinyurl -haskell-tls -haskell-transformers-base -haskell-transformers-compat -haskell-transformers -haskell-trifecta -haskell-type-level -haskell-unbounded-delays -haskell-uniplate -haskell-universe-base -haskell-universe -haskell-unix-bytestring -haskell-unix-compat -haskell-unix-time -haskell-unixutils -haskell-unlambda -haskell-unordered-containers -haskell-uri -haskell-url -haskell-utf8-light -haskell-utf8-string -haskell-utility-ht -haskell-uuagc-cabal -haskell-uuid -haskell-uulib -haskell-vault -haskell-vector-algorithms -haskell-vector-binary-instances-goto-binaries.t..> -haskell-vector -haskell-vector-instances -haskell-vector-space -haskell-vector-space-points -haskell-vector-th-unbox -haskell-void -haskell-vte -haskell-vty -haskell-wai-app-file-cgi -haskell-wai-app-static -haskell-wai-conduit -haskell-wai-extra -haskell-wai -haskell-wai-handler-fastcgi -haskell-wai-handler-launch -haskell-wai-logger -haskell-wai-websockets -haskell-warp -haskell-warp-tls -haskell-web-plugins -haskell-web-routes-boomerang -haskell-web-routes -haskell-web-routes-happstack -haskell-web-routes-hsp -haskell-web-routes-th -haskell-webkit -haskell-websockets -haskell-weighted-regexp -haskell-wizards -haskell-wl-pprint-text -haskell-word8 -haskell-x11 -haskell-x11-xft -haskell-x509 -haskell-x509-store -haskell-x509-system -haskell-x509-util -haskell-x509-validation -haskell-xcb-types -haskell-xdg-basedir -haskell-xhtml -haskell-xml-conduit -haskell-xml -haskell-xml-hamlet -haskell-xml-types -haskell-xml2html -haskell-xmlhtml -haskell-xss-sanitize -haskell-yaml -haskell-yaml-light -haskell-yesod-auth-account -haskell-yesod-auth -haskell-yesod-auth-oauth -haskell-yesod-bin -haskell-yesod-core -haskell-yesod-default -haskell-yesod-form -haskell-yesod -haskell-yesod-markdown -haskell-yesod-newsfeed -haskell-yesod-persistent -haskell-yesod-routes -haskell-yesod-static -haskell-yesod-test -haskell-zeromq4-haskell -haskell-zip-archive -haskell-zlib-bindings -haskell-zlib-enum -haskell-zlib -haskell98-report -haskell98-tutorial -haskelldb -haskelldb-hdbc -haskelldb-hdbc-odbc -haskelldb-hdbc-postgresql -haskelldb-hdbc-sqlite3 -hasktags -haveged -havp -hawknl -haxml -hbro-contrib -hbro -hdapsd -hdate-applet -hdbc -hdbc-odbc -hdbc-postgresql -hdbc-sqlite3 -hddtemp -hdevtools -hdf-eos4 -hdf-eos5 -hdup -health-check -hebcal -hedgewars -heimdal -heimdall-flash -heirloom-mailx -hello -hello-traditional -help2man -hepmc -herbstluftwm -heroes -hershey-fonts -herwig++ -hesiod -hexchat -hexcurse -hexec -hexedit -hexer -hexter -hexxagon -hfsplus -hfsprogs -hfsutils -hidapi -hidrd -highlighting-kate -hippo-canvas -hiredis -hitori -hivex -hkgerman -hkl -hlint -hmisc -hmmer -hmmer2 -hnb -ho22bus -hoauth -hocr -hodie -hol88 -holdingnuts -homebank -horgand -hostap-utils -hostname -hothasktags -hotssh -hotswap -hoz -hp2xx -hp48cc -hpanel -hpcc -hping3 -hplip -hpsockd -hscolour -hsetroot -hslogger -hspell -hspell-gui -ht -htcheck -htdig -html-xml-utils -htmlcxx -htmldoc -htop -htp -htpdate -htsengine -htseq -httest -http-parser -httperf -httpfs2 -httping -httpry -httptunnel -httrack -httraqt -hubicfuse -hugin -hugs98 -hunspell -hunt -hw-detect -hwinfo -hwloc-contrib -hwloc -hyantesite -hybserv -hydrogen -hyperestraier -hyperic-sigar -hyphen -hyphen-show -hypre -i2c-tools -i2util -i3-wm -i3lock -i3status -i7z -i810switch -i8kutils -iagno -iat -iaxmodem -ibacm -ibniz -ibod -ibsim -ibus-anthy -ibus-array -ibus-cangjie -ibus-chewing -ibus-client-clutter -ibus -ibus-hangul -ibus-input-pad -ibus-kkc -ibus-libpinyin -ibus-libthai -ibus-libzhuyin -ibus-m17n -ibus-pinyin -ibus-qt -ibus-rime -ibus-sharada-braille -ibus-skk -ibus-table -ibus-unikey -ibus-zhuyin -ibutils -ical2html -icebreaker -icecast2 -icecc -icecc-monitor -icedove -ices2 -icinga2 -icmake -icmpinfo -icmptx -icmpush -icom -icon-slicer -icoutils -icu -id3 -id3lib3.8.3 -id3ren -id3tool -idba -ident2 -idesk -ideviceinstaller -idle3-tools -idlestat -ido -idzebra -iec16022 -ifd-gempc -ifhp -ifile -ifmetric -ifpgui -ifplugd -ifrit -ifstat -iftop -ifupdown -ii -iipimage -ijs -ikarus -ike -ike-scan -ikiwiki-hosting -ikvm -ilmbase -im -imagemagick -imagevis3d -imagination -imapfilter -imaptool -imdbpy -imgvtopgm -imhangul -imhangul3 -iml -imlib2 -imposm -imview -imvirt -imwheel -inadyn -indent -indicator-session -indigo -infernal -infiniband-diags -infon -ink -inkscape -inn -inn2 -innoextract -inotail -inoticoming -inotify-tools -inotifyx -input-pad -input-utils -inputlirc -inputplug -insighttoolkit4 -instead -intel-gpu-tools -intel-vaapi-driver -inteltool -intone -invada-studio-plugins -invada-studio-plugins-lv2 -invaders -inventor -invesalius -iodine -iok -ioping -ip4r -ipband -ipe5toxml -iperf -iperf3 -ipfm -ipgrab -ipheth -ipip -ipkungfu -ipmitool -ippl -iprint -iproute2 -ips -ipsec-tools -ipset -ipsvd -iptotal -iptraf -iptraf-ng -iptux -iputils -ipv6calc -ipv6toolkit -ipvsadm -ipwatchd-gnotify -ipwatchd -ir.lv2 -ircd-hybrid -ircd-irc2 -ircd-ratbox -ircmarkers -ircp-tray -irda-utils -iroffer -irony-mode -irqbalance -irsim -irssi -irssi-plugin-otr -irssi-plugin-xmpp -isatapd -isc-dhcp -iscsitarget -iselect -isight-firmware-tools -isl -isomaster -isomd5sum -isoquery -ispell -istanbul -istgt -isync -italc -itcl3 -itk3 -itksnap -itools -itop -itsol -iucode-tool -ivtools -ivtv-utils -ivykis -iw -iwyu -jabber-muc -jack-audio-connection-kit -jack-capture -jack -jack-keyboard -jack-midi-clock -jack-mixer -jack-stdio -jack-tools -jackd2 -jackmeter -jaffl -jags -jalv -jam -jamnntpd -jana -jansson -jasper -jaula -java-atk-wrapper -java-gnome -java2html -java3d -jazip -jbig2dec -jbigkit -jblas -jclassinfo -jd -jed -jeex -jellyfish -jemalloc -jerasure -jesred -jester -jetty -jffi -jgraph -jhbuild -jhdf -jhead -jigdo -jigit -jikespg -jimtcl -jinput -jlint -jmagick -jmtpfs -jnettop -jocaml -joe -jovie -joy2key -joystick -jp2a -jpeginfo -jpegjudge -jpegoptim -jpegpixi -jpilot -jpnevulator -jq -jruby -js-of-ocaml -jshon -json-c -json-glib -json-spirit -jthread -judy -jugglemaster -juk -juke -jumpnbump -jupp -jvim -jxrlib -jzip -k3b -k3d -k4dirstat -kaa-base -kaa-imlib2 -kaa-metadata -kaccessible -kactivities -kadu -kaffeine -kajongg -kakasi -kalgebra -kali -kalign -kalternatives -kalzium -kamera -kamerka -kamoso -kanagram -kanatest -kanjipad -kannel-sqlbox -kanyremote -kapman -kapptemplate -kasumi -kate -katomic -kaya -kbackup -kbd -kbdd -kbibtex -kblackbox -kblocks -kbounce -kbreakout -kbruch -kbtin -kcachegrind -kcalc -kcc -kcemu -kcharselect -kchmviewer -kcm-fcitx -kcollectd -kcolorchooser -kcometen4 -kcov -kcron -kdbg -kdc2tiff -kde-base-artwork -kde-baseapps -kde-dev-scripts -kde-dev-utils -kde-gtk-config -kde-l10n -kde-runtime -kde-style-polyester -kde-style-qtcurve -kde-wallpapers -kde-workspace -kde4libs -kdeartwork -kdeconnect -kdegraphics-mobipocket -kdegraphics-strigi-analyzer -kdegraphics-thumbnailers -kdenetwork-filesharing -kdenetwork-strigi-analyzers -kdenlive -kdepimlibs -kdeplasma-addons -kdesdk-kioslaves -kdesdk-strigi-analyzers -kdesdk-thumbnailers -kdesrc-build -kdesudo -kdesvn -kdevelop -kdevelop-pg-qt -kdevelop-php-docs -kdevelop-php -kdevelop-python -kdevplatform -kdewebdev -kdf -kdiamond -kdiff3 -kdnssd -kdrill -keepalived -keepassx -kerneltop -kernsmooth -ketm -keurocalc -kexec-tools -keybinder-3.0 -keybinder -keylaunch -keynav -keyutils -kfilemetadata -kfloppy -kfourinline -kftpgrabber -kgamma -kgeography -kget -kgoldrunner -kgpg -khangman -khronos-opencl-headers -kicad -kid3 -kig -kigo -kildclient -kile -killbots -kimwitu++ -kimwitu -kinect-audio-setup -kino -kio-ftps -kio-gopher -kio-mtp -kiriki -kismet -kissplice -kiten -kivy -kjumpingcube -klatexformula -klettres -klickety -klines -klog -kmag -kmahjongg -kmess -kmetronome -kmflcomp -kmidimon -kmines -kmix -kmldonkey -kmod -kmousetool -kmouth -kmplayer -kmplot -kmymoney -knavalbattle -knemo -knetwalk -knews -knights -knockd -knocker -knot -knutclient -kobodeluxe -kolf -kollision -kolourpaint -komi -komparator -kompare -kon2 -konquest -konsole -konversation -kopete -korundum -kosd -kover -kpartsplugin -kpat -kphotoalbum -kppp -kprinter4 -kqtquickcharts -kradio4 -kraft -krb5-auth-dialog -krb5-strength -krb5-sync -krdc -krecipes -kredentials -kremotecontrol -krename -kreversi -krfb -kross-interpreters -kruler -krusader -ksaneplugin -kscd -kscreen -kshisen -kshutdown -ksirk -ksnakeduel -ksnapshot -kspaceduel -ksplice -ksquares -ksshaskpass -kst -kstars -kstart -ksudoku -ksystemlog -kteatime -kterm -ktikz -ktimer -ktorrent -ktouch -ktp-accounts-kcm -ktp-approver -ktp-auth-handler -ktp-call-ui -ktp-common-internals -ktp-contact-list -ktp-contact-runner -ktp-desktop-applets -ktp-filetransfer-handler -ktp-kded-integration-module -ktp-send-file -ktp-text-ui -ktuberling -kturtle -ktux -kubrick -kumofs -kuser -kuvert -kvirc -kvkbd -kvpm -kvpnc -kwallet -kwalletcli -kwin-style-crystal -kwin-style-dekorator -kwordquiz -kwstyle -kxl -kyotocabinet -kyototycoon -kytea -l2tpns -lablgl -lablgtk2 -lablgtkmathview -labrea -lacheck -ladish -ladr -ladspa-sdk -ladvd -lakai -lambdabot -lame -lapack -larswm -laserboy -last-align -lastpass-cli -lat -latd -late -latencytop -latex-cjk-japanese-wadalab -latex2rtf -latexila -latrace -lattice -launchtool -lbcd -lbdb -lbreakout2 -lbt -lbzip2 -lcab -lcalc -lcas -lcas-lcmaps-gt4-interface -lcd4linux -lcdproc -lcmaps -lcmaps-plugins-basic -lcmaps-plugins-jobrep -lcmaps-plugins-verify-proxy -lcmaps-plugins-voms -lcms2 -lcrt -ldap-haskell -ldap2dns -ldap2zone -ldapvi -ldb -ldc -le-dico-de-rene-cougnenc -le -leafpad -leave -lebiniou -ledger -ledmon -lekhonee-gnome -lensfun -leptonlib -letterize -levee -leveldb -lft -lftp -lgeneral -lhapdf -lhasa -lhs2tex -lib3ds -libaacs -libaal -libabw -libace-perl -libacme-damn-perl -libacpi -libafs-pag-perl -libai-fann-perl -libaio -libalgorithm-combinatorics-perl-goto-binaries.t..> -libalgorithm-diff-xs-perl -libalgorithm-lbfgs-perl -libalgorithm-permute-perl -libalias-perl -libalien-sdl-perl -libalien-wxwidgets-perl -libalkimia -libalog -libam7xxx -libantlr3c -libao -libaosd -libapache-authenhook-perl -libapache-db-perl -libapache-logformat-compiler-perl-goto-binaries..> -libapache-mod-auth-kerb -libapache-mod-auth-radius -libapache-mod-encoding -libapache-mod-evasive -libapache-mod-jk -libapache-mod-log-sql -libapache-mod-musicindex -libapache-mod-removeip -libapache2-authenntlm-perl -libapache2-mod-auth-cas -libapache2-mod-auth-gssapi -libapache2-mod-auth-mellon -libapache2-mod-auth-openid -libapache2-mod-auth-openidc -libapache2-mod-auth-pgsql -libapache2-mod-auth-plain -libapache2-mod-auth-pubtkt -libapache2-mod-auth-tkt -libapache2-mod-authn-sasl -libapache2-mod-authnz-external-goto-binaries.ta..> -libapache2-mod-authnz-pam -libapache2-mod-authz-unixgroup-goto-binaries.ta..> -libapache2-mod-bw -libapache2-mod-defensible -libapache2-mod-encoding -libapache2-mod-fcgid -libapache2-mod-form -libapache2-mod-geoip -libapache2-mod-intercept-form-submit-goto-binar..> -libapache2-mod-ldap-userdir -libapache2-mod-lisp -libapache2-mod-log-slow -libapache2-mod-lookup-identity-goto-binaries.ta..> -libapache2-mod-nss -libapache2-mod-perl2 -libapache2-mod-python -libapache2-mod-qos -libapache2-mod-rivet -libapache2-mod-rpaf -libapache2-mod-ruid2 -libapache2-mod-watchcat -libapache2-mod-xsendfile -libappindicator -libapr-memcache -libapreq2 -libaqbanking -libarray-refelem-perl -libart-lgpl -libass -libassa -libassuan -libast -libastro-fits-cfitsio-perl -libasync-interrupt-perl -libasyncns -libatasmart -libaudclient -libaudio-cd-perl -libaudio-ecasound-perl -libaudio-flac-decoder-perl -libaudio-flac-header-perl -libaudio-mixer-perl -libaudio-scan-perl -libaudio-wav-perl -libauthen-dechpwd-perl -libauthen-krb5-admin-perl -libauthen-krb5-perl -libauthen-krb5-simple-perl -libauthen-pam-perl -libauthen-sasl-cyrus-perl -libauthen-smb-perl -libauthen-tacacsplus-perl -libautobox-perl -libautovivification-perl -libavc1394 -libavg -libavl -libax25 -libb-compiling-perl -libb-hooks-endofscope-perl -libb-hooks-op-annotation-perl-goto-binaries.tar..> -libb-hooks-op-check-entersubforcv-perl-goto-bin..> -libb-hooks-op-check-perl -libb-hooks-op-ppaddr-perl -libb-hooks-parser-perl -libb-perlreq-perl -libb-utils-perl -libb64 -libbareword-filehandles-perl -libbde -libberkeleydb-perl -libbfio -libbind -libbinio -libbio-samtools-perl -libbio-scf-perl -libbit-vector-perl -libbitcoin -libbitmask -libblkmaker -libbluedevil -libbluray -libbonobo -libbonoboui -libboost-geometry-utils-perl -libbpp-qt -libbpp-raa -libbrahe -libbs2b -libbsd-arc4random-perl -libbsd -libbsd-resource-perl -libbssolv-perl -libbuffy -libburn -libcaca -libcache-fastmmap-perl -libcache-memcached-fast-perl -libcache-mmap-perl -libcairo-gobject-perl -libcairo-perl -libcanberra -libcangjie -libcap-ng -libcap2 -libcapi20-3 -libcapsinetwork -libcapture-tiny-perl -libccaudio2 -libccd -libccp4 -libccrtp -libccscript3 -libccss -libcdb-file-perl -libcddb -libcdk-perl -libcdk5 -libcdr -libcec -libcerf -libcgi-struct-xs-perl -libcgic -libcgicc -libcgns -libcgroup -libchamplain -libchipcard -libcitadel -libcitygml -libclass-accessor-grouped-perl-goto-binaries.ta..> -libclass-c3-xs-perl -libclass-date-perl -libclass-errorhandler-perl -libclass-load-xs-perl -libclass-methodmaker-perl -libclass-xsaccessor-perl -libclaw -libcli -libclone-perl -libcmis -libcommoncpp2 -libcompface -libcompress-bzip2-perl -libcompress-raw-bzip2-perl -libcompress-raw-lzma-perl -libcompress-raw-zlib-perl -libconfig-augeas-perl -libconfig-autoconf-perl -libconvert-binary-c-perl -libcookie-baker-perl -libcorelinux -libcoro-perl -libcoverart -libcoyotl -libcpanel-json-xs-perl -libcpanplus-dist-build-perl -libcpuset -libcroco -libcrypt-cast5-perl -libcrypt-cracklib-perl -libcrypt-des-perl -libcrypt-dh-gmp-perl -libcrypt-eksblowfish-perl -libcrypt-gcrypt-perl -libcrypt-mysql-perl -libcrypt-openssl-bignum-perl -libcrypt-openssl-dsa-perl -libcrypt-openssl-random-perl -libcrypt-openssl-rsa-perl -libcrypt-openssl-x509-perl -libcrypt-rijndael-perl -libcrypt-smime-perl -libcrypt-ssleay-perl -libcrypt-twofish-perl -libcrypt-unixcrypt-xs-perl -libcrypto++ -libcsfml -libcsoap -libcss-minifier-xs-perl -libcsv -libctapimkt -libctl -libcue -libcutl -libcxgb3 -libdaemon -libdap -libdata-alias-perl -libdata-clone-perl -libdata-dump-streamer-perl -libdata-messagepack-perl -libdata-peek-perl -libdata-pond-perl -libdata-streamdeserializer-perl-goto-binaries.t..> -libdata-streamserializer-perl-goto-binaries.tar..> -libdata-structure-util-perl -libdata-swap-perl -libdata-util-perl -libdata-uuid-libuuid-perl -libdata-uuid-perl -libdate-calc-xs-perl -libdate-pcalc-perl -libdate-simple-perl -libdatetime-format-pg-perl -libdatetime-perl -libdatrie -libdbd-firebird-perl -libdbd-mysql-perl -libdbd-odbc-perl -libdbd-pg-perl -libdbd-sqlite2-perl -libdbd-sqlite3-perl -libdbd-sybase-perl -libdbi-drivers -libdbi -libdbi-perl -libdbusmenu -libdbusmenu-qt -libdc0 -libdca -libde265 -libdebian-installer -libdebug -libdevel-beginlift-perl -libdevel-bt-perl -libdevel-caller-perl -libdevel-callsite-perl -libdevel-checkbin-perl -libdevel-checkcompiler-perl -libdevel-checklib-perl -libdevel-cover-perl -libdevel-declare-perl -libdevel-dprof-perl -libdevel-findref-perl -libdevel-leak-perl -libdevel-lexalias-perl -libdevel-nytprof-perl -libdevel-pragma-perl -libdevel-refcount-perl -libdevel-size-perl -libdevice-cdio-perl -libdevice-serialport-perl -libdevice-usb-perl -libdigest-crc-perl -libdigest-jhash-perl -libdigest-md2-perl -libdigest-md4-perl -libdigest-sha-perl -libdigest-sha3-perl -libdigest-whirlpool-perl -libdisasm -libdiscid -libdisplaymigration -libdivecomputer -libdjconsole -libdkim -libdmapsharing -libdmtx -libdmx -libdockapp -libdogleg -libdr-sundown-perl -libdr-tarantool-perl -libdrm -libdrumstick -libdshconfig -libdssialsacompat -libdumb -libdvb -libdvbcsa -libdvbpsi -libdvdnav -libdvdread -libe-book -libeatmydata -libebur128 -libecap -libechonest -libedit -libee -libelf -libembperl-perl -libemu -libencode-detect-perl -libencode-eucjpms-perl -libencode-hanextra-perl -libencode-jis2k-perl -libencode-perl -libeot -libepc -libepoxy -libepsilon -libept -libepubgen -libesmtp -libestr -libetonyek -libetpan -libev -libev-perl -libevdev -libevent -libevent-perl -libevhtp -libevocosm -libexif -libexif-gtk -libexosip2 -libexplain -libextractor -libextractor-java -libextutils-cbuilder-perl -libextutils-cchecker-perl -libextutils-cppguess-perl -libextutils-libbuilder-perl -libextutils-parsexs-perl -libfakekey -libfann -libfap5 -libfcgi -libfcgi-perl -libffado -libfile-extattr-perl -libfile-fcntllock-perl -libfile-fnmatch-perl -libfile-lchown-perl -libfile-libmagic-perl -libfile-mmagic-xs-perl -libfile-rsyncp-perl -libfile-spec-perl -libfile-sync-perl -libfilehandle-fmode-perl -libfilesys-df-perl -libfilesys-smbclient-perl -libfilesys-statvfs-perl -libfilter-perl -libfiu -libfixbuf -libfixposix -libflorist -libfm -libfolia -libfont-freetype-perl -libfontenc -libforks-perl -libforms -libfprint -libfreefare -libfreehand -libfreenect -libfso-glib -libfsoframework -libftdi -libfurl-perl -libfuse-perl -libg15 -libg15render -libg3d -libgadu -libgaiagraphics -libgarmin -libgc -libgcal -libgconf-bridge -libgcr410 -libgctp -libgd-gd2-perl -libgd-perl -libgda5 -libgdal-grass -libgdata -libgdchart-gd2 -libgdf -libgee-0.8 -libgee -libgenome -libgeo-distance-xs-perl -libgeo-ip-perl -libgeo-proj4-perl -libgeotiff-dfsg -libgetdata -libgetopt++ -libgfshare -libghemical -libgig -libgisi -libgit2-glib -libgksu -libglademm2.4 -libglib-object-introspection-perl-goto-binaries..> -libglib-perl -libgltf -libglu -libgmpada -libgnatcoll -libgnome -libgnome-keyring -libgnome-media-profiles -libgnome2-canvas-perl -libgnome2-gconf-perl -libgnome2-perl -libgnome2-vfs-perl -libgnome2-wnck-perl -libgnomecanvas -libgnomecanvasmm2.6 -libgnomekbd -libgnomeui -libgoo-canvas-perl -libgooglepinyin -libgpg-error -libgpiv -libgpod -libgraphics-libplot-perl -libgringotts -libgrip -libgrits -libgroove -libgrss -libgsecuredelete -libgsf -libgsm -libgsm0710 -libgssapi-perl -libgssglue -libgstreamer-interfaces-perl -libgstreamer-perl -libgtextutils -libgtk2-appindicator-perl -libgtk2-gladexml-perl -libgtk2-imageview-perl -libgtk2-notify-perl -libgtk2-perl -libgtk2-sourceview2-perl -libgtk2-spell-perl -libgtk2-trayicon-perl -libgtk2-traymanager-perl -libgtk2-unique-perl -libgtkada -libgtksourceviewmm -libgtop2 -libguac -libguard-perl -libguess -libguestfs -libgusb -libgweather -libgwenhywfar -libgwibber -libgxps -libhangul -libharu -libhash-fieldhash-perl -libhash-storediterator-perl -libhbaapi -libhbalinux -libhdhomerun -libheimdal-kadm5-perl -libhmsbeagle -libhtml-parser-perl -libhtml-strip-perl -libhtml-template-pro-perl -libhtml-tidy-perl -libhtp -libhttp-parser-xs-perl -libhx -libibcm -libiberty -libibmad -libibtk -libibumad -libibverbs -libice -libicns -libics -libid3tag -libident -libidl -libidn2-0 -libiec61883 -libieee1284 -libifp -libiksemel -libimage-exif-perl -libimage-imlib2-perl -libimage-librsvg-perl -libimager-perl -libimager-qrcode-perl -libimobiledevice -libindi -libindicate -libindicate-qt -libindicator -libindirect-perl -libinline-c-perl -libinnodb -libinput -libinstpatch -libint -libinternals-perl -libintl-perl -libio-aio-perl -libio-captureoutput-perl -libio-dirent-perl -libio-epoll-perl -libio-interface-perl -libio-pty-perl -libio-socket-multicast-perl -libipathverbs -libipc-sharelite-perl -libiptcdata -libircclient -libirman -libiscsi -libisds -libisoburn -libisocodes -libitl-gobject -libitl -libitpp -libixion -libixp -libjavascript-minifier-xs-perl-goto-binaries.ta..> -libjconv -libjna-java -libjogl2-java -libjpeg-turbo -libjpeg6b -libjpeg8 -libjpeg9 -libjson-maybexs-perl -libjson-pointer-perl -libjson-rpc-perl -libjson-xs-perl -libkal -libkarma -libkate -libkaz -libkcddb -libkcompactdisc -libkdcraw -libkdeedu -libkdegames -libkeepalive -libkexiv2 -libkeyword-simple-perl -libkgapi -libkibi -libkinosearch1-perl -libkipi -libkkc-data -libkkc -libkmahjongg -libkmfl -libkml -libkolab -libkolabxml -libkomparediff2 -libkpeople -libkqueue -libksane -libksba -libkscreen -libktoblzcheck -libktorrent -liblangtag -liblas -liblastfm -liblaxjson -liblbfgs -liblchown-perl -libldm -liblexical-sealrequirehints-perl-goto-binaries...> -liblexical-var-perl -liblicense -liblingua-stem-snowball-perl -liblinux-dvb-perl -liblinux-epoll-perl -liblinux-inotify2-perl -liblinux-pid-perl -liblinux-prctl-perl -liblip -liblist-moreutils-perl -liblivemedia -liblo -liblocale-gettext-perl -liblocale-hebrew-perl -liblockfile -liblogging -liblognorm -liblouis -liblouisutdml -liblouisxml -liblqr -liblrdf -liblscp -libltc -libltcsmpte -liblucy-perl -liblunar -libm4ri -libm4rie -libmaa -libmad -libmail-cclient-perl -libmarpa-r2-perl -libmatch-simple-xs-perl -libmatchbox -libmatekbd -libmateweather -libmath++ -libmath-bigint-gmp-perl -libmath-clipper-perl -libmath-convexhull-monotonechain-perl-goto-bina..> -libmath-geometry-voronoi-perl-goto-binaries.tar..> -libmath-gmp-perl -libmath-int64-perl -libmath-libm-perl -libmath-mpfr-perl -libmath-prime-util-gmp-perl -libmath-prime-util-perl -libmath-random-isaac-xs-perl -libmath-random-mt-perl -libmath-random-tt800-perl -libmath-tamuanova-perl -libmath-vector-real-xs-perl -libmatheval -libmatio -libmatthew-java -libmbim -libmdsp -libmediaart -libmediainfo -libmemcached -libmialm -libmicrohttpd -libmikmod -libmime-explode-perl -libmimedir -libmimic -libmirisdr -libmkv -libmlx4 -libmlx5 -libmm-qt -libmms -libmng -libmnl -libmodbus -libmodelfile -libmodplug -libmodule-build-perl -libmodule-build-tiny-perl -libmodule-build-xsutil-perl -libmoe -libmongo-client -libmongodb-perl -libmoose-perl -libmoosex-role-withoverloading-perl-goto-binari..> -libmouse-perl -libmousex-foreign-perl -libmowgli-2 -libmowgli -libmozilla-ldap-perl -libmp3splt -libmpd -libmpdclient -libmpeg3 -libmrss -libmsgcat-perl -libmsn -libmspack -libmspub -libmsv -libmthca -libmtp -libmultidimensional-perl -libmusicbrainz-discid-perl -libmusicbrainz3 -libmwaw -libnanomsg-raw-perl -libnatpmp -libnbio -libncursesada -libndp -libnes -libnet-arp-perl -libnet-bluetooth-perl -libnet-cli-interact-perl -libnet-cups-perl -libnet-dbus-glib-perl -libnet-dbus-perl -libnet-dns-perl -libnet-freedb-perl -libnet -libnet-idn-encode-perl -libnet-jabber-loudmouth-perl -libnet-ldapapi-perl -libnet-libdnet-perl -libnet-libidn-perl -libnet-nis-perl -libnet-patricia-perl -libnet-pcap-perl -libnet-rawip-perl -libnet-ssh2-perl -libnet-ssleay-perl -libnet-tclink-perl -libnet-z3950-simpleserver-perl-goto-binaries.ta..> -libnet-z3950-zoom-perl -libnetaddr-ip-perl -libnetfilter-acct -libnetfilter-cthelper -libnetfilter-cttimeout -libnetfilter-log -libnetfilter-queue -libnfc -libnfnetlink -libnfo -libnfs -libnfsidmap -libnftnl -libnice -libnih -libnjb -libnl3 -libnm-qt -libnotify -libnova -libnsbmp -libnsgif -libnss-cache -libnss-db -libnss-extrausers -libnss-gw-name -libnss-ldap -libnss-lwres -libnss-myhostname -libnss-pgsql -libnss-securepass -libntlm -libnxml -libnxt -libnzb -liboauth -libocas -libodfgen -libofa -libofx -libogg -libogg-vorbis-decoder-perl -liboggz -liboglappth -libomxalsa -libomxcamera -libomxfbdevsink -libomxmad -libomxvideosrc -libomxvorbis -libomxxvideo -liboobs -liboop -libopendbx -libopengl-perl -libopengl-xscreensaver-perl -libopenraw -libopenusb -liboping -libopkele -liborcus -libosinfo -libosip2 -libosmosdr -libotf -libotr -libp11 -libpackage-stash-xs-perl -libpadwalker-perl -libpagemaker -libpam-abl -libpam-afs-session -libpam-alreadyloggedin -libpam-blue -libpam-ccreds -libpam-chroot -libpam-encfs -libpam-krb5 -libpam-ldap -libpam-mount -libpam-pwdfile -libpam-radius-auth -libpam-script -libpam-ssh -libpam-sshauth -libpam-tacplus -libpam-usb -libpango-perl -libpano13 -libpaper -libpar-packer-perl -libpar2 -libparams-classify-perl -libparams-util-perl -libparams-validate-perl -libparse-exuberantctags-perl -libpcap -libpcapnav -libpcl1 -libpcre++ -libpdl-io-hdf5-perl -libpdl-io-matlab-perl -libpdl-linearalgebra-perl -libpdl-netcdf-perl -libpeas -libperl-destruct-level-perl -libperl5i-perl -libperlio-eol-perl -libperlio-gzip-perl -libperlio-utf8-strict-perl -libperlx-maybe-xs-perl -libpff -libpfm4 -libpg-hstore-perl -libpg-perl -libpgf -libpgm -libpgplot-perl -libphone-ui-shr -libphone-utils -libphonenumber -libphysfs -libpinyin -libpipeline -libplack-middleware-expires-perl-goto-binaries...> -libplayer -libplist -libpmount -libpng -libpodofo -libpolyclipping -libposix-atfork-perl -libposix-strftime-compiler-perl-goto-binaries.t..> -libposix-strptime-perl -libpostproc -libppd -libppi-xs-perl -libpqtypes -libpqxx -libpreludedb -libpri -libprintsys -libproc-processtable-perl -libproc-wait3-perl -libproxy -libpsl -libpst -libpthread-stubs -libpthread-workqueue -libpulse-java -libpuzzle -libpwiz -libpwquality -libpyzy -libqalculate -libqmi -libquantum -libquazip -libquicktime -libquota-perl -libquvi -libr3 -librabbitmq -libradsec -libranlip -librasterlite -libraw -libraw1394 -librcc -librcd -librcsb-core-wrapper -librdkafka -librdmacm -libreadline-java -libreadonly-perl -libreadonly-xs-perl -librecad -librelp -librep -libreplaygain -libresample -librest -librevenge -librevisa -librime -librostlab-blast -librostlab -librouter-simple-perl -librpcsecgss -librsvg -librsync -librtfcomp -libs3 -libsamplerate -libsane-perl -libsbml -libsbsms -libscalar-list-utils-perl -libscalar-string-perl -libscalar-util-numeric-perl -libscope-upper-perl -libscrypt -libsdl-console -libsdl-perl -libsdl2-gfx -libsdl2-image -libsdl2-mixer -libsdl2-net -libsdl2-ttf -libseccomp -libsecret -libsemanage -libsendmail-milter-perl -libsepol -libsereal-decoder-perl -libsereal-encoder-perl -libserialport -libset-object-perl -libsexy -libsfml -libshairport -libshevek -libshout -libshout-idjc -libshr-glib -libsidplay -libsidplayfp -libsieve -libsigc++-1.2 -libsigc++-2.0 -libsignatures-perl -libsigrok -libsigrokdecode -libsigsegv -libsixel -libskk -libsm -libsmf -libsmi -libsocket-linux-perl -libsocket-msghdr-perl -libsocket-multicast6-perl -libsocket-perl -libsocket6-perl -libsocketcan -libsodium -libsoil -libsolv -libsort-key-perl -libsort-key-top-perl -libsoup2.4 -libspctag -libspectre -libspf2 -libspiro -libspnav -libss7 -libssh -libssh2 -libstatgrab -libstoragemgmt -libstore-opaque-perl -libstrictures-perl -libstring-approx-perl -libstring-compare-constanttime-perl-goto-binari..> -libstring-crc32-perl -libstring-similarity-perl -libstroke -libstrophe -libstxxl -libsub-current-perl -libsub-identify-perl -libsub-name-perl -libsub-prototype-perl -libswe -libsylph -libsynthesis -libsys-cpu-perl -libsys-cpuload-perl -libsys-mmap-perl -libsys-syslog-perl -libsys-utmp-perl -libsys-virt-perl -libsysactivity -libtaint-runtime-perl -libtaint-util-perl -libtar -libtasn1-6 -libtcd -libtcl-perl -libteam -libtecla -libtelnet -libtemplate-perl -libterm-readkey-perl -libterm-readline-gnu-perl -libterm-size-perl -libterm-size-perl-perl -libterm-slang-perl -libterralib -libtest-leaktrace-perl -libtest-mock-guard-perl -libtest-taint-perl -libtest-valgrind-perl -libtext-aspell-perl -libtext-bibtex-perl -libtext-bidi-perl -libtext-charwidth-perl -libtext-chasen-perl -libtext-csv-xs-perl -libtext-hunspell-perl -libtext-iconv-perl -libtext-kakasi-perl -libtext-levenshteinxs-perl -libtext-markdown-discount-perl-goto-binaries.ta..> -libtext-mecab-perl -libtext-ngram-perl -libtext-qrcode-perl -libtext-reflow-perl -libtext-soundex-perl -libtext-unaccent-perl -libtexttools -libtextwrap -libtfbs-perl -libthai -libtheora -libthread-sigmask-perl -libticonv -libtime-hr-perl -libtime-warp-perl -libtime-y2038-perl -libtins -libtirpc -libtk-img -libtk-tablematrix-perl -libtokyocabinet-perl -libtomcrypt -libtommath -libtorrent -libtorrent-rasterbar -libtpl -libtrace3 -libtrain -libtrio -libtritonus-java -libtrue-perl -libtrycatch-perl -libtsm -libtuxcap -libtwin -libtype-tiny-xs-perl -libucimf -libunibreak -libunicode-casefold-perl -libunicode-collate-perl -libunicode-japanese-perl -libunicode-linebreak-perl -libunicode-map-perl -libunicode-map8-perl -libunicode-string-perl -libunicode-utf8-perl -libuninameslist -libuninum -libunique -libunique3 -libunistring -libunix-mknod-perl -libunix-syslog-perl -libunwind -libupnp -libupnp4 -libur-perl -liburcu -liburi-escape-xs-perl -libusb-1.0 -libusb -libusb-java -libusbmuxd -libusbtc08 -libuser -libutempter -libuuid-perl -libuv -libva -libvariable-magic-perl -libvc -libvdpau -libvdpau-va-gl -libversion-perl -libverto -libvformat -libvideo-capture-v4l-perl -libvideo-ivtv-perl -libview -libvigraimpex -libvirt-glib -libvirt -libvirt-php -libvirt-python -libvisca -libvisio -libvistaio -libvisual -libvisual-plugins -libvncserver -libvoikko -libvorbis -libvorbisidec -libvsqlitepp -libwacom -libwant-perl -libwcat1 -libwebcam -libwebp -libwebsockets -libwfut -libwibble -libwnck -libwnck3 -libwnckmm -libwpd -libwpg -libwps -libwww-curl-perl -libwww-youtube-download-perl -libwx-perl -libwx-scintilla-perl -libx11 -libx11-guitest-perl -libx86 -libx86emu -libxau -libxaw -libxc -libxcb -libxcomposite -libxcrypt -libxcursor -libxdamage -libxdg-basedir -libxdmcp -libxext -libxfce4ui -libxfce4util -libxfcegui4 -libxfixes -libxfont -libxi -libxinerama -libxkbcommon -libxkbfile -libxklavier -libxml++2.6 -libxml-bare-perl -libxml-easy-perl -libxml-libxml-perl -libxml-libxslt-perl -libxml-parser-perl -libxml-quote-perl -libxml-rss-libxml-perl -libxml-sax-expatxs-perl -libxml2 -libxmltok -libxmp -libxmu -libxp -libxpm -libxr -libxrandr -libxrender -libxres -libxs -libxs-object-magic-perl -libxsettings-client -libxsettings -libxss -libxtst -libxv -libxvmc -libxxf86dga -libxxf86vm -libyahoo2 -libyaml -libyaml-libyaml-perl -libyaml-syck-perl -libydpdict -libykneomgr -libytnef -libyubikey -libzapojit -libzeitgeist -libzen -libzerg -libzerg-perl -libzeromq-perl -libzhuyin -libzip -libzn-poly -libzorpll -libzrtpcpp -libzypp -licenseutils -licq -liece -lierolibre -lifelines -lifeograph -liggghts -light-locker -lightdm -lightdm-gtk-greeter -lightdm-kde -lightsoff -lightspark -lightspeed -lilv -lilypond -lilyterm -linbox -lincity-ng -lingot -link-grammar -link-monitor-applet -linkchecker -links2 -lintex -linux-atm -linux-ftpd -linux-ftpd-ssl -linux -linux-igd -linux-minidisc -linux-tools -linux-user-chroot -linux-wlan-ng -linuxdcpp -linuxdoc-tools -linuxinfo -linuxlogo -linuxtv-dvb-apps -liquidwar -lisaac -listaller -littler -littlewizard -live-f1 -live-installer -lives -liwc -lksctp-tools -ll-scope -lldpd -llvm-toolchain-3.3 -llvm-toolchain-3.4 -llvm-toolchain-3.5 -lm-sensors -lm4tools -lmarbles -lmdb -lmemory -lmms -lmod -lnav -lnpd -loadlin -loadmeter -loadwatch -lockdev -lockfile-progs -log4c -log4cplus -log4cpp -log4cxx -log4shib -logapp -logfs-tools -logjam -logol -logrotate -logservice -logstalgia -logtool -logtools -logtop -lokalize -loki -lomoco -longomatch -lookup -looptools -loqui -lordsawar -lostirc -loudmouth -lout -love -lowmem -lowpan-tools -lp-solve -lpc21isp -lpctools -lpe -lprng -lrcalc -lrslib -lrzip -lrzsz -lsat -lsdvd -lshw -lskat -lsmbox -lsof -lsscsi -lsyncd -ltpanel -ltrace -ltris -ltrsift -ltsp -ltspfs -lttngtop -lttoolbox -lttv -lua-apr -lua-augeas -lua-bitop -lua-cjson -lua-curl -lua-cyrussasl -lua-dbi -lua-discount -lua-event -lua-expat -lua-filesystem -lua-iconv -lua-ldap -lua-lgi -lua-lpeg -lua-lpty -lua-md5 -lua-posix -lua-rexlib -lua-rings -lua-sec -lua-sql -lua-svn -lua-term -lua-wsapi -lua-yaml -lua-zip -lua-zlib -lua5.1 -lua5.2 -lua50 -luajit -luasocket -lucene++ -luminance-hdr -lunar-date -lunar -lunzip -luola -lurker -lutefisk -luxio -lv -lv2 -lv2dynparam1 -lv2file -lv2proc -lv2vocoder -lvm2 -lwatch -lwipv6 -lwjgl -lwm -lwt -lx-gdb -lxappearance -lxappearance-obconf -lxde-common -lxdm -lxinput -lxlauncher -lxmenu-data -lxml -lxmms2 -lxmusic -lxpanel -lxrandr -lxsession -lxshortcut -lxtask -lxterminal -lynkeos.app -lysdr -lyx -lz4 -lzlib -lzma -lzo2 -lzop -m17n-contrib -m17n-db -m17n-docs -m17n-im-config -m17n-lib -m2300w -m2crypto -m2ext -m2vrequantiser -mac-robber -macchanger -macfanctld -macs -madbomber -madlib -madplay -madwimax -maelstrom -mafft -magic-haskell -magicfilter -magicrescue -magics++ -mah-jong -mail-notification -mailavenger -mailcheck -maildir-filter -maildir-utils -maildrop -mailfilter -mailfront -mailman -mailsync -mailtextbody -mailto -mailutils -main-menu -mairix -maitreya -make-dfsg -makebootfat -makedepf90 -makefs -makehuman -makejvf -makepp -makexvpics -malaga -maloc -man2html -manaplus -mancala -mango-lassi -manpages-tr -mapcache -mapnik -mapsembler2 -maq -maqview -marble -marco -maria -mariadb-client-lgpl -marisa -markupsafe -marsshooter -massxpert -matanza -matchbox-desktop -matchbox-keyboard -matchbox-panel-manager -matchbox-window-manager -mate-applets -mate-backgrounds -mate-control-center -mate-desktop -mate-icon-theme -mate-indicator-applet -mate-media -mate-menus -mate-netbook -mate-netspeed -mate-notification-daemon -mate-panel -mate-polkit -mate-power-manager -mate-screensaver -mate-sensors-applet -mate-session-manager -mate-settings-daemon -mate-system-monitor -mate-system-tools -mate-terminal -mate-themes -mate-utils -mathgl -mathomatic -mathtex -mathwar -matplotlib -matroxset -maude -mawk -maxima -maximus -mayavi2 -mboxgrep -mbt -mbtserver -mbuffer -mbw -mc -mcabber -mcelog -mcl -mclibs -mcmcpack -mcpp -mcrl2 -mcron -md5deep -mdbtools -mdbus -mdetect -mdf2iso -mdk -mdm -mdns-scan -me-tv -meanwhile -mecab -media-ctl -mediainfo -mediatomb -mediawiki2latex -medit -mednafen -medusa -meep -meep-lam4 -meep-mpi-default -meep-mpich2 -meep-openmpi -megaglest-data -megaglest -megatools -meliae -melting -memcached -memcachedb -memchan -memdump -memphis -memstat -memtester -mensis -menu-cache -menu -mercator -mercurial -mergelog -mesa-demos -meschach -meshlab -mess-desktop-entries -metacity -metapixel -metar -metastore -metatheme-gilouche -meterbridge -meterec -metis -metview -mew-beta -mew -mftrace -mgcv -mgdiff -mgt -mhc -mhddfs -mhwaveedit -mia -mialmpick -miaviewit -micro-httpd -micro-inetd -micro-proxy -microbiomeutil -microcom -microdc2 -midgard2-core -midish -mighttpd2 -mikmod -milkytracker -milter-greylist -mimedefang -mimelib1 -mimetex -mimetic -min12xxw -minbif -minetest -mingetty -mingw-ocaml -mini-httpd -mini18n -minicom -minidjvu -minimodem -minisapserver -minissdpd -ministat -minit -miniupnpc -miniupnpd -minizip -minpack -mira -mirage -miredo -miro -mirrormagic -missidentify -missingh -mixmaster -mixxx -mkcue -mkelfimage -mknbi -mksh -mktorrent -mkvtoolnix -mldemos -mlgmp -mlmmj -mlocate -mlpack -mlpcap -mlpy -mlton -mlv-smile -mm -mm3d -mmass -mmdb -mmorph -mmpong -mmtk -mmv -moblin-gtk-engine -moblin-menus -mobyle -moc -mod-authn-webid -mod-authnz-persona -mod-authz-securepass -mod-dnssd -mod-gearman -mod-gnutls -mod-mime-xattr -mod-mono -mod-proxy-msrpc -mod-vhost-ldap -mod-wsgi -modem-cmd -modem-manager-gui -modglue -modplugtools -modsecurity-apache -modules -mokomaze -mokutil -mon -mona -monav -mongodb -monit -monkeystudio -mono-fuse -mono-tools -monopd -monotone-viz -monster-masher -monsterz -moodbar -moon-buggy -moon-lander -moonshot-gss-eap -moonshot-trust-router -moonshot-ui -mooproxy -mopac7 -moreutils -morla -morris -morse-simulator -morse2ascii -morsegen -mosh -mosquitto -most -motif -motion -mountall -mountpy -mouseemu -mousepad -mousetrap -mousetweaks -movit -mozjs -mozjs17 -mozjs24 -mozo -mozplugger -mp -mp3blaster -mp3fs -mp3info -mp3rename -mp3splt -mp3wrap -mp4h -mp4v2 -mpage -mpb -mpc -mpc123 -mpclib3 -mpd -mpdcon.app -mpdcron -mpdecimal -mpdris2 -mpdscribble -mpeg2dec -mpegdemux -mpfi -mpfr4 -mpg123 -mpi4py -mpich -mplayerthumbs -mpm-itk -mpop -mppenc -mpqc -mpt-status -mrbayes -mriconvert -mrmpi -mrpt -mrtg -mrtgutils -mruby -mrxvt -mscgen -mscompress -msgpack -msktutil -msmtp -msr-tools -msrtool -mssh -mstflint -mswatch -mt-st -mtasc -mtbl -mtd-utils -mtdev -mtpaint -mtr -mtx -muddleftpd -mudita24 -muffin -multiboot -multicat -multimon -multitee -multiwatch -mumble -mummer -mummy -mumps -mumudvb -munge -munin-c -muparser -mupen64plus-audio-sdl -mupen64plus-core -mupen64plus-input-sdl -mupen64plus-rsp-hle -mupen64plus-ui-console -mupen64plus-video-glide64 -mupen64plus-video-glide64mk2 -mupen64plus-video-rice -mupen64plus-video-z64 -muroar -muroard -muse -museek+ -musescore -music -musl -mutter -muttprint -mvtnorm -mwrap -mx -mxallowd -mxml -mydumper -mygui -myodbc -mypaint -myproxy -myrescue -mysecureshell -myspell -mysql++ -mysql-connector-c++ -mysql-ocaml -mysql-workbench -mysqltcl -mysqmail -mythes -mythtvfs-fuse -n2n -nacl -nagios-nrpe -nagios-plugins-contrib -nagios3 -nagircbot -nailgun -nam -namazu2 -nano -nanomsg -nas -nasm -naspro-bridge-it -naspro-bridges -naspro-core -nast -nasty -nat -nautic -nautilus-actions -nautilus-filename-repairer -nautilus -nautilus-image-converter -nautilus-open-terminal -nautilus-python -nautilus-sendto -nautilus-share -nautilus-wipe -nbd -nbdkit -nbibtex -nbtscan -nc6 -ncap -ncbi-blast+ -ncbi-seg -ncbi-tools6 -ncdt -ncdu -ncmpc -ncmpcpp -nco -ncompress -nd -ndisc6 -ndiswrapper -ndoutils -ndpi -ne -neard -nec -nec2c -nedit -neko -nekobee -nemiver -nemo-fileroller -nemo -neon27 -nepomuk-core -nepomuk-widgets -nestopia -net-acct -net-tools -net6 -netatalk -netcat -netcat-openbsd -netcf -netcfg -netdiag -netdiscover -netexpect -nethogs -netifaces -netkit-bootparamd -netkit-ftp -netkit-ftp-ssl -netkit-ntalk -netkit-rsh -netkit-rusers -netkit-rwall -netkit-rwho -netkit-telnet -netkit-telnet-ssl -netkit-tftp -netmask -netmate -netmrg -netperfmeter -netpipe -netpipes -netqmail -netrek-client-cow -netrik -netris -netrw -netsed -netselect -netspeed -netstat-nat -netsurf -nettle -nettoe -netw-ib-ox-ag -network-console -network-manager-applet -network-manager-iodine -network-manager-openconnect -network-manager-openvpn -network-manager-pptp -network-manager-strongswan -network-manager-vpnc -neverball -newlib -newmat -newpid -nexus -nfacct -nfft -nflog-bindings -nfqueue-bindings -nfs-utils -nfs4-acl-tools -nfswatch -nftables -ng -ng-utils -ngetty -nghttp2 -nginx -ngircd -ngraph-gtk -ngrep -nickle -nicstat -nield -nifti2dicom -nifticlib -nikwi -nilfs-tools -ninja -ninvaders -nip2 -nipy -nis -nitpic -nitrogen -njam -nkf -nlme -nload -nlopt -nmap -nmapsi4 -nmh -nmon -nmzmail -nocache -nodau -node -nodejs -nodm -noiz2sa -nomarch -nomnom -nordugrid-arc -normalize-audio -notebook -notification-daemon -notify-osd -novena-eeprom -noweb -npapi-vlc -npth -nqp -nrg2iso -nrss -ns3 -nsca -nsca-ng -nsd -nsis -nslint -nsnake -nspr -nss-mdns -nss-pam-ldapd -nss-passwords -nss-updatedb -nted -ntfs-config -ntl -ntop -ntopng -ntp -ntpstat -ntrack -nuapplet -nullidentd -nullmailer -numactl -numdiff -numlockx -numptyphysics -nut-nutrition -nuttcp -nvi -nvidia-modprobe -nvidia-settings-legacy-304xx -nvidia-texture-tools -nvidia-xconfig -nvram-wakeup -nvramtool -nvtv -nwall -nwipe -nwrite -nx-libs-lite -nxcl -nyancat -o3dgc -oar -oasis3 -obby -obconf -obdgpslogger -obex-data-server -obexd -obexfs -obexftp -obexpushd -objcryst-fox -obsession -ocaml-alsa -ocaml-ao -ocaml-bitstring -ocaml-bjack -ocaml-cry -ocaml-ctypes -ocaml-curses -ocaml-dbus -ocaml-dssi -ocaml-dtools -ocaml-duppy -ocaml-expat -ocaml-extunix -ocaml-faad -ocaml-fdkaac -ocaml-flac -ocaml-frei0r -ocaml-gavl -ocaml-gettext -ocaml -ocaml-gstreamer -ocaml-inotify -ocaml-ladspa -ocaml-lame -ocaml-lastfm -ocaml-libvirt -ocaml-lo -ocaml-mad -ocaml-magic -ocaml-mm -ocaml-ogg -ocaml-opus -ocaml-portaudio -ocaml-pulseaudio -ocaml-reins -ocaml-samplerate -ocaml-schroedinger -ocaml-sha -ocaml-shine -ocaml-shout -ocaml-soundtouch -ocaml-speex -ocaml-sqlite3 -ocaml-ssl -ocaml-taglib -ocaml-text -ocaml-theora -ocaml-usb -ocaml-voaacenc -ocaml-vorbis -ocaml-xmlplaylist -ocaml-zarith -ocamlagrep -ocamlbricks -ocamlgsl -ocamlnet -ocamlodbc -ocamlpam -ocamlsdl -oce -ocfs2-tools -ocp -ocp-indent -ocproxy -ocrfeeder -ocsinventory-agent -octave -octomap -ocurl -ode -odt2txt -oflib -ofono -ogamesim -oggfwd -oggvideotools -ogmtools -ogre-1.8 -ogre-1.9 -ohcount -ois -okteta -okular -ola -olpc-kbdshim -olpc-powerd -olsrd -omake -omega-rpg -omhacks -omins -omnievents -omniorb-dfsg -ompl -oneko -onesixtyone -onioncat -ontv -oolite -opam -opari -opari2 -open-axiom -open-cobol -open-invaders -open-jtalk -openais -openal-soft -openambit -openarena-085-data -openarena-088-data -openarena-data -openbabel -openblas -openbox -openbox-menu -openbsd-inetd -opencaster -opencc -opencity -openclonk -opencolorio -openconnect -opencore-amr -openct -openctm -opendkim -opendmarc -opendnssec -openexr -openexr-viewers -openfetion -openigtlink -openimageio -openjade -openjade1.3 -openjdk-7-jre-dcevm -openjfx -openjpeg -openjpeg2 -openlayer -openlibm -openload -openlugaru -openms -openntpd -openpref -openr2 -openrpt -opensaml2 -opensc -openscad -openscap -openscenegraph -openslide -opensm -opensp -openspecfun -openssl -openteacher -openuniverse -openvanilla-modules -openvpn-auth-ldap -openvpn -openvrml -openwince-include -openwince-jtag -openyahtzee -ophcrack -opt -optipng -opus -opus-tools -opusfile -orafce -orbit2 -orbital-eunuchs-sniper -orc -oregano -original-awk -oroborus -orpie -orthanc -orville-write -osdclock -osdsh -osgearth -osm-gps-map -osm2pgsql -osmctools -osmo -osptoolkit -oss-preserve -ossim -ossp-uuid -osspd -osspsa -otcl -otf -otf2bdf -otp -otpw -ots -outguess -ovirt-guest-agent -ovito -owfs -oxygen-gtk3 -oxygencursors -p0f -p11-kit -p7zip -p910nd -pacemaker -pachi -packagekit-qt -packeth -packit -pacman4console -paco -pacparser -padevchooser -padre -pads -pagodacf -pairs -pajeng -pal -palapeli -palbart -palo -palp -pam-dbus -pam-geoip -pam -pam-krb5-migrate -pam-mysql -pam-p11 -pam-pgsql -pam-pkcs11 -pam-python -pam-shield -pam-tmpdir -paman -pamtester -pan -pandas -pandoc -pandora-build -pangomm -pangox-compat -pantomime1.2 -paperkey -papi -paprefs -paps -papyrus -par -par2cmdline -paraview -parcellite -parchive -pari -paris-traceroute -parley -parmap -parole -parprouted -parrot -parser -parser-mysql -partclone -parted -partimage -partitionmanager -partman-base -partman-crypto -pasco -passepartout -passwdqc -pasystray -patch -patchelf -patchutils -pathogen -pathological -pavucontrol -pavuk -pavumeter -pax-britannica -pax -pax-utils -paxctl -pbs-drmaa -pcal -pcapfix -pcaputils -pcb2gcode -pccts -pciutils -pcl -pcmanfm -pcmanx-gtk2 -pcmciautils -pconsole -pcre-ocaml -pcre3 -pcsc-cyberjack -pcsc-lite -pcsc-perl -pcsc-tools -pd-arraysize -pd-aubio -pd-bassemu -pd-beatpipe -pd-boids -pd-bsaylor -pd-chaos -pd-comport -pd-cxc -pd-cyclone -pd-earplug -pd-ekext -pd-ext13 -pd-fftease -pd-flite -pd-freeverb -pd-ggee -pd-hcs -pd-hid -pd-iemambi -pd-iemlib -pd-iemmatrix -pd-iemnet -pd-libdir -pd-lua -pd-lyonpotpourri -pd-markex -pd-maxlib -pd-mjlib -pd-moonlib -pd-motex -pd-osc -pd-pddp -pd-pdogg -pd-pdstring -pd-plugin -pd-pmpd -pd-sigpack -pd-smlib -pd-unauthorized -pd-vbap -pd-wiimote -pd-windowing -pd-zexy -pdf-presenter-console -pdf2djvu -pdf2htmlex -pdf2svg -pdfcrack -pdfcube -pdfgrep -pdfmod -pdfresurrect -pdl -pdlzip -pdmenu -pdns -pdns-recursor -pdnsd -pdsh -pebl -pecomato -peg -pegasus-wms -pegsolitaire -pekwm -pen -pencil2d -penguin-command -pennmush -pente -pentobi -pepper -perceptualdiff -percona-xtradb-cluster-galera-2.x-goto-binaries..> -perforate -performous -perftest -perl-byacc -perl -perl4caml -perlipq -petri-foo -petris -pev -pexec -pfb2t1c2pfb -pfqueue -pfstmo -pfstools -pg-comparator -pg-reorg -pgadmin3 -pgagent -pgapack -pgbouncer -pgdbf -pgespresso -pgextwlist -pgfincore -pgmemcache -pgn-extract -pgn2web -pgpdump -pgpgpg -pgreplay -pgrouting -pgsql-asn1oid -pgtcl -pgtop -phalanx -phasex -phnxdeco -phonefsod -phoneui-apps -phoneuid -phonon-backend-gstreamer -phonon-backend-vlc -phonon -photopc -photoprint -php-adodb -php-apcu -php-gearman -php-geoip -php-gnupg -php-horde-lz4 -php-igbinary -php-imagick -php-imlib -php-json -php-memcached -php-mongo -php-msgpack -php-mysqlnd-ms -php-oauth -php-pinba -php-propro -php-radius -php-raphf -php-redis -php-rrd -php-solr -php-ssh2 -php-stomp -php-svn -php-tokyo-tyrant -php-yac -php-zmq -phylip -phyml -pianobar -pianobooster -picard -picmi -picocom -picolisp -picosat -picviz -pida -pidentd -pidgin-audacious -pidgin-awayonlock -pidgin-blinklight -pidgin-encryption -pidgin-extprefs -pidgin-festival -pidgin-gmchess -pidgin -pidgin-hotkeys -pidgin-latex -pidgin-libnotify -pidgin-librvp -pidgin-mpris -pidgin-mra -pidgin-nateon -pidgin-openfetion -pidgin-otr -pidgin-privacy-please -pidgin-sipe -pidgin-skype -pidgin-twitter -pigment -pigment-python -pigz -pillow -pilot-link -pinball -pinentry -pinentry-x2go -pinfo -pingus -pinot -pinpoint -pinta -pion -pioneers -pipebench -pipemeter -pipewalker -pitivi -pixelize -pixman -pixmap -pixz -pjproject -pkcs11-data -pkcs11-dump -pkcs11-helper -pkg-config -pkg-kde-tools -pkgconf -pktools -pktstat -plainbox-provider-checkbox -plainbox-provider-resource-generic-goto-binarie..> -plan -planner -plasma-nm -plasma-widget-adjustableclock-goto-binaries.tar..> -plasma-widget-cwp -plasma-widget-fastuserswitch -plasma-widget-menubar -plasma-widget-message-indicator-goto-binaries.t..> -plasma-widget-smooth-tasks -plasma-widget-yawp -plastimatch -plee-the-bear -plib -ploop -plotdrop -ploticus -plotutils -plptools -plr -pluma -plymouth -pm-utils -pmccabe -pmidi -pmk -pmount -pms -pmw -pmx -png23d -png2html -pngcheck -pngcrush -pnglite -pngmeta -pngnq -pngphoon -pngquant -pngtools -pnm2ppa -pnp4nagios -pnscan -poa -poc-streamer -pocketsphinx -pocl -poco -poe.app -poedit -polari -polarssl -poldi -policycoreutils -policykit-1-gnome -policykit-1 -polipo -polkit-kde-1 -polkit-qt-1 -polspline -polybori -polyglot -polylib -polyml -polyorb -pommed -pong2 -popa3d -poppassd -poppler -popt -populations -portabase -portaudio19 -portmidi -portreserve -portsentry -portsmf -posh -postal -poster -posterazor -postfix-gld -postfix -postgis -postgresql-9.1 -postgresql-9.3 -postgresql-9.4 -postgresql-debversion -postgresql-filedump -postgresql-hll -postgresql-multicorn -postgresql-ocaml -postgresql-pgmp -postgresql-pllua -postgresql-plsh -postgresql-prioritize -postmark -postpone -postr -potool -potrace -pound -povray -powerdebug -powerline -powerman -powermanga -powerstat -powertop -powstatd -poxml -pp-popularity-contest -ppl -pps-tools -pptp-linux -pptpd -pqiv -praat -prayer -prctl -prefix -prelink -preload -prelude-lml -premake4 -preprepare -prerex -presage -pretzel -price.app -prima -prime-phylo -primer3 -print-manager -printfilters-ppd -prips -prison -pristine-tar -privbind -privoxy -probabel -procenv -procinfo -procmail -procmeter3 -procserv -prodigal -proftmb -proftpd-mod-autohost -proftpd-mod-case -proftpd-mod-dnsbl -proftpd-mod-fsync -proftpd-mod-msg -proftpd-mod-tar -projectm -propellor -prosody -protobuf-c -protobuf -proxsmtp -proxy-suite -proxychains -proxycheck -proxytunnel -prt -ps2eps -psad -pscan -psensor -psi -psi-plus -psi4 -psicode -psignifit -psimedia -pslib -psmisc -psocksxx -pspresent -psqlodbc -pstack -pstoedit -pstotext -psurface -psutils -psychtoolbox-3 -psycopg2 -pth -ptouch-driver -ptpd -ptunnel -publib -puf -pugixml -pugl -pulseview -pump -pumpa -pure-ftpd -puredata-import -purelibc -purity -putty -pvrg-jpeg -pwauth -pwgen -pxe -pxe-kexec -pxlib -pxljr -pxsl-tools -pxz -py-postgresql -py-radix -py3cairo -pyalsaaudio -pyao -pyatspi -pybloomfiltermmap -pybluez -pycairo -pycaml -pycangjie -pychm -pycryptopp -pycurl -pyepl -pyepr -pyfai -pyfftw -pyfits -pyfribidi -pygame -pygdchart2 -pygobject-2 -pygobject -pygoocanvas -pygpgme -pygpiv -pygresql -pygrib -pygtk -pygtksourceview -pygts -pyhunspell -pykaraoke -pykcs11 -pykdtree -pykerberos -pyliblo -pylibmc -pylibssh2 -pylibtiff -pylirc -pymad -pymc -pymca -pyme -pymilter -pymol -pymongo -pymssql -pymtbl -pymvpa -pymvpa2 -pynac -pynfft -pynifti -pyode -pyogg -pyopenssl -pyoperators -pyorbit -pyparted -pypoker-eval -pyprotocols -pypy -pyqt5 -pyrenamer -pyrit -pyrit-opencl -pyrite-publisher -pyscanfcs -pyscard -pysendfile -pyside -pyside-tools -pysmbc -pysparse -pyspatialite -pystemmer -pysubnettree -pytables -python-admesh -python-adns -python-apsw -python-astropy -python-bcrypt -python-bibtex -python-biggles -python-biom-format -python-biopython -python-bitarray -python-bsddb3 -python-caja -python-casmoothing -python-cddb -python-cffi -python-chaco -python-cjson -python-clamav -python-clips -python-cogent -python-coverage -python-cpl -python-crypto -python-cryptography -python-cups -python-daap -python-demgengeo -python-djvulibre -python-dmidecode -python-edbus -python-enet -python-ethtool -python-fabio -python-falcon -python-fontconfig -python-fuse -python-gd -python-geoip -python-gevent -python-gitdb -python-gmpy -python-gmpy2 -python-gnatpython -python-gnutls -python-greenlet -python-gtkglext1 -python-gudev -python-hiredis -python-http-parser -python-jswebkit -python-kinterbasdb -python-krbv -python-ldap -python-levenshtein -python-libdiscid -python-libpcap -python-lightblue -python-llfuse -python-lz4 -python-lzma -python-lzo -python-memprof -python-mhash -python-misaka -python-mysqldb -python-neuroshare -python-nids -python-nss -python-numpy -python-omniorb -python-osd -python-pam -python-passfd -python-persistent -python-phoneutils -python-poppler -python-posix-ipc -python-pqueue -python-prctl -python-psutil -python-pyalsa -python-pyaudio -python-pygraphviz -python-pylibacl -python-pyo -python-pypcap -python-pypm -python-pysam -python-pyscss -python-pysqlite1.1 -python-pysqlite2 -python-pytc -python-pywcs -python-pyxattr -python-pyxenstore -python-qrencode -python-qt4 -python-regex -python-reportlab -python-scientific -python-scipy -python-scrypt -python-setproctitle -python-shapely -python-shogun -python-smbpasswd -python-snappy -python-sqlite -python-srp -python-ssdeep -python-stdlib-extensions -python-sysv-ipc -python-tcpwrap -python-thrift -python-tornado -python-traits -python-unac -python-unshare -python-utmp -python-visual -python-wrapt -python-xattr -python-xdo -python-xklavier -python-yenc -python2.7 -python3-stdlib-extensions -python3.4 -pythonmagick -pythonqt -pythontracer -pytone -pyusb -pyvorbis -pywavelets -pywebkitgtk -pyx -pyx3 -pyxmpp -pyxplot -pyyaml -pyzmq -q4wine -qalculate-gtk -qapt -qastools -qcomicbook -qdacco -qdbm -qedje -qfits -qgis -qhull -qiime -qimageblitz -qimhangul -qingy -qiv -qjackctl -qjson -qlandkartegt -qliss3d -qlvnictools -qmapshack -qmenu -qmidiarp -qmidinet -qmidiroute -qmmp -qmpdclient -qmtest -qof -qonk -qpdf -qpdfview -qpid-proton -qprint -qpxtool -qqwing -qrencode -qrisk2 -qrouter -qsampler -qsapecng -qstat -qsynth -qt-gstreamer -qt4-perl -qtads -qtbase-opensource-src -qtcreator -qtemu -qterm -qthid-fcd-controller -qtimageformats-opensource-src-goto-binaries.tar..> -qtiplot -qtkeychain -qtm -qtmultimedia-opensource-src -qtoctave -qtop -qtractor -qtruby -qtwebkit -qtwebkit-opensource-src -qtzeitgeist -quadprog -quadrapassel -quadrule -quantlib -quantlib-swig -quarry -quassel -quesoglc -quickfix -quickplot -quicksynergy -quisk -quitcount -quixote -quixote1 -quota -quvi -qwbfsmanager -qwo -qwtplot3d -qzion -r-bioc-affy -r-bioc-affyio -r-bioc-biobase -r-bioc-biostrings -r-bioc-biovizbase -r-bioc-edger -r-bioc-genomicalignments -r-bioc-genomicranges -r-bioc-graph -r-bioc-hilbertvis -r-bioc-iranges -r-bioc-limma -r-bioc-makecdfenv -r-bioc-preprocesscore -r-bioc-rsamtools -r-bioc-rtracklayer -r-bioc-shortread -r-bioc-snpstats -r-bioc-variantannotation -r-bioc-xvector -r-cran-amore -r-cran-ape -r-cran-base64enc -r-cran-bayesm -r-cran-bbmisc -r-cran-boolnet -r-cran-catools -r-cran-checkmate -r-cran-class -r-cran-colorspace -r-cran-cubature -r-cran-deal -r-cran-digest -r-cran-dosefinding -r-cran-e1071 -r-cran-eco -r-cran-ecodist -r-cran-energy -r-cran-epi -r-cran-evd -r-cran-expm -r-cran-gam -r-cran-genabel -r-cran-gsl -r-cran-gss -r-cran-haplo.stats -r-cran-hdf5 -r-cran-int64 -r-cran-lpsolve -r-cran-maldiquant -r-cran-mapdata -r-cran-mapproj -r-cran-maps -r-cran-maptools -r-cran-mass -r-cran-matrixstats -r-cran-medadherence -r-cran-mixtools -r-cran-mnp -r-cran-msm -r-cran-ncdf4 -r-cran-nloptr -r-cran-nnet -r-cran-polycub -r-cran-pscl -r-cran-qtl -r-cran-quantreg -r-cran-randomforest -r-cran-rcurl -r-cran-rjags -r-cran-rjson -r-cran-rnetcdf -r-cran-rniftilib -r-cran-rsclient -r-cran-rsqlite -r-cran-slam -r-cran-sp -r-cran-spatial -r-cran-spc -r-cran-surveillance -r-cran-testthat -r-cran-tgp -r-cran-truncnorm -r-cran-vegan -r-cran-vgam -r-other-mott-happy -r-zoo -rabbyt -radeontool -radeontop -radioclk -radiusclient-ng -radsecproxy -radvd -ragel -raidutils -raincat -rakarrack -rakudo -ramond -rancid -randomize-lines -randomsound -randtype -rapidsvn -raptor -raptor2 -rarcrack -rarpd -rasmol -raspell -rasqal -raster3d -rat -ratbox-services -rate4site -ratfor -ratmenu -ratpoison -ratproxy -rawtherapee -raxml -razor -razorqt -rblcheck -rbootd -rc -rcmdr -rcs -rdate -rdd -rdfind -rdiff-backup-fs -rdiff-backup -rdkit -re2c -read-edid -readahead-fedora -readline5 -readline6 -readosm -realmd -realpath -realtimebattle -reaver -recite -recode -recoll -reconserver -recordmydesktop -recoverdm -recoverjpeg -recutils -redir -redis -redland-bindings -redland -redshift -redshift-plasmoid -redsocks -ree -refdb -referencer -refpolicy -regexxer -regina-normal -regina-rexx -regionset -reglookup -reinteract -reiserfsprogs -relion -remake -remctl -remind -remmina -remote-tty -renameutils -renattach -renpy -rep-gtk -rephrase -repmgr -repsnapper -reptyr -resample -resiprocate -restartd -revelation -rexima -rfc5766-turn-server -rfdump -rfkill -rfoo -rgbpaint -rgl -rglpk -rgxg -rhash -rheolef -rhnsd -rhythmbox -ri-li -riemann-c-client -rifiuti -rifiuti2 -rinetd -ripmime -ripole -ristretto -rivet -rjava -rkward -rlinetd -rlog -rlpr -rlvm -rlwrap -rman -rmatrix -rmilter -rmpi -rmysql -rnahybrid -rng-tools -roaraudio -roarplaylistd -roboptim-core -robotfindskitten -robustbase -rockdodger -rocs -rodbc -rofs-fuse -roger-router -rolldice -root-system -root-tail -rootskel -rosegarden -rotix -rott -rotter -routino -rovclock -rox -roxterm -rp-pppoe -rpart -rpcbind -rpm -rpm2html -rpy -rpy2 -rrdcollect -rrdtool -rrep -rrootage -rs -rserve -rsibreak -rspamd -rsprng -rsrce -rss-glx -rss2irc -rssh -rsstail -rstatd -rsymphony -rt-app -rt-tests -rtaudio -rtfilter -rtkit -rtl-sdr -rtmidi -rtmpdump -rtorrent -rtpproxy -rubberband -ruby-atomic -ruby-augeas -ruby-bcrypt -ruby-bdb -ruby-blockenspiel -ruby-bluecloth -ruby-bson-ext -ruby-cairo -ruby-charlock-holmes -ruby-curb -ruby-dataobjects-mysql -ruby-dataobjects-postgres -ruby-dataobjects-sqlite3 -ruby-eb -ruby-escape-utils -ruby-exif -ruby-fast-stemmer -ruby-fast-xs -ruby-fcgi -ruby-ferret -ruby-ffi -ruby-fftw3 -ruby-filesystem -ruby-fusefs -ruby-gd -ruby-gherkin -ruby-globalhotkeys -ruby-gnome2 -ruby-god -ruby-gpgme -ruby-grib -ruby-gsl -ruby-hdfeos5 -ruby-hiredis -ruby-hitimes -ruby-http-parser.rb -ruby-inotify -ruby-json -ruby-kgio -ruby-lapack -ruby-ldap -ruby-levenshtein -ruby-libvirt -ruby-libxml -ruby-mkrf -ruby-mpi -ruby-msgpack -ruby-multibitnums -ruby-multimap -ruby-mysql -ruby-mysql2 -ruby-narray -ruby-ncurses -ruby-netcdf -ruby-nfc -ruby-nio4r -ruby-nokogiri -ruby-odbc -ruby-oily-png -ruby-oj -ruby-ox -ruby-passenger -ruby-password -ruby-patron -ruby-pcaprub -ruby-pg -ruby-pgplot -ruby-posix-spawn -ruby-raindrops -ruby-rdiscount -ruby-redcarpet -ruby-redcloth -ruby-rinku -ruby-rjb -ruby-rmagick -ruby-rpatricia -ruby-sdl -ruby-sequel-pg -ruby-serialport -ruby-shadow -ruby-sigar -ruby-sqlite3 -ruby-standalone -ruby-taglib2 -ruby-termios -ruby-tokyocabinet -ruby-uconv -ruby-unicode -ruby-version-sorter -ruby-xmlparser -ruby-yajl -ruby-zoom -rudecgi -ruli -runawk -rungetty -runlim -rxp -rxtx -rxvt -rxvt-unicode -rzip -s2tc -s3d -s3ql -s51dude -sa-exim -sac -safe-hole-perl -safecopy -saga -sagasu -sage -sailcut -saint -sakura -salome-kernel -samdump2 -samplv1 -samtools -samtools-legacy -sanduhr -sane-backends-extras -sane-backends -sane-frontends -sanlock -saods9 -sarg -sash -sawfish -saytime -sbc -sbcl -sblim-wbemcli -sbnc -sbox-dtc -sbrsh -sc -scalapack -scalc -scalpel -scamper -scanbd -scanbuttond -scanlogd -scanmem -scanssh -scantailor -scantool -scgi -schedtool -scheme9 -schism -schroedinger -schroot -scid -scim-anthy -scim-chewing -scim -scim-kmfl-imengine -scim-pinyin -scim-skk -scim-tables -scim-thai -scim-unikey -sciplot -sciscipy -scite -sciteproj -scm -scorched3d -scottfree -scratchbox2 -screen-message -screentest -scribus -scrot -scrounge-ntfs -scrub -scrypt -scscp-imcce -scsitools -scute -sdate -sdcv -sdformat -sdl-image1.2 -sdl-mixer1.2 -sdl-net1.2 -sdl-sound1.2 -sdl-stretch -sdl-ttf2.0 -sdlbasic -sdlgfx -sdlpango -sdop -sdpa -sdparm -sdrangelove -seabios -seahorse -seahorse-nautilus -searchandrescue -searchmonkey -seaview -seccure -secure-delete -sed -see -seekwatcher -sendfile -sendip -sensors-applet -sentinella -seq24 -seqan -seqtk -ser2net -serd -serf -service-wrapper-java -setcd -setserial -sextractor -sfftobmp -sflphone -sfront -sg3-utils -sgabios -sgf2dg -sgrep -sgt-puzzles -shadow -shapelib -shapetools -shared-mime-info -sharutils -shc -shed -sheepdog -shell-fm -shellcheck -shellex -shellinabox -shelltestrunner -shelxle -shhmsg -shhopt -shibboleth-resolver -shibboleth-sp2 -shiboken -shine -shishi -shntool -shogivar -shogun -shotdetect -shotwell -sibsim4 -sic -sidplay -sidplay-libs -siege -sigma-align -signing-party -sigrok-cli -sigscheme -silan -silentjack -silgraphite2.0 -silly -silo-llnl -silversearcher-ag -sim4 -simage -simbody -simhash -similarity-tester -simple-scan -simple-tpm-pk11 -simpleburn -simplejson -simpleparse -simpleproxy -simulavr -since -sineshaper -sinfo -sip-tester -sip4 -sipcalc -sipcrack -sipsak -sipwitch -sipxtapi -siril -siscone -sispmctl -sitecopy -skalibs -skanlite -sketch -skimage -skinedit -skipfish -skksearch -skktools -skrooge -sks-ecc -sks -skstream -skycat -skytools3 -sl -slang2 -slapi-nis -slcfitsio -slcurl -sleepd -sleepenh -sleuthkit -slexpat -slgdbm -slgsl -slhist -slic3r -slim -slimevolley -slmon -sloccount -slowhttptest -slpvm -slrn -slrnface -slsqlite -sludge -slurm-drmaa -slurm -slv2 -slwildcard -slxfig -sm-archive -sm -sma -smalt -smart -smartlist -smartmontools -smb4k -smbnetfs -smc -smcroute -smem -smemstat -smlnj -smokegen -smokekde -smokeping -smokeqt -smp-utils -smpeg -smsclient -smstools -smuxi -snacc -snake4 -snap -snappea -snapper -snappy -snappy-player -snarf -snd -sndfile-tools -sndobj -sng -sniffit -snimpy -snmpkit -snmptrapfmt -snooper -snoopy -snowball -snowdrop -snp-sites -sntop -so-synth-lv2 -soapdenovo -soapdenovo2 -sobby -socat -socket++ -socket -socklog -sockstat -socnetv -softflowd -softhsm -sogo -solarpowerlog -solfege -solid-pop3d -sombok -sonata -sonic -sonic-visualiser -sooperlooper -sope -soprano -sopwith -soqt -sord -sortmail -sound-juicer -sound-theme-freedesktop -soundconverter -soundkonverter -soundmodem -soundscaperenderer -soundtouch -source-highlight -sox -soya -sp-gxmlcpp -spacearyarya -spacefm -spacenavd -spacezero -spamass-milter -spamassassin -spamprobe -spark -sparsehash -sparskit -spass -spatialindex -spatialite -spatialite-gui -spatialite-tools -spawn-fcgi -spd -spectemu -spectools -spectrwm -speech-dispatcher -speech-tools -speechd-up -speedcrunch -speex -spell -spellutils -spew -spherepack -sphinxbase -spice -spice-gtk -spice-vdagent -spice-xpi -spim -spinner -spiped -splash -splat -splay -spline -spooles -spotlighter -spout -spring -springlobby -sqcwa -sqlalchemy -sqlcipher -sqlheavy -sqlite -sqlite3 -sqlitebrowser -sqliteodbc -sqsh -squeak-plugins-scratch -squeezelite -squid3 -squidguard -squidview -squishyball -squizz -sra-sdk -sratom -src2tex -srecord -sredird -srf -srg -srm-ifce -srptools -srtp -ssdeep -ssed -ssh-askpass-fullscreen -ssh-askpass -ssh-contact -sshfs-fuse -sshguard -sshm -sshpass -ssldump -sslh -sslscan -sslsniff -ssm -ssmping -ssmtp -sssd -ssss -ssvnc -st -staden-io-lib -stalin -stalonetray -stardata-common -stardict -stardict-tools -starlink-ast -starlink-pal -starplot -startpar -startup-notification -starvoyager -statserial -stax -stdsyslog -steadyflow -steghide -stegsnow -stellarium -step -stfl -stimfit -stk -stm32flash -stoken -stone -stopmotion -storm -stress -stress-ng -stressapptest -stretchplayer -strigi -stringencoders -stterm -stud -stx-btree -styx -subcommander -subnetcalc -subsurface -subtitlecomposer -subtitleeditor -subtle -subunit -subversion -subvertpy -suck -suckless-tools -sucrack -sudo -sudoku -sugar-0.96 -sugar-0.98 -sugar-artwork-0.84 -sugar-artwork-0.88 -sugar-artwork-0.96 -sugar-artwork-0.98 -sugar-base-0.84 -sugar-base-0.88 -sugar-base-0.96 -sugar-base-0.98 -sugar-datastore-0.84 -sugar-datastore-0.88 -sugar-datastore-0.96 -sugar-datastore-0.98 -sugar-toolkit-0.84 -sugar-toolkit-0.88 -sugar-toolkit-0.96 -sugar-toolkit-0.98 -sugar-toolkit-gtk3 -suil -suitesparse -suitesparse-metis -summain -sumo -sundials -sunpinyin -sunxi-tools -sup -super -supercat -supercollider -superiotool -superkaramba -superlu -supermin -supertux -supertuxkart -surf -survex -survival -sushi -svgpart -svrcore -swac-explore -swac-get -swami -swapspace -swath -swe-standard-data -sweep -sweeper -swell-foop -swfmill -swh-lv2 -swh-plugins -swift-im -swig -swig2.0 -swish-e -swisswatch -switchsh -sword -swt-gtk -swt4-gtk -sxid -sxiv -syfi -sylfilter -sylph-searcher -sylpheed -symlinks -symmetrica -sympa -sympow -synaesthesia -synaptic -synce-serial -syncevolution -syncmaildir -synergy -synfig -synfigstudio -synopsis -synthv1 -syrep -syrthes -sysbench -sysdig -sysfsutils -syslog-ng -syslog-ng-incubator -syslog-ocaml -sysnews -sysprof -sysrqd -sysstat -system-config-cluster -system-config-lvm -system-config-printer -system-tools-backends -systemd-shim -systemd-ui -sysvbanner -sysvinit -t-code -t1utils -t2n -t4kcommon -tabble -tabix -tableau-parm -tablix2 -tachyon -tack -taffybar -tagainijisho -tagcoll2 -taggrepper -taglib-extras -taglib -tagtool -tagua -taktuk -tali -talloc -tamil-gtk2im -tamuanova -tangerine -tango -tango-icon-theme -taningia -taopm -tap-plugins -tapecalc -tar -tarantool -tardy -tart -task -task-spooler -tasque -tau -tayga -tbb -tcc -tcd-utils -tcl-fitstcl -tcl-signal -tclcl -tclcurl -tclex -tclgeoip -tclodbc -tclreadline -tclthread -tcltls -tcltrf -tcludp -tclvfs -tclx8.4 -tclxml -tcm -tcos -tcpcopy -tcpcrypt -tcpdump -tcpflow -tcplay -tcpreen -tcpser -tcpslice -tcpspy -tcpstat -tcptrace -tcptraceroute -tcptrack -tcputils -tcpxtract -tcs -tcsh -tdbc -tdbcmysql -tdbcodbc -tdbcpostgres -tdbcsqlite3 -tdc -tdfsb -tdom -tea -tecnoballz -teeworlds -teg -telegnome -telepathy-farstream -telepathy-gabble -telepathy-glib -telepathy-haze -telepathy-idle -telepathy-logger -telepathy-logger-qt -telepathy-mission-control-5 -telepathy-qt -telepathy-rakia -telepathy-salut -tellico -tenace -tenmado -tercpp -terminatorx -terminology -termit -teseq -tesseract -testdisk -tetgen -tetradraw -tetrinet -tetrinetx -tex4ht -texmacs -texstudio -textdraw -texworks -tf -tf5 -tfdocgen -tftp-hpa -tgt -thc-ipv6 -the -thepeg -thermald -theseus -thewidgetfactory -thin -thin-provisioning-tools -thinkfan -threadscope -thrift-compiler -thuban -thunar-archive-plugin -thunar-dropbox-plugin -thunar -thunar-media-tags-plugin -thunar-vcs-plugin -thunar-volman -ticcutils -ticker -tickr -tidy -tifffile -tig -tiger -tilda -tilem -tilp2 -timbl -timblserver -time -timelimit -timemachine -timemon.app -timidity -tin -tina -tinc -tint -tint2 -tintin++ -tinycdb -tinydyndns -tinymux -tinyos-tools -tinyproxy -tinyscheme -tinywm -tinyxml2 -tiptop -tix -tk-html3 -tk-table -tk707 -tkdesk -tkdnd -tkpng -tkrplot -tktray -tktreectrl -tlsdate -tmispell-voikko -tmperamental -tmpreaper -tmux -tnat64 -tnef -tnetstring -tnftp -tntdb -tntnet -tofrodos -togl -toilet -tokyocabinet -tokyocabinet-haskell -tokyotyrant -tolua++ -tolua -tomboy -tomcat-native -tomoyo-tools -topal -tophat -toppler -tor -tora -torcs -toshset -totem-pl-parser -towitoko -tpconfig -tpm-tools -traceroute -trackballs -tracker -trafficserver -transcalc -transcriber -transfermii -transfig -translatoid -transmageddon -transmission-remote-gtk -traverso -trayer -tre -tree-puzzle -treil -trickle -trigger-rally -triggerhappy -trinity -tripwire -troffcvt -trophy -trousers -trueprint -trustedqsl -tsdecrypt -tse3 -tseries -tslib -tsocks -tstools -ttf2ufm -ttfautohint -tth -tthsum -tty-clock -ttyload -ttylog -ttyrec -ttysnoop -tua -tulip -tumbler -turnserver -tuxcmd-modules -tuxfootball -tuxguitar -tuxmath -tuxonice-userui -tuxpaint -tuxpuck -tuxtype -tv-fonts -tvoe -tvtime -twclock -tweak -twidge -twig -twisted -twm -twofish -twoftpd -twolame -tworld -twpsk -txt2pdbdoc -tzc -u-boot -u1db -u3-tool -uanytun -uapevent -uaputl -ubuntulooks -ucarp -ucblogo -ucimf-chewing -ucimf-openvanilla -ucimf-sunpinyin -ucl -uclmmbase -ucommon -ucpp -ucspi-proxy -ucto -udev -udevil -udftools -udisks-glue -udisks -udisks2 -udj-desktop-client -udns -udo -udpcast -udpkg -udptunnel -udunits -ufc -ufiformat -ufraw -uget -uhd -uhttpmock -uhub -ui-auto -ui-gxmlcpp -ui-utilcpp -uid-wrapper -uim-chewing -uim -uisp -ulogd2 -ultracopier -umbrello -uml-utilities -unac -unace -unadf -unagi -unalz -unar -unclutter -undbx -undertaker -unhide -unhtml -uni2ascii -unicap -unicode-screensaver -unicorn -unifdef -unifont -unison2.32.52 -units -uniutils -unixcw -unixodbc -unixodbc-gui-qt -unmass -unmo3 -unpaper -unrar-free -unrtf -unscd -unshield -unsort -untex -unworkable -unyaffs -unzip -upnp-router-control -uprofiler -upslug2 -uptimed -uqwk -urdfdom -urdfdom-headers -urfkill -urg -uriparser -urjtag -urlview -urwid -usb-modeswitch -usbmuxd -usbprog -usbrelay -usbtc08-python -usbutils -usbview -userinfo -usermode -userv -ussp-push -ustr -uswsusp -utalk -utfout -util-linux -utopia-documents -uuagc -uucp -uucpsend -uudeview -uvccapture -uw-imap -uwsgi -uzbl -v4l2ucp -v86d -vacation -vagalume -vala-0.16 -vala-0.24 -vala-0.26 -vala-dbus-binding-tool -vala-terminal -valabind -valadoc -valgrind -validns -valknut -vamp-plugin-sdk -vamps -vanessa-adt -vanessa-logger -vanessa-socket -varconf -varmon -varnish -vbetool -vbindiff -vblade -vboot-utils -vbrfix -vcdimager -vcftools -vde2 -vdesk -vdetelweb -vdk2 -vdmfec -vdpau-video -vdr -vdr-plugin-streamdev -vdr-plugin-xineliboutput -vectoroids -velvet -vera++ -verbiste -verilator -verse -veusz -vflib3 -vgabios -vgrabbj -vidalia -videogen -videotrans -viennacl -viewmol -viewnior -vifm -vigor -viking -vile -vilistextum -vim-youcompleteme -vinagre -vino -virt-viewer -virt-what -virtualjaguar -vish -visionegg -visitors -visp -visualboyadvance -visualvm -vite -viva -vkeybd -vlan -vlc -vlfeat -vlock -vm -vmfs-tools -vmpk -vncsnapshot -vnstat -vo-aacenc -vo-amrwbenc -vobcopy -vokoscreen -volpack -volumeicon -voms -voms-mysql-plugin -vorbis-tools -vorbisgain -votca-csg -votca-tools -vowpal-wabbit -vpb-driver -vpcs -vpnc -vramsteg -vrfy -vrrpd -vsdump -vstream-client -vtable-dumper -vte -vte2.91 -vte3 -vtgrab -vtk-dicom -vtprint -vttest -vtun -vxi -vxl -vzctl -vzquota -w3cam -w9wm -wacomtablet -waffle -warmux -warzone2100 -watchcatd -watchdog -wavbreaker -wavemon -wavpack -wavtool-pl -wayland -wayv -wbar -wbox -wbxml2 -wcd -wcslib-contrib -wcslib -wdiff -webalizer -webauth -webcit -webdis -webdruid -webfs -webkit-image -webkit2gtk -webkit2pdf -webkitgtk -webkitkde -weborf -webrtc-audio-processing -websocketpp -websockify -weechat -weex -welcome2l -weplab -wesnoth-1.10 -wesnoth-1.11 -west-chamber -wfmath -wfrench -whichman -whitedb -whois -whowatch -why -whysynth -wicd-kde -wide-dhcpv6 -widelands -wiggle -wiipdf -wikidiff2 -wildmidi -wily -wims -windowlab -wings3d -wininfo -winwrangler -wipe -wireless-tools -wise -witty -wizznic -wmacpi -wmail -wmaker -wmaloader -wmauda -wmbattery -wmbubble -wmbutton -wmcalclock -wmclock -wmclockmon -wmcpu -wmcpuload -wmctrl -wmdate -wmdiskmon -wmf -wmforecast -wmforkplop -wmfrog -wmhdplop -wmifinfo -wmifs -wmitime -wmix -wml -wmlongrun -wmmatrix -wmmemload -wmmon -wmmoonclock -wmnd -wmnet -wmnut -wmpinboard -wmppp.app -wmpuzzle -wmrack -wmressel -wmshutdown -wmsystemtray -wmtemp -wmtime -wmtv -wmwave -wmweather+ -wmweather -wmwork -wmxmms2 -wmxres -wnn6-sdk -woff-tools -wordgrinder -wordnet -wordplay -wordwarvi -worker -worklog -workrave -wp2x -wpa -wput -wraplinux -wrapsrv -wreport -writerperfect -wsjt -wsjtx -wsynth-dssi -wuzzah -wv -wv2 -wvstreams -wwl -wxmaxima -wxsqlite3 -wxsvg -wxwidgets2.8 -wxwidgets3.0 -wysihtml -wzip -x11-apps -x11-session-utils -x11-touchscreen-calibrator -x11-utils -x11-xfs-utils -x11-xkb-utils -x11-xserver-utils -x11proto-bigreqs -x11proto-composite -x11proto-core -x11proto-damage -x11proto-dmx -x11proto-dri2 -x11proto-dri3 -x11proto-fixes -x11proto-fonts -x11proto-gl -x11proto-input -x11proto-kb -x11proto-present -x11proto-randr -x11proto-record -x11proto-render -x11proto-resource -x11proto-scrnsaver -x11proto-video -x11proto-xcmisc -x11proto-xext -x11proto-xf86dga -x11proto-xf86dri -x11proto-xf86vidmode -x11proto-xinerama -x11vnc -x2 -x264 -x2vnc -x2x -x42-plugins -x52pro -x86info -xa -xabacus -xacobeo -xalan -xaos -xapian-bindings -xapian-core -xapian-omega -xarchiver -xarclock -xastir -xauth -xautolock -xautomation -xawtv -xbacklight -xbae -xbase64 -xbattbar -xbill -xbindkeys-config -xbindkeys -xbitmaps -xbmc-pvr-addons -xbomb -xbs -xbubble -xbuffy -xcache -xcalib -xcape -xcb -xcb-util-cursor -xcb-util -xcb-util-image -xcb-util-keysyms -xcb-util-renderutil -xcb-util-wm -xcfa -xcftools -xchain -xchat-gnome -xchat -xchat-guile -xchm -xcircuit -xclip -xcolmix -xcolors -xcolorsel -xcompmgr -xcowsay -xcrysden -xcursor-themes -xdaliclock -xdebug -xdelta -xdelta3 -xdemineur -xdemorse -xdesktopwaves -xdffileio -xdg-user-dirs -xdg-user-dirs-gtk -xdiskusage -xdm -xdmf -xdms -xdotool -xdu -xdx -xemacs21 -xerces-c -xf86-input-wacom -xf86-input-xwiimote -xf86-video-glamo -xfaces -xfburn -xfce4-appfinder -xfce4-battery-plugin -xfce4-cellmodem-plugin -xfce4-clipman-plugin -xfce4-cpufreq-plugin -xfce4-cpugraph-plugin -xfce4-datetime-plugin -xfce4-dev-tools -xfce4-dict -xfce4-diskperf-plugin -xfce4-fsguard-plugin -xfce4-genmon-plugin -xfce4-hdaps -xfce4-indicator-plugin -xfce4-linelight-plugin -xfce4-mailwatch-plugin -xfce4-messenger-plugin -xfce4-mixer -xfce4-mount-plugin -xfce4-mpc-plugin -xfce4-netload-plugin -xfce4-notes-plugin -xfce4-notifyd -xfce4-panel -xfce4-places-plugin -xfce4-power-manager -xfce4-quicklauncher-plugin -xfce4-radio-plugin -xfce4-screenshooter -xfce4-sensors-plugin -xfce4-session -xfce4-settings -xfce4-smartbookmark-plugin -xfce4-systemload-plugin -xfce4-taskmanager -xfce4-terminal -xfce4-timer-plugin -xfce4-verve-plugin -xfce4-volumed -xfce4-wavelan-plugin -xfce4-weather-plugin -xfce4-whiskermenu-plugin -xfce4-wmdock-plugin -xfce4-xkb-plugin -xfconf -xfdesktop4 -xfe -xfig -xfireworks -xfishtank -xflip -xfoil -xfonts-100dpi -xfonts-75dpi -xfonts-base -xfonts-cyrillic -xfonts-encodings -xfonts-scalable -xfonts-utils -xfpt -xfrisk -xfstt -xfswitch-plugin -xft -xfwm4 -xgalaga -xgks -xhprof -xindy -xine-plugin -xine-ui -xinit -xinput-calibrator -xinput -xinv3d -xiphos -xipmsg -xiterm+thai -xjokes -xjump -xkbind -xkbset -xkeyboard-config -xkeycaps -xl2tpd -xlassie -xlbiff -xless -xletters -xli -xmahjongg -xmakemol -xmbmon -xmds -xmedcon -xmhtml -xmille -xmix -xml-security-c -xml2 -xmlcopyeditor -xmldiff -xmlindent -xmlroff -xmlrpc-epi -xmlsec1 -xmlstarlet -xmlto -xmltooling -xmms2 -xmms2-scrobbler -xmobar -xmonad-contrib -xmonad -xmotd -xmoto -xmount -xmountains -xmp -xmpi -xnbd -xnec2c -xnecview -xnee -xneur -xombrero -xonix -xoo -xorg-docs -xorg -xorg-sgml-doctools -xosd -xotcl -xpa -xpad -xpat2 -xpenguins -xphoon -xpilot-ng -xplanet -xplc -xplot -xplot-xplot.org -xpra -xprintidle -xprobe -xpuzzles -xpyb -xqf -xqilla -xracer -xresprobe -xrestop -xringd -xrootconsole -xscavenger -xscorch -xsd -xsel -xsensors -xserver-xorg-input-acecad -xserver-xorg-input-aiptek -xserver-xorg-input-elographics-goto-binaries.ta..> -xserver-xorg-input-evdev -xserver-xorg-input-joystick -xserver-xorg-input-keyboard -xserver-xorg-input-mouse -xserver-xorg-input-mutouch -xserver-xorg-input-synaptics -xserver-xorg-input-vmmouse -xserver-xorg-input-void -xserver-xorg-video-ati -xserver-xorg-video-cirrus -xserver-xorg-video-dummy -xserver-xorg-video-fbdev -xserver-xorg-video-glide -xserver-xorg-video-intel -xserver-xorg-video-ivtvdev -xserver-xorg-video-mach64 -xserver-xorg-video-mga -xserver-xorg-video-modesetting-goto-binaries.ta..> -xserver-xorg-video-neomagic -xserver-xorg-video-nouveau -xserver-xorg-video-openchrome-goto-binaries.tar..> -xserver-xorg-video-qxl -xserver-xorg-video-r128 -xserver-xorg-video-savage -xserver-xorg-video-siliconmotion-goto-binaries...> -xserver-xorg-video-tdfx -xserver-xorg-video-trident -xserver-xorg-video-vesa -xsettings-kde -xshisen -xshogi -xskat -xsok -xsol -xsoldier -xsp -xss-lock -xstarfish -xstow -xsunpinyin -xsynth-dssi -xsysinfo -xtables-addons -xtail -xteddy -xtell -xterm -xtermcontrol -xtermset -xtrace -xtrans -xtrlock -xtron -xtrs -xttitle -xtv -xutils-dev -xvba-video -xvidcore -xvier -xvkbd -xvt -xwatch -xwax -xwelltris -xwiimote -xwit -xwpe -xwrits -xxdiff -xxkb -xxxterm -xye -xylib -xz-utils -xzgv -xzip -xzoom -yacas -yacpi -yade -yafc -yagf -yagiuda -yajl -yakuake -yamdi -yaml-cpp -yaml-cpp0.3 -yapet -yara -yash -yasr -yauap -yaws -yc-el -ydpdict -yeahconsole -yelp -yelp-xsl -ygl -yi -yics -yiyantang -ykclient -yodl -yorick-av -yorick-cubeview -yorick-curses -yorick -yorick-gy -yorick-hdf5 -yorick-imutil -yorick-ml4 -yorick-mpeg -yorick-optimpack -yorick-yeti -yorick-ygsl -yorick-ynfft -yorick-z -yoshimi -ytree -yubico-pam -yubikey-personalization -yubikey-server-c -yubiserver -yudit -yum-metadata-parser -z80asm -z80dasm -z80ex -z8530-utils2 -z88 -zabbix -zalign -zam-plugins -zanshin -zatacka -zathura-extras -zathura -zaz -zbackup -zeitgeist -zenity -zenlisp -zeroc-icee-translators -zerofree -zeroinstall-injector -zeromq -zeromq3 -zfec -zh-autoconvert -zimlib -zimpl -zinnia -zip -zipios++ -zlib -zlibc -zmakebas -zmap -zodb -zomg -zoo -zookeeper -zope.hookable -zope.i18nmessageid -zope.interface -zope.proxy -zope.security -zope2.13 -zopfli -zpspell -zsh -zssh -zsync -zthreads -zurl -zyn -zynaddsubfx -zypper -zziplib -zzuf diff --git a/src/musketeer/experiments/goto-runner/pkgs-qm-paper b/src/musketeer/experiments/goto-runner/pkgs-qm-paper deleted file mode 100644 index 429e961590a..00000000000 --- a/src/musketeer/experiments/goto-runner/pkgs-qm-paper +++ /dev/null @@ -1,10 +0,0 @@ -blktrace -dnshistory -ghostess -lingot -memcached -proxsmtp -ptunnel -see -timemachine -weborf diff --git a/src/musketeer/experiments/goto-runner/readme.txt b/src/musketeer/experiments/goto-runner/readme.txt deleted file mode 100644 index 486e9c2e3a5..00000000000 --- a/src/musketeer/experiments/goto-runner/readme.txt +++ /dev/null @@ -1,18 +0,0 @@ - -Debian experiments -================== - -The Debian experiments can be run with the script goto-runner.sh. The script -runs a goto binary analysis tool on the goto binaries contained in archives held -at a certain URL. - -The script reads a configuration file .config, with being -the hostname of the machine the script is run on (as can be retrieved by the -command 'hostname'). Various options can be configured in this file, such as the -URL from which to download packages, the tools to use, or the analysis timeout. -For an example configuration file see dkr11.cs.ox.ac.uk.config. - -The output of successful runs is put into a directory 'success', and the output -of erroneous runs is put into a directory 'failure'. An erroneous run means that -the tool crashed or a timeout occured. - diff --git a/src/musketeer/fence-insertion/fi.py b/src/musketeer/fence-insertion/fi.py deleted file mode 100644 index b0cf1539c56..00000000000 --- a/src/musketeer/fence-insertion/fi.py +++ /dev/null @@ -1,1061 +0,0 @@ -#!/usr/bin/env python3 - -# (1) Wrap if, while, etc. statements in curly braces. -# (2) Insert fences; backup file as *.fibak first if it does not exist yet - -# Transformations preserve line numbers. - -# ------------------------------------------------------------------------------ -# Current musketeer input format (SVN rev >= 4816) - -# Input format example (musketeer output; 9 cols): -# fence|peterson.c|thr1|6|c::turn|peterson.c|thr1|7|c::flag2 - -# Input format example (for e.g. pensieve output; 5 cols): -# fence|peterson.c|5|c::flag1|0 - -# ------------------------------------------------------------------------------ -# Old musketeer input formats: - -# Input format example (for regular musketeer output; fixed version; 9 cols): -# fence|test.c|test|5|c::exp|test.c|test|5|c::exp - -# Input format example (for regular musketeer output; async version; -# unsupported; 11 cols): -# fence|test.c|test|5|exp|c::exp|test.c|test|5|exp|c::exp - -# Input format example (for regular musketeer output; with types; unsupported; -# 13 cols): -# dp|pfscan.c|matchfun|311|line_f|c::line_f|signed_int|f.c|fun|31|*mutex|c::p_l| -# (notice that there's no type for the second access) - -# Input format example (for e.g. allshared output; 5 cols): -# fence|assoc.c|125|old_hashtable|Write - -# ------------------------------------------------------------------------------ -# Implementation notes - -# - The newline that terminates a line is considered part of the line. -# - Two ways of specifying lines: line number (1-based), or global index of -# character (0-based). -# - Conceptually, the C file is analyzed by moving around a cursor that points -# at characters in the input file. Various functions are provided to move the -# cursor (e.g. ln_toe() moves the cursor to the end of the current line). -# - Common argument names: pos (cursor position), s (string containing source -# file) -# - Assumption: Input is a well-formed C file. -# - Whitespace (e.g. for eat() and puke()): space, tab, newline. -# - Functions that take ranges of cursor positions treat both as inclusive. -# - Most important top-level functions: insert_fences(), place_fence(), -# place_dp(). -# - Two types of temporary variables: pull variable, connection variable. For -# the pull variable we need the correct type of the expression. - -# ------------------------------------------------------------------------------ - -# Todo: -# - Comment handling, e.g. comments at end of line (priority low) - -# ------------------------------------------------------------------------------ - -import re -import sys -import shutil -import os - -# ------------------------------------------------------------------------------ -# Fence map (for ARM and dp only used when dependency insertion is not possible) - -fm_x86 = { 'fence': 'mfence' } -fm_arm = { 'fence': 'dsb', 'cf': 'isb', 'dp': 'dsb' } - -# ------------------------------------------------------------------------------ -# Configuration parameters set via command line arguments. - -handle_dp = False -musk_form = True -fm = fm_x86 - -# ------------------------------------------------------------------------------ -# Indices of items in lines in results.txt in musk format -# -1: gets last element from list - -im_fence = 0 - -im_src_file1 = 1 -im_func_name1 = 2 -im_line1 = 3 -im_exp1 = -1 -im_cprover_exp1 = -1 -im_type1 = -1 - -im_src_file2 = 5 -im_func_name2 = 6 -im_line2 = 7 -im_exp2 = -1 -im_cprover_exp2 = -1 -im_type2 = -1 - -# ------------------------------------------------------------------------------ -# Indices of items in lines in results.txt in other format - -io_fence = 0 -io_src_file = 1 -io_line = 2 - -# ------------------------------------------------------------------------------ - -# Enum for possible fence positions -fence_first, fence_second = range(2) - -# Config for fence position (where to insert into the code) -fence_pos = fence_first - -# ------------------------------------------------------------------------------ - -def print_err(s): - print(s, file = sys.stderr) - -def assert_msg(c, msg): - if not c: - print_err(msg) - assert(False) - -def usage(): - print_err("Usage:") - print_err(" fi.py (x86|arm) (fence|dp) (musk|other) ") - print_err("") - print_err(" 1: Architecture") - print_err(" 2: Select if fence or real dependency should be used for dp's") - print_err(" 3: Specify input format") - print_err(" 4: Output file of musketeer (results.txt)") - -# ------------------------------------------------------------------------------ -# Functions to delete, replace, and insert symbols from/in a string - -### Insert string at position in string -# :pos is exclusive, pos: is inclusive -def insert(s, pos, c): - return s[:pos] + c + s[pos:] - -### Delete string between pos1 (inclusive) and pos2 (exclusive) -def delete(s, pos1, pos2): - assert(pos1 <= pos2) - return s[:pos1] + s[pos2:] - -### Get line within string (including newline at end) -# pos: position within a line -def extract_ln(s, pos): - start = ln_tos(s, pos) - end = ln_toe(s, pos) - ss = s[start:end+1] - return ss - -### Replace regex on line with repl (regex must match on line) -# Current limitation: only string replacement -def replace_ln(s, pos, regex, repl): - start = ln_tos(s, pos) - end = ln_toe(s, pos) - ln = extract_ln(s, pos) - #lnt = re.sub(regex, ln, repl) - lnt = ln.replace(regex, repl, 1) - assert(ln != lnt); - s = delete(s, start, end + 1) - s = insert(s, start, lnt) - return s - -### Insert curly braces at specified positions -def wrap(s, pos1, pos2): - assert(pos1 < pos2) - assert(pos2 < len(s)) - s = insert(s, '{', pos1) - s = insert(s, '}', pos2 + 1) - return s - -### Insert items at given positions of string (l is a list of pairs) -# Items to insert must be single characters -def insert_items(s, l): - l.sort() - cnt = 0 - for el in l: - s = insert(s, el[0] + cnt, el[1]) - cnt += 1 - return s - -# ------------------------------------------------------------------------------ -# Functions to move cursor to start or end of specific lines. - -### Goto start of line of a certain number -# return value: index of first char on line, -1 if line does not exist -def before_line(s, n): - assert(n >= 1) - cnt = 1 - for i in range(0, len(s)): - if cnt == n: - return i - if s[i] == '\n': - cnt += 1 - return -1 - -### Goto end of line of a certain number -# return value: index of newline at end of line -def after_line(s, n): - return before_line(s, n + 1) - 1 - -# ------------------------------------------------------------------------------ -# Functions to move cursor to start or end of line, given a position. - -### Go from end to start of line -def ln_etos(s, pos): - assert(s[pos] == '\n') - return ln_tos(s, pos) - -### Go from start to end of line -def ln_stoe(s, pos): - assert(s[pos] != '\n') - return ln_toe(s, pos) - -### Go to start of line -def ln_tos(s, pos): - assert(pos > 0) - if s[pos] == '\n': - pos -= 1 - - while pos > 0 and s[pos] != '\n': - pos -= 1 - - if s[pos] == '\n': - pos += 1 - assert(s[pos] != '\n') - return pos - assert(False) - -### Go to end of line -def ln_toe(s, pos): - assert(pos > 0) - l = len(s) - while pos < l and s[pos] != '\n': - pos += 1 - - if s[pos] == '\n': - return pos - assert(False) - -# ------------------------------------------------------------------------------ -# Functions to skip over text items. It is an error to skip to the end of the -# string. - -def next_item(s, pos, item): - l = len(s) - assert(pos < l) - ret = s.find(item, pos) - - # Debug - if (ret == -1): - assert(s[pos] == '\n') - print('Debug: string for next_item:') - print(s[pos:]) - - return ret - -### Get next semicolon at or after pos -# return value: index of next semicolon, or -1 -def next_semicolon(s, pos): - return next_item(s, pos, ';') - -### Skip over nested items (return pos of next character), forwards or backwards -# s: file as string -# a: left item -# b: right item -# d: direction(1: forward, -1: backward) -# pos: points at first item (a for forward, b for backward) -def skip_nested(s, a, b, d, pos): - l = len(s) - assert(pos < l) - assert(pos >= 0) - assert(d == -1 or d == 1); - assert(d != 1 or s[pos] == a); - assert(d != -1 or s[pos] == b); - - cnt = d - pos += d - while True: - assert(pos >= 0) - assert(pos < l) - if s[pos] == a: - cnt += 1 - elif s[pos] == b: - cnt -= 1 - - pos += d - - if cnt == 0: - assert(pos >= 0) - assert(pos < l) - return pos - - assert(False) - -def skip_p(s, pos): - return skip_nested(s, '(', ')', 1, pos) - -def skip_b(s, pos): - return skip_nested(s, '{', '}', 1, pos) - -def skip_p_b(s, pos): - return skip_nested(s, '(', ')', -1, pos) - -def skip_b_b(s, pos): - return skip_nested(s, '{', '}', -1, pos) - -# Return position of current or next non-whitespace character -def eat(s, pos): - l = len(s) - assert(pos < l) - while (pos < l): - c = s[pos] - if c != ' ' and c != '\t' and c != '\n': - return pos - pos += 1 - assert(False) - return pos - -# Return position of current or previous non-whitespace character. -def puke(s, pos): - l = len(s) - assert(pos < l) - while (pos < l): - c = s[pos] - if c != ' ' and c != '\t' and c != '\n': - return pos - pos -= 1 - assert(False) - return pos - -# Return position of current or previous non-whitespace character (newline is -# not considered a whitespace character here). -def puke2(s, pos): - l = len(s) - assert(pos < l) - while (pos < l): - c = s[pos] - if c != ' ' and c != '\t': - return pos - pos -= 1 - assert(False) - return pos - -### Skip over statement (including parentheses). -def skip_stat(s, pos): - l = len(s) - assert(pos < l) - # Skip keyword - if (s[pos:pos+5] == 'while'): - pos += 5 - elif (s[pos:pos+2] == 'if'): - pos += 2 - elif (s[pos:pos+3] == 'for'): - pos += 3 - elif (s[pos:pos+6] == 'switch'): - pos += 6 - else: - return -1 - pos = eat(s, pos) - if (s[pos] != '('): - # Spurious statement (e.g. in comment or string) - return -1 - pos = skip_p(s, pos) - pos = eat(s, pos) - return pos - -# ------------------------------------------------------------------------------ -# Predicates - -# Are the nested constructions with symbols a, b balanced between pos1 and pos2? -def is_balanced(s, a, b, pos1, pos2): - assert(pos1 < pos2) - assert(pos2 < len(s)) - cnt = 0 - for i in range(pos1, pos2+1): - if s[i] == a: - cnt += 1 - elif s[i] == b: - cnt -= 1 - if cnt == 0: - return True - return False - -def is_balanced_curly(s, pos1, pos2): - return is_balanced(s, '{', '}', pos1, pos2) - -# Can pos2 see variables declared at pos1? (counting braces between is not -# sufficient as the visibility can be killed in between) -def from_to_scope(s, pos1, pos2): - l = len(s) - assert(pos1 >= 0) - assert(pos1 < pos2) - assert(pos2 < l) - cnt = 0 - for i in range(pos1, pos2 + 1): - if s[i] == '{': - cnt += 1 - elif s[i] == '}': - cnt -= 1 - if cnt == -1: - return False - return True - -### Check if string ln contains string s -def contains(ln, s): - ret = ln.find(s, 0) - if ret != -1: - return True - return False - -### Check if string ln contains string s, and s is delimited by special chars. -# A string at the beginning or end of line is delimited by definition. -def contains_delim(ln, s): - l = len(s) - ret = ln.find(s, 0) - if ret != -1: - if ret > 0 and ret + l < len(ln): - return not ln[ret-1].isalnum() and not ln[ret+l].isalnum() - return False - -### Check if line has a statement keyword like if, while, ... -def contains_stat(ln): - b = contains_delim(ln, "if") - b = b or contains_delim(ln, "while") - b = b or contains_delim(ln, "for") - b = b or contains_delim(ln, "do") - b = b or contains_delim(ln, "switch") - b = b or contains_delim(ln, "case") - return b - -### Check if string contains carriage returns -def check(s): - mo = re.search('\r', s) - if mo == None: - return True - return False - -def is_stat_delim(c): - return c == ';' or c == '{' or c == '}' - -# ------------------------------------------------------------------------------ -# Fix braces in string - -### Fix statements other than cases -# s: whole source -def fix(s): - pat = '([;}\t\n ](if|while|for))|(do[\t\n ]*\{)' - - s_prev = s - - # Set of starting locations of whiles that belong to previous do's - forbidden = set() - - while True: - locs = [] - it = re.finditer(pat, s) - - # For all match objects - for mo in it: - pos = mo.start() - - # Ignore lines that are defines or comments (check for not equal to \n to - # avoid skipping to the previous line) - if s[pos] != '\n': - px = ln_tos(s, pos) - px = eat(s, px) - if s[px] == '#': - continue - if s[px:px+2] == '//': - continue - if s[px:px+2] == '/*': - continue - - if s[pos:pos+2] == 'do': - pos += 2 - pos = eat(s, pos) - assert(s[pos] == '{') - pos = skip_b(s, pos) - pos = eat(s, pos) - assert(s[pos:pos+5] == 'while') - forbidden.add(pos) - continue - - pos += 1 - - # While that belongs to a previous do - if pos in forbidden: - continue - - pos = skip_stat(s, pos) - - # Spurious statement - if pos == -1: - continue - - if s[pos] == '{': - # Already wrapped, nothing to do - pass - else: - ppos = puke(s, pos - 1) - ppos += 1 - # Try to skip statement below - npos = skip_stat(s, pos) - if npos == -1: - # Statement ending in semicolon - end = next_semicolon(s, pos) - assert(end > 0) - locs.append((ppos, '{')) - locs.append((end + 1, '}')) - elif s[npos] == '{': - # Wrapped statement - end = skip_b(s, npos) - locs.append((ppos, '{')) - locs.append((end, '}')) - - s = insert_items(s, locs) - if (s == s_prev): - break - s_prev = s - - return s - -### Wrap cases in switch statement in curly braces -# s: whole source -def fix_case(s): - pat = '([\t ]((case[^:\n]+\:)|(default\:))|(switch[ \t]*\())' - it = re.finditer(pat, s) - locs = [] - prev_end = -1 - - for mo in it: - pos = mo.start() - if s[pos:pos+6] == 'switch': - prev_end = -1 - else: - start = mo.start() - if prev_end != -1 and is_balanced_curly(s, prev_end, start): - locs.append((prev_end, '{')) - locs.append((start, '}')) - prev_end = mo.end() - - s = insert_items(s, locs) - return s - -# ------------------------------------------------------------------------------ -# Dependency handling (ARM only) - -### Connect a read via a dependency to a previous read -# s: file as string -# pos: points at newline at end of line -# cv: name of the connecting variable -# read_exp: expression that corresponds to the read -# return value: -# 1: true if connected, false otherwise -# 2: transformed string -def connect_rd_dp(s, pos, cv, read_exp): - repl = "*(&(" + read_exp + ")" + cv + ")" - s = replace_ln(s, pos, read_exp, repl) - return s - -# Connect a write via a dependency to a previous read -# s: file as string -# pos: points at newline at end of line -# cv: name of the connecting variable -# return value: -# 1: true if connected, false otherwise -# 2: transformed string -def connect_wrt_dp(s, pos, cv): - # Find pattern " = " (matches practically all writes occuring in a C program) - pos -= 1 - while pos >= 0 and s[pos] != '\n': - if s[pos] == '=' and s[pos-1] == ' ' and s[pos+1] == ' ': - s = insert(s, pos + 2, cv + " + ") - return True, s - pos -= 1 - return False, s - -# ------------------------------------------------------------------------------ -# Temporary variable names - -### Get name of next temporary variable -tmp_cnt = 0 -def next_tmp(): - global tmp_cnt - tmp_cnt += 1 - vn = 'tmp_xjsdfk_' + str(tmp_cnt) - return vn - -### Get name of next pull temporary variable -tmp_cnt_pull = 0 -def next_tmp_pull(): - global tmp_cnt_pull - tmp_cnt_pull += 1 - vn = 'tmp_pull_' + str(tmp_cnt_pull) - return vn - -### Get name of next connection temporary variable -tmp_cnt_con = 0 -def next_tmp_con(): - global tmp_cnt_con - tmp_cnt_con += 1 - vn = 'tmp_con_' + str(tmp_cnt_con) - return vn - -# ------------------------------------------------------------------------------ - -### Insert given statement at given position (for inserting full fences). -# s: file as string -# pos: points at newline character at end of line -# asm: asm statement to insert -# line_cnt: line in results.txt -placement_cnt = 0 -def place_fence(s, pos, asm, line_cnt): - assert(s[pos] == '\n') - - global placement_cnt - placement_cnt += 1 - pc = str(placement_cnt) - - # Check if it's an if or while at the end of the line - pn = puke(s, pos) - if s[pn] == '{': - pn = puke(s, pn - 1) - if s[pn] == ')': - pb = skip_p_b(s, pn) + 1 - assert(s[pb] == '(') - # Condition including parentheses - cond = s[pb:pn+1] - p = puke(s, pb - 1) - if s[p-1:p+1] == 'if': - px = puke(s, p-2) - if re.search('[;}\t\n ]', s[p-2]) != None and s[px-3:px+1] != 'else': - # We have found a suitable if - tmp = next_tmp() - s = delete(s, pb + 1, pn) - s = insert(s, pb + 1, tmp) - p -= 1 - s = insert(s, p, 'long ' + tmp + ' = (long)' + cond + ';' + asm) - print('Placing fence ' + line_cnt + ' with rule 1') - return s - elif s[p-4:p+1] == 'while': - if re.search('[;}\t\n ]', s[p-5]) != None: - - tmp = next_tmp() - pulled = tmp + ' = (long)' + cond + ';' + asm - - # Statement at end of while loop - idx = next_item(s, p, '{') - assert(s[idx] == '{') - idx = skip_b(s, idx) - idx -= 1 - assert(s[idx] == '}') - s = insert(s, idx, pulled) - - pulled = 'long ' + pulled - s = delete(s, pb + 1, pn) - s = insert(s, pb + 1, tmp) - p -= 4 - s = insert(s, p, pulled) - print('Placing fence ' + line_cnt + ' with rule 2') - return s - - # Try to place on same line (at the end) - pn = puke(s, pos) - while s[pn] == '}': - pn = puke(s, pn - 1) - c = s[pn] - if c == ';' or c == '{': - s = insert(s, pn + 1, asm) - print('Placing fence ' + line_cnt + ' with rule 3') - return s - - # Try to place on next line (at the beginning) - pn = eat(s, pos) - c = s[pn] - if c == '{': - s = insert(s, pn + 1, asm) - print('Placing fence ' + line_cnt + ' with rule 4') - return s - - print('Ignoring fence ' + line_cnt) - return s - -# ------------------------------------------------------------------------------ - -### Get asm statement connecting a read with a read/write -# inv: in variable -# outv: out variable -def get_connector(inv, outv): - s = "__asm volatile(\"eors %0, %1, %1\" : \"=r\"(" + outv + ") : \"r\"(" + \ - inv + "));" - return s - -### Connect an expression expr via connection variable cv -# Works for both read and write targets -# s: -# pos: starting index of the expression -# cv: connection variable -# expr: original expression -def connect_dp(s, pos, cv, expr): - repl = "(*(&(" + expr + ") + " + cv + "))" - s = replace_ln(s, pos, expr, repl) - return s - -### Place the asm connection statement -# s: -# idx: index of the second expression belonging to the dependency -# ps: index of the start of the line -# asm_st: asm statement to place -def place_asm_st(s, idx, ps, asm_st): - assert(idx > ps) - pt = puke2(s, idx-1) - tc = s[pt] - if is_stat_delim(tc): - # Place immediately before the expression - s = insert(s, pt+1, asm_st) - return s - else: - pt = puke(s, ps-1) - tc = s[pt] - if is_stat_delim(tc): - # Place at start of line - assert(s[ps] != '\n') - s = insert(s, ps, asm_st) - return s - else: - # Connector asm statement cannot be placed - return "" - -### Add a dependency between the accesses -# s: file as string -# pos1: points at newline character at end of line of first access -# pos2: points at newline character at end of line of second access -# fst: first expression (read) -# snd: second expression (read or write) -# ty: type of first expression -# line_cnt: corresponding line number in results.txt -def place_dp(s, pos1, pos2, fst, snd, ty, line_cnt): - - if ty == '' or ty == ' ': - return s - - # Strip off c:: from source and target expressions (if any) - if fst[0:3] == 'c::': - fst = fst[3:] - - if snd[0:3] == 'c::': - snd = snd[3:] - - ps1 = ln_etos(s, pos1) - ps2 = ln_etos(s, pos2) - assert(ps1 != '\n') - assert(ps2 != '\n') - - ln1 = extract_ln(s, pos1) - ln2 = extract_ln(s, pos2) - - # Check if expressions exist on line (exact matches) - if not contains(ln1, fst): - print('dp ' + line_cnt + ', first expression not found') - return s - if not contains(ln2, snd): - print('dp ' + line_cnt + ', second expression not found') - return s - - # Get starting indices of expressions in source file - idx1 = s.find(fst, ps1) - idx2 = s.find(snd, ps2) - assert(idx1 != -1) - assert(idx2 != -1) - len1 = len(fst) - len2 = len(snd) - - if not from_to_scope(s, idx1, idx2): - print('dp ' + line_cnt + ', target out of scope') - return s - - # At this point, we're pretty confident that it's possible to insert the dep - # :-) - - # Handle source of dependency - stat = contains_stat(ln1) - if stat: - # Source line contains a complicated statement (if, while, for, do, case, - # switch) - print('Inserting dependency with complicated source, ' + line_cnt) - - # Handle target of dependency - sn = connect_dp(s, idx2, "0", snd) - assert(len(sn) > 0) - - # Handle connector asm statement - asm_st = '__asm volatile("":::"memory");' - sn = place_asm_st(sn, idx2, ps2, asm_st) - if sn == '': - return s - else: - # Source line is simple - print('Inserting dependency with simple source, ' + line_cnt) - - # Pull and connection variables - pv = next_tmp_pull() - con = next_tmp_con() - - # Handle target of dependency - sn = connect_dp(s, idx2, con, snd) - assert(len(sn) > 0) - - # Handle connector asm statement - asm_st = get_connector(pv, con) - sn = place_asm_st(sn, idx2, ps2, asm_st) - if sn == '': - return s - - # Transform line to pulled version - sn = delete(sn, idx1, idx1 + len1) - sn = insert(sn, idx1, '(' + pv + ')') - con_and_pull = 'int ' + con + ' = 0; ' + ty + ' ' + pv + ' = ' + fst + ';' - while True: - idx1 -= 1 - c = sn[idx1] - if c == ';' or c == '{' or c == '}' or c == '\n': - sn = insert(sn, idx1 + 1, con_and_pull) - break - - return sn - -# ------------------------------------------------------------------------------ - -# Process each line in results.txt separately; not efficient but OK ... -# fences: list of pairs (with pair = (num, list), a list in a pair represents a -# line in results.txt) -# -# fences: all non-ignored lines in results.txt -def insert_fences(fences): - global musk_form - global handle_dp - global fm - - # For every line in results.txt - for p in fences: - line_cnt = str(p[0]) - l = p[1] - - # Read file into string - assert(im_src_file1 == io_src_file) - fn = l[im_src_file1] - f = open(fn, 'r') - s = f.read() - f.close() - - # Sanity checks - if musk_form: - if l[im_src_file1] != l[im_src_file2]: - print('Ignoring fence/dp ' + line_cnt + ', file mismatch') - continue - if l[im_func_name1] != l[im_func_name2]: - print('Ignoring fence/dp ' + line_cnt + ', func mismatch') - continue - - # Handle inverse line numbers - if musk_form: - if int(l[im_line1]) > int(l[im_line2]): - pass - - place_full_fence = True - - # Dp's are handled specially and line specifies a dp - if handle_dp and l[im_fence] == "dp": - assert(musk_form) - - # Get position pointers - ln1 = int(l[im_line1]) - ln2 = int(l[im_line2]) - if ln1 == ln2: - print('Ignoring dp ' + line_cnt + ', same line numbers') - continue - pos1 = after_line(s, ln1) - pos2 = after_line(s, ln2) - - # Expressions - fst = l[im_exp1] - snd = l[im_exp2] - - # Type of first expression (+ replace _ by space) - ty = l[im_type1] - ty = ty.replace('_', '') - - s_bak = s - s = place_dp(s, pos1, pos2, fst, snd, ty, line_cnt) - # Dependency successfully inserted - if (s != s_bak): - place_full_fence = False - - if place_full_fence: - # Insert a normal fence - assert(im_fence == io_fence) - try: - fence = fm[l[im_fence]] - except KeyError: - print_err('Unrecognized fence for architecture. Exiting.') - sys.exit(1) - - # Using __asm as asm does not work with -std=c99 - asm = '__asm volatile ("' + fence + '":::"memory");' - # Throws ValueError if not an integer - if musk_form: - if fence_pos == fence_first: - ln = int(l[im_line1]) - elif fence_pos == fence_second: - ln = int(l[im_line2])-1 - else: - ln = int(l[io_line]) - - # Point at newline character at end of line - pos = after_line(s, ln) - #assert(s[pos] == '\n') - assert_msg(s[pos] == '\n', 'Insert at line: ' + str(ln) + ', File: ' + fn) - - s = place_fence(s, pos, asm, line_cnt) - - # Write back result - f = open(fn, 'w') - f.write(s) - f.close() - -# ------------------------------------------------------------------------------ - -def handle_args(args): - global musk_form - global handle_dp - global fm - - if len(sys.argv) != 5: - print_err('Number of arguments != 5\n') - usage() - sys.exit(1) - - arch = sys.argv[1] - if arch == 'x86': - print('x86 architecture') - fm = fm_x86 - elif arch == 'arm': - print('ARM architecture') - fm = fm_arm - else: - print_err('Unrecognized architecture') - sys.exit(1) - - dp_mode = sys.argv[2] - if dp_mode == "dp": - print('Handling dp') - handle_dp = True - elif dp_mode == "fence": - print('Using full fence for dp') - handle_dp = False - else: - print_err('Unrecognized fencing strategy') - sys.exit(1) - - in_form = sys.argv[3] - if in_form == "musk": - print('Input format musketeer\n') - musk_form = True - elif in_form == "other": - print('Input format other\n') - musk_form = False - else: - print_err('Unrecognized format selector') - sys.exit(1) - - if handle_dp and (not(musk_form) or not(arch == 'arm')): - print_err('Incompatible argument values.') - sys.exit(1) - -# ------------------------------------------------------------------------------ - -if __name__ == "__main__": - - handle_args(sys.argv) - # Hack (musk output insufficient for dp insertion at the moment) - handle_dp = False - - print('Current working directory: \n' + os.getcwd() + '\n') - - # Read results file (check files mentioned in there) - fences = [] # list of pairs: (num, list) - files = [] # files in results.txt that will be fenced - all_files = [] # all files mentioned in results.txt - with open(sys.argv[4], 'r') as f: - cnt = 0 - for line in f: - cnt += 1 - # Note: "a||b|".split('|') yields ['a', '', 'b', ''] - l = line.split('|') - cols = len(l) - if cols == 11 or cols == 13: - print(' is from older version of musketeer') - sys.exit(1) - assert(cols == 5 or cols == 9) - assert(im_src_file1 == io_src_file) - fn = l[im_src_file1] - all_files.append(fn) - if fn[0] != '/' and os.path.isfile(fn): - # Files to fence - files.append(fn) - # Fencing instruction used (and its line in results.txt) - fences.append((cnt, l)) - - # Check if files exist before doing anything - not_found = False - all_files = list(set(all_files)) - for f in all_files: - if not(os.path.isfile(f)): - not_found = True - print('File ' + f + ' does not exist') - continue - if f[0] == '/': - not_found = True - print('File ' + f + ' has absolute path. Ignoring.') - - # Print extra newline if there is a file we ignore (pretty printing) - if not_found: - print() - - # Files to fence - files = list(set(files)) - - # Backup files (if backup doesn't exist yet) - for f in files: - backup = f + '.fibak' - if not(os.path.isfile(backup)): - shutil.copyfile(f, backup) - - # Fix curly braces in files (results.txt is not used) - for f in files: - sf = open(f, 'r') - s = sf.read() - # Check if file contains carriage returns - r = check(s) - if not(r): - print_err('File ' + f + ' contains carriage returns') - sys.exit(1) - sf.close() - # Fix the cases of switch statements - s = fix_case(s) - # Fix the remaining statements - s = fix(s) - sf = open(f, 'w') - sf.write(s) - sf.close() - - # Do actual fence insertion (fences: list of pairs, with pair = (num, list), - # with num denoting the line number of the entry in results.txt) - insert_fences(fences) - print('\ndone') - diff --git a/src/musketeer/fence-insertion/test1/clean.sh b/src/musketeer/fence-insertion/test1/clean.sh deleted file mode 100644 index 9a5b29472f0..00000000000 --- a/src/musketeer/fence-insertion/test1/clean.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -rm -f test test1 test2 test3 test.c *.fibak diff --git a/src/musketeer/fence-insertion/test1/results-musk.txt b/src/musketeer/fence-insertion/test1/results-musk.txt deleted file mode 100644 index f6278d128c4..00000000000 --- a/src/musketeer/fence-insertion/test1/results-musk.txt +++ /dev/null @@ -1,21 +0,0 @@ -fence|test.c|test|5|c::exp|test.c|test|5|c::exp -fence|test.c|test|7|c::exp|test.c|test|7|c::exp -fence|test.c|test|59|c::exp|test.c|test|59|c::exp -fence|test.c|test|63|c::exp|test.c|test|63|c::exp -fence|example.c|test|59|c::exp|example.c|test|59|c::exp -fence|test.c|test|65|c::exp|test.c|test|65|c::exp -fence|test.c|test|68|c::exp|test.c|test|68|c::exp -fence|test.c|test|69|c::exp|test.c|test|69|c::exp -fence|test.c|test|71|c::exp|test.c|test|71|c::exp -fence|test.c|test|76|c::exp|test.c|test|76|c::exp -fence|test.c|test|5|c::exp|test.c|test|5|c::exp -fence|test.c|test|59|c::exp|test.c|test|59|c::exp -fence|blabla.c|test|59|c::exp|blabla.c|test|59|c::exp -fence|test.c|test|86|c::exp|test.c|test|86|c::exp -fence|test.c|test|133|c::exp|test.c|test|133|c::exp -fence|test.c|dp_test1|173|c::x|test.c|dp_test1|174|c::y -fence|test.c|dp_test2|184|c::x|test.c|dp_test2|185|c::y -fence|test.c|test|240|x|test.c|test|240|x -fence|test.c|test|240|x|test.c|test|240|x -fence|test.c|test|249|x|test.c|test|247|x -fence|test.c|test|254|x|test.c|test|254|x diff --git a/src/musketeer/fence-insertion/test1/results-other.txt b/src/musketeer/fence-insertion/test1/results-other.txt deleted file mode 100644 index ca34c1984df..00000000000 --- a/src/musketeer/fence-insertion/test1/results-other.txt +++ /dev/null @@ -1,21 +0,0 @@ -fence|test.c|5|c::exp|0 -fence|test.c|7|c::exp|0 -fence|test.c|59|c::exp|0 -fence|test.c|63|c::exp|0 -fence|example.c|59|c::exp|0 -fence|test.c|65|c::exp|0 -fence|test.c|68|c::exp|0 -fence|test.c|69|c::exp|0 -fence|test.c|71|c::exp|0 -fence|test.c|76|c::exp|0 -fence|test.c|5|c::exp|0 -fence|test.c|59|c::exp|0 -fence|blabla.c|59|c::exp|0 -fence|test.c|86|c::exp|0 -fence|test.c|133|c::exp|0 -fence|test.c|173|c::x|0 -fence|test.c|184|c::x|0 -fence|test.c|240|x|0 -fence|test.c|240|x|0 -fence|test.c|249|x|0 -fence|test.c|254|x|0 diff --git a/src/musketeer/fence-insertion/test1/test.sh b/src/musketeer/fence-insertion/test1/test.sh deleted file mode 100644 index a1891f5bc18..00000000000 --- a/src/musketeer/fence-insertion/test1/test.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash - -set -e - -T='test.sh:' - -prepare() { - ./clean.sh - cp test.c.orig test.c -} - -prepare -gcc -std=c99 -Wall -o test1 test.c -echo -e $T 'Original compiled successfully.\n' - -prepare -../fi.py x86 fence musk results-musk.txt -gcc -std=c99 -Wall -o test2 test.c -echo -e $T 'Fenced compiled successfully (musketeer format).\n' - -prepare -../fi.py x86 fence other results-other.txt -gcc -std=c99 -Wall -o test3 test.c -echo -e $T 'Fenced compiled successfully (other format).' - -./clean.sh diff --git a/src/musketeer/fence-insertion/test2/clean.sh b/src/musketeer/fence-insertion/test2/clean.sh deleted file mode 100644 index 9e636f1f7d7..00000000000 --- a/src/musketeer/fence-insertion/test2/clean.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -rm -f test test1 test2 test.c *.fibak diff --git a/src/musketeer/fence-insertion/test2/results.txt b/src/musketeer/fence-insertion/test2/results.txt deleted file mode 100644 index 0627c6a1035..00000000000 --- a/src/musketeer/fence-insertion/test2/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -fence|test.c|thr1|14|c::flag1|test.c|thr1|10|c::flag2 -fence|test.c|thr1|9|c::flag1|test.c|thr1|10|c::flag2 -fence|test.c|thr2|26|c::flag2|test.c|thr2|27|c::flag1 -fence|test.c|thr2|26|c::flag2|test.c|thr2|30|c::turn -fence|test.c|thr2|29|c::flag2|test.c|thr2|30|c::turn -fence|test.c|thr2|31|c::flag2|test.c|thr2|27|c::flag1 diff --git a/src/musketeer/fence-insertion/test2/test.sh b/src/musketeer/fence-insertion/test2/test.sh deleted file mode 100644 index 4d4f5c7e069..00000000000 --- a/src/musketeer/fence-insertion/test2/test.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -set -e - -T='test.sh:' - -prepare() { - ./clean.sh - cp test.c.orig test.c -} - -prepare -gcc -std=c99 -Wall -o test1 test.c -echo -e $T 'Original compiled successfully.\n' - -prepare -../fi.py x86 fence musk results.txt -gcc -std=c99 -Wall -o test2 test.c -echo -e $T 'Fenced compiled successfully (musketeer format).\n' - -./clean.sh diff --git a/src/musketeer/fence_assert.cpp b/src/musketeer/fence_assert.cpp deleted file mode 100644 index d44faf74689..00000000000 --- a/src/musketeer/fence_assert.cpp +++ /dev/null @@ -1,32 +0,0 @@ -/*******************************************************************\ - -Module: ILP construction for cycles affecting user-assertions - and resolution - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// ILP construction for cycles affecting user-assertions and resolution - -#include "fence_assert.h" - -bool fence_assert_insertert::find_assert( - const event_grapht::critical_cyclet &cycle) const -{ - /* TODO */ - return true; -} - -void fence_assert_insertert::process_cycles_selection() -{ - for(std::set::const_iterator - C_j=instrumenter.set_of_cycles.begin(); - C_j!=instrumenter.set_of_cycles.end(); - ++C_j) - { - if( find_assert(*C_j) ) - selected_cycles.insert(C_j->id); - } -} diff --git a/src/musketeer/fence_assert.h b/src/musketeer/fence_assert.h deleted file mode 100644 index bc21b8b5319..00000000000 --- a/src/musketeer/fence_assert.h +++ /dev/null @@ -1,52 +0,0 @@ -/*******************************************************************\ - -Module: ILP construction for cycles affecting user-assertions - and resolution - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// ILP construction for cycles affecting user-assertions and resolution - -#ifndef CPROVER_MUSKETEER_FENCE_ASSERT_H -#define CPROVER_MUSKETEER_FENCE_ASSERT_H - -#include - -#include - -#include "fence_inserter.h" - -class instrumentert; - -class fence_assert_insertert:public fence_insertert -{ -protected: - std::set selected_cycles; - - bool find_assert(const event_grapht::critical_cyclet &cycle) const; - - // overload for base class - virtual void process_cycles_selection(); - - // overload for base class - virtual bool filter_cycles(unsigned cycles_id) const - { - return selected_cycles.find(cycles_id)!=selected_cycles.end(); - } - -public: - explicit fence_assert_insertert(instrumentert &instr): - fence_insertert(instr) - { - } - - fence_assert_insertert(instrumentert &instr, memory_modelt _model): - fence_insertert(instr, _model) - { - } -}; - -#endif // CPROVER_MUSKETEER_FENCE_ASSERT_H diff --git a/src/musketeer/fence_inserter.cpp b/src/musketeer/fence_inserter.cpp deleted file mode 100644 index 10de10049eb..00000000000 --- a/src/musketeer/fence_inserter.cpp +++ /dev/null @@ -1,1107 +0,0 @@ -/*******************************************************************\ - -Module: ILP construction for all cycles and resolution - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// ILP construction for all cycles and resolution - -#include "fence_inserter.h" - -#include - -#include -#include - -#ifdef HAVE_GLPK -#include -#include -#endif - -#include "ilp.h" - -class abstract_eventt; - -unsigned fence_insertert::fence_cost(fence_typet f) const -{ - switch(f) - { - case Fence: - return 3; - case Lwfence: - return 2; - case Dp: - return 1; - case Branching: - return 2; - case Ctlfence: - return 1; - } - UNREACHABLE; - return 0; -} - -void fence_insertert::compute() -{ - compute_fence_options(); - instrumenter.message.status() << "Preprocessing" << messaget::eom; - preprocess(); - instrumenter.message.status() << "Solving" << messaget::eom; - if(unique>0) - solve(); - else - instrumenter.message.result() << "no cycle concerned" << messaget::eom; -} - -void fence_insertert::preprocess() -{ - process_cycles_selection(); - - cycles_visitor.po_edges(po); - - /* TODO: replace lists by sets and carefully count the number of constraints - _with_ removing the existing ones (i.e., those which are not inserted) */ - - instrumenter.message.status() << "Preparing cycles" << messaget::eom; - for(std::set::const_iterator - C_j=instrumenter.set_of_cycles.begin(); - C_j!=instrumenter.set_of_cycles.end(); - ++C_j) - { - /* filtering */ - if(filter_cycles(C_j->id)) - continue; - - std::set new_wr_set; - cycles_visitor.powr_constraint(*C_j, new_wr_set); - powr_constraints.push_back(new_wr_set); - - std::set new_ww_set; - cycles_visitor.poww_constraint(*C_j, new_ww_set); - poww_constraints.push_back(new_ww_set); - - std::set new_rw_set; - cycles_visitor.porw_constraint(*C_j, new_rw_set); - porw_constraints.push_back(new_rw_set); - - std::set new_rr_set; - cycles_visitor.porr_constraint(*C_j, new_rr_set); - porr_constraints.push_back(new_rr_set); - - if(model==Power || model==Unknown) - { - std::set new_comset; - cycles_visitor.com_constraint(*C_j, new_comset); - com_constraints.push_back(new_comset); - } - - assert(powr_constraints.size()==poww_constraints.size()); - assert(poww_constraints.size()==porw_constraints.size()); - assert(porw_constraints.size()==porr_constraints.size()); - } - - // Note: not true if filters - // assert(non_powr_constraints.size()==instrumenter.set_of_cycles.size()); - - // NEW - /* first, powr constraints: for all C_j */ - for(std::list >::const_iterator - e_i=powr_constraints.begin(); - e_i!=powr_constraints.end(); - ++e_i) - { - /* for all e */ - for(std::set::const_iterator - e_c_it=e_i->begin(); - e_c_it!=e_i->end(); - ++e_c_it) - { - std::set pt_set; - assert(map_to_e.find(*e_c_it)!=map_to_e.end()); - const_graph_visitor.PT(map_to_e.find(*e_c_it)->second, pt_set); - } - } - - /* then, poww constraints: for all C_j */ - for(std::list >::const_iterator - e_i=poww_constraints.begin(); - e_i!=poww_constraints.end(); - ++e_i) - { - /* for all e */ - for(std::set::const_iterator - e_nc_it=e_i->begin(); - e_nc_it!=e_i->end(); - ++e_nc_it) - { - std::set pt_set; - assert(map_to_e.find(*e_nc_it)!=map_to_e.end()); - const_graph_visitor.PT(map_to_e.find(*e_nc_it)->second, pt_set); - } - } - - /* then, porw constraints: for all C_j */ - for(std::list >::const_iterator - e_i=porw_constraints.begin(); - e_i!=porw_constraints.end(); - ++e_i) - { - /* for all e */ - for(std::set::const_iterator - e_nc_it=e_i->begin(); - e_nc_it!=e_i->end(); - ++e_nc_it) - { - std::set pt_set; - assert(map_to_e.find(*e_nc_it)!=map_to_e.end()); - const_graph_visitor.PT(map_to_e.find(*e_nc_it)->second, pt_set); - } - } - - /* then, porr constraints: for all C_j */ - for(std::list >::const_iterator - e_i=porr_constraints.begin(); - e_i!=porr_constraints.end(); - ++e_i) - { - /* for all e */ - for(std::set::const_iterator - e_nc_it=e_i->begin(); - e_nc_it!=e_i->end(); - ++e_nc_it) - { - std::set pt_set; - assert(map_to_e.find(*e_nc_it)!=map_to_e.end()); - const_graph_visitor.PT(map_to_e.find(*e_nc_it)->second, pt_set); - } - } - - if(model==Power || model==Unknown) - { - /* finally, Power/ARM constraints for Rfes: for all C_j */ - for(std::list >::const_iterator - e_i=com_constraints.begin(); - e_i!=com_constraints.end(); - ++e_i) - { - /* for all e */ - for(std::set::const_iterator - e_c_it=e_i->begin(); - e_c_it!=e_i->end(); - ++e_c_it) - { - std::set ct_set; - assert(invisible_var.map_to_e.find(*e_c_it)!= - invisible_var.map_to_e.end()); - const_graph_visitor.CT(invisible_var.map_to_e.find(*e_c_it)->second, - ct_set); - - std::set ct_not_powr_set; - const_graph_visitor.CT_not_powr( - invisible_var.map_to_e.find(*e_c_it)->second, ct_not_powr_set); - } - } - } -} - -void inline fence_insertert::mip_set_var( - ilpt &ilp, - unsigned &i) -{ -#ifdef HAVE_GLPK - glp_add_cols(ilp.lp, unique*fence_options); - // unsigned i=1; - for(; i<=unique*fence_options; i+=fence_options) - { - const bool has_cost=1; // (po_plus.find(i)==po_plus.end()); - /* has_cost==0 => invisible variable */ - assert(has_cost); // not useful for this problem - - /* computes the sum of the frequencies of the cycles in which - this event appears, if requested */ - float freq_sum=0; - if(with_freq) - { - assert(instrumenter.set_of_cycles.size()==freq_table.size()); - freq_sum += epsilon; - for(std::set::const_iterator - C_j=instrumenter.set_of_cycles.begin(); - C_j!=instrumenter.set_of_cycles.end(); - ++C_j) - { - /* filters */ - if(filter_cycles(C_j->id)) - continue; - - /* if(C_j->find( col_to_var(i) )!=C_j->end()) */ - std::list::const_iterator it; - for(it=C_j->begin(); it!=C_j->end() && col_to_var(i)!=*it; ++it) - { - } - - if(it!=C_j->end()) - freq_sum += freq_table[C_j->id]; - } - } - else - freq_sum=1; - - if(model==Power || model==Unknown) - { - /* dp variable for e */ - const std::string name_dp="dp_"+std::to_string(i); - glp_set_col_name(ilp.lp, i, name_dp.c_str()); - glp_set_col_bnds(ilp.lp, i, GLP_LO, 0.0, 0.0); - glp_set_obj_coef(ilp.lp, i, (has_cost?fence_cost(Dp):0)*freq_sum); - glp_set_col_kind(ilp.lp, i, GLP_BV); - - /* fence variable for e */ - const std::string name_f="f_"+std::to_string(i); - glp_set_col_name(ilp.lp, i+1, name_f.c_str()); - glp_set_col_bnds(ilp.lp, i+1, GLP_LO, 0.0, 0.0); - glp_set_obj_coef(ilp.lp, i+1, (has_cost?fence_cost(Fence):0)*freq_sum); - glp_set_col_kind(ilp.lp, i+1, GLP_BV); - -// Note: uncomment for br and cf fences -#if 0 - /* br variable for e */ - const std::string name_br="br_"+std::to_string(i); - glp_set_col_name(ilp.lp, i+2, name_br.c_str()); - glp_set_col_bnds(ilp.lp, i+2, GLP_LO, 0.0, 0.0); - glp_set_obj_coef( - ilp.lp, i+2, (has_cost?fence_cost(Branching):0)*freq_sum); - glp_set_col_kind(ilp.lp, i+2, GLP_BV); - - /* cf variable for e */ - const std::string name_cf="cf_"+std::to_string(i); - glp_set_col_name(ilp.lp, i+3, name_cf.c_str()); - glp_set_col_bnds(ilp.lp, i+3, GLP_LO, 0.0, 0.0); - glp_set_obj_coef(ilp.lp, i+3, (has_cost?fence_cost(Ctlfence):0)*freq_sum); - glp_set_col_kind(ilp.lp, i+3, GLP_BV); -#endif - - if(model==Power) - { - /* lwf variable for e */ - const std::string name_lwf="lwf_"+std::to_string(i); - glp_set_col_name(ilp.lp, i+2/*4*/, name_lwf.c_str()); - glp_set_col_bnds(ilp.lp, i+2/*4*/, GLP_LO, 0.0, 0.0); - glp_set_obj_coef(ilp.lp, i+2/*4*/, - (has_cost?fence_cost(Lwfence):0)*freq_sum); - glp_set_col_kind(ilp.lp, i+2/*4*/, GLP_BV); - } - } - else - { - /* fence variable for e */ - const std::string name_f="f_"+std::to_string(i); - glp_set_col_name(ilp.lp, i, name_f.c_str()); - glp_set_col_bnds(ilp.lp, i, GLP_LO, 0.0, 0.0); - glp_set_obj_coef(ilp.lp, i, (has_cost?fence_cost(Fence):0)*freq_sum); - glp_set_col_kind(ilp.lp, i, GLP_BV); - } - } -#else - throw "sorry, musketeer requires glpk; please recompile musketeer with glpk"; -#endif -} - -void inline fence_insertert::mip_set_cst(ilpt &ilp, unsigned &i) -{ -#ifdef HAVE_GLPK - glp_add_rows(ilp.lp, constraints_number); - i=1; - - /* first the powr: for all C_j */ - for( - std::list >::const_iterator c_wr_it = - powr_constraints.begin(); - c_wr_it!=powr_constraints.end(); - ++c_wr_it) - { - /* for all e */ - for(std::size_t j=1; j<=c_wr_it->size(); ++j) - { - std::string name="C_"+std::to_string(i)+"_c_wr_"+std::to_string(j); - glp_set_row_name(ilp.lp, i, name.c_str()); - glp_set_row_bnds(ilp.lp, i, GLP_LO, 1.0, 0.0); /* >= 1*/ - ++i; - } - } - - /* then the poww: for all C_j */ - for(std::list >::const_iterator - c_ww_it=poww_constraints.begin(); - c_ww_it!=poww_constraints.end(); - ++c_ww_it) - { - /* for all e */ - for(std::size_t j=1; j<=c_ww_it->size(); ++j) - { - std::string name="C_"+std::to_string(i)+"_c_ww_"+std::to_string(j); - glp_set_row_name(ilp.lp, i, name.c_str()); - glp_set_row_bnds(ilp.lp, i, GLP_LO, 1.0, 0.0); /* >= 1*/ - ++i; - } - } - - /* then the porw: for all C_j */ - for(std::list >::const_iterator - c_rw_it=porw_constraints.begin(); - c_rw_it!=porw_constraints.end(); - ++c_rw_it) - { - /* for all e */ - for(std::size_t j=1; j<=c_rw_it->size(); ++j) - { - std::string name="C_"+std::to_string(i)+"_c_rw_"+std::to_string(j); - glp_set_row_name(ilp.lp, i, name.c_str()); - glp_set_row_bnds(ilp.lp, i, GLP_LO, 1.0, 0.0); /* >= 1*/ - ++i; - } - } - - /* and finally the porr: for all C_j */ - for( - std::list >::const_iterator c_rr_it = - porr_constraints.begin(); - c_rr_it!=porr_constraints.end(); - ++c_rr_it) - { - /* for all e */ - for(std::size_t j=1; j<=c_rr_it->size(); ++j) - { - std::string name="C_"+std::to_string(i)+"_c_rr_"+std::to_string(j); - glp_set_row_name(ilp.lp, i, name.c_str()); - glp_set_row_bnds(ilp.lp, i, GLP_LO, 1.0, 0.0); /* >= 1*/ - ++i; - } - } - - if(model==Power || model==Unknown) - { - for(std::list >::const_iterator - c_it=com_constraints.begin(); - c_it!=com_constraints.end(); - ++c_it) - { - /* for all e */ - for(std::size_t j=1; j<=c_it->size(); ++j) - { - std::string name="C_"+std::to_string(i)+"_c_"+std::to_string(j); - glp_set_row_name(ilp.lp, i, name.c_str()); - glp_set_row_bnds(ilp.lp, i, GLP_LO, 1.0, 0.0); /* >= 1*/ - ++i; - } - } - } -#else - throw "sorry, musketeer requires glpk; please recompile musketeer with glpk"; -#endif -} - -void inline fence_insertert::mip_fill_matrix( - ilpt &ilp, - unsigned &i, - unsigned const_constraints_number, - unsigned const_unique) -{ -#ifdef HAVE_GLPK - unsigned col=1; - unsigned row=1; - i=1; - - /* first, powr constraints: for all C_j */ - for(std::list >::const_iterator - e_i=powr_constraints.begin(); - e_i!=powr_constraints.end(); - ++e_i) - { - /* for all e */ - for(std::set::const_iterator - e_c_it=e_i->begin(); - e_c_it!=e_i->end(); - ++e_c_it) - { - std::set pt_set; - assert(map_to_e.find(*e_c_it)!=map_to_e.end()); - const_graph_visitor.PT(map_to_e.find(*e_c_it)->second, pt_set); - /* sum_e' f_e' */ - for(col=1; col<=unique*fence_options; ++col) - { - assert(row<=const_constraints_number); - assert(col<=const_unique*fence_options); - ilp.imat[i]=row; - ilp.jmat[i]=col; - if(model==Power || model==Unknown) - { - if(pt_set.find(col_to_var(col))!=pt_set.end() - && col_to_fence(col)==Fence) - ilp.vmat[i]=1.0; - else - ilp.vmat[i]=0.0; - } - else - { - if(pt_set.find(col_to_var(col))!=pt_set.end() && - col_to_fence(col)==Fence) - ilp.vmat[i]=1.0; - else - ilp.vmat[i]=0.0; - } - ++i; - } - ++row; - } - } - - /* then, poww constraints: for all C_j */ - for(std::list >::const_iterator - e_i=poww_constraints.begin(); - e_i!=poww_constraints.end(); - ++e_i) - { - /* for all e */ - for(std::set::const_iterator - e_nc_it=e_i->begin(); - e_nc_it!=e_i->end(); - ++e_nc_it) - { - std::set pt_set; - assert(map_to_e.find(*e_nc_it)!=map_to_e.end()); - const_graph_visitor.PT(map_to_e.find(*e_nc_it)->second, pt_set); - /* sum_e' (f_e' + lwf_e') */ - for(col=1; col<=unique*fence_options; ++col) - { - assert(row<=const_constraints_number); - assert(col<=const_unique*fence_options); - ilp.imat[i]=row; - ilp.jmat[i]=col; - if(model==Power) - { - if(pt_set.find(col_to_var(col))!=pt_set.end() && - (col_to_fence(col)==Lwfence || col_to_fence(col)==Fence)) - ilp.vmat[i]=1.0; - else - ilp.vmat[i]=0.0; - } - else - { - if(pt_set.find(col_to_var(col))!=pt_set.end() && - col_to_fence(col)==Fence) - ilp.vmat[i]=1.0; - else - ilp.vmat[i]=0.0; - } - ++i; - } - ++row; - } - } - - /* then, porw constraints: for all C_j */ - for(std::list >::const_iterator - e_i=porw_constraints.begin(); - e_i!=porw_constraints.end(); - ++e_i) - { - /* for all e */ - for(std::set::const_iterator - e_nc_it=e_i->begin(); - e_nc_it!=e_i->end(); - ++e_nc_it) - { - std::set pt_set; - assert(map_to_e.find(*e_nc_it)!=map_to_e.end()); - const_graph_visitor.PT(map_to_e.find(*e_nc_it)->second, pt_set); - /* dp_e + sum_e' (f_e' + lwf_e' + br_e') */ - for(col=1; col<=unique*fence_options; ++col) - { - assert(row<=const_constraints_number); - assert(col<=const_unique*fence_options); - ilp.imat[i]=row; - ilp.jmat[i]=col; - if(model==Power) - { - if(col==var_fence_to_col(Dp, *e_nc_it) || - (pt_set.find(col_to_var(col))!=pt_set.end() && - (col_to_fence(col)==Lwfence || - col_to_fence(col)==Fence -#if 0 - || col_to_fence(col)==Branching -#endif - ))) // NOLINT(whitespace/parens) - ilp.vmat[i]=1.0; - else - ilp.vmat[i]=0.0; - } - else if(model==Unknown) - { - if(col==var_fence_to_col(Dp, *e_nc_it) || - (pt_set.find(col_to_var(col))!=pt_set.end() && - (col_to_fence(col)==Fence -#if 0 - || col_to_fence(col)==Branching -#endif - ))) // NOLINT(whitespace/parens) - ilp.vmat[i]=1.0; - else - ilp.vmat[i]=0.0; - } - else - { - if(pt_set.find(col_to_var(col))!=pt_set.end() && - (col_to_fence(col)==Fence -#if 0 - || col_to_fence(col)==Branching -#endif - )) // NOLINT(whitespace/parens) - ilp.vmat[i]=1.0; - else - ilp.vmat[i]=0.0; - } - ++i; - } - ++row; - } - } - - /* then, porr constraints: for all C_j */ - for(std::list >::const_iterator - e_i=porr_constraints.begin(); - e_i!=porr_constraints.end(); - ++e_i) - { - /* for all e */ - for(std::set::const_iterator - e_nc_it=e_i->begin(); - e_nc_it!=e_i->end(); - ++e_nc_it) - { - std::set pt_set; - assert(map_to_e.find(*e_nc_it)!=map_to_e.end()); - const_graph_visitor.PT(map_to_e.find(*e_nc_it)->second, pt_set); -// uncomment for cf -#if 0 - std::set it_set; - IT(map_to_e.find(*e_nc_it)->second, it_set); -#endif - /* dp_e + sum_e' (f_e' + lwf_e') + sum_e'' cf_e'') */ - for(col=1; col<=unique*fence_options; ++col) - { - assert(row<=const_constraints_number); - assert(col<=const_unique*fence_options); - ilp.imat[i]=row; - ilp.jmat[i]=col; - if(model==Power) - { - if(col==var_fence_to_col(Dp, *e_nc_it) || - (pt_set.find(col_to_var(col))!=pt_set.end() && - (col_to_fence(col)==Lwfence || col_to_fence(col)==Fence)) -#if 0 - || (it_set.find(col_to_var(col))!=it_set.end() - && col_to_fence(col)==Ctlfence) -#endif - ) - ilp.vmat[i]=1.0; - else - ilp.vmat[i]=0.0; - } - else if(model==Unknown) - { - if(col==var_fence_to_col(Dp, *e_nc_it) || - (pt_set.find(col_to_var(col))!=pt_set.end() && - (col_to_fence(col)==Fence)) -#if 0 - || (it_set.find(col_to_var(col))!=it_set.end() - && col_to_fence(col)==Ctlfence) -#endif - ) - ilp.vmat[i]=1.0; - else - ilp.vmat[i]=0.0; - } - else - { - if(pt_set.find(col_to_var(col))!=pt_set.end() && - (col_to_fence(col)==Fence)) - ilp.vmat[i]=1.0; - else - ilp.vmat[i]=0.0; - } - ++i; - } - ++row; - } - } - - if(model==Power || model==Unknown) - { - /* finally, Power/ARM constraints for Rfes: for all C_j */ - for(std::list >::const_iterator - e_i=com_constraints.begin(); - e_i!=com_constraints.end(); - ++e_i) - { - /* for all e */ - for(std::set::const_iterator - e_c_it=e_i->begin(); - e_c_it!=e_i->end(); - ++e_c_it) - { - unsigned possibilities_met=0; - - std::set ct_set; - assert(invisible_var.map_to_e.find(*e_c_it)!= - invisible_var.map_to_e.end()); - const_graph_visitor.CT(invisible_var.map_to_e.find(*e_c_it)->second, - ct_set); - - std::set ct_not_powr_set; - const_graph_visitor.CT_not_powr(invisible_var.map_to_e.find( - *e_c_it)->second, ct_not_powr_set); - - instrumenter.message.statistics() << "size of CT for " - << invisible_var.map_to_e.find(*e_c_it)->second.first << "," - << invisible_var.map_to_e.find(*e_c_it)->second.second << ": " - << ct_set.size() << messaget::eom; - - /* sum_e' f_e' + sum_e'' lwf_e'' */ - for(col=1; col<=unique*fence_options; ++col) - { - assert(row<=const_constraints_number); - assert(col<=const_unique*fence_options); - ilp.imat[i]=row; - ilp.jmat[i]=col; - if((ct_set.find(col_to_var(col))!=ct_set.end() && - col_to_fence(col)==Fence) || - (ct_not_powr_set.find(col_to_var(col))!=ct_not_powr_set.end() && - col_to_fence(col)==Lwfence)) - { - ilp.vmat[i]=1.0; - ++possibilities_met; - } - else - ilp.vmat[i]=0.0; - ++i; - } - ++row; - assert(possibilities_met); - } - } - } - instrumenter.message.debug() << "3: " << i << " row: " << row - << messaget::eom; -#else - throw "sorry, musketeer requires glpk; please recompile musketeer with glpk"; -#endif -} - -void fence_insertert::solve() -{ -#ifdef HAVE_GLPK - ilpt ilp; - - instrumenter.message.statistics() << "po^+ edges considered:" - << unique << " cycles:" << instrumenter.set_of_cycles.size() - << messaget::eom; - - /* sets the variables and coefficients */ - // nb of po+ considered * types of fences (_e) - unsigned i=1; - mip_set_var(ilp, i); - - /* sets the constraints */ - mip_set_cst(ilp, i); - - instrumenter.message.debug() << "3: " << i << messaget::eom; - assert(i-1==constraints_number); - - const std::size_t const_constraints_number=constraints_number; - const unsigned const_unique=unique; - - const std::size_t mat_size= - // NOLINTNEXTLINE(whitespace/operators) - const_unique*fence_options*const_constraints_number; - instrumenter.message.statistics() << "size of the system: " << mat_size - << messaget::eom; - instrumenter.message.statistics() << "# of constraints: " - << const_constraints_number << messaget::eom; - instrumenter.message.statistics() << "# of variables: " - << const_unique*fence_options << messaget::eom; - - ilp.set_size(mat_size); - -#ifdef DEBUG - print_vars(); -#endif - - /* fills the constraints coeff */ - /* tables read from 1 in glpk -- first row/column ignored */ - mip_fill_matrix(ilp, i, const_constraints_number, const_unique); - - instrumenter.message.statistics() << "i: " << i << " mat_size: " << mat_size - << messaget::eom; - // assert(i-1==mat_size); - -#ifdef DEBUG - for(i=1; i<=mat_size; ++i) - instrumenter.message.debug() << i << "[" << ilp.imat[i] << "," - << ilp.jmat[i] << "]=" << ilp.vmat[i] << messaget::eom; -#endif - - /* solves MIP by branch-and-cut */ - ilp.solve(); - -#ifdef DEBUG - print_vars(); -#endif - - /* checks optimality */ - switch(glp_mip_status(ilp.lp)) - { - case GLP_OPT: - instrumenter.message.result() << "Optimal solution found" - << messaget::eom; - break; - case GLP_UNDEF: - instrumenter.message.result() << "Solution undefined" << messaget::eom; - UNREACHABLE; - case GLP_FEAS: - instrumenter.message.result() << "Solution feasible, " - << "yet not proven optimal, " - << "due to early termination" - << messaget::eom; - break; - case GLP_NOFEAS: - instrumenter.message.result() - << "No feasible solution, the system is UNSAT" << messaget::eom; - UNREACHABLE; - } - - event_grapht &egraph=instrumenter.egraph; - - /* loads results (x_i) */ - instrumenter.message.statistics() << "minimal cost: " - << glp_mip_obj_val(ilp.lp) << messaget::eom; - for(unsigned j=1; j<=const_unique*fence_options; ++j) - { - if(glp_mip_col_val(ilp.lp, j)>=1) - { - /* insert that fence */ - assert(map_to_e.find(col_to_var(j))!=map_to_e.end()); - const edget &delay=map_to_e.find(col_to_var(j))->second; - instrumenter.message.statistics() << delay.first << " -> " - << delay.second << " : " << to_string(col_to_fence(j)) - << messaget::eom; - instrumenter.message.statistics() << "(between " - << egraph[delay.first].source_location << " and " - << egraph[delay.second].source_location << messaget::eom; - fenced_edges.insert( - std::pair(delay, col_to_fence(j))); - } - } -#else - throw "sorry, musketeer requires glpk; please recompile musketeer with glpk"; -#endif -} - -void fence_insertert::import_freq() -{ - /* TODO */ -} - -void fence_insertert::print_to_file() -{ - /* removes redundant (due to several call to the same fenced function) */ - std::set non_redundant_display; - for(std::map::const_iterator it=fenced_edges.begin(); - it!=fenced_edges.end(); - ++it) - { - std::ostringstream s; - const abstract_eventt &first=instrumenter.egraph[it->first.first]; - - s << to_string(it->second) << "|" << first.source_location.get_file() - << "|" << first.source_location.get_line() << "|" - << first.source_location.get_column() << '\n'; - non_redundant_display.insert(s.str()); - } - - std::ofstream results; - results.open("results.txt"); - for(std::set::const_iterator it=non_redundant_display.begin(); - it!=non_redundant_display.end(); - ++it) - results << *it; - results.close(); -} - -/* prints final results */ -void fence_insertert::print_to_file_2() -{ - /* removes redundant (due to several call to the same fenced function) */ - std::set non_redundant_display; - for(std::map::const_iterator it=fenced_edges.begin(); - it!=fenced_edges.end(); - ++it) - { - std::ostringstream s; - const abstract_eventt &first=instrumenter.egraph[it->first.first]; - const abstract_eventt &second=instrumenter.egraph[it->first.second]; - - s << to_string(it->second) << "|" << first.source_location.get_file() - << "|" << first.source_location.get_line() << "|" - << second.source_location.get_file() - << "|" << second.source_location.get_line() << '\n'; - non_redundant_display.insert(s.str()); - } - - std::ofstream results; - results.open("results.txt"); - for(std::set::const_iterator it=non_redundant_display.begin(); - it!=non_redundant_display.end(); - ++it) - results << *it; - results.close(); -} - -/* prints final results */ -void fence_insertert::print_to_file_3() -{ - /* removes redundant (due to several call to the same fenced function) */ - std::set non_redundant_display; - for(std::map::const_iterator it=fenced_edges.begin(); - it!=fenced_edges.end(); - ++it) - { - std::ostringstream s; - const abstract_eventt &first=instrumenter.egraph[it->first.first]; - const abstract_eventt &second=instrumenter.egraph[it->first.second]; - - try - { - s << to_string(it->second) << "|" << first.source_location.get_file() - << "|" << first.source_location.get_function() << "|" - << first.source_location.get_line() << "|" << first.variable << "|" - << second.source_location.get_file() << "|" - << second.source_location.get_function() << "|" - << second.source_location.get_line() - << "|" << second.variable << '\n'; - non_redundant_display.insert(s.str()); - } - catch(std::string s) - { - instrumenter.message.warning() - << "Couldn't retrieve symbols of variables " << first.variable - << " and " << second.variable << " due to " << s << messaget::eom; - } - } - - std::ofstream results; - results.open("results.txt"); - for(std::set::const_iterator it=non_redundant_display.begin(); - it!=non_redundant_display.end(); - ++it) - results << *it; - results.close(); -} - -/* prints final results */ -void fence_insertert::print_to_file_4() -{ - /* removes redundant (due to several call to the same fenced function) */ - std::set non_redundant_display; - for(std::map::const_iterator it=fenced_edges.begin(); - it!=fenced_edges.end(); - ++it) - { - std::ostringstream s; - const abstract_eventt &first=instrumenter.egraph[it->first.first]; - const abstract_eventt &second=instrumenter.egraph[it->first.second]; - - try - { - s << to_string(it->second) << "|" << first.source_location.get_file() - << "|" << first.source_location.get_function() << "|" - << first.source_location.get_line() - << "|" << first.variable << "|" - << get_type(first.variable).get("#c_type") << "|" - << second.source_location.get_file() << "|" - << second.source_location.get_function() << "|" - << second.source_location.get_line() - << "|" << second.variable << "|" - << get_type(second.variable).get("#c_type") << '\n'; - non_redundant_display.insert(s.str()); - } - catch (std::string s) - { - instrumenter.message.warning() - << "Couldn't retrieve types of variables " << first.variable - << " and " << second.variable << " due to " << s << messaget::eom; - } - } - - std::ofstream results; - results.open("results.txt"); - for(std::set::const_iterator it=non_redundant_display.begin(); - it!=non_redundant_display.end(); - ++it) - results << *it; - results.close(); -} - -std::string fence_insertert::to_string(fence_typet f) const -{ - switch(f) - { - case Fence: return "fence"; - case Lwfence: return "lwfence"; - case Dp: return "dp"; - case Branching: return "branching"; - case Ctlfence: return "ctlfence"; - } - UNREACHABLE; -} - -inline unsigned fence_insertert::col_to_var(unsigned u) const -{ - return (u-u%fence_options)/fence_options+(u%fence_options!=0?1:0); -} - -inline fence_insertert::fence_typet fence_insertert::col_to_fence(unsigned u) - const -{ - switch(u%fence_options) - { - case 0: return Fence; - case 1: return Dp; - case 2: return Lwfence; - case 3: return Branching; - case 4: return Ctlfence; - } - UNREACHABLE; -} - -inline unsigned fence_insertert::var_fence_to_col(fence_typet f, unsigned var) - const -{ - switch(f) - { - case Fence: return var*fence_options; - case Dp: return (var-1)*fence_options+1; - case Lwfence: return (var-1)*fence_options+2; - case Branching: return (var-1)*fence_options+3; - case Ctlfence: return (var-1)*fence_options+4; - } - UNREACHABLE; -} - -void fence_insertert::compute_fence_options() -{ - switch(model) - { - case TSO: - case PSO: - case RMO: - fence_options=1; // 2: f, br - break; - case Power: - fence_options=3; // 5: f, lwf, dp, cf, br - break; - case Unknown: /* including ARM */ - fence_options=2; // 4: f, dp, cf, br - break; - } -} - -void fence_insertert::print_vars() const -{ - instrumenter.message.statistics() - << "---- pos/pos+ (visible) variables ----" << messaget::eom; - for(std::map::const_iterator it=map_from_e.begin(); - it!=map_from_e.end(); ++it) - instrumenter.message.statistics() << it->first.first << "," - << it->first.second << messaget::eom; - instrumenter.message.statistics() << "---- cmp (invisible) variables ----" - << messaget::eom; - for(std::map::const_iterator it= - invisible_var.map_from_e.begin(); - it!=invisible_var.map_from_e.end(); ++it) - instrumenter.message.statistics() << it->first.first << "," - << it->first.second << messaget::eom; - instrumenter.message.statistics() << "-----------------------------------" - << messaget::eom; -} - -typet fence_insertert::get_type(const irep_idt &id) -{ - std::string copy=id2string(id); - /* if we picked an array, removes [] that rw_set added */ - if(copy.find("[]")!=std::string::npos) - copy=copy.substr(0, copy.find_last_of("[]")-1); - try - { - return instrumenter.ns.lookup(copy).type; - } - catch(...) - { - std::list fields; - std::string current; - - /* collects the consecutive fields */ - std::string::const_iterator it=copy.begin(); - std::string::const_iterator next=it; - for(; it!=copy.end(); ++it) - { - next=it; - ++next; - if(!(*it=='.' || (next!=copy.end() && *it=='-' && *next=='>'))) - { - current+=*it; - instrumenter.message.debug() << current << messaget::eom; - } - else - { - fields.push_back(current); - current.clear(); - if(*it!='.') - ++it; - /* safe as next!=copy.end() */ - assert(next!=copy.end()); - } - } - - /* retrieves the type of the accessed field */ - typet field=type_component(fields.begin(), fields.end(), - instrumenter.ns.lookup(fields.front()).type); - return field; - } -} - -typet fence_insertert::type_component( - std::list::const_iterator it, - std::list::const_iterator end, - const typet &type) -{ - if(it==end) - return type; - - if(type.id()==ID_struct) - { - const struct_union_typet &str=to_struct_union_type(type); - typet comp_type=str.component_type(*it); - ++it; - return type_component(it, end, comp_type); - } - - if(type.id()==ID_symbol) - { - return type; - } - - UNREACHABLE; -} diff --git a/src/musketeer/fence_inserter.h b/src/musketeer/fence_inserter.h deleted file mode 100644 index e24a32dbc11..00000000000 --- a/src/musketeer/fence_inserter.h +++ /dev/null @@ -1,196 +0,0 @@ -/*******************************************************************\ - -Module: ILP construction for all cycles and resolution - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// ILP construction for all cycles and resolution - -#ifndef CPROVER_MUSKETEER_FENCE_INSERTER_H -#define CPROVER_MUSKETEER_FENCE_INSERTER_H - -#include -#include - -// Note: no forward declaration for instrumentert as we derive fence_insertert -#include - -#include -#include - -#include "graph_visitor.h" -#include "cycles_visitor.h" - -class abstract_eventt; -class ilpt; - -// TODO: can be indirectly replaced by a list without redundancy -// (not a set though) -struct mip_vart -{ - typedef event_grapht::critical_cyclet::delayt edget; - - unsigned unique; - - std::map map_to_e; - std::map map_from_e; - - unsigned add_edge(const edget &e) - { - if(map_from_e.find(e) != map_from_e.end()) - return map_from_e[e]; - else - { - ++unique; - map_to_e.insert(std::pair(unique, e)); - map_from_e[e] = unique; - return unique; - } - } - - mip_vart():unique(0) - { - } -}; - -/* in essence: cycles + goto-prog -> ilp */ -class fence_insertert -{ -public: - typedef event_grapht::critical_cyclet::delayt edget; - - instrumentert &instrumenter; - - /// normal variables used almost every time - std::map &map_to_e; - std::map &map_from_e; - unsigned add_edge(const edget &e) { return var.add_edge(e); } - unsigned add_invisible_edge(const edget &e) - { - return invisible_var.add_edge(e); - } - - /// number of constraints - std::size_t constraints_number; - const memory_modelt model; - - /// to retrieve the concrete graph edges involved in the (abstract) cycles - const_graph_visitort const_graph_visitor; - -protected: - unsigned &unique; - unsigned fence_options; - - /* MIP variables to edges in po^+/\C */ - mip_vart var; - - /* MIP invisible variables (com) */ - mip_vart invisible_var; - - /* MIP matrix construction */ - void mip_set_var(ilpt &ilp, unsigned &i); - void mip_set_cst(ilpt &ilp, unsigned &i); - void mip_fill_matrix( - ilpt &ilp, - unsigned &i, - unsigned const_constraints_number, - unsigned const_unique); - - /* preprocessing (necessary as glpk static) and solving */ - void preprocess(); - void solve(); - - enum fence_typet { Fence=0, Dp=1, Lwfence=2, Branching=3, Ctlfence=4 }; - virtual unsigned fence_cost(fence_typet e) const; - - std::string to_string(fence_typet f) const; - - /* for the preprocessing */ - std::set po; - std::list > powr_constraints; - std::list > poww_constraints; - std::list > porw_constraints; - std::list > porr_constraints; - std::list > com_constraints; - - /* to retrieve the edges involved in the cycles */ - cycles_visitort cycles_visitor; - - /* conversion column <-> (MIP variable, fence type) */ - unsigned col_to_var(unsigned u) const; - fence_typet col_to_fence(unsigned u) const; - unsigned var_fence_to_col(fence_typet f, unsigned var) const; - - /* for the frequencies sum */ - const float epsilon; - const bool with_freq; - std::map freq_table; - - void import_freq(); - - /* computes the fence options */ - void compute_fence_options(); - - /* debug */ - void print_vars() const; - - /* storing final results */ - std::map fenced_edges; - -public: - explicit fence_insertert(instrumentert &instr): - instrumenter(instr), map_to_e(var.map_to_e), map_from_e(var.map_from_e), - constraints_number(0), model(TSO), const_graph_visitor(*this), - unique(var.unique), fence_options(0), cycles_visitor(*this), - epsilon(0.001), with_freq(false) - { - } - - fence_insertert(instrumentert &instr, memory_modelt _model): - instrumenter(instr), map_to_e(var.map_to_e), map_from_e(var.map_from_e), - constraints_number(0), model(_model), const_graph_visitor(*this), - unique(var.unique), fence_options(0), cycles_visitor(*this), - epsilon(0.001), with_freq(false) - { - } - - /* do it */ - void compute(); - - /* selection methods */ - // Note: process_selection updates the selection of cycles in instrumenter, - // whereas filter just ignores some - virtual void process_cycles_selection() { } - virtual bool filter_cycles(unsigned cycle_id) const { return false; } - - /* prints final results */ - void print_to_file(); - void print_to_file_2(); - void print_to_file_3(); - void print_to_file_4(); - - /* TODO: to be replaced eventually by ns.lookup and basename */ - static std::string remove_extra(const irep_idt &id) - { - const std::string copy=id2string(id); - return remove_extra(copy); - } - - static std::string remove_extra(std::string copy) - { - if(copy.find("::")==std::string::npos) - return copy; - return copy.substr(copy.find_last_of("::")+1); - } - - typet get_type(const irep_idt &id); - typet type_component( - std::list::const_iterator it, - std::list::const_iterator end, - const typet &type); -}; - -#endif // CPROVER_MUSKETEER_FENCE_INSERTER_H diff --git a/src/musketeer/fence_shared.cpp b/src/musketeer/fence_shared.cpp deleted file mode 100644 index 4dc970c513d..00000000000 --- a/src/musketeer/fence_shared.cpp +++ /dev/null @@ -1,599 +0,0 @@ -/*******************************************************************\ - -Module: - -Author: Vincent Nimal - -\*******************************************************************/ - -#include "fence_shared.h" - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -// #include - -#ifdef LOCAL_MAY -#include -#endif - -#define OUTPUT(s, fence, file, line, id, type) \ - s< writes; - std::list reads; - } fenced_edges; - - virtual void compute()=0; - - /* prints final results */ - void print_to_file() const - { - source_locationt emptyloc; - - /* removes redundant (due to several call to the same fenced function) */ - std::set non_redundant_display; - - for(std::list::const_iterator it=fenced_edges.writes.begin(); - it!=fenced_edges.writes.end(); - ++it) - { - std::ostringstream s; - - if(it->source_location().as_string().empty()) - continue; - - OUTPUT( - s, - "fence", - it->source_location().get_file(), - it->source_location().get_line(), - ns.lookup(it->get_identifier()).base_name, - "Write"); - non_redundant_display.insert(s.str()); - } - - for(std::list::const_iterator it=fenced_edges.reads.begin(); - it!=fenced_edges.reads.end(); - ++it) - { - std::ostringstream s; - - if(it->source_location().as_string().empty()) - continue; - - OUTPUT( - s, - "fence", - it->source_location().get_file(), - it->source_location().get_line(), - ns.lookup(it->get_identifier()).base_name, - "Read"); - non_redundant_display.insert(s.str()); - } - - std::ofstream results; - results.open("results.txt"); - for(std::set::const_iterator it=non_redundant_display.begin(); - it!=non_redundant_display.end(); - ++it) - results << *it; - results.close(); - } - -public: - explicit simple_insertiont( - messaget &_message, - value_setst &_value_sets, - const symbol_tablet &_symbol_table, - const goto_functionst &_goto_functions) - :message(_message), value_sets(_value_sets), symbol_table(_symbol_table), - ns(_symbol_table), goto_functions(_goto_functions) - {} - - virtual ~simple_insertiont() {} - - void do_it() - { - compute(); - print_to_file(); - } -}; - -/* fence insertion for all shared accesses */ -class fence_all_sharedt:public simple_insertiont -{ -protected: - void compute(); - -public: - fence_all_sharedt( - messaget &_message, - value_setst &_value_sets, - const symbol_tablet &_symbol_table, - const goto_functionst &_goto_functions) - :simple_insertiont(_message, _value_sets, _symbol_table, _goto_functions) - {} -}; - -/* fence insertion for all shared accesses */ -class fence_all_shared_aegt:public fence_all_sharedt -{ -protected: - void compute(); - std::set visited_functions; - void fence_all_shared_aeg_explore(const goto_programt &code -#ifdef LOCAL_MAY - , local_may_aliast &local_may -#endif - ); // NOLINT(whitespace/parens) - -public: - fence_all_shared_aegt( - messaget &_message, - value_setst &_value_sets, - const symbol_tablet &_symbol_table, - const goto_functionst &_goto_functions) - :fence_all_sharedt(_message, _value_sets, _symbol_table, _goto_functions) - {} -}; - -/* fence insertion for volatile accesses (a la MSVC) */ -class fence_volatilet:public simple_insertiont -{ -protected: - void compute(); - bool is_volatile(const typet &src) const; - -public: - fence_volatilet( - messaget &_message, - value_setst &_value_sets, - const symbol_tablet &_symbol_table, - const goto_functionst &_goto_functions) - :simple_insertiont(_message, _value_sets, _symbol_table, _goto_functions) - {} -}; - -/// we can determine whether an access is volatile just by looking at the type -/// of the variables involved in the expression. We assume that the program is -/// correctly typed (i.e., volatile-marked) -bool fence_volatilet::is_volatile(const typet &src) const -{ - if(src.get_bool(ID_C_volatile)) - return true; - -// std::cout << "type: " << src << " has sub: " -// << src.subtypes().empty() /*src.has_subtypes()*/ << '\n'; - if(src.id()==ID_symbol) - { - symbol_tablet::symbolst::const_iterator s_it= - symbol_table.symbols.find(to_symbol_type(src).get_identifier()); - assert(s_it!=symbol_table.symbols.end()); - return is_volatile(s_it->second.type); - } - else if(src.has_subtype()) - { - /* if a pointer points to a volatile variable, then any access through this - pointer has also to be considered as volatile (conservative) */ - if(is_volatile(src.subtype())) - return true; - } - else if(src.has_subtypes()) - { - /* if a pointer points to a volatile variable, then any access through this - pointer has also to be considered as volatile (conservative) */ - bool vol=false; - for(typet::subtypest::const_iterator it=src.subtypes().begin(); - it!=src.subtypes().end(); - ++it) - { - // std::cout << *it << '\n'; - vol|=is_volatile(*it); - if(vol) - break; - } - return vol; - } - - return false; -} - -void fence_volatilet::compute() -{ - std::cout << "--------\n"; - - forall_goto_functions(f_it, goto_functions) - { - #ifdef LOCAL_MAY - local_may_aliast local_may(f_it->second); - #endif - - forall_goto_program_instructions(i_it, f_it->second.body) - { - rw_set_loct rw_set(ns, value_sets, i_it - #ifdef LOCAL_MAY - , local_may - #endif - ); // NOLINT(whitespace/parens) - forall_rw_set_w_entries(w_it, rw_set) - { - if(has_prefix(id2string(w_it->second.object), CPROVER_PREFIX)) - continue; - - try - { - message.debug() << "debug: " - << id2string(w_it->second.object) << messaget::eom; - const symbolt &var=ns.lookup(w_it->second.object); - if(is_volatile(var.type)) - { - message.debug() << "volatile: " - << id2string(w_it->second.object) << messaget::eom; - fenced_edges.writes.push_front(w_it->second.symbol_expr); - } - } - catch(std::string s) - { - message.warning() << "failed to find" << s - << messaget::eom; - continue; - } - } - forall_rw_set_r_entries(r_it, rw_set) - { - if(has_prefix(id2string(r_it->second.object), CPROVER_PREFIX)) - continue; - - try - { - message.debug() << "debug: " - << id2string(r_it->second.object) << messaget::eom; - const symbolt &var=ns.lookup(r_it->second.object); - #if 0 - // NOLINTNEXTLINE(readability/braces) - if(var.is_volatile && !var.is_thread_local) - #endif - if(is_volatile(var.type)) - { - message.debug() << "volatile: " - << id2string(r_it->second.object) << messaget::eom; - fenced_edges.reads.push_front(r_it->second.symbol_expr); - } - } - catch (std::string s) - { - message.warning() << "failed to find" << s - << messaget::eom; - continue; - } - } - } - } -} - -void fence_all_sharedt::compute() -{ - std::cout << "--------\n"; - - forall_goto_functions(f_it, goto_functions) - { -#ifdef LOCAL_MAY - local_may_aliast local_may(f_it->second); -#endif - - forall_goto_program_instructions(i_it, f_it->second.body) - { - if(i_it->is_function_call()) - continue; - - rw_set_with_trackt rw_set(ns, value_sets, i_it -#ifdef LOCAL_MAY - , local_may -#endif - ); // NOLINT(whitespace/parens) - forall_rw_set_w_entries(w_it, rw_set) - { - if(has_prefix(id2string(w_it->second.object), CPROVER_PREFIX)) - continue; - - try - { - const symbolt &var=ns.lookup(w_it->second.object); - message.debug() << "debug: " - << id2string(w_it->second.object) << " shared: " << var.is_shared() - << " loc: " << w_it->second.symbol_expr.source_location() - << messaget::eom; - if(var.is_shared()) - { - /* this variable has perhaps been discovered after dereferencing - a pointer. We want to report this pointer */ - std::map &ref= - rw_set.dereferenced_from; - if(ref.find(w_it->second.object)!=ref.end()) - { - const irep_idt from=ref[w_it->second.object]; - const rw_set_baset::entryt &entry= - rw_set.set_reads.find(from)!=rw_set.set_reads.end() ? - rw_set.r_entries[from] : - rw_set.w_entries[from]; - message.debug() << "shared: (through " - << id2string(w_it->second.object) << ") " << entry.object - << messaget::eom; - fenced_edges.writes.push_front(entry.symbol_expr); - } - else - { - message.debug() << "shared: " - << id2string(w_it->second.object) << " -> " - << w_it->second.object << messaget::eom; - fenced_edges.writes.push_front(w_it->second.symbol_expr); - } - } - } - catch(std::string s) - { - message.warning() << "failed to find" << s - << messaget::eom; - continue; - } - } - forall_rw_set_r_entries(r_it, rw_set) - { - if(has_prefix(id2string(r_it->second.object), CPROVER_PREFIX)) - continue; - - try - { - const symbolt &var=ns.lookup(r_it->second.object); - message.debug() << "debug: " - << id2string(r_it->second.object) << " shared: " - << var.is_shared() << " loc: " - << r_it->second.symbol_expr.source_location() << messaget::eom; - if(var.is_shared()) - { - /* this variable has perhaps been discovered after dereferencing - a pointer. We want to report this pointer */ - std::map& - ref=rw_set.dereferenced_from; - if(ref.find(r_it->second.object)!=ref.end()) - { - const irep_idt from=ref[r_it->second.object]; - const rw_set_baset::entryt &entry= - rw_set.set_reads.find(from)!=rw_set.set_reads.end() ? - rw_set.r_entries[from] : - rw_set.w_entries[from]; - - message.debug() << "shared: (through " - << id2string(r_it->second.object) << ") " << entry.object - << messaget::eom; - fenced_edges.reads.push_front(entry.symbol_expr); - } - else - { - message.debug() << "shared: " - << id2string(r_it->second.object) << " -> " - << r_it->second.object << messaget::eom; - fenced_edges.reads.push_front(r_it->second.symbol_expr); - } - } - } - catch(std::string s) - { - message.warning() << "failed to find" << s - << messaget::eom; - continue; - } - } - } - } -} - -void fence_all_shared_aegt::compute() -{ - message.status() << "--------" << messaget::eom; - - const goto_functionst::goto_functiont &main= - goto_functions.function_map.find(goto_functionst::entry_point())->second; - #ifdef LOCAL_MAY - local_may_aliast local_may(main); - #endif - - fence_all_shared_aeg_explore(main.body -#ifdef LOCAL_MAY - , local_may -#endif - ); // NOLINT(whitespace/parens) -} - -void fence_all_shared_aegt::fence_all_shared_aeg_explore( - const goto_programt &code -#ifdef LOCAL_MAY - , local_may_aliast &local_may -#endif -) -{ - forall_goto_program_instructions(i_it, code) - { - if(i_it->is_function_call()) - { - const exprt &fun=to_code_function_call(i_it->code).function(); - - if(fun.id()!=goto_functionst::entry_point()) - continue; - - const irep_idt &fun_id=to_symbol_expr(fun).get_identifier(); - - if(visited_functions.find(fun_id)!=visited_functions.end()) - continue; - - visited_functions.insert(fun_id); - fence_all_shared_aeg_explore( - goto_functions.function_map.find(fun_id)->second.body -#ifdef LOCAL_MAY - , local_may -#endif - ); // NOLINT(whitespace/parens) - visited_functions.erase(fun_id); - } - - rw_set_with_trackt rw_set(ns, value_sets, i_it - #ifdef LOCAL_MAY - , local_may - #endif - ); // NOLINT(whitespace/parens) - forall_rw_set_w_entries(w_it, rw_set) - { - if(has_prefix(id2string(w_it->second.object), CPROVER_PREFIX)) - continue; - - try - { - const symbolt &var=ns.lookup(w_it->second.object); - message.debug() << "debug: " - << id2string(w_it->second.object) << " shared: " - << var.is_shared() << " loc: " - << w_it->second.symbol_expr.source_location() << messaget::eom; - if(var.is_shared()) - { - /* this variable has perhaps been discovered after dereferencing - a pointer. We want to report this pointer */ - std::map& - ref=rw_set.dereferenced_from; - if(ref.find(w_it->second.object)!=ref.end()) - { - const irep_idt from=ref[w_it->second.object]; - const rw_set_baset::entryt &entry= - rw_set.set_reads.find(from)!=rw_set.set_reads.end() ? - rw_set.r_entries[from] : - rw_set.w_entries[from]; - - message.debug() << "shared: (through " - << id2string(w_it->second.object) << ") " << entry.object - << messaget::eom; - fenced_edges.writes.push_front(entry.symbol_expr); - } - else - { - message.debug() << "shared: " - << id2string(w_it->second.object) << " -> " - << w_it->second.object << messaget::eom; - fenced_edges.writes.push_front(w_it->second.symbol_expr); - } - } - } - catch(std::string s) - { - message.warning() << "failed to find" << s - << messaget::eom; - continue; - } - } - forall_rw_set_r_entries(r_it, rw_set) - { - if(has_prefix(id2string(r_it->second.object), CPROVER_PREFIX)) - continue; - - try - { - const symbolt &var=ns.lookup(r_it->second.object); - message.debug() << "debug: " - << id2string(r_it->second.object) << " shared: " - <second.symbol_expr.source_location() << messaget::eom; - if(var.is_shared() && var.type.id()!=ID_code) - { - /* this variable has perhaps been discovered after dereferencing - a pointer. We want to report this pointer */ - std::map& - ref=rw_set.dereferenced_from; - if(ref.find(r_it->second.object)!=ref.end()) - { - const irep_idt from=ref[r_it->second.object]; - const rw_set_baset::entryt &entry= - rw_set.set_reads.find(from)!=rw_set.set_reads.end() ? - rw_set.r_entries[from] : - rw_set.w_entries[from]; - - message.debug() << "shared: (through " - << id2string(r_it->second.object) << ") " << entry.object - << messaget::eom; - fenced_edges.reads.push_front(entry.symbol_expr); - } - else - { - message.debug() << "shared: " - << id2string(r_it->second.object) << " -> " - << r_it->second.object << messaget::eom; - fenced_edges.reads.push_front(r_it->second.symbol_expr); - } - } - } - catch(std::string s) - { - message.warning() << "failed to find" << s - << messaget::eom; - continue; - } - } - } -} - -void fence_all_shared( - message_handlert &message_handler, - value_setst &value_sets, - symbol_tablet &symbol_table, - goto_functionst &goto_functions) -{ - messaget message(message_handler); - fence_all_sharedt instrumenter(message, value_sets, symbol_table, - goto_functions); - instrumenter.do_it(); -} - -void fence_all_shared_aeg( - message_handlert &message_handler, - value_setst &value_sets, - symbol_tablet &symbol_table, - goto_functionst &goto_functions) -{ - messaget message(message_handler); - fence_all_shared_aegt instrumenter(message, value_sets, symbol_table, - goto_functions); - instrumenter.do_it(); -} - -void fence_volatile( - message_handlert &message_handler, - value_setst &value_sets, - symbol_tablet &symbol_table, - goto_functionst &goto_functions) -{ - messaget message(message_handler); - fence_volatilet instrumenter(message, value_sets, symbol_table, - goto_functions); - instrumenter.do_it(); -} diff --git a/src/musketeer/fence_shared.h b/src/musketeer/fence_shared.h deleted file mode 100644 index 370e39f817f..00000000000 --- a/src/musketeer/fence_shared.h +++ /dev/null @@ -1,43 +0,0 @@ -/*******************************************************************\ - -Module: (naive) Fence insertion - -Purpose: fences all the shared or volatile-declared variables - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// (naive) Fence insertion - -#ifndef CPROVER_MUSKETEER_FENCE_SHARED_H -#define CPROVER_MUSKETEER_FENCE_SHARED_H - -class value_setst; -class goto_functionst; -class symbol_tablet; -class message_handlert; - -/* finds all the shared variables (including static, global and dynamic) */ -void fence_all_shared( - message_handlert &message_handler, - value_setst &value_sets, - symbol_tablet &symbol_table, - goto_functionst &goto_functions); - -/* finds all the shared variables (including static, global and dynamic) */ -void fence_all_shared_aeg( - message_handlert &message_handler, - value_setst &value_sets, - symbol_tablet &symbol_table, - goto_functionst &goto_functions); - -/* finds all the volatile-declared variables */ -void fence_volatile( - message_handlert &message_handler, - value_setst &value_sets, - symbol_tablet &symbol_table, - goto_functionst &goto_functions); - -#endif // CPROVER_MUSKETEER_FENCE_SHARED_H diff --git a/src/musketeer/fence_user_def.cpp b/src/musketeer/fence_user_def.cpp deleted file mode 100644 index 8bf57a99b8c..00000000000 --- a/src/musketeer/fence_user_def.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/*******************************************************************\ - -Module: ILP construction for cycles affecting user-assertions - and resolution - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// ILP construction for cycles affecting user-assertions and resolution - -#include "fence_user_def.h" - -bool fence_user_def_insertert::contains_user_def( - const event_grapht::critical_cyclet &cycle) const -{ - /* DEPRECATED: user-inserted fences now detected at cycle collection */ - #if 0 - /* if a fence already appears in the representation of the cycle, ok */ - for(event_grapht::critical_cyclet::const_iterator it=cycle.begin(); - it!=cycle.end(); ++it) - if(egraph[*it].is_fence()) - return true; - - /* we collect the fences back in the graph; indeed, in the cycles we extract, - it is possible that some lwfence have been ignored, as they had no effect - (in the case of WR) */ - #endif - - return cycle.has_user_defined_fence; -} - -void fence_user_def_insertert::process_cycles_selection() -{ - for(std::set::const_iterator - C_j=instrumenter.set_of_cycles.begin(); - C_j!=instrumenter.set_of_cycles.end(); - ++C_j) - { - if( contains_user_def(*C_j) ) - selected_cycles.insert(C_j->id); - } -} diff --git a/src/musketeer/fence_user_def.h b/src/musketeer/fence_user_def.h deleted file mode 100644 index 04a1236fd46..00000000000 --- a/src/musketeer/fence_user_def.h +++ /dev/null @@ -1,52 +0,0 @@ -/*******************************************************************\ - -Module: ILP construction for cycles containing user-placed fences - and resolution - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// ILP construction for cycles containing user-placed fences and resolution - -#ifndef CPROVER_MUSKETEER_FENCE_USER_DEF_H -#define CPROVER_MUSKETEER_FENCE_USER_DEF_H - -#include - -#include - -#include "fence_inserter.h" - -class instrumentert; - -class fence_user_def_insertert:public fence_insertert -{ -protected: - std::set selected_cycles; - - bool contains_user_def(const event_grapht::critical_cyclet &cycle) const; - - // overload for base class - virtual void process_cycles_selection(); - - // overload for base class - virtual bool filter_cycles(unsigned cycles_id) const - { - return selected_cycles.find(cycles_id)==selected_cycles.end(); - } - -public: - explicit fence_user_def_insertert(instrumentert &instr): - fence_insertert(instr) - { - } - - fence_user_def_insertert(instrumentert &instr, memory_modelt _model): - fence_insertert(instr, _model) - { - } -}; - -#endif // CPROVER_MUSKETEER_FENCE_USER_DEF_H diff --git a/src/musketeer/fencer.cpp b/src/musketeer/fencer.cpp deleted file mode 100644 index f62917df4e6..00000000000 --- a/src/musketeer/fencer.cpp +++ /dev/null @@ -1,184 +0,0 @@ -/*******************************************************************\ - -Module: Fence inference: Main - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// Fence inference: Main - -#include "fencer.h" - -#include -#include - -#include -#include -#include - -#include "fence_inserter.h" -#include "fence_user_def.h" -#include "fence_assert.h" - -void fence_weak_memory( - memory_modelt model, - value_setst &value_sets, - symbol_tablet &symbol_table, - goto_functionst &goto_functions, - bool SCC, - instrumentation_strategyt event_strategy, - unsigned unwinding_bound, - bool no_cfg_kill, - bool no_dependencies, - loop_strategyt duplicate_body, - unsigned input_max_var, - unsigned input_max_po_trans, - bool render_po, - bool render_file, - bool render_function, - bool cav11_option, - bool hide_internals, - bool print_graph, - infer_modet mode, - message_handlert &message_handler, - bool ignore_arrays) -{ - messaget message(message_handler); - - message.status() << "--------" << messaget::eom; - - // all access to shared variables is pushed into assignments - Forall_goto_functions(f_it, goto_functions) - if(f_it->first!=CPROVER_PREFIX "initialize" && - f_it->first!=goto_functionst::entry_point()) - introduce_temporaries(value_sets, symbol_table, f_it->first, - f_it->second.body, -#ifdef LOCAL_MAY - f_it->second, -#endif - message); - message.status() << "Temporary variables added" << messaget::eom; - - unsigned max_thds = 0; - instrumentert instrumenter(symbol_table, goto_functions, message); - max_thds=instrumenter.goto2graph_cfg(value_sets, model, - no_dependencies, duplicate_body); - ++max_thds; - message.status() << "Abstract event graph computed" << messaget::eom; - - // collects cycles, directly or by SCCs - if(input_max_var!=0 || input_max_po_trans!=0) - instrumenter.set_parameters_collection(input_max_var, input_max_po_trans, - ignore_arrays); - else - instrumenter.set_parameters_collection(max_thds, 0, ignore_arrays); - - if(SCC) - { - instrumenter.collect_cycles_by_SCCs(model); - message.statistics() << "cycles collected: " << messaget::eom; - std::size_t interesting_scc = 0; - std::size_t total_cycles = 0; - for(std::size_t i=0; i=4) - { - message.statistics() << "SCC #" << i << ": " - <second.body); - - // update counters etc. - goto_functions.update(); - - // prints the whole abstract graph - if(print_graph) - instrumenter.egraph.print_graph(); - - // for debug only -#if 0 - instrumenter.print_map_function_graph(); -#endif -} diff --git a/src/musketeer/fencer.h b/src/musketeer/fencer.h deleted file mode 100644 index b15cb631971..00000000000 --- a/src/musketeer/fencer.h +++ /dev/null @@ -1,48 +0,0 @@ -/*******************************************************************\ - -Module: Fence inference - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// Fence inference - -#ifndef CPROVER_MUSKETEER_FENCER_H -#define CPROVER_MUSKETEER_FENCER_H - -#include -#include - -#include "infer_mode.h" - -class message_handlert; -class value_setst; -class goto_functionst; -class symbol_tablet; - -void fence_weak_memory( - memory_modelt model, - value_setst &value_sets, - symbol_tablet &symbol_table, - goto_functionst &goto_functions, - bool SCC, - instrumentation_strategyt event_strategy, - unsigned unwinding_bound, - bool no_cfg_kill, - bool no_dependencies, - loop_strategyt duplicate_body, - unsigned max_var, - unsigned max_po_trans, - bool render_po, - bool render_file, - bool render_function, - bool cav11_option, - bool hide_internals, - bool print_graph, - infer_modet mode, - message_handlert &message_handler, - bool ignore_arrays); - -#endif // CPROVER_MUSKETEER_FENCER_H diff --git a/src/musketeer/graph_visitor.cpp b/src/musketeer/graph_visitor.cpp deleted file mode 100644 index 87fe14e0cbf..00000000000 --- a/src/musketeer/graph_visitor.cpp +++ /dev/null @@ -1,484 +0,0 @@ -/*******************************************************************\ - -Module: graph visitor for computing edges involved for fencing - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// graph visitor for computing edges involved for fencing - -#include "graph_visitor.h" - -#include "fence_inserter.h" - -/* implemented: BTWN1, BTWN4 */ -#define BTWN1 - -void const_graph_visitort::graph_explore( - event_grapht &egraph, - event_idt next, - event_idt end, - std::list &old_path, - std::set &edges) -{ - if(next==end) - { - /* inserts all the pos collected from old_path in edges */ - std::list::const_iterator it=old_path.begin(); - std::list::const_iterator next_it=it; - ++next_it; - for( ; next_it!=old_path.end() && it!=old_path.end(); ++it, ++next_it) - { - /* it should be a po_s, and not a po_s^+ */ - assert(egraph.has_po_edge(*it, *next_it)); - edges.insert(fence_inserter.add_edge(edget(*it, *next_it))); - } - } - else if(egraph.po_out(next).empty()) - { - /* this path is not connecting a to b => return */ - } - else - { - for(wmm_grapht::edgest::const_iterator - next_it=egraph.po_out(next).begin(); - next_it!=egraph.po_out(next).end(); - ++next_it) - { - if(visited_nodes.find(next_it->first)!=visited_nodes.end()) - continue; - visited_nodes.insert(next_it->first); - - old_path.push_back/*front*/(next_it->first); - graph_explore(egraph, next_it->first, end, old_path, edges); - old_path.pop_back/*front*/(); - } - } -} - -void const_graph_visitort::const_graph_explore( - event_grapht &egraph, - event_idt next, - event_idt end, - std::list &old_path) -{ - if(next==end) - { - /* inserts all the pos collected from old_path in edges */ - std::list::const_iterator it=old_path.begin(); - std::list::const_iterator next_it=it; - ++next_it; - for( ; next_it!=old_path.end() && it!=old_path.end(); ++it, ++next_it) - { - /* it should be a po_s, and not a po_s^+ */ - assert(egraph.has_po_edge(*it, *next_it)); - fence_inserter.add_edge(edget(*it, *next_it)); - } - } - else if(egraph.po_out(next).empty()) - { - /* this path is not connecting a to b => return */ - } - else - { - for(wmm_grapht::edgest::const_iterator - next_it=egraph.po_out(next).begin(); - next_it!=egraph.po_out(next).end(); - ++next_it) - { - if(visited_nodes.find(next_it->first)!=visited_nodes.end()) - continue; - visited_nodes.insert(next_it->first); - - old_path.push_back/*front*/(next_it->first); - const_graph_explore(egraph, next_it->first, end, old_path); - old_path.pop_back/*front*/(); - } - } -} - -void const_graph_visitort::graph_explore_BC( - event_grapht &egraph, - event_idt next, - std::list &old_path, - std::set &edges, - bool porw) -{ - /* TODO: restricts to C_1 U ... U C_n for perf improvement */ - assert(!old_path.empty()); - - fence_inserter.instrumenter.message.debug() << "(BC) explore " - << old_path.front() - << " --...--> " << next - << messaget::eom; - - if(visited_nodes.find(next)!=visited_nodes.end()) - return; - visited_nodes.insert(next); - - /* if all the incoming pos were already visited, add */ - bool no_other_pos = true; - for(wmm_grapht::edgest::const_iterator it= - egraph.po_out(next).begin(); - it!=egraph.po_out(next).end(); - ++it) - if(visited_nodes.find(it->first)==visited_nodes.end()) - { - no_other_pos = false; - break; - } - - if(egraph.po_out(next).empty() || no_other_pos) - { - /* inserts all the pos collected from old_path in edges */ - std::list::const_iterator it=old_path.begin(); - std::list::const_iterator next_it=it; - ++next_it; - for( ; next_it!=old_path.end() && it!=old_path.end(); ++it, ++next_it) - { - const abstract_eventt &e1=egraph[*it]; - const abstract_eventt &e2=egraph[*next_it]; - if(!porw || - (e1.operation==abstract_eventt::operationt::Read && - e2.operation==abstract_eventt::operationt::Write)) - edges.insert(fence_inserter.add_edge(edget(*it, *next_it))); - } - assert(it!=old_path.end()); - } - else - { - for(wmm_grapht::edgest::const_iterator - next_it=egraph.po_out(next).begin(); - next_it!=egraph.po_out(next).end(); - ++next_it) - { - old_path.push_back/*front*/(next_it->first); - graph_explore_BC(egraph, next_it->first, old_path, edges); - old_path.pop_back/*front*/(); - } - } -} - -void const_graph_visitort::const_graph_explore_BC( - event_grapht &egraph, - event_idt next, - std::list &old_path) -{ - /* TODO: restricts to C_1 U ... U C_n */ - assert(old_path.size() > 0); - - if(visited_nodes.find(next)!=visited_nodes.end()) - return; - visited_nodes.insert(next); - - /* if all the incoming pos were already visited, add */ - bool no_other_pos = true; - for(wmm_grapht::edgest::const_iterator it= - egraph.po_out(next).begin(); - it!=egraph.po_out(next).end(); - ++it) - if(visited_nodes.find(it->first)==visited_nodes.end()) - { - no_other_pos = false; - break; - } - - if(egraph.po_out(next).empty() || no_other_pos) - { - /* inserts all the pos collected from old_path in edges */ - std::list::const_iterator it=old_path.begin(); - std::list::const_iterator next_it=it; - ++next_it; - for( ; next_it!=old_path.end() && it!=old_path.end(); ++it, ++next_it) - { - const abstract_eventt &e1=egraph[*it]; - const abstract_eventt &e2=egraph[*next_it]; - if((e1.operation==abstract_eventt::operationt::Read && - e2.operation==abstract_eventt::operationt::Write)) - fence_inserter.add_edge(edget(*it, *next_it)); - } - // NEW - assert(it!=old_path.end()); - } - else - { - for(wmm_grapht::edgest::const_iterator - next_it=egraph.po_out(next).begin(); - next_it!=egraph.po_out(next).end(); - ++next_it) - { - old_path.push_back/*front*/(next_it->first); - const_graph_explore_BC(egraph, next_it->first, old_path); - old_path.pop_back/*front*/(); - } - } -} - -void const_graph_visitort::graph_explore_AC( - event_grapht &egraph, - event_idt next, - std::list &old_path, - std::set &edges, - bool porw) -{ - /* TODO: restricts to C_1 U ... U C_n */ - assert(old_path.size() > 0); - - fence_inserter.instrumenter.message.debug() << "(AC) explore " - << old_path.front() << " --...--> " << next << messaget::eom; - - if(visited_nodes.find(next)!=visited_nodes.end()) - return; - visited_nodes.insert(next); - - /* if all the incoming pos were already visited, add */ - bool no_other_pos = true; - for(wmm_grapht::edgest::const_iterator it= - egraph.po_in(next).begin(); - it!=egraph.po_in(next).end(); - ++it) - if(visited_nodes.find(it->first)==visited_nodes.end()) - { - no_other_pos = false; - break; - } - - if(egraph.po_in(next).empty() || no_other_pos) - { - /* inserts all the pos collected from old_path in edges */ - std::list::const_iterator it=old_path.begin(); - std::list::const_iterator next_it=it; - ++next_it; - for( ; next_it!=old_path.end() && it!=old_path.end(); ++it, ++next_it) - { - const abstract_eventt &e1=egraph[*next_it]; - const abstract_eventt &e2=egraph[*it]; - if(!porw || - (e1.operation==abstract_eventt::operationt::Read && - e2.operation==abstract_eventt::operationt::Write)) - edges.insert(fence_inserter.add_edge(edget(*next_it, *it))); - } - assert(it!=old_path.end()); - } - else - { - for(wmm_grapht::edgest::const_iterator - next_it=egraph.po_in(next).begin(); - next_it!=egraph.po_in(next).end(); - ++next_it) - { - old_path.push_back/*front*/(next_it->first); - graph_explore_AC(egraph, next_it->first, old_path, edges); - old_path.pop_back/*front*/(); - } - } -} - -void const_graph_visitort::const_graph_explore_AC( - event_grapht &egraph, - event_idt next, - std::list &old_path) -{ - /* TODO: restricts to C_1 U ... U C_n */ - assert(old_path.size() > 0); - - if(visited_nodes.find(next)!=visited_nodes.end()) - return; - visited_nodes.insert(next); - - /* if all the incoming pos were already visited, add */ - bool no_other_pos = true; - for(wmm_grapht::edgest::const_iterator it= - egraph.po_in(next).begin(); - it!=egraph.po_in(next).end(); - ++it) - if(visited_nodes.find(it->first)==visited_nodes.end()) - { - no_other_pos = false; - break; - } - - /* if beginning of the thread */ - if(egraph.po_in(next).empty() || no_other_pos) - { - /* inserts all the pos collected from old_path in edges */ - std::list::const_iterator it=old_path.begin(); - std::list::const_iterator next_it=it; - ++next_it; - for( ; next_it!=old_path.end() && it!=old_path.end(); ++it, ++next_it) - { - const abstract_eventt &e1=egraph[*next_it]; - const abstract_eventt &e2=egraph[*it]; - if(e1.operation==abstract_eventt::operationt::Read && - e2.operation==abstract_eventt::operationt::Write) - fence_inserter.add_edge(edget(*next_it, *it)); - } - // NEW - assert(it!=old_path.end()); - } - else - { - for(wmm_grapht::edgest::const_iterator - next_it=egraph.po_in(next).begin(); - next_it!=egraph.po_in(next).end(); - ++next_it) - { - old_path.push_back/*front*/(next_it->first); - const_graph_explore_AC(egraph, next_it->first, old_path); - old_path.pop_back/*front*/(); - } - } -} - -void const_graph_visitort::PT( - const edget &e, - std::set &edges) -{ - visited_nodes.clear(); - -// if(!e.is_po) /* e is in po^+\po */ is_po is a flag set manually, do not -// use it for checks!! - const wmm_grapht::edgest &list_po_out= - fence_inserter.instrumenter.egraph.po_out(e.first); - if(list_po_out.find(e.second)==list_po_out.end()) - { -#ifdef BTWN1 - event_grapht &egraph=fence_inserter.instrumenter.egraph; - - /// all the pos in between - for(wmm_grapht::edgest::const_iterator - next_it=egraph.po_out(e.first).begin(); - next_it!=egraph.po_out(e.first).end(); - ++next_it) - { - std::list new_path; - new_path.push_back(e.first); - new_path.push_back(next_it->first); - graph_explore(egraph, next_it->first, e.second, new_path, edges); - } -#elif defined BTWN4 - /* all the pos+ intersections inbetween */ - /* TODO */ - /* when detecting intersections, add them to a map thread->edges - then for BTWN4, enumerates all the edges of the thread of e and - check whether e.first-po-> edge.first /\ edge.second-po->e.second, - using egraph.are_po_ordered. */ -#else - throw "BTWN definition not selected!"; // NOLINT(readability/throw) -#endif - } - else - /* reflexive -- only when in pos */ - edges.insert(fence_inserter.map_from_e[e]); -} - -/// \par parameters: e in comWR /\ C_j (invisible variables) -/// \return e's in po /\ C (problem variables) -void const_graph_visitort::CT( - const edget &edge, - std::set &edges) -{ - event_grapht &egraph=fence_inserter.instrumenter.egraph; - - /* the edge can be in the reversed order (back-edge) */ - const abstract_eventt &test_first=egraph[edge.first]; - const abstract_eventt &test_second=egraph[edge.second]; - assert(test_first.operation!=test_second.operation); - - const event_idt first= - (test_first.operation==abstract_eventt::operationt::Write? - edge.first: - edge.second); - const event_idt second= - (test_second.operation==abstract_eventt::operationt::Read? - edge.second: - edge.first); - - /* TODO: AC + restricts to C_1 U ... U C_n */ - visited_nodes.clear(); - - /* if one event only on this thread of the cycle, discard */ - if(!egraph.po_in(first).empty()) - { - for(wmm_grapht::edgest::const_iterator - next_it=egraph.po_in(first).begin(); - next_it!=egraph.po_in(first).end(); - ++next_it) - { - std::list new_path; - new_path.push_back(first); - new_path.push_back(next_it->first); - graph_explore_AC(egraph, next_it->first, new_path, edges); - } - } - - if(!egraph.po_out(second).empty()) - { - for(wmm_grapht::edgest::const_iterator - next_it=egraph.po_out(second).begin(); - next_it!=egraph.po_out(second).end(); - ++next_it) - { - std::list new_path; - new_path.push_back(second); - new_path.push_back(next_it->first); - graph_explore_BC(egraph, next_it->first, new_path, edges); - } - } -} - -/// \par parameters: e in comWR /\ C_j (invisible variables) -/// \return e's in poRW/\ C (problem variables) -void const_graph_visitort::CT_not_powr( - const edget &edge, - std::set &edges) -{ - event_grapht &egraph=fence_inserter.instrumenter.egraph; - - /* the edge can be in the reversed order (back-edge) */ - const abstract_eventt &test_first=egraph[edge.first]; - const abstract_eventt &test_second=egraph[edge.second]; - assert(test_first.operation!=test_second.operation); - - const event_idt first= - (test_first.operation==abstract_eventt::operationt::Write? - edge.first: - edge.second); - const event_idt second= - (test_second.operation==abstract_eventt::operationt::Read? - edge.second: - edge.first); - - /* TODO: AC + restricts to C_1 U ... U C_n */ - visited_nodes.clear(); - - if(!egraph.po_in(first).empty()) - { - for(wmm_grapht::edgest::const_iterator - next_it=egraph.po_in(first).begin(); - next_it!=egraph.po_in(first).end(); - ++next_it) - { - std::list new_path; - new_path.push_back(first); - new_path.push_back(next_it->first); - graph_explore_AC(egraph, next_it->first, new_path, edges, true); - } - } - - if(!egraph.po_out(second).empty()) - { - for(wmm_grapht::edgest::const_iterator - next_it=egraph.po_out(second).begin(); - next_it!=egraph.po_out(second).end(); - ++next_it) - { - std::list new_path; - new_path.push_back(second); - new_path.push_back(next_it->first); - graph_explore_BC(egraph, next_it->first, new_path, edges, true); - } - } -} diff --git a/src/musketeer/graph_visitor.h b/src/musketeer/graph_visitor.h deleted file mode 100644 index 2df40b7e1d3..00000000000 --- a/src/musketeer/graph_visitor.h +++ /dev/null @@ -1,75 +0,0 @@ -/*******************************************************************\ - -Module: graph visitor for computing edges involved for fencing - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// graph visitor for computing edges involved for fencing - -#ifndef CPROVER_MUSKETEER_GRAPH_VISITOR_H -#define CPROVER_MUSKETEER_GRAPH_VISITOR_H - -#include -#include - -#include - -class fence_insertert; - -class const_graph_visitort -{ -protected: - typedef event_grapht::critical_cyclet::delayt edget; - - fence_insertert &fence_inserter; - std::set visited_nodes; - -public: - /* computes the PT (btwn), CT (cml) and IT (cntrl) */ - void PT(const edget &e, std::set &edges); - void CT(const edget &e, std::set &edges); - void CT_not_powr(const edget &e, std::set &edges); - void IT(const edget &e, std::set &edges); - - void const_graph_explore( - event_grapht &graph, - event_idt next, - event_idt end, - std::list &old_path); - void graph_explore(event_grapht &graph, event_idt next, event_idt end, - std::list &old_path, std::set &edges); - void graph_explore_BC(event_grapht &egraph, event_idt next, - std::list &old_path, std::set &edges, bool porw); - void graph_explore_AC(event_grapht &egraph, event_idt next, - std::list &old_path, std::set &edges, bool porw); - void graph_explore_BC( - event_grapht &egraph, event_idt next, - std::list &old_path, - std::set &edges) - { - graph_explore_BC(egraph, next, old_path, edges, false); - } - - void graph_explore_AC( - event_grapht &egraph, - event_idt next, - std::list &old_path, - std::set &edges) - { - graph_explore_AC(egraph, next, old_path, edges, false); - } - - void const_graph_explore_BC(event_grapht &egraph, event_idt next, - std::list &old_path); - void const_graph_explore_AC(event_grapht &egraph, event_idt next, - std::list &old_path); - - explicit const_graph_visitort(fence_insertert &_fence_inserter) - : fence_inserter(_fence_inserter) - {} -}; - -#endif // CPROVER_MUSKETEER_GRAPH_VISITOR_H diff --git a/src/musketeer/ilp.h b/src/musketeer/ilp.h deleted file mode 100644 index c7ce87537a5..00000000000 --- a/src/musketeer/ilp.h +++ /dev/null @@ -1,70 +0,0 @@ -/*******************************************************************\ - -Module: ILP structure - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// ILP structure - -#ifdef HAVE_GLPK -#include -#endif - -#include - -#ifndef CPROVER_MUSKETEER_ILP_H -#define CPROVER_MUSKETEER_ILP_H - -#ifdef HAVE_GLPK -class ilpt -{ -protected: - glp_iocp parm; - unsigned matrix_size; - -public: - glp_prob *lp; - - std::vector imat; - std::vector jmat; - std::vector vmat; - - ilpt() - { - glp_init_iocp(&parm); - parm.msg_lev=GLP_MSG_OFF; - parm.presolve=GLP_ON; - - lp=glp_create_prob(); - glp_set_prob_name(lp, "fence optimisation"); - glp_set_obj_dir(lp, GLP_MIN); - } - - ~ilpt() - { - glp_delete_prob(lp); - } - - void set_size(unsigned mat_size) - { - matrix_size=mat_size; - imat.resize(mat_size+1); - jmat.resize(mat_size+1); - vmat.resize(mat_size+1); - } - - void solve() - { - glp_load_matrix(lp, matrix_size, imat.data(), - jmat.data(), vmat.data()); - glp_intopt(lp, &parm); - } -}; -#else -class ilpt {}; -#endif - -#endif // CPROVER_MUSKETEER_ILP_H diff --git a/src/musketeer/infer_mode.h b/src/musketeer/infer_mode.h deleted file mode 100644 index 66ab97cdf36..00000000000 --- a/src/musketeer/infer_mode.h +++ /dev/null @@ -1,20 +0,0 @@ -/*******************************************************************\ - - Module: - - Author: Vincent Nimal - -\*******************************************************************/ - - -#ifndef CPROVER_MUSKETEER_INFER_MODE_H -#define CPROVER_MUSKETEER_INFER_MODE_H - -enum infer_modet -{ - INFER=0, - USER_DEF=1, - USER_ASSERT=2 -}; - -#endif // CPROVER_MUSKETEER_INFER_MODE_H diff --git a/src/musketeer/languages.cpp b/src/musketeer/languages.cpp deleted file mode 100644 index 8ae85e2e27a..00000000000 --- a/src/musketeer/languages.cpp +++ /dev/null @@ -1,21 +0,0 @@ -/*******************************************************************\ - -Module: Language Registration - -Author: - -\*******************************************************************/ - -/// \file -/// Language Registration - -#include "musketeer_parse_options.h" - -#include - -#include - -void goto_fence_inserter_parse_optionst::register_languages() -{ - register_language(new_ansi_c_language); -} diff --git a/src/musketeer/musketeer_main.cpp b/src/musketeer/musketeer_main.cpp deleted file mode 100644 index b233c0080a0..00000000000 --- a/src/musketeer/musketeer_main.cpp +++ /dev/null @@ -1,18 +0,0 @@ -/*******************************************************************\ - -Module: Main Module - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// Main Module - -#include "musketeer_parse_options.h" - -int main(int argc, const char **argv) -{ - goto_fence_inserter_parse_optionst parse_options(argc, argv); - return parse_options.main(); -} diff --git a/src/musketeer/musketeer_parse_options.cpp b/src/musketeer/musketeer_parse_options.cpp deleted file mode 100644 index fabb89a3add..00000000000 --- a/src/musketeer/musketeer_parse_options.cpp +++ /dev/null @@ -1,457 +0,0 @@ -/*******************************************************************\ - -Module: Main Module - -Author: - -\*******************************************************************/ - -/// \file -/// Main Module - -#include "musketeer_parse_options.h" - -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef POINTER_ANALYSIS_FI -#include -#else -#include -#endif - -#include -#include - -#include - -#include -#include - -#include "propagate_const_function_pointers.h" -#include "version.h" -#include "fencer.h" -#include "fence_shared.h" -#include "pensieve.h" -#include "replace_async.h" -#include "infer_mode.h" - -void goto_fence_inserter_parse_optionst::set_verbosity() -{ - unsigned int v=8; // default - - if(cmdline.isset("verbosity")) - { - v=unsafe_string2unsigned(cmdline.get_value("verbosity")); - if(v>10) - v=10; - } - - ui_message_handler.set_verbosity(v); -} - -/// invoke main modules -int goto_fence_inserter_parse_optionst::doit() -{ - if(cmdline.isset("version")) - { - std::cout << MUSKETEER_VERSION << '\n'; - return 0; - } - - if(cmdline.args.size()!=1 && cmdline.args.size()!=2) - { - help(); - return 0; - } - - set_verbosity(); - - try - { - register_languages(); - - goto_functionst goto_functions; - - get_goto_program(goto_functions); - - instrument_goto_program(goto_functions); - - // write new binary? - if(cmdline.args.size()==2) - { - status() << "Writing GOTO program to " << cmdline.args[1] << eom; - - if(write_goto_binary( - cmdline.args[1], symbol_table, goto_functions, get_message_handler())) - return 1; - else - return 0; - } - - // help(); - return 0; - } - - catch(const char *e) - { - error() << e << eom; - return 11; - } - - catch(const std::string e) - { - error() << e << eom; - return 11; - } - - catch(int) - { - return 11; - } - - catch(std::bad_alloc) - { - error() << "Out of memory" << eom; - return 11; - } -} - -void goto_fence_inserter_parse_optionst::get_goto_program( - goto_functionst &goto_functions) -{ - status() << "Reading GOTO program from " << cmdline.args[0] << eom; - - if(read_goto_binary(cmdline.args[0], - symbol_table, goto_functions, get_message_handler())) - throw 0; -} - -void goto_fence_inserter_parse_optionst::instrument_goto_program( - goto_functionst &goto_functions) -{ - optionst options; - - // unwind loops - if(cmdline.isset("unwind")) - { - status() << "Unwinding loops" << eom; - options.set_option("unwind", cmdline.get_value("unwind")); - } - - // we add the library, as some analyses benefit - - link_to_library(symbol_table, goto_functions, ui_message_handler); - - namespacet ns(symbol_table); - - if( cmdline.isset("mm") - || cmdline.isset("all-shared") - || cmdline.isset("volatile") - || cmdline.isset("pensieve") - || cmdline.isset("naive") - || cmdline.isset("all-shared-aeg") ) - { - if(cmdline.isset("remove-function-pointers")) - { - status() << "remove soundly function pointers" << eom; - remove_function_pointers( - get_message_handler(), - symbol_table, - goto_functions, - cmdline.isset("pointer-check")); - } - - if(cmdline.isset("async")) - { - status() << "Replace pthread_creates by __CPROVER_ASYNC_0:" << eom; - replace_async(ns, goto_functions); - goto_functions.update(); - } - - // do partial inlining - status() << "Partial Inlining" << eom; - goto_partial_inline(goto_functions, ns, ui_message_handler); - - if(cmdline.isset("const-function-pointer-propagation")) - { - /* propagate const pointers to functions */ - status() << "Propagate Constant Function Pointers" << eom; - propagate_const_function_pointers(symbol_table, goto_functions, - get_message_handler()); - } - - // goto_functions.output(ns, std::cout); - // return; -#if 0 - status() << "Function Pointer Removal" << eom; - remove_function_pointers( - get_message_handler(), - symbol_table, - goto_functions, - cmdline.isset("pointer-check"); -#endif - - status() << "Pointer Analysis" << eom; -#ifdef POINTER_ANALYSIS_FI - value_set_analysis_fit value_set_analysis(ns); -#else - value_set_analysist value_set_analysis(ns); -#endif - -#ifndef LOCAL_MAY - value_set_analysis(goto_functions); -#endif - - status() << "Removing asm code" << eom; - remove_asm(symbol_table, goto_functions); - goto_functions.update(); - - if(cmdline.isset("all-shared")) - { - status() << "Shared variables accesses detection" << eom; - fence_all_shared(get_message_handler(), value_set_analysis, symbol_table, - goto_functions); - // simple analysis, coupled with script to insert; - // does not transform the goto-binary - return; - } - if(cmdline.isset("all-shared-aeg")) - { - status() << "Shared variables accesses detection (CF)" << eom; - fence_all_shared_aeg(get_message_handler(), value_set_analysis, - symbol_table, goto_functions); - // simple analysis, coupled with script to insert; - // does not transform the goto-binary - return; - } - else if(cmdline.isset("volatile")) - { - status() << "Detection of variables declared volatile" << eom; - - fence_volatile(get_message_handler(), value_set_analysis, symbol_table, - goto_functions); - // simple analysis, coupled with script to insert; - // does not transform the goto-binary - return; - } - else if(cmdline.isset("pensieve") || cmdline.isset("naive")) - { - status() << "Delay-set analysis" << eom; - - const unsigned unwind_loops= - cmdline.isset("unwind") ? - unsafe_string2unsigned(cmdline.get_value("unwind")) : 0; - - const unsigned max_po_trans= - cmdline.isset("max-po-trans") ? - unsafe_string2unsigned(cmdline.get_value("max-po-trans")) : 0; - - fence_pensieve( - value_set_analysis, - symbol_table, - goto_functions, - unwind_loops, - max_po_trans, - !cmdline.isset("no-po-rendering"), - cmdline.isset("render-cluster-file"), - cmdline.isset("render-cluster-function"), - cmdline.isset("naive"), - get_message_handler()); - // simple analysis, coupled with script to insert; - // does not transform the goto-binary - return; - } - else if(cmdline.isset("mm")) - { - std::string mm=cmdline.get_value("mm"); - memory_modelt model; - - status() << "Fence detection for " << mm - << " via critical cycles and ILP" << eom; - - // strategy of instrumentation - instrumentation_strategyt inst_strategy; - if(cmdline.isset("one-event-per-cycle")) - inst_strategy=one_event_per_cycle; - else if(cmdline.isset("minimum-interference")) - inst_strategy=min_interference; - else if(cmdline.isset("read-first")) - inst_strategy=read_first; - else if(cmdline.isset("write-first")) - inst_strategy=write_first; - else if(cmdline.isset("my-events")) - inst_strategy=my_events; - else - /* default: instruments all unsafe pairs */ - inst_strategy=all; - - const unsigned unwind_loops = - cmdline.isset("unwind") ? - unsafe_string2unsigned(cmdline.get_value("unwind")) : 0; - - const unsigned max_var = - cmdline.isset("max-var") ? - unsafe_string2unsigned(cmdline.get_value("max-var")) : 0; - - const unsigned max_po_trans = - cmdline.isset("max-po-trans") ? - unsafe_string2unsigned(cmdline.get_value("max-po-trans")) : 0; - - if(mm=="tso") - { - status() << "Adding weak memory (TSO) Instrumentation" << eom; - model=TSO; - } - else if(mm=="pso") - { - status() << "Adding weak memory (PSO) Instrumentation" << eom; - model=PSO; - } - else if(mm=="rmo") - { - status() << "Adding weak memory (RMO) Instrumentation" << eom; - model=RMO; - } - else if(mm=="power") - { - status() << "Adding weak memory (Power) Instrumentation" << eom; - model=Power; - } - else - { - status/*error*/() << "Unknown weak memory model" << eom; - model=Unknown; - } - - /* inference mode */ - infer_modet infer_mode=INFER; - - if(cmdline.isset("userdef")) - infer_mode=USER_DEF; - - loop_strategyt loops=arrays_only; - - if(cmdline.isset("force-loop-duplication")) - loops=all_loops; - if(cmdline.isset("no-loop-duplication")) - loops=no_loop; - - /*if(model!=Unknown)*/ - fence_weak_memory( - model, - value_set_analysis, - symbol_table, - goto_functions, - cmdline.isset("scc"), - inst_strategy, - unwind_loops, - !cmdline.isset("cfg-kill"), - cmdline.isset("no-dependencies"), - loops, - max_var, - max_po_trans, - !cmdline.isset("no-po-rendering"), - cmdline.isset("render-cluster-file"), - cmdline.isset("render-cluster-function"), - cmdline.isset("cav11"), - cmdline.isset("hide-internals"), - cmdline.isset("print-graph"), - infer_mode, - get_message_handler(), - cmdline.isset("ignore-arrays")); - } - } - - // add failed symbols - add_failed_symbols(symbol_table); - - // recalculate numbers, etc. - goto_functions.update(); - - // add loop ids - goto_functions.compute_loop_numbers(); - - // label the assertions - label_properties(goto_functions); -} - -/// display command line help -void goto_fence_inserter_parse_optionst::help() -{ - std::cout << - "\n" - "* * musketeer " MUSKETEER_VERSION " * *\n" - "\n" - " ~__\n" - " |)\n" - " /|_____\n" - " / |\n" - " /|\n" - " / |\n" - "\n" - "Usage: Purpose:\n" - "\n" - " musketeer [-?] [-h] [--help] show help\n" - "\n" - "Main options:\n" - "\n" - // NOLINTNEXTLINE(whitespace/line_length) - " --mm detects all the fences to insert for a weak\n" - " memory model\n" - "\n" - "Alternative methods:\n" - "\n" - // NOLINTNEXTLINE(whitespace/line_length) - " --all-shared detects and fences all the accesses to shared\n" - " variables (context insensitive)\n" - // NOLINTNEXTLINE(whitespace/line_length) - " --all-shared-aeg detects all the accesses to shared variables\n" - " (context sensitive)\n" - // NOLINTNEXTLINE(whitespace/line_length) - " --volatile detects all the accesses to volatile variables\n" - " --pensieve detects all the pairs to be delayed with\n" - " Pensieve's criteria (context sensitive)\n" - // NOLINTNEXTLINE(whitespace/line_length) - " --naive detects all the pairs to be delayed in a naive\n" - " approach (context sensitive)\n" - "\n" - "Options:\n" - "\n" - " --remove-function-pointers removes soundly function pointers based on\n" - " their signatures\n" - // NOLINTNEXTLINE(whitespace/line_length) - " --async replaces all the pthread_creates by CPROVER_ASYNC\n" - " --const-function-pointer-propagation\n" - // NOLINTNEXTLINE(whitespace/line_length) - " propagates the constant pointers to functions\n" - // NOLINTNEXTLINE(whitespace/line_length) - " --scc detects cycles in parallel (one thread/SCC)\n" - // NOLINTNEXTLINE(whitespace/line_length) - " --force-loop-duplication duplicates the bodies of all the loops, and not\n" - " only those with arrays accesses\n" - " --no-loop-duplication constructs back-edges for all the loops\n" - // NOLINTNEXTLINE(whitespace/line_length) - " --no-dependencies ignores existing dependencies in the program\n" - " --print-graph prints the AEG into graph.dot\n" - " --max-po-var limits the number of variables per cycle\n" - " --max-po-trans limits the size of pos^+ in terms of pos\n" - // NOLINTNEXTLINE(whitespace/line_length) - " --ignore-arrays ignores cycles with multiple accesses to the\n" - " same array\n" - "\n"; -} diff --git a/src/musketeer/musketeer_parse_options.h b/src/musketeer/musketeer_parse_options.h deleted file mode 100644 index 13d0a07ef19..00000000000 --- a/src/musketeer/musketeer_parse_options.h +++ /dev/null @@ -1,59 +0,0 @@ -/*******************************************************************\ - -Module: Command Line Parsing - -Author: - -\*******************************************************************/ - -/// \file -/// Command Line Parsing - -#ifndef CPROVER_MUSKETEER_MUSKETEER_PARSE_OPTIONS_H -#define CPROVER_MUSKETEER_MUSKETEER_PARSE_OPTIONS_H - -#include -#include - -#include -#include - -#define GOTO_FENCE_INSERTER_OPTIONS \ - "(scc)(one-event-per-cycle)(verbosity):" \ - "(mm):(my-events)(unwind):" \ - "(max-var):(max-po-trans):(ignore-arrays)(remove-function-pointers)" \ - "(cfg-kill)(no-dependencies)(force-loop-duplication)(no-loop-duplication)" \ - "(no-po-rendering)(render-cluster-file)(render-cluster-function)" \ - "(cav11)(version)(const-function-pointer-propagation)(print-graph)" \ - "(volatile)(all-shared)(pensieve)(naive)(all-shared-aeg)(async)(userdef)" - -class goto_fence_inserter_parse_optionst: - public parse_options_baset, - public language_uit -{ -public: - virtual int doit(); - virtual void help(); - - goto_fence_inserter_parse_optionst(int argc, const char **argv): - parse_options_baset(GOTO_FENCE_INSERTER_OPTIONS, argc, argv), - language_uit(cmdline, ui_message_handler), - ui_message_handler(cmdline, "musketeer") - { - } - -protected: - ui_message_handlert ui_message_handler; - - virtual void register_languages(); - - void get_goto_program( - goto_functionst &goto_functions); - - void instrument_goto_program( - goto_functionst &goto_functions); - - void set_verbosity(); -}; - -#endif // CPROVER_MUSKETEER_MUSKETEER_PARSE_OPTIONS_H diff --git a/src/musketeer/pensieve.cpp b/src/musketeer/pensieve.cpp deleted file mode 100644 index d46397f74a3..00000000000 --- a/src/musketeer/pensieve.cpp +++ /dev/null @@ -1,72 +0,0 @@ -/*******************************************************************\ - -Module: - -Author: Vincent Nimal - -\*******************************************************************/ - -#include "pensieve.h" - -#include -#include -#include - -#include -#include -#include - -void fence_pensieve( - value_setst &value_sets, - symbol_tablet &symbol_table, - goto_functionst &goto_functions, - unsigned unwinding_bound, - unsigned input_max_po_trans, - bool render_po, - bool render_file, - bool render_function, - bool naive_mode, - message_handlert &message_handler) -{ - messaget message(message_handler); - - message.status() << "--------" << messaget::eom; - - // all access to shared variables is pushed into assignments - Forall_goto_functions(f_it, goto_functions) - if(f_it->first!=CPROVER_PREFIX "initialize" && - f_it->first!=goto_functionst::entry_point()) - introduce_temporaries(value_sets, symbol_table, f_it->first, - f_it->second.body, -#ifdef LOCAL_MAY - f_it->second, -#endif - message); - message.status() << "Temporary variables added" << messaget::eom; - - unsigned max_thds = 0; - - instrumenter_pensievet instrumenter(symbol_table, goto_functions, message); - max_thds=instrumenter.goto2graph_cfg(value_sets, Power, true, no_loop); - message.status() << "Abstract event graph computed" << messaget::eom; - - if(input_max_po_trans!=0) - instrumenter.set_parameters_collection(0, input_max_po_trans); - else - instrumenter.set_parameters_collection(max_thds); - - /* necessary for correct printings */ - namespacet ns(symbol_table); - - if(naive_mode) - instrumenter.collect_pairs_naive(ns); - else - instrumenter.collect_pairs(ns); - - /* removes potential skips */ - Forall_goto_functions(f_it, goto_functions) - remove_skip(f_it->second.body); - - // update counters etc. - goto_functions.update(); -} diff --git a/src/musketeer/pensieve.h b/src/musketeer/pensieve.h deleted file mode 100644 index 9513a26c433..00000000000 --- a/src/musketeer/pensieve.h +++ /dev/null @@ -1,35 +0,0 @@ -/*******************************************************************\ - -Module: Fence insertion following criteria of Pensieve (PPoPP'05) - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// Fence insertion following criteria of Pensieve (PPoPP'05) - -#ifndef CPROVER_MUSKETEER_PENSIEVE_H -#define CPROVER_MUSKETEER_PENSIEVE_H - -#include -#include - -class value_setst; -class goto_functionst; -class symbol_tablet; -class message_handlert; - -void fence_pensieve( - value_setst &value_sets, - symbol_tablet &symbol_table, - goto_functionst &goto_functions, - unsigned unwinding_bound, - unsigned max_po_trans, - bool render_po, - bool render_file, - bool render_function, - bool naive_mode, - message_handlert &message_handler); - -#endif // CPROVER_MUSKETEER_PENSIEVE_H diff --git a/src/musketeer/propagate_const_function_pointers.cpp b/src/musketeer/propagate_const_function_pointers.cpp deleted file mode 100644 index e58efe92429..00000000000 --- a/src/musketeer/propagate_const_function_pointers.cpp +++ /dev/null @@ -1,568 +0,0 @@ -/*******************************************************************\ - -Module: Constant Function Pointer Propagation - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// Constant Function Pointer Propagation - -#include "propagate_const_function_pointers.h" - -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include - -class const_function_pointer_propagationt -{ -protected: - symbol_tablet &symbol_table; - goto_functionst &goto_functions; - const namespacet ns; - messaget &message; - - std::unordered_map map_unique; - - /* maps const pointer to function (expression + arguments at call) */ - std::unordered_map pointer_to_fun; - - /* maps const pointer to where it was defined in the call function stack */ - std::unordered_map pointer_to_stack; - - /* where a const function to inline was the first time invoked */ - std::unordered_map fun_id_to_invok; - - /* stack of callsites: provides functions and location in the goto-program */ - goto_programt::const_targetst callsite_stack; - - bool resolve( - const irep_idt &symb, - symbol_exprt &goto_function, - unsigned &stack_scope) - { - message.debug() << "I resolve " << symb << " with " - << pointer_to_fun[symb].get_identifier() << messaget::eom; - if(pointer_to_fun.find(symb)==pointer_to_fun.end()) - return false; - else - { - goto_function=pointer_to_fun[symb]; - stack_scope=pointer_to_stack[symb]; - return true; - } - } - - /* TODO: use the whole name rather than the base one, to avoid - overwriting? - Yes! Pure propagation of pointers only intra-proc. At call, arguments - and pointed functions stored in the table -- no need to keep the match - between two pointers inter-proc. */ - bool add(const irep_idt &symb, const symbol_exprt &goto_function) - { - return add(symb, goto_function, callsite_stack.size()); - } - - bool add(const irep_idt &symb, - const symbol_exprt &goto_function, - unsigned scope) - { - pointer_to_fun[symb]=goto_function; - pointer_to_stack[symb]=scope; - - const symbolt &function_symb=ns.lookup(goto_function.get_identifier()); - if(fun_id_to_invok.find(function_symb.base_name)==fun_id_to_invok.end()) - fun_id_to_invok[function_symb.base_name]=scope; - - return true; - } - - bool remove(const irep_idt &symb) - { - assert(pointer_to_fun.find(symb)!=pointer_to_fun.end()); - pointer_to_fun.erase(symb); - return true; - } - - bool has(const irep_idt &symb) const - { - return pointer_to_fun.find(symb)!=pointer_to_fun.end(); - } - - symbol_exprt get(const irep_idt &symb) - { - return pointer_to_fun[symb]; - } - - /* to keep track of the visited functions and avoid recursion */ - std::set functions_met; - - void propagate(const irep_idt &function); - - void dup_caller_and_inline_callee(const symbol_exprt &function, - unsigned stack_scope); - - /* to keep track of the constant function pointers passed as arguments */ - class arg_stackt final - { - typedef std::set data_typet; - data_typet data; - const_function_pointer_propagationt &cfpp; - - public: - // NOLINTNEXTLINE(readability/identifiers) - typedef data_typet::iterator iterator; - // NOLINTNEXTLINE(readability/identifiers) - typedef data_typet::const_iterator const_iterator; - // NOLINTNEXTLINE(readability/identifiers) - typedef data_typet::value_type value_type; - - std::pair insert(const value_type &t) - { - return data.insert(t); - } - - explicit arg_stackt(const_function_pointer_propagationt &_cfpp): - cfpp(_cfpp) - {} - void add_args(const symbol_exprt &const_function, - goto_programt::instructionst::iterator it); - void remove_args(); - }; - -public: - const_function_pointer_propagationt(symbol_tablet &_symbol_table, - goto_functionst &_goto_functions, messaget &_message) - :symbol_table(_symbol_table), goto_functions(_goto_functions), - ns(_symbol_table), message(_message) - {} - - /* Note that it only propagates from MAIN, following the CFG, without - resolving non-constant function pointers. */ - void propagate() - { - propagate(goto_functionst::entry_point()); - } -}; - -/// \par parameters: 'it' pointing to the callsite to update, 'function' the -/// function -/// actually called, 'stack_scope' the place where the constant was -/// defined in the call stack -void const_function_pointer_propagationt::dup_caller_and_inline_callee( - const symbol_exprt &const_function, - unsigned stack_scope) -{ - assert(!callsite_stack.empty()); - - /* for the reconstruction of the {call,callsite}_stacks after the - duplication */ - goto_programt::const_targetst new_callsite_stack; - - goto_programt::const_targetst::const_iterator - callsite=callsite_stack.begin(); - - std::string last_suffix=""; - - for(unsigned current_call=callsite_stack.size(); - current_call>=stack_scope; - --current_call) - { - message.debug() << "current_call=" << current_call << " stack_scope=" - << stack_scope << " callsite_stack.size()=" << callsite_stack.size() - << messaget::eom; - assert(callsite!=callsite_stack.end()); - - message.debug() << callsite_stack.size() << messaget::eom; - - const irep_idt function_id=(*callsite)->function; - - goto_functionst::goto_functiont* pfunction_dup=&goto_functions - .function_map[function_id]; - - std::string suffix="$"; - - if(current_call>stack_scope) - { - /* unique suffix */ - if(map_unique.find(function_id)!=map_unique.end()) - { - suffix+=std::to_string(map_unique[function_id]); - ++map_unique[function_id]; - } - else - { - map_unique[function_id]=0; - suffix+=std::to_string(map_unique[function_id]); - ++map_unique[function_id]; - } - - /* creates a new, unique copy of the function */ - message.debug() << "duplicate function: " << function_id - << messaget::eom; - const irep_idt function_new_id=id2string(function_id)+suffix; - - goto_functionst::goto_functiont &function_dup= - goto_functions.function_map[function_new_id]; - function_dup.copy_from(goto_functions.function_map[function_id]); - pfunction_dup=&function_dup; - - for(goto_programt::targett it=function_dup.body.instructions.begin(); - it!=function_dup.body.instructions.end(); ++it) - it->function=function_new_id; - - assert(goto_functions.function_map[function_new_id].body.empty()); - - /* removes in definition the argument leading to the const_function */ - code_typet::parameterst &args=function_dup.type.parameters(); - for(code_typet::parameterst::iterator it=args.begin(); - it!=args.end(); ++it) - { - if(pointer_to_fun.find(it->get_identifier())!=pointer_to_fun.end() - && pointer_to_fun[it->get_identifier()]==const_function) - args.erase(it); - } - - /* updates the table of symbols */ - const symbolt &fun_symb=ns.lookup(function_id); - symbolt dup_fun_symb; - dup_fun_symb=fun_symb; - dup_fun_symb.name=id2string(dup_fun_symb.name)+suffix; - dup_fun_symb.base_name=id2string(dup_fun_symb.base_name)+suffix; - dup_fun_symb.pretty_name=id2string(dup_fun_symb.pretty_name)+suffix; - symbol_table.add(dup_fun_symb); - - goto_functions.update(); - message.debug() << "new function " << function_new_id << " created." - << messaget::eom; - message.debug() << "new function " - << goto_functions.function_map[function_new_id].body.instructions - .front().function << " created." << messaget::eom; - } - - if(current_callbody.instructions; - goto_programt::targett it=new_instructions.begin(); - // beurk -- should use location_number or something unique per - // instruction but shared between two copies of a same goto-program - for( ; - it->source_location!=(*callsite)->source_location && - it!=new_instructions.end(); - ++it) - { - } - - assert(it->source_location==(*callsite)->source_location); - exprt &function_called=to_code_function_call(it->code).function(); - assert(function_called.id()==ID_symbol); - symbol_exprt &symbol_fun_called=to_symbol_expr(function_called); - symbol_fun_called.set_identifier( - id2string(symbol_fun_called.get_identifier())+last_suffix); - - /* removes the constant pointer from the arguments passed at call */ - code_function_callt::argumentst &args=to_code_function_call(it->code) - .arguments(); - for(code_function_callt::argumentst::iterator arg_it=args.begin(); - arg_it!=args.end(); ++arg_it) - { - if(arg_it->id()==ID_symbol) - { - const symbol_exprt &symb_arg=to_symbol_expr(*arg_it); - if(symb_arg.get_identifier()==const_function.get_identifier() - || (pointer_to_fun.find(symb_arg.get_identifier()) - !=pointer_to_fun.end() - && pointer_to_fun[symb_arg.get_identifier()]==const_function) ) - args.erase(arg_it); - } - else if(arg_it->id()==ID_address_of) - { - const address_of_exprt &add_arg=to_address_of_expr(*arg_it); - if(add_arg.object().id()==ID_symbol - && to_symbol_expr(add_arg.object()).get_identifier() - ==const_function.get_identifier()) - args.erase(arg_it); - } - } - - new_callsite_stack.push_back(it); - } - else - { - message.debug() << "we first modify the first caller" << messaget::eom; - - /* initially, inlines the callee function in the duplicate of the last - caller */ - goto_programt::instructionst &new_instructions= - pfunction_dup->body.instructions; - goto_programt::targett it=new_instructions.begin(); - // beurk -- should use location_number or something unique per - // instruction but shared between two copies of a same goto-program - for( ; - it->source_location!=(*callsite)->source_location && - it!=new_instructions.end(); - ++it) - { - } - - message.debug() << "callsite targeted: " << (*callsite)->source_location - << " function: " << const_function.get_identifier() << messaget::eom; - - assert(it->source_location==(*callsite)->source_location); - message.debug() << it->code.get_statement() << messaget::eom; - to_code_function_call(it->code).function()=const_function; - - new_callsite_stack.push_back(it); - } - - last_suffix=suffix; - ++callsite; - } - - /* and updates the call_stack and callsite_stack */ - // new_callsite_stack.splice(new_callsite_stack.end(), callsite_stack, - // callsite, callsite_stack.end()); - for(goto_programt::const_targetst::const_iterator it=callsite; - it!=callsite_stack.end(); ++it) - new_callsite_stack.push_back(*it); - - assert(callsite_stack.size()==new_callsite_stack.size()); - callsite_stack.swap(new_callsite_stack); -} - -/// adds const pointers (instantiated here or propagated) passed as arguments in -/// the map -void const_function_pointer_propagationt::arg_stackt::add_args( - const symbol_exprt &const_function, - goto_programt::instructionst::iterator it) -{ - /* if constant pointers passed as arguments, add the names of the parameters - in the function definition to the map */ - const code_function_callt::argumentst &arg= - to_code_function_call(it->code).arguments(); - - /* retrieve the corresponding parameters expressions in the - function definition */ - assert(cfpp.goto_functions.function_map.find( - const_function.get_identifier())!=cfpp.goto_functions.function_map.end()); - - goto_functionst::goto_functiont &cor_function= - cfpp.goto_functions.function_map[const_function.get_identifier()]; - - code_typet::parameterst::const_iterator cor_arg_it= - cor_function.type.parameters().begin(); - - for(code_function_callt::argumentst::const_iterator arg_it=arg.begin(); - arg_it!=arg.end(); - ++arg_it, ++cor_arg_it) - { - assert(cor_arg_it!=cor_function.type.parameters().end()); - - if(arg_it->id()!=ID_symbol && arg_it->id()!=ID_address_of) - continue; - - if(arg_it->id()==ID_address_of) - { - if(to_address_of_expr(*arg_it).object().id()!=ID_symbol) - continue; - - const exprt &arg_expr=to_address_of_expr(*arg_it).object(); - assert(arg_expr.id()==ID_symbol); - const symbol_exprt &arg_symbol_expr=to_symbol_expr(arg_expr); - - // const symbolt &arg_symbol= - // cfpp.symbol_table.lookup(arg_symbol_expr.get_identifier()); - - // debug - for(std::unordered_map::const_iterator - it=cfpp.fun_id_to_invok.begin(); - it!=cfpp.fun_id_to_invok.end(); - ++it) - cfpp.message.debug() << it->first << ":" << it->second << " "; - cfpp.message.debug() << messaget::eom; - - cfpp.add(cor_arg_it->get_base_name(), arg_symbol_expr); - insert(cor_arg_it->get_base_name()); - cfpp.message.debug() << "SET: insert " << cor_arg_it->get_base_name() - << messaget::eom; - } - else - { - cfpp.message.debug() << "fun: " << const_function.get_identifier() - << " - arg: (symb) " << cfpp.symbol_table - .lookup(to_symbol_expr(*arg_it).get_identifier()).base_name - << messaget::eom; - - const symbol_exprt &arg_symbol_expr=to_symbol_expr(*arg_it); - const symbolt &arg_symbol= - cfpp.symbol_table.lookup(arg_symbol_expr.get_identifier()); - - if(cfpp.has(arg_symbol.base_name)) - { - cfpp.add(cor_arg_it->get_base_name(), cfpp.get(arg_symbol.base_name), - cfpp.fun_id_to_invok[arg_symbol.base_name]); - insert(cor_arg_it->get_base_name()); - cfpp.message.debug() << "SET: insert " << cor_arg_it->get_base_name() - << messaget::eom; - } - } - } -} - -void const_function_pointer_propagationt::arg_stackt::remove_args() -{ - /* remove the parameter names */ - for(const_iterator arg_it=data.begin(); arg_it!=data.end(); ++arg_it) - { - cfpp.remove(*arg_it); - cfpp.message.debug() << "SET: remove " << *arg_it << messaget::eom; - } -} - -void const_function_pointer_propagationt::propagate( - const irep_idt &function_id) -{ - if(goto_functions.function_map.find(function_id)== - goto_functions.function_map.end()) - return; - - goto_functionst::goto_functiont &function= - goto_functions.function_map[function_id]; - - if(functions_met.find(function_id)!=functions_met.end()) - return; - - functions_met.insert(function_id); - - Forall_goto_program_instructions(it, function.body) - { - if(it->is_assign()) - { - /* is it an assignment of function pointer? */ - const code_assignt &assign=to_code_assign(it->code); - const exprt &lhs=assign.lhs(); - const exprt &rhs=assign.rhs(); - - /* rhs has to be an address to a function */ - if(rhs.id()!=ID_address_of) - continue; - const address_of_exprt &addr_rhs=to_address_of_expr(rhs); - - if(addr_rhs.object().id()!=ID_symbol - || addr_rhs.object().type().id()!=ID_code) - continue; - const symbol_exprt &symbol_rhs=to_symbol_expr(addr_rhs.object()); - - /* lhs must be a pointer */ - if(lhs.id()!=ID_symbol || lhs.type().id()!=ID_pointer) - continue; - const symbol_exprt &symbol_expr_lhs=to_symbol_expr(lhs); - const symbolt &symbol_lhs= - symbol_table.lookup(symbol_expr_lhs.get_identifier()); - - add(symbol_lhs.base_name, symbol_rhs); - } - else if(it->is_function_call()) - { - callsite_stack.push_front(it); - - const exprt &fun=to_code_function_call(it->code).function(); - - /* if it is a function pointer */ - if(fun.id()==ID_dereference) - { - const exprt &fun_pointer=to_dereference_expr(fun).pointer(); - if(fun_pointer.id()!=ID_symbol) - { - callsite_stack.pop_front(); - continue; - } - - const symbol_exprt &fun_symbol_expr=to_symbol_expr(fun_pointer); - const symbolt &fun_symbol= - symbol_table.lookup(fun_symbol_expr.get_identifier()); - symbol_exprt const_function; - unsigned stack_scope=0; - - /* is it a constant pointer? */ - if(resolve(fun_symbol.base_name, const_function, stack_scope)) - { - /* saves the current context (stack of --unduplicated-- callsites) */ - goto_programt::const_targetst context(callsite_stack); - - /* it is. Inline it and explore it. */ - dup_caller_and_inline_callee(const_function, stack_scope); - message.debug() << "I substitute " << const_function.get_identifier() - << messaget::eom; - - arg_stackt arg_stack(*this); - arg_stack.add_args(const_function, it); - - propagate(const_function.get_identifier()); - - arg_stack.remove_args(); - - /* restores the context */ - callsite_stack.swap(context); - } - else - { - /* no. Ignore it and leave it to the remove_function_pointers */ - } - } - else if(fun.id()==ID_symbol) - { - message.debug() << "Propagates through " << to_symbol_expr(fun) - .get_identifier() << messaget::eom; - - /* just propagate */ - const symbol_exprt &fun_symbol_expr=to_symbol_expr(fun); - const irep_idt &fun_id=fun_symbol_expr.get_identifier(); - - arg_stackt arg_stack(*this); - arg_stack.add_args(fun_symbol_expr, it); - - propagate(fun_id); - - arg_stack.remove_args(); - } - - callsite_stack.pop_front(); - } - else if(it->is_end_function()) - { - functions_met.erase(function_id); - return; - } - } - - functions_met.erase(function_id); -} - -void propagate_const_function_pointers( - symbol_tablet &symbol_table, - goto_functionst &goto_functions, - message_handlert &message_handler) -{ - messaget message(message_handler); - const_function_pointer_propagationt propagation(symbol_table, - goto_functions, message); - propagation.propagate(); - goto_functions.update(); -} diff --git a/src/musketeer/propagate_const_function_pointers.h b/src/musketeer/propagate_const_function_pointers.h deleted file mode 100644 index af1b5497b41..00000000000 --- a/src/musketeer/propagate_const_function_pointers.h +++ /dev/null @@ -1,31 +0,0 @@ -/*******************************************************************\ - -Module: Constant Function Pointer Propagation - -Author: Vincent Nimal - -\*******************************************************************/ - -/// \file -/// Constant Function Pointer Propagation - -#ifndef CPROVER_MUSKETEER_PROPAGATE_CONST_FUNCTION_POINTERS_H -#define CPROVER_MUSKETEER_PROPAGATE_CONST_FUNCTION_POINTERS_H - -class symbol_tablet; -class goto_functionst; -class message_handlert; - -/* Note that it only propagates from MAIN, following the CFG, without - resolving non-constant function pointers. This is of particular interest - when used in conjunction with goto_partial_inline, so that it explores - inlined functions accepting generic functions (pthread_create in - particular) in their context, preventing a huge overapproximation of a - functions-based exploration in remove_function_pointers. */ - -void propagate_const_function_pointers( - symbol_tablet &symbol_tables, - goto_functionst &goto_functions, - message_handlert &message_handler); - -#endif // CPROVER_MUSKETEER_PROPAGATE_CONST_FUNCTION_POINTERS_H diff --git a/src/musketeer/replace_async.h b/src/musketeer/replace_async.h deleted file mode 100644 index 9f3a85e1159..00000000000 --- a/src/musketeer/replace_async.h +++ /dev/null @@ -1,86 +0,0 @@ -/*******************************************************************\ - -Module: - -Author: Vincent Nimal - -Date: December 2013 - -\*******************************************************************/ - - -#ifndef CPROVER_MUSKETEER_REPLACE_ASYNC_H -#define CPROVER_MUSKETEER_REPLACE_ASYNC_H - -#include -#include - -class goto_functionst; -class namespacet; - -void replace_async( - const namespacet &ns, - goto_functionst &goto_functions) -{ - Forall_goto_functions(f_it, goto_functions) - { - goto_programt &program=f_it->second.body; - - Forall_goto_program_instructions(i_it, program) - { - const goto_programt::instructiont &instruction=*i_it; - - if(instruction.is_function_call()) - { - const code_function_callt &fct=to_code_function_call(instruction.code); - if(fct.function().id() == ID_symbol) - { - const symbol_exprt &fsym=to_symbol_expr(fct.function()); - - if(ns.lookup(fsym.get_identifier()).base_name == "pthread_create") - { - assert(fct.arguments().size()>=4); - code_function_callt new_call; - /* takes the 3rd argument (pointer to the function to call) */ - const exprt &fct_name=fct.arguments()[2]; - - if(fct_name.id()==ID_address_of) - { - /* pointer to function */ - new_call.function()= - to_address_of_expr(fct.arguments()[2]).object(); - } - else - { - /* other (e.g. local copy) */ - new_call.function()=fct_name; - } - - new_call.arguments().resize(1); - /* takes the 4th argument (argument of the function to call) */ - new_call.arguments()[0]=fct.arguments()[3]; - - /* __CPROVER_ASYNC labels only evaluated at C parsing time; we - reproduce here the effects of the evaluation of this label */ - i_it->labels.push_front("__CPROVER_ASYNC_0"); - i_it->clear(START_THREAD); - /* CP_AC_0: f(); -> CP_AC_0: start_th; goto 2; - 1: f(); end_th; 2: ... */ - - goto_programt::targett goto2=program.insert_after(i_it); - goto_programt::targett call=program.insert_after(goto2); - goto_programt::targett end=program.insert_after(call); - goto_programt::targett skip=program.insert_after(end); - - goto2->make_goto(skip); - call->make_function_call(new_call); - end->clear(END_THREAD); - skip->make_skip(); - } - } - } - } - } -} - -#endif // CPROVER_MUSKETEER_REPLACE_ASYNC_H diff --git a/src/musketeer/version.h b/src/musketeer/version.h deleted file mode 100644 index fde0c82ecea..00000000000 --- a/src/musketeer/version.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef CPROVER_MUSKETEER_VERSION_H -#define CPROVER_MUSKETEER_VERSION_H - -#define MUSKETEER_VERSION "0.37" - -#endif // CPROVER_MUSKETEER_VERSION_H diff --git a/src/nonstd/optional.hpp b/src/nonstd/optional.hpp new file mode 100644 index 00000000000..2634200523b --- /dev/null +++ b/src/nonstd/optional.hpp @@ -0,0 +1,1086 @@ +// +// Copyright (c) 2016 Martin Moene +// +// https://github.com/martinmoene/optional-lite +// +// This code is licensed under the MIT License (MIT). +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#pragma once + +#ifndef NONSTD_OPTIONAL_LITE_HPP +#define NONSTD_OPTIONAL_LITE_HPP + +#include +#include +#include + +#define optional_lite_VERSION "2.1.0" + +// variant-lite alignment configuration: + +#ifndef optional_CONFIG_MAX_ALIGN_HACK +# define optional_CONFIG_MAX_ALIGN_HACK 0 +#endif + +#ifndef optional_CONFIG_ALIGN_AS +// no default, used in #if defined() +#endif + +#ifndef optional_CONFIG_ALIGN_AS_FALLBACK +# define optional_CONFIG_ALIGN_AS_FALLBACK double +#endif + +// Compiler detection (C++17 is speculative): + +#define optional_CPP11_OR_GREATER ( __cplusplus >= 201103L ) +#define optional_CPP14_OR_GREATER ( __cplusplus >= 201402L ) +#define optional_CPP17_OR_GREATER ( __cplusplus >= 201700L ) + +// half-open range [lo..hi): +#define optional_BETWEEN( v, lo, hi ) ( lo <= v && v < hi ) + +#if defined(_MSC_VER) && !defined(__clang__) +# define optional_COMPILER_MSVC_VERSION (_MSC_VER / 100 - 5 - (_MSC_VER < 1900)) +#else +# define optional_COMPILER_MSVC_VERSION 0 +#endif + +#if defined __GNUC__ +# define optional_COMPILER_GNUC_VERSION __GNUC__ +#else +# define optional_COMPILER_GNUC_VERSION 0 +#endif + +#if optional_BETWEEN(optional_COMPILER_MSVC_VERSION, 7, 14 ) +# pragma warning( push ) +# pragma warning( disable: 4345 ) // initialization behavior changed +#endif + +#if optional_BETWEEN(optional_COMPILER_MSVC_VERSION, 7, 15 ) +# pragma warning( push ) +# pragma warning( disable: 4814 ) // in C++14 'constexpr' will not imply 'const' +#endif + +// Presence of C++11 language features: + +#if optional_CPP11_OR_GREATER || optional_COMPILER_MSVC_VERSION >= 10 +# define optional_HAVE_AUTO 1 +# define optional_HAVE_NULLPTR 1 +# define optional_HAVE_STATIC_ASSERT 1 +#endif + +#if optional_CPP11_OR_GREATER || optional_COMPILER_MSVC_VERSION >= 12 +# define optional_HAVE_DEFAULT_FUNCTION_TEMPLATE_ARG 1 +# define optional_HAVE_INITIALIZER_LIST 1 +#endif + +#if optional_CPP11_OR_GREATER || optional_COMPILER_MSVC_VERSION >= 14 +# define optional_HAVE_ALIAS_TEMPLATE 1 +# define optional_HAVE_CONSTEXPR_11 1 +# define optional_HAVE_ENUM_CLASS 1 +# define optional_HAVE_EXPLICIT_CONVERSION 1 +# define optional_HAVE_IS_DEFAULT 1 +# define optional_HAVE_IS_DELETE 1 +# define optional_HAVE_NOEXCEPT 1 +# define optional_HAVE_REF_QUALIFIER 1 +#endif + +// Presence of C++14 language features: + +#if optional_CPP14_OR_GREATER +# define optional_HAVE_CONSTEXPR_14 1 +#endif + +// Presence of C++17 language features: + +#if optional_CPP17_OR_GREATER +# define optional_HAVE_ENUM_CLASS_CONSTRUCTION_FROM_UNDERLYING_TYPE 1 +#endif + +// Presence of C++ library features: + +#if optional_COMPILER_GNUC_VERSION +# define optional_HAVE_TR1_TYPE_TRAITS 1 +# define optional_HAVE_TR1_ADD_POINTER 1 +#endif + +#if optional_CPP11_OR_GREATER || optional_COMPILER_MSVC_VERSION >= 9 +# define optional_HAVE_TYPE_TRAITS 1 +# define optional_HAVE_STD_ADD_POINTER 1 +#endif + +#if optional_CPP11_OR_GREATER || optional_COMPILER_MSVC_VERSION >= 11 +# define optional_HAVE_ARRAY 1 +#endif + +#if optional_CPP11_OR_GREATER || optional_COMPILER_MSVC_VERSION >= 12 +# define optional_HAVE_CONDITIONAL 1 +#endif + +#if optional_CPP11_OR_GREATER || optional_COMPILER_MSVC_VERSION >= 14 || (optional_COMPILER_MSVC_VERSION >= 9 && _HAS_CPP0X) +# define optional_HAVE_CONTAINER_DATA_METHOD 1 +#endif + +#if optional_CPP11_OR_GREATER || optional_COMPILER_MSVC_VERSION >= 12 +# define optional_HAVE_REMOVE_CV 1 +#endif + +#if optional_CPP11_OR_GREATER || optional_COMPILER_MSVC_VERSION >= 14 +# define optional_HAVE_SIZED_TYPES 1 +#endif + +// For the rest, consider VC14 as C++11 for variant-lite: + +#if optional_COMPILER_MSVC_VERSION >= 14 +# undef optional_CPP11_OR_GREATER +# define optional_CPP11_OR_GREATER 1 +#endif + +// C++ feature usage: + +#if optional_HAVE_CONSTEXPR_11 +# define optional_constexpr constexpr +#else +# define optional_constexpr /*constexpr*/ +#endif + +#if optional_HAVE_CONSTEXPR_14 +# define optional_constexpr14 constexpr +#else +# define optional_constexpr14 /*constexpr*/ +#endif + +#if optional_HAVE_NOEXCEPT +# define optional_noexcept noexcept +#else +# define optional_noexcept /*noexcept*/ +#endif + +#if optional_HAVE_NULLPTR +# define optional_nullptr nullptr +#else +# define optional_nullptr NULL +#endif + +#if optional_HAVE_REF_QUALIFIER +# define optional_ref_qual & +# define optional_refref_qual && +#else +# define optional_ref_qual /*&*/ +# define optional_refref_qual /*&&*/ +#endif + +// additional includes: + +#if optional_CPP11_OR_GREATER +# include +#endif + +#if optional_HAVE_INITIALIZER_LIST +# include +#endif + +#if optional_HAVE_TYPE_TRAITS +# include +#elif optional_HAVE_TR1_TYPE_TRAITS +# include +#endif + +// +// in_place: code duplicated in any-lite, optional-lite, variant-lite: +// + +#if ! nonstd_lite_HAVE_IN_PLACE_TYPES + +namespace nonstd { + +namespace detail { + +template< class T > +struct in_place_type_tag {}; + +template< std::size_t I > +struct in_place_index_tag {}; + +} // namespace detail + +struct in_place_t {}; + +template< class T > +inline in_place_t in_place( detail::in_place_type_tag = detail::in_place_type_tag() ) +{ + return in_place_t(); +} + +template< std::size_t I > +inline in_place_t in_place( detail::in_place_index_tag = detail::in_place_index_tag() ) +{ + return in_place_t(); +} + +// mimic templated typedef: + +#define nonstd_lite_in_place_type_t( T) nonstd::in_place_t(&)( nonstd::detail::in_place_type_tag ) +#define nonstd_lite_in_place_index_t(T) nonstd::in_place_t(&)( nonstd::detail::in_place_index_tag ) + +#define nonstd_lite_HAVE_IN_PLACE_TYPES 1 + +} // namespace nonstd + +#endif // nonstd_lite_HAVE_IN_PLACE_TYPES + +// +// optional: +// + +namespace nonstd { namespace optional_lite { + +/// class optional + +template< typename T > +class optional; + +namespace detail { + +// C++11 emulation: + +#if variant_HAVE_CONDITIONAL + +using std::conditional; + +#else + +template< bool Cond, class Then, class Else > +struct conditional; + +template< class Then, class Else > +struct conditional< true , Then, Else > { typedef Then type; }; + +template< class Then, class Else > +struct conditional< false, Then, Else > { typedef Else type; }; + +#endif // variant_HAVE_CONDITIONAL + +struct nulltype{}; + +template< typename Head, typename Tail > +struct typelist +{ + typedef Head head; + typedef Tail tail; +}; + +#if optional_CONFIG_MAX_ALIGN_HACK + +// Max align, use most restricted type for alignment: + +#define optional_UNIQUE( name ) optional_UNIQUE2( name, __LINE__ ) +#define optional_UNIQUE2( name, line ) optional_UNIQUE3( name, line ) +#define optional_UNIQUE3( name, line ) name ## line + +#define optional_ALIGN_TYPE( type ) \ + type optional_UNIQUE( _t ); struct_t< type > optional_UNIQUE( _st ) + +template< typename T > +struct struct_t { T _; }; + +union max_align_t +{ + optional_ALIGN_TYPE( char ); + optional_ALIGN_TYPE( short int ); + optional_ALIGN_TYPE( int ); + optional_ALIGN_TYPE( long int ); + optional_ALIGN_TYPE( float ); + optional_ALIGN_TYPE( double ); + optional_ALIGN_TYPE( long double ); + optional_ALIGN_TYPE( char * ); + optional_ALIGN_TYPE( short int * ); + optional_ALIGN_TYPE( int * ); + optional_ALIGN_TYPE( long int * ); + optional_ALIGN_TYPE( float * ); + optional_ALIGN_TYPE( double * ); + optional_ALIGN_TYPE( long double * ); + optional_ALIGN_TYPE( void * ); + +#ifdef HAVE_LONG_LONG + optional_ALIGN_TYPE( long long ); +#endif + + struct Unknown; + + Unknown ( * optional_UNIQUE(_) )( Unknown ); + Unknown * Unknown::* optional_UNIQUE(_); + Unknown ( Unknown::* optional_UNIQUE(_) )( Unknown ); + + struct_t< Unknown ( * )( Unknown) > optional_UNIQUE(_); + struct_t< Unknown * Unknown::* > optional_UNIQUE(_); + struct_t< Unknown ( Unknown::* )(Unknown) > optional_UNIQUE(_); +}; + +#undef optional_UNIQUE +#undef optional_UNIQUE2 +#undef optional_UNIQUE3 + +#undef optional_ALIGN_TYPE + +#elif defined( optional_CONFIG_ALIGN_AS ) // optional_CONFIG_MAX_ALIGN_HACK + +// Use user-specified type for alignment: + +#define optional_ALIGN_AS( unused ) \ + optional_CONFIG_ALIGN_AS + +#else // optional_CONFIG_MAX_ALIGN_HACK + +// Determine POD type to use for alignment: + +#define optional_ALIGN_AS( to_align ) \ + typename type_of_size< alignment_types, alignment_of< to_align >::value >::type + +template +struct alignment_of; + +template +struct alignment_of_hack +{ + char c; + T t; + alignment_of_hack(); +}; + +template +struct alignment_logic +{ + enum { value = A < S ? A : S }; +}; + +template< typename T > +struct alignment_of +{ + enum { value = alignment_logic< + sizeof( alignment_of_hack ) - sizeof(T), sizeof(T) >::value, }; +}; + +template< typename List, size_t N > +struct type_of_size +{ + typedef typename conditional< + N == sizeof( typename List::head ), + typename List::head, + typename type_of_size::type >::type type; +}; + +template< size_t N > +struct type_of_size< nulltype, N > +{ + typedef optional_CONFIG_ALIGN_AS_FALLBACK type; +}; + +template< typename T> +struct struct_t { T _; }; + +#define optional_ALIGN_TYPE( type ) \ + typelist< type , typelist< struct_t< type > + +struct Unknown; + +typedef + optional_ALIGN_TYPE( char ), + optional_ALIGN_TYPE( short ), + optional_ALIGN_TYPE( int ), + optional_ALIGN_TYPE( long ), + optional_ALIGN_TYPE( float ), + optional_ALIGN_TYPE( double ), + optional_ALIGN_TYPE( long double ), + + optional_ALIGN_TYPE( char *), + optional_ALIGN_TYPE( short * ), + optional_ALIGN_TYPE( int * ), + optional_ALIGN_TYPE( long * ), + optional_ALIGN_TYPE( float * ), + optional_ALIGN_TYPE( double * ), + optional_ALIGN_TYPE( long double * ), + + optional_ALIGN_TYPE( Unknown ( * )( Unknown ) ), + optional_ALIGN_TYPE( Unknown * Unknown::* ), + optional_ALIGN_TYPE( Unknown ( Unknown::* )( Unknown ) ), + + nulltype + > > > > > > > > > > > > > > + > > > > > > > > > > > > > > + > > > > > > + alignment_types; + +#undef optional_ALIGN_TYPE + +#endif // optional_CONFIG_MAX_ALIGN_HACK + +/// C++03 constructed union to hold value. + +template< typename T > +union storage_t +{ +private: + friend class optional; + + typedef T value_type; + + storage_t() {} + + storage_t( value_type const & v ) + { + construct_value( v ); + } + + void construct_value( value_type const & v ) + { + ::new( value_ptr() ) value_type( v ); + } + +#if optional_CPP11_OR_GREATER + + storage_t( value_type && v ) + { + construct_value( std::move( v ) ); + } + + void construct_value( value_type && v ) + { + ::new( value_ptr() ) value_type( std::move( v ) ); + } + +#endif + + void destruct_value() + { + value_ptr()->~T(); + } + + value_type const * value_ptr() const + { + return as(); + } + + value_type * value_ptr() + { + return as(); + } + + value_type const & value() const optional_ref_qual + { + return * value_ptr(); + } + + value_type & value() optional_ref_qual + { + return * value_ptr(); + } + +#if optional_CPP11_OR_GREATER + + value_type const && value() const optional_refref_qual + { + return * value_ptr(); + } + + value_type && value() optional_refref_qual + { + return * value_ptr(); + } + +#endif + +#if optional_CPP11_OR_GREATER + + using aligned_storage_t = typename std::aligned_storage< sizeof(value_type), alignof(value_type) >::type; + aligned_storage_t data; + +#elif optional_CONFIG_MAX_ALIGN_HACK + + typedef struct { unsigned char data[ sizeof(value_type) ]; } aligned_storage_t; + + max_align_t hack; + aligned_storage_t data; + +#else + typedef optional_ALIGN_AS(value_type) align_as_type; + + typedef struct { align_as_type data[ 1 + ( sizeof(value_type) - 1 ) / sizeof(align_as_type) ]; } aligned_storage_t; + aligned_storage_t data; + +#undef optional_ALIGN_AS + +#endif // optional_CONFIG_MAX_ALIGN_HACK + + void * ptr() optional_noexcept + { + return &data; + } + + void const * ptr() const optional_noexcept + { + return &data; + } + + template + U * as() + { + return reinterpret_cast( ptr() ); + } + + template + U const * as() const + { + return reinterpret_cast( ptr() ); + } +}; + +} // namespace detail + +/// disengaged state tag + +struct nullopt_t +{ + struct init{}; + optional_constexpr nullopt_t( init ) {} +}; + +#if optional_HAVE_CONSTEXPR_11 +constexpr nullopt_t nullopt{ nullopt_t::init{} }; +#else +// extra parenthesis to prevent the most vexing parse: +const nullopt_t nullopt(( nullopt_t::init() )); +#endif + +/// optional access error + +class bad_optional_access : public std::logic_error +{ +public: + explicit bad_optional_access() + : logic_error( "bad optional access" ) {} +}; + +/// optional + +template< typename T> +class optional +{ +private: + typedef void (optional::*safe_bool)() const; + +public: + typedef T value_type; + + optional_constexpr optional() optional_noexcept + : has_value_( false ) + , contained() + {} + + optional_constexpr optional( nullopt_t ) optional_noexcept + : has_value_( false ) + , contained() + {} + + optional( optional const & rhs ) + : has_value_( rhs.has_value() ) + { + if ( rhs.has_value() ) + contained.construct_value( rhs.contained.value() ); + } + +#if optional_CPP11_OR_GREATER + optional_constexpr14 optional( optional && rhs ) noexcept( std::is_nothrow_move_constructible::value ) + : has_value_( rhs.has_value() ) + { + if ( rhs.has_value() ) + contained.construct_value( std::move( rhs.contained.value() ) ); + } +#endif + + optional_constexpr optional( value_type const & value ) + : has_value_( true ) + , contained( value ) + {} + +#if optional_CPP11_OR_GREATER + + optional_constexpr optional( value_type && value ) + : has_value_( true ) + , contained( std::move( value ) ) + {} + + template< class... Args > + optional_constexpr explicit optional( nonstd_lite_in_place_type_t(T), Args&&... args ) + : has_value_( true ) + , contained( T( std::forward(args)...) ) + {} + + template< class U, class... Args > + optional_constexpr explicit optional( nonstd_lite_in_place_type_t(T), std::initializer_list il, Args&&... args ) + : has_value_( true ) + , contained( T( il, std::forward(args)...) ) + {} + +#endif // optional_CPP11_OR_GREATER + + ~optional() + { + if ( has_value() ) + contained.destruct_value(); + } + + // assignment + + optional & operator=( nullopt_t ) optional_noexcept + { + reset(); + return *this; + } + + optional & operator=( optional const & rhs ) +#if optional_CPP11_OR_GREATER + noexcept( std::is_nothrow_move_assignable::value && std::is_nothrow_move_constructible::value ) +#endif + { + if ( has_value() == true && rhs.has_value() == false ) reset(); + else if ( has_value() == false && rhs.has_value() == true ) initialize( *rhs ); + else if ( has_value() == true && rhs.has_value() == true ) contained.value() = *rhs; + return *this; + } + +#if optional_CPP11_OR_GREATER + + optional & operator=( optional && rhs ) noexcept + { + if ( has_value() == true && rhs.has_value() == false ) reset(); + else if ( has_value() == false && rhs.has_value() == true ) initialize( std::move( *rhs ) ); + else if ( has_value() == true && rhs.has_value() == true ) contained.value() = std::move( *rhs ); + return *this; + } + + template< class U, + typename = typename std::enable_if< std::is_same< typename std::decay::type, T>::value >::type > + optional & operator=( U && v ) + { + if ( has_value() ) contained.value() = std::forward( v ); + else initialize( T( std::forward( v ) ) ); + return *this; + } + + template< class... Args > + void emplace( Args&&... args ) + { + *this = nullopt; + initialize( T( std::forward(args)...) ); + } + + template< class U, class... Args > + void emplace( std::initializer_list il, Args&&... args ) + { + *this = nullopt; + initialize( T( il, std::forward(args)...) ); + } + +#endif // optional_CPP11_OR_GREATER + + // swap + + void swap( optional & rhs ) +#if optional_CPP11_OR_GREATER + noexcept( std::is_nothrow_move_constructible::value && noexcept( std::swap( std::declval(), std::declval() ) ) ) +#endif + { + using std::swap; + if ( has_value() == true && rhs.has_value() == true ) { swap( **this, *rhs ); } + else if ( has_value() == false && rhs.has_value() == true ) { initialize( *rhs ); rhs.reset(); } + else if ( has_value() == true && rhs.has_value() == false ) { rhs.initialize( **this ); reset(); } + } + + // observers + + optional_constexpr value_type const * operator ->() const + { + return assert( has_value() ), + contained.value_ptr(); + } + + optional_constexpr14 value_type * operator ->() + { + return assert( has_value() ), + contained.value_ptr(); + } + + optional_constexpr value_type const & operator *() const optional_ref_qual + { + return assert( has_value() ), + contained.value(); + } + + optional_constexpr14 value_type & operator *() optional_ref_qual + { + return assert( has_value() ), + contained.value(); + } + +#if optional_CPP11_OR_GREATER + + optional_constexpr value_type const && operator *() const optional_refref_qual + { + return assert( has_value() ), std::move( contained.value() ); + } + + optional_constexpr14 value_type && operator *() optional_refref_qual + { + assert( has_value() ); + return std::move( contained.value() ); + } + +#endif + +#if optional_CPP11_OR_GREATER + optional_constexpr explicit operator bool() const optional_noexcept + { + return has_value(); + } +#else + optional_constexpr operator safe_bool() const optional_noexcept + { + return has_value() ? &optional::this_type_does_not_support_comparisons : 0; + } +#endif + + optional_constexpr bool has_value() const optional_noexcept + { + return has_value_; + } + + optional_constexpr14 value_type const & value() const optional_ref_qual + { + if ( ! has_value() ) + throw bad_optional_access(); + + return contained.value(); + } + + optional_constexpr14 value_type & value() optional_ref_qual + { + if ( ! has_value() ) + throw bad_optional_access(); + + return contained.value(); + } + +#if optional_HAVE_REF_QUALIFIER + + optional_constexpr14 value_type const && value() const optional_refref_qual + { + if ( ! has_value() ) + throw bad_optional_access(); + + return std::move( contained.value() ); + } + + optional_constexpr14 value_type && value() optional_refref_qual + { + if ( ! has_value() ) + throw bad_optional_access(); + + return std::move( contained.value() ); + } + +#endif + +#if optional_CPP11_OR_GREATER + + template< class U > + optional_constexpr value_type value_or( U && v ) const optional_ref_qual + { + return has_value() ? contained.value() : static_cast(std::forward( v ) ); + } + + template< class U > + optional_constexpr value_type value_or( U && v ) const optional_refref_qual + { + return has_value() ? std::move( contained.value() ) : static_cast(std::forward( v ) ); + } + +#else + + template< class U > + optional_constexpr value_type value_or( U const & v ) const + { + return has_value() ? contained.value() : static_cast( v ); + } + +#endif // optional_CPP11_OR_GREATER + + // modifiers + + void reset() optional_noexcept + { + if ( has_value() ) + contained.destruct_value(); + + has_value_ = false; + } + +private: + void this_type_does_not_support_comparisons() const {} + + template< typename V > + void initialize( V const & value ) + { + assert( ! has_value() ); + contained.construct_value( value ); + has_value_ = true; + } + +#if optional_CPP11_OR_GREATER + template< typename V > + void initialize( V && value ) + { + assert( ! has_value() ); + contained.construct_value( std::move( value ) ); + has_value_ = true; + } +#endif + +private: + bool has_value_; + detail::storage_t< value_type > contained; + +}; + +// Relational operators + +template< typename T > bool operator==( optional const & x, optional const & y ) +{ + return bool(x) != bool(y) ? false : bool(x) == false ? true : *x == *y; +} + +template< typename T > bool operator!=( optional const & x, optional const & y ) +{ + return !(x == y); +} + +template< typename T > bool operator<( optional const & x, optional const & y ) +{ + return (!y) ? false : (!x) ? true : *x < *y; +} + +template< typename T > bool operator>( optional const & x, optional const & y ) +{ + return (y < x); +} + +template< typename T > bool operator<=( optional const & x, optional const & y ) +{ + return !(y < x); +} + +template< typename T > bool operator>=( optional const & x, optional const & y ) +{ + return !(x < y); +} + +// Comparison with nullopt + +template< typename T > bool operator==( optional const & x, nullopt_t ) optional_noexcept +{ + return (!x); +} + +template< typename T > bool operator==( nullopt_t, optional const & x ) optional_noexcept +{ + return (!x); +} + +template< typename T > bool operator!=( optional const & x, nullopt_t ) optional_noexcept +{ + return bool(x); +} + +template< typename T > bool operator!=( nullopt_t, optional const & x ) optional_noexcept +{ + return bool(x); +} + +template< typename T > bool operator<( optional const &, nullopt_t ) optional_noexcept +{ + return false; +} + +template< typename T > bool operator<( nullopt_t, optional const & x ) optional_noexcept +{ + return bool(x); +} + +template< typename T > bool operator<=( optional const & x, nullopt_t ) optional_noexcept +{ + return (!x); +} + +template< typename T > bool operator<=( nullopt_t, optional const & ) optional_noexcept +{ + return true; +} + +template< typename T > bool operator>( optional const & x, nullopt_t ) optional_noexcept +{ + return bool(x); +} + +template< typename T > bool operator>( nullopt_t, optional const & ) optional_noexcept +{ + return false; +} + +template< typename T > bool operator>=( optional const &, nullopt_t ) +{ + return true; +} + +template< typename T > bool operator>=( nullopt_t, optional const & x ) +{ + return (!x); +} + +// Comparison with T + +template< typename T > bool operator==( optional const & x, const T& v ) +{ + return bool(x) ? *x == v : false; +} + +template< typename T > bool operator==( T const & v, optional const & x ) +{ + return bool(x) ? v == *x : false; +} + +template< typename T > bool operator!=( optional const & x, const T& v ) +{ + return bool(x) ? *x != v : true; +} + +template< typename T > bool operator!=( T const & v, optional const & x ) +{ + return bool(x) ? v != *x : true; +} + +template< typename T > bool operator<( optional const & x, const T& v ) +{ + return bool(x) ? *x < v : true; +} + +template< typename T > bool operator<( T const & v, optional const & x ) +{ + return bool(x) ? v < *x : false; +} + +template< typename T > bool operator<=( optional const & x, const T& v ) +{ + return bool(x) ? *x <= v : true; +} + +template< typename T > bool operator<=( T const & v, optional const & x ) +{ + return bool(x) ? v <= *x : false; +} + +template< typename T > bool operator>( optional const & x, const T& v ) +{ + return bool(x) ? *x > v : false; +} + +template< typename T > bool operator>( T const & v, optional const & x ) +{ + return bool(x) ? v > *x : true; +} + +template< typename T > bool operator>=( optional const & x, const T& v ) +{ + return bool(x) ? *x >= v : false; +} + +template< typename T > bool operator>=( T const & v, optional const & x ) +{ + return bool(x) ? v >= *x : true; +} + +// Specialized algorithms + +template< typename T > +void swap( optional & x, optional & y ) +#if optional_CPP11_OR_GREATER + noexcept( noexcept( x.swap(y) ) ) +#endif +{ + x.swap( y ); +} + +#if optional_CPP11_OR_GREATER + +template< class T > +optional_constexpr optional< typename std::decay::type > make_optional( T && v ) +{ + return optional< typename std::decay::type >( std::forward( v ) ); +} + +template< class T, class...Args > +optional_constexpr optional make_optional( Args&&... args ) +{ + return optional( in_place, std::forward(args)...); +} + +template< class T, class U, class... Args > +optional_constexpr optional make_optional( std::initializer_list il, Args&&... args ) +{ + return optional( in_place, il, std::forward(args)...); +} + +#else + +template< typename T > +optional make_optional( T const & v ) +{ + return optional( v ); +} + +#endif // optional_CPP11_OR_GREATER + +} // namespace optional + +using namespace optional_lite; + +} // namespace nonstd + +#if optional_CPP11_OR_GREATER + +// specialize the std::hash algorithm: + +namespace std { + +template< class T > +struct hash< nonstd::optional > +{ +public: + std::size_t operator()( nonstd::optional const & v ) const optional_noexcept + { + return bool( v ) ? hash()( *v ) : 0; + } +}; + +} //namespace std + +#endif // optional_CPP11_OR_GREATER + +#endif // NONSTD_OPTIONAL_LITE_HPP diff --git a/src/path-symex/CMakeLists.txt b/src/path-symex/CMakeLists.txt new file mode 100644 index 00000000000..c86e9c27a25 --- /dev/null +++ b/src/path-symex/CMakeLists.txt @@ -0,0 +1,7 @@ +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +add_library(path-symex ${sources} ${headers}) + +generic_includes(path-symex) + +target_link_libraries(path-symex util pointer-analysis) diff --git a/src/path-symex/path_symex.cpp b/src/path-symex/path_symex.cpp index 8f8f6f3707a..3beecc4cfdf 100644 --- a/src/path-symex/path_symex.cpp +++ b/src/path-symex/path_symex.cpp @@ -129,7 +129,7 @@ void path_symext::assign( // start recursion on lhs exprt::operandst _guard; // start with empty guard - assign_rec(state, _guard, ssa_lhs, ssa_rhs); + assign_rec(state, _guard, lhs, ssa_lhs, ssa_rhs); } inline static typet c_sizeof_type_rec(const exprt &expr) @@ -347,6 +347,7 @@ void path_symext::symex_va_arg_next( void path_symext::assign_rec( path_symex_statet &state, exprt::operandst &guard, + const exprt &full_lhs, const exprt &ssa_lhs, const exprt &ssa_rhs) { @@ -376,17 +377,17 @@ void path_symext::assign_rec( // increase the SSA counter and produce new SSA symbol expression var_info.increment_ssa_counter(); - symbol_exprt new_lhs=var_info.ssa_symbol(); + symbol_exprt new_ssa_lhs=var_info.ssa_symbol(); #ifdef DEBUG - std::cout << "new_lhs: " << new_lhs.get_identifier() << '\n'; + std::cout << "new_ssa_lhs: " << new_ssa_lhs.get_identifier() << '\n'; #endif // record new state of lhs { // reference is not stable path_symex_statet::var_statet &var_state=state.get_var_state(var_info); - var_state.ssa_symbol=new_lhs; + var_state.ssa_symbol=new_ssa_lhs; } // rhs nil means non-det assignment @@ -398,11 +399,11 @@ void path_symext::assign_rec( else { // consistency check - if(!base_type_eq(ssa_rhs.type(), new_lhs.type(), state.var_map.ns)) + if(!base_type_eq(ssa_rhs.type(), new_ssa_lhs.type(), state.var_map.ns)) { #ifdef DEBUG std::cout << "ssa_rhs: " << ssa_rhs.pretty() << '\n'; - std::cout << "new_lhs: " << new_lhs.pretty() << '\n'; + std::cout << "new_ssa_lhs: " << new_ssa_lhs.pretty() << '\n'; #endif throw "assign_rec got different types"; } @@ -413,8 +414,8 @@ void path_symext::assign_rec( if(!guard.empty()) step.guard=conjunction(guard); - step.full_lhs=ssa_lhs; - step.ssa_lhs=new_lhs; + step.full_lhs=full_lhs; + step.ssa_lhs=new_ssa_lhs; step.ssa_rhs=ssa_rhs; // propagate the rhs? @@ -425,10 +426,10 @@ void path_symext::assign_rec( else if(ssa_lhs.id()==ID_typecast) { // dereferencing might yield a typecast - const exprt &new_lhs=to_typecast_expr(ssa_lhs).op(); - typecast_exprt new_rhs(ssa_rhs, new_lhs.type()); + const exprt &new_ssa_lhs=to_typecast_expr(ssa_lhs).op(); + typecast_exprt new_rhs(ssa_rhs, new_ssa_lhs.type()); - assign_rec(state, guard, new_lhs, new_rhs); + assign_rec(state, guard, full_lhs, new_ssa_lhs, new_rhs); } else if(ssa_lhs.id()==ID_member) { @@ -454,7 +455,7 @@ void path_symext::assign_rec( with_exprt new_rhs(struct_op, member_name, ssa_rhs); - assign_rec(state, guard, struct_op, new_rhs); + assign_rec(state, guard, full_lhs, struct_op, new_rhs); } else if(compound_type.id()==ID_union) { @@ -462,9 +463,9 @@ void path_symext::assign_rec( exprt offset=from_integer(0, index_type()); byte_extract_exprt - new_lhs(byte_update_id(), struct_op, offset, ssa_rhs.type()); + new_ssa_lhs(byte_update_id(), struct_op, offset, ssa_rhs.type()); - assign_rec(state, guard, new_lhs, ssa_rhs); + assign_rec(state, guard, full_lhs, new_ssa_lhs, ssa_rhs); } else throw "assign_rec: member expects struct or union type"; @@ -496,12 +497,12 @@ void path_symext::assign_rec( // true guard.push_back(cond); - assign_rec(state, guard, lhs_if_expr.true_case(), ssa_rhs); + assign_rec(state, guard, full_lhs, lhs_if_expr.true_case(), ssa_rhs); guard.pop_back(); // false guard.push_back(not_exprt(cond)); - assign_rec(state, guard, lhs_if_expr.false_case(), ssa_rhs); + assign_rec(state, guard, full_lhs, lhs_if_expr.false_case(), ssa_rhs); guard.pop_back(); } else if(ssa_lhs.id()==ID_byte_extract_little_endian || @@ -533,9 +534,9 @@ void path_symext::assign_rec( new_rhs.offset()=byte_extract_expr.offset(); new_rhs.value()=ssa_rhs; - const exprt new_lhs=byte_extract_expr.op(); + const exprt new_ssa_lhs=byte_extract_expr.op(); - assign_rec(state, guard, new_lhs, new_rhs); + assign_rec(state, guard, full_lhs, new_ssa_lhs, new_rhs); } else if(ssa_lhs.id()==ID_struct) { @@ -555,7 +556,7 @@ void path_symext::assign_rec( exprt::operandst::const_iterator lhs_it=operands.begin(); forall_operands(it, ssa_rhs) { - assign_rec(state, guard, *lhs_it, *it); + assign_rec(state, guard, full_lhs, *lhs_it, *it); ++lhs_it; } } @@ -571,7 +572,7 @@ void path_symext::assign_rec( components[i].get_name(), components[i].type()), state.var_map.ns); - assign_rec(state, guard, operands[i], new_rhs); + assign_rec(state, guard, full_lhs, operands[i], new_rhs); } } } @@ -594,7 +595,7 @@ void path_symext::assign_rec( exprt::operandst::const_iterator lhs_it=operands.begin(); forall_operands(it, ssa_rhs) { - assign_rec(state, guard, *lhs_it, *it); + assign_rec(state, guard, full_lhs, *lhs_it, *it); ++lhs_it; } } @@ -610,7 +611,7 @@ void path_symext::assign_rec( from_integer(i, index_type()), array_type.subtype()), state.var_map.ns); - assign_rec(state, guard, operands[i], new_rhs); + assign_rec(state, guard, full_lhs, operands[i], new_rhs); } } } @@ -1090,6 +1091,10 @@ void path_symext::operator()( { // just needs to be recorded } + else if(statement==ID_output) + { + // just needs to be recorded + } else throw "unexpected OTHER statement: "+id2string(statement); } diff --git a/src/path-symex/path_symex_class.h b/src/path-symex/path_symex_class.h index 933b871e9fa..cd67b9c31aa 100644 --- a/src/path-symex/path_symex_class.h +++ b/src/path-symex/path_symex_class.h @@ -93,6 +93,7 @@ class path_symext void assign_rec( path_symex_statet &state, exprt::operandst &guard, // instantiated + const exprt &full_lhs, // not instantiated, no recursion const exprt &ssa_lhs, // instantiated, recursion here const exprt &ssa_rhs); // instantiated diff --git a/src/pointer-analysis/CMakeLists.txt b/src/pointer-analysis/CMakeLists.txt new file mode 100644 index 00000000000..66d9f23893d --- /dev/null +++ b/src/pointer-analysis/CMakeLists.txt @@ -0,0 +1,7 @@ +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +add_library(pointer-analysis ${sources} ${headers}) + +generic_includes(pointer-analysis) + +target_link_libraries(pointer-analysis util analyses goto-programs) diff --git a/src/pointer-analysis/goto_program_dereference.cpp b/src/pointer-analysis/goto_program_dereference.cpp index 857f9e722fc..64f9d5fe071 100644 --- a/src/pointer-analysis/goto_program_dereference.cpp +++ b/src/pointer-analysis/goto_program_dereference.cpp @@ -392,18 +392,18 @@ void remove_pointers( } void remove_pointers( - goto_functionst &goto_functions, - symbol_tablet &symbol_table, + goto_modelt &goto_model, value_setst &value_sets) { - namespacet ns(symbol_table); + namespacet ns(goto_model.symbol_table); optionst options; goto_program_dereferencet - goto_program_dereference(ns, symbol_table, options, value_sets); + goto_program_dereference( + ns, goto_model.symbol_table, options, value_sets); - Forall_goto_functions(it, goto_functions) + Forall_goto_functions(it, goto_model.goto_functions) goto_program_dereference.dereference_program(it->second.body); } diff --git a/src/pointer-analysis/goto_program_dereference.h b/src/pointer-analysis/goto_program_dereference.h index 5f2a76083ab..312dcc9f069 100644 --- a/src/pointer-analysis/goto_program_dereference.h +++ b/src/pointer-analysis/goto_program_dereference.h @@ -14,7 +14,7 @@ Author: Daniel Kroening, kroening@kroening.com #include -#include +#include #include "value_sets.h" #include "value_set_dereference.h" @@ -99,29 +99,28 @@ class goto_program_dereferencet:protected dereference_callbackt void dereference( goto_programt::const_targett target, exprt &expr, - const namespacet &ns, - value_setst &value_sets); + const namespacet &, + value_setst &); void remove_pointers( - goto_programt &goto_program, - symbol_tablet &symbol_table, - value_setst &value_sets); + goto_modelt &, + value_setst &); void remove_pointers( - goto_functionst &goto_functions, - symbol_tablet &symbol_table, - value_setst &value_sets); + goto_functionst &, + symbol_tablet &, + value_setst &); void pointer_checks( - goto_programt &goto_program, - symbol_tablet &symbol_table, - const optionst &options, - value_setst &value_sets); + goto_programt &, + symbol_tablet &, + const optionst &, + value_setst &); void pointer_checks( - goto_functionst &goto_functions, - symbol_tablet &symbol_table, - const optionst &options, - value_setst &value_sets); + goto_functionst &, + symbol_tablet &, + const optionst &, + value_setst &); #endif // CPROVER_POINTER_ANALYSIS_GOTO_PROGRAM_DEREFERENCE_H diff --git a/src/pointer-analysis/show_value_sets.cpp b/src/pointer-analysis/show_value_sets.cpp index ce555e2dd02..e1dc0bb938e 100644 --- a/src/pointer-analysis/show_value_sets.cpp +++ b/src/pointer-analysis/show_value_sets.cpp @@ -10,16 +10,17 @@ Author: Daniel Kroening, kroening@kroening.com /// Show Value Sets #include "show_value_sets.h" +#include "value_set_analysis.h" -#include +#include #include -#include "value_set_analysis.h" +#include void show_value_sets( ui_message_handlert::uit ui, - const goto_functionst &goto_functions, + const goto_modelt &goto_model, const value_set_analysist &value_set_analysis) { switch(ui) @@ -27,13 +28,13 @@ void show_value_sets( case ui_message_handlert::uit::XML_UI: { xmlt xml; - convert(goto_functions, value_set_analysis, xml); + convert(goto_model.goto_functions, value_set_analysis, xml); std::cout << xml << '\n'; } break; case ui_message_handlert::uit::PLAIN: - value_set_analysis.output(goto_functions, std::cout); + value_set_analysis.output(goto_model.goto_functions, std::cout); break; default: diff --git a/src/pointer-analysis/show_value_sets.h b/src/pointer-analysis/show_value_sets.h index 82005aec9ad..9210adfab4e 100644 --- a/src/pointer-analysis/show_value_sets.h +++ b/src/pointer-analysis/show_value_sets.h @@ -15,17 +15,11 @@ Author: Daniel Kroening, kroening@kroening.com #include #include "value_set_analysis.h" -class goto_functionst; -class goto_programt; +class goto_modelt; void show_value_sets( - ui_message_handlert::uit ui, - const goto_functionst &goto_functions, - const value_set_analysist &value_set_analysis); - -void show_value_sets( - ui_message_handlert::uit ui, - const goto_programt &goto_program, - const value_set_analysist &value_set_analysis); + ui_message_handlert::uit, + const goto_modelt &, + const value_set_analysist &); #endif // CPROVER_POINTER_ANALYSIS_SHOW_VALUE_SETS_H diff --git a/src/pointer-analysis/value_set.h b/src/pointer-analysis/value_set.h index 37ae293e5f9..6623e48e198 100644 --- a/src/pointer-analysis/value_set.h +++ b/src/pointer-analysis/value_set.h @@ -71,6 +71,8 @@ class value_sett typedef data_typet::const_iterator const_iterator; // NOLINTNEXTLINE(readability/identifiers) typedef data_typet::value_type value_type; + // NOLINTNEXTLINE(readability/identifiers) + typedef data_typet::key_type key_type; iterator begin() { return data.begin(); } const_iterator begin() const { return data.begin(); } @@ -83,12 +85,12 @@ class value_sett size_t size() const { return data.size(); } bool empty() const { return data.empty(); } - void erase(unsigned i) { data.erase(i); } - void erase(iterator it) { data.erase(it); } + void erase(key_type i) { data.erase(i); } + void erase(const_iterator it) { data.erase(it); } - objectt &operator[](unsigned i) { return data[i]; } - objectt &at(unsigned i) { return data.at(i); } - const objectt &at(unsigned i) const { return data.at(i); } + objectt &operator[](key_type i) { return data[i]; } + objectt &at(key_type i) { return data.at(i); } + const objectt &at(key_type i) const { return data.at(i); } template void insert(It b, It e) { data.insert(b, e); } diff --git a/src/solvers/CMakeLists.txt b/src/solvers/CMakeLists.txt new file mode 100644 index 00000000000..910b39f7c6e --- /dev/null +++ b/src/solvers/CMakeLists.txt @@ -0,0 +1,84 @@ +# We may use one of several different solver libraries. +# The following files wrap the chosen solver library. +# We remove them all from the solver-library sources list, and then add the +# ones we actually need back in. +set(chaff_source + ${CMAKE_CURRENT_SOURCE_DIR}/sat/satcheck_zchaff.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/sat/satcheck_zcore.cpp +) +set(minisat_source + ${CMAKE_CURRENT_SOURCE_DIR}/sat/satcheck_minisat.cpp +) +set(minisat2_source + ${CMAKE_CURRENT_SOURCE_DIR}/sat/satcheck_minisat2.cpp +) +set(glucose_source + ${CMAKE_CURRENT_SOURCE_DIR}/sat/satcheck_glucose.cpp +) +set(smvsat_source + ${CMAKE_CURRENT_SOURCE_DIR}/sat/satcheck_smvsat.cpp +) +set(squolem2_source + ${CMAKE_CURRENT_SOURCE_DIR}/qbf/qbf_squolem.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/qbf/qbf_squolem_core.cpp +) +set(cudd_source + ${CMAKE_CURRENT_SOURCE_DIR}/qbf/qbf_bdd_core.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/qbf/qbf_skizzo_core.cpp +) +set(precosat_source + ${CMAKE_CURRENT_SOURCE_DIR}/sat/satcheck_precosat.cpp +) +set(picosat_source + ${CMAKE_CURRENT_SOURCE_DIR}/sat/satcheck_picosat.cpp +) +set(lingeling_source + ${CMAKE_CURRENT_SOURCE_DIR}/sat/satcheck_lingeling.cpp +) +set(booleforce_source + ${CMAKE_CURRENT_SOURCE_DIR}/sat/satcheck_booleforce.cpp +) +set(minibdd_source + ${CMAKE_CURRENT_SOURCE_DIR}/miniBDD/example.cpp +) +set(limmat_source + ${CMAKE_CURRENT_SOURCE_DIR}/sat/satcheck_limmat.cpp +) + +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +list(REMOVE_ITEM sources + ${chaff_source} + ${minisat_source} + ${minisat2_source} + ${glucose_source} + ${smvsat_source} + ${squolem2_source} + ${cudd_source} + ${precosat_source} + ${picosat_source} + ${lingeling_source} + ${booleforce_source} + ${minibdd_source} + ${limmat_source} +) + +add_library(solvers ${sources} ${headers}) + +if("${sat_impl}" STREQUAL "minisat2") + message(STATUS "Building solvers with minisat2") + target_sources(solvers PRIVATE ${minisat2_source}) + add_dependencies(solvers minisat2-extern) + target_compile_definitions(solvers PUBLIC SATCHECK_MINISAT2 HAVE_MINISAT2 __STDC_FORMAT_MACROS __STDC_LIMIT_MACROS) + target_link_libraries(solvers minisat2-condensed) +elseif("${sat_impl}" STREQUAL "glucose") + message(STATUS "Building solvers with glucose") + target_sources(solvers PRIVATE ${glucose_source}) + add_dependencies(solvers glucose-extern) + target_compile_definitions(solvers PUBLIC SATCHECK_GLUCOSE HAVE_GLUCOSE __STDC_FORMAT_MACROS __STDC_LIMIT_MACROS) + target_link_libraries(solvers glucose-condensed) +endif() + +target_link_libraries(solvers util) + +generic_includes(solvers) diff --git a/src/solvers/Makefile b/src/solvers/Makefile index b7b9c5b43d9..a3e7219db4d 100644 --- a/src/solvers/Makefile +++ b/src/solvers/Makefile @@ -69,6 +69,13 @@ ifneq ($(LINGELING),) CP_CXXFLAGS += -DHAVE_LINGELING endif +ifneq ($(LIMMAT),) + LIMMAT_SRC=sat/satcheck_limmat.cpp + LIMMAT_INCLUDE=-I $(LIMMAT) + LIMMAT_LIB=$(LIMMAT)/liblimmat$(LIBEXT) + CP_CXXFLAGS += -DHAVE_LIMMAT +endif + SRC = $(BOOLEFORCE_SRC) \ $(CHAFF_SRC) \ $(CUDD_SRC) \ @@ -80,6 +87,7 @@ SRC = $(BOOLEFORCE_SRC) \ $(PRECOSAT_SRC) \ $(SMVSAT_SRC) \ $(SQUOLEM2_SRC) \ + $(LIMMAT_SRC) \ cvc/cvc_conv.cpp \ cvc/cvc_dec.cpp \ flattening/arrays.cpp \ @@ -138,6 +146,7 @@ SRC = $(BOOLEFORCE_SRC) \ flattening/pointer_logic.cpp \ floatbv/float_bv.cpp \ floatbv/float_utils.cpp \ + floatbv/float_approximation.cpp \ miniBDD/miniBDD.cpp \ prop/aig.cpp \ prop/aig_prop.cpp \ diff --git a/src/solvers/cvc/cvc_prop.cpp b/src/solvers/cvc/cvc_prop.cpp deleted file mode 100644 index 7a02bd65335..00000000000 --- a/src/solvers/cvc/cvc_prop.cpp +++ /dev/null @@ -1,307 +0,0 @@ -/*******************************************************************\ - -Module: - -Author: Daniel Kroening, kroening@kroening.com - -\*******************************************************************/ - -#include "cvc_prop.h" - -#include -#include - -explicit cvc_propt::cvc_propt(std::ostream &_out):out(_out) -{ - _no_variables=0; -} - -cvc_propt::~cvc_propt() -{ -} - -void cvc_propt::land(literalt a, literalt b, literalt o) -{ - out << "%% land\n"; - out << "ASSERT (" << cvc_literal(a) << " AND " - << cvc_literal(b) << ") <=> " << cvc_literal(o) - << ";\n\n"; -} - -void cvc_propt::lor(literalt a, literalt b, literalt o) -{ - out << "%% lor\n"; - out << "ASSERT (" << cvc_literal(a) << " OR " - << cvc_literal(b) << ") <=> " << cvc_literal(o) - << ";\n\n"; -} - -void cvc_propt::lxor(literalt a, literalt b, literalt o) -{ - out << "%% lxor\n"; - out << "ASSERT (" << cvc_literal(a) << " XOR " - << cvc_literal(b) << ") <=> " << cvc_literal(o) - << ";\n\n"; -} - -void cvc_propt::lnand(literalt a, literalt b, literalt o) -{ - out << "%% lnand\n"; - out << "ASSERT (NOT (" << cvc_literal(a) << " AND " - << cvc_literal(b) << ")) <=> " << cvc_literal(o) - << ";\n\n"; -} - -void cvc_propt::lnor(literalt a, literalt b, literalt o) -{ - out << "%% lnor\n"; - out << "ASSERT (NOT (" << cvc_literal(a) << " OR " - << cvc_literal(b) << ")) <=> " << cvc_literal(o) - << ";\n\n"; -} - -void cvc_propt::lequal(literalt a, literalt b, literalt o) -{ - out << "%% lequal\n"; - out << "ASSERT (" << cvc_literal(a) << " <=> " - << cvc_literal(b) << ") <=> " << cvc_literal(o) - << ";\n\n"; -} - -void cvc_propt::limplies(literalt a, literalt b, literalt o) -{ - out << "%% limplies\n"; - out << "ASSERT (" << cvc_literal(a) << " => " - << cvc_literal(b) << ") <=> " << cvc_literal(o) - << ";\n\n"; -} - -literalt cvc_propt::land(const bvt &bv) -{ - out << "%% land\n"; - - literalt literal=def_cvc_literal(); - - forall_literals(it, bv) - { - if(it!=bv.begin()) - out << " AND "; - out << cvc_literal(*it); - } - - out << ";\n\n"; - - return literal; -} - -literalt cvc_propt::lor(const bvt &bv) -{ - out << "%% lor\n"; - - literalt literal=def_cvc_literal(); - - forall_literals(it, bv) - { - if(it!=bv.begin()) - out << " OR "; - out << cvc_literal(*it); - } - - out << ";\n\n"; - - return literal; -} - -literalt cvc_propt::lxor(const bvt &bv) -{ - if(bv.empty()) - return const_literal(false); - if(bv.size()==1) - return bv[0]; - if(bv.size()==2) - return lxor(bv[0], bv[1]); - - literalt literal=const_literal(false); - - forall_literals(it, bv) - literal=lxor(*it, literal); - - return literal; -} - -literalt cvc_propt::land(literalt a, literalt b) -{ - if(a==const_literal(true)) - return b; - if(b==const_literal(true)) - return a; - if(a==const_literal(false)) - return const_literal(false); - if(b==const_literal(false)) - return const_literal(false); - if(a==b) - return a; - - out << "%% land\n"; - - literalt o=def_cvc_literal(); - - out << cvc_literal(a) << " AND " << cvc_literal(b) << ";\n\n"; - - return o; -} - -literalt cvc_propt::lor(literalt a, literalt b) -{ - if(a==const_literal(false)) - return b; - if(b==const_literal(false)) - return a; - if(a==const_literal(true)) - return const_literal(true); - if(b==const_literal(true)) - return const_literal(true); - if(a==b) - return a; - - out << "%% lor\n"; - - literalt o=def_cvc_literal(); - - out << cvc_literal(a) << " OR " << cvc_literal(b) << ";\n\n"; - - return o; -} - -literalt cvc_propt::lxor(literalt a, literalt b) -{ - if(a==const_literal(false)) - return b; - if(b==const_literal(false)) - return a; - if(a==const_literal(true)) - return !b; - if(b==const_literal(true)) - return !a; - - out << "%% lxor\n"; - - literalt o=def_cvc_literal(); - - out << cvc_literal(a) << " XOR " << cvc_literal(b) << ";\n\n"; - - return o; -} - -literalt cvc_propt::lnand(literalt a, literalt b) -{ - return !land(a, b); -} - -literalt cvc_propt::lnor(literalt a, literalt b) -{ - return !lor(a, b); -} - -literalt cvc_propt::lequal(literalt a, literalt b) -{ - return !lxor(a, b); -} - -literalt cvc_propt::limplies(literalt a, literalt b) -{ - return lor(!a, b); -} - -literalt cvc_propt::lselect(literalt a, literalt b, literalt c) -{ - if(a==const_literal(true)) - return b; - if(a==const_literal(false)) - return c; - if(b==c) - return b; - - out << "%% lselect\n"; - - literalt o=def_cvc_literal(); - - out << "IF " << cvc_literal(a) << " THEN " - << cvc_literal(b) << " ELSE " - << cvc_literal(c) << " ENDIF;\n\n"; - - return o; -} - -literalt cvc_propt::new_variable() -{ - out << "l" << _no_variables << ": BOOLEAN;\n"; - literalt l; - l.set(_no_variables, false); - _no_variables++; - return l; -} - -literalt cvc_propt::def_cvc_literal() -{ - out << "l" << _no_variables << ": BOOLEAN = "; - literalt l; - l.set(_no_variables, false); - _no_variables++; - return l; -} - -void cvc_propt::lcnf(const bvt &bv) -{ - if(bv.empty()) - return; - bvt new_bv; - - std::set s; - - new_bv.reserve(bv.size()); - - for(bvt::const_iterator it=bv.begin(); it!=bv.end(); it++) - { - if(s.insert(*it).second) - new_bv.push_back(*it); - - if(s.find(!*it)!=s.end()) - return; // clause satisfied - - assert(it->var_no()<_no_variables); - } - - assert(!new_bv.empty()); - - out << "%% lcnf\n"; - out << "ASSERT "; - - for(bvt::const_iterator it=new_bv.begin(); it!=new_bv.end(); it++) - { - if(it!=new_bv.begin()) - out << " OR "; - out << cvc_literal(*it); - } - - out << ";\n\n"; -} - -std::string cvc_propt::cvc_literal(literalt l) -{ - if(l==const_literal(false)) - return "FALSE"; - else if(l==const_literal(true)) - return "TRUE"; - - if(l.sign()) - return "(NOT l"+std::to_string(l.var_no())+")"; - - return "l"+std::to_string(l.var_no()); -} - -propt::resultt cvc_propt::prop_solve() -{ - out << "QUERY FALSE;\n"; - return P_ERROR; -} diff --git a/src/solvers/cvc/cvc_prop.h b/src/solvers/cvc/cvc_prop.h deleted file mode 100644 index 82786e0a2bb..00000000000 --- a/src/solvers/cvc/cvc_prop.h +++ /dev/null @@ -1,88 +0,0 @@ -/*******************************************************************\ - -Module: - -Author: Daniel Kroening, kroening@kroening.com - -\*******************************************************************/ - - -#ifndef CPROVER_SOLVERS_CVC_CVC_PROP_H -#define CPROVER_SOLVERS_CVC_CVC_PROP_H - -#include - -#include - -#include - -class cvc_propt:virtual public propt -{ -public: - explicit cvc_propt(std::ostream &_out); - virtual ~cvc_propt(); - - virtual void land(literalt a, literalt b, literalt o); - virtual void lor(literalt a, literalt b, literalt o); - virtual void lxor(literalt a, literalt b, literalt o); - virtual void lnand(literalt a, literalt b, literalt o); - virtual void lnor(literalt a, literalt b, literalt o); - virtual void lequal(literalt a, literalt b, literalt o); - virtual void limplies(literalt a, literalt b, literalt o); - - virtual literalt land(literalt a, literalt b); - virtual literalt lor(literalt a, literalt b); - virtual literalt land(const bvt &bv); - virtual literalt lor(const bvt &bv); - virtual literalt lxor(const bvt &bv); - virtual literalt lxor(literalt a, literalt b); - virtual literalt lnand(literalt a, literalt b); - virtual literalt lnor(literalt a, literalt b); - virtual literalt lequal(literalt a, literalt b); - virtual literalt limplies(literalt a, literalt b); - virtual literalt lselect(literalt a, literalt b, literalt c); // a?b:c - virtual literalt new_variable(); - virtual size_t no_variables() const { return _no_variables; } - virtual void set_no_variables(size_t no) { assert(false); } - - virtual void lcnf(const bvt &bv); - - virtual const std::string solver_text() - { return "CVC"; } - - virtual tvt l_get(literalt literal) const - { - unsigned v=literal.var_no(); - if(v>=assignment.size()) - return tvt(tvt::tv_enumt::TV_UNKNOWN); - tvt r=assignment[v]; - return literal.sign()?!r:r; - } - - virtual propt::resultt prop_solve(); - - friend class cvc_convt; - friend class cvc_dect; - - virtual void clear() - { - assignment.clear(); - } - - void reset_assignment() - { - assignment.clear(); - assignment.resize(no_variables(), tvt(tvt::tv_enumt::TV_UNKNOWN)); - } - -protected: - unsigned _no_variables; - std::ostream &out; - - std::string cvc_literal(literalt l); - literalt def_cvc_literal(); - - std::vector assignment; -}; - -#endif // CPROVER_SOLVERS_CVC_CVC_PROP_H diff --git a/src/solvers/dplib/dplib_conv.cpp b/src/solvers/dplib/dplib_conv.cpp deleted file mode 100644 index a87cd0c25a2..00000000000 --- a/src/solvers/dplib/dplib_conv.cpp +++ /dev/null @@ -1,1170 +0,0 @@ -/*******************************************************************\ - -Module: - -Author: Daniel Kroening, kroening@kroening.com - -\*******************************************************************/ - -#include "dplib_conv.h" - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include - -std::string dplib_convt::bin_zero(unsigned bits) -{ - assert(bits!=0); - std::string result="0bin"; - while(bits!=0) { result+='0'; bits--; } - return result; -} - -std::string dplib_convt::dplib_pointer_type() -{ - assert(config.ansi_c.pointer_width!=0); - return "[# object: INT, offset: BITVECTOR("+ - std::to_string(config.ansi_c.pointer_width)+") #]"; -} - -std::string dplib_convt::array_index_type() -{ - return std::string("SIGNED [")+std::to_string(32)+"]"; -} - -typet dplib_convt::gen_array_index_type() -{ - typet t(ID_signedbv); - t.set(ID_width, 32); - return t; -} - -std::string dplib_convt::array_index(unsigned i) -{ - return "0bin"+integer2binary(i, config.ansi_c.int_width); -} - -void dplib_convt::convert_array_index(const exprt &expr) -{ - if(expr.type()==gen_array_index_type()) - { - convert_dplib_expr(expr); - } - else - { - exprt tmp(ID_typecast, gen_array_index_type()); - tmp.copy_to_operands(expr); - convert_dplib_expr(tmp); - } -} - -void dplib_convt::convert_address_of_rec(const exprt &expr) -{ - if(expr.id()==ID_symbol || - expr.id()==ID_constant || - expr.id()==ID_string_constant) - { - dplib_prop.out - << "(# object:=" - << pointer_logic.add_object(expr) - << ", offset:=" - << bin_zero(config.ansi_c.pointer_width) << " #)"; - } - else if(expr.id()==ID_index) - { - if(expr.operands().size()!=2) - throw "index takes two operands"; - - const exprt &array=expr.op0(); - const exprt &index=expr.op1(); - - if(index.is_zero()) - { - if(array.type().id()==ID_pointer) - convert_dplib_expr(array); - else if(array.type().id()==ID_array) - convert_address_of_rec(array); - else - assert(false); - } - else - { - dplib_prop.out << "(LET P: "; - dplib_prop.out << dplib_pointer_type(); - dplib_prop.out << " = "; - - if(array.type().id()==ID_pointer) - convert_dplib_expr(array); - else if(array.type().id()==ID_array) - convert_address_of_rec(array); - else - assert(false); - - dplib_prop.out << " IN P WITH .offset:=BVPLUS(" - << config.ansi_c.pointer_width - << ", P.offset, "; - convert_dplib_expr(index); - dplib_prop.out << "))"; - } - } - else if(expr.id()==ID_member) - { - if(expr.operands().size()!=1) - throw "member takes one operand"; - - const exprt &struct_op=expr.op0(); - - dplib_prop.out << "(LET P: "; - dplib_prop.out << dplib_pointer_type(); - dplib_prop.out << " = "; - - convert_address_of_rec(struct_op); - - const irep_idt &component_name= - to_member_expr(expr).get_component_name(); - - mp_integer offset=member_offset(ns, - to_struct_type(struct_op.type()), component_name); - assert(offset>=0); - - typet index_type(ID_unsignedbv); - index_type.set(ID_width, config.ansi_c.pointer_width); - - exprt index=from_integer(offset, index_type); - - dplib_prop.out << " IN P WITH .offset:=BVPLUS(" - << config.ansi_c.pointer_width - << ", P.offset, "; - convert_dplib_expr(index); - dplib_prop.out << "))"; - } - else - throw "don't know how to take address of: "+expr.id_string(); -} - -literalt dplib_convt::convert_rest(const exprt &expr) -{ - // dplib_prop.out << "%% E: " << expr << '\n'; - - literalt l=prop.new_variable(); - - find_symbols(expr); - - if(expr.id()==ID_equal || expr.id()==ID_notequal) - { - assert(expr.operands().size()==2); - - dplib_prop.out << "ASSERT " << dplib_prop.dplib_literal(l) << " <=> ("; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ((expr.id()==ID_equal)?"=":"/="); - convert_dplib_expr(expr.op1()); - dplib_prop.out << ");\n"; - } - - return l; -} - -void dplib_convt::convert_identifier(const std::string &identifier) -{ - for(std::string::const_iterator - it=identifier.begin(); - it!=identifier.end(); - it++) - { - char ch=*it; - - if(isalnum(ch) || ch=='$' || ch=='?') - dplib_prop.out << ch; - else if(ch==':') - { - std::string::const_iterator next_it(it); - next_it++; - if(next_it!=identifier.end() && *next_it==':') - { - dplib_prop.out << "__"; - it=next_it; - } - else - { - dplib_prop.out << '_'; - dplib_prop.out << int(ch); - dplib_prop.out << '_'; - } - } - else - { - dplib_prop.out << '_'; - dplib_prop.out << int(ch); - dplib_prop.out << '_'; - } - } -} - -void dplib_convt::convert_as_bv(const exprt &expr) -{ - if(expr.type().id()==ID_bool) - { - dplib_prop.out << "IF "; - convert_dplib_expr(expr); - dplib_prop.out << " THEN 0bin1 ELSE 0bin0 ENDIF"; - } - else - convert_dplib_expr(expr); -} - -void dplib_convt::convert_array_value(const exprt &expr) -{ - convert_as_bv(expr); -} - -void dplib_convt::convert_dplib_expr(const exprt &expr) -{ - if(expr.id()==ID_symbol) - { - convert_identifier(expr.get_string(ID_identifier)); - } - else if(expr.id()==ID_nondet_symbol) - { - convert_identifier("nondet$"+expr.get_string(ID_identifier)); - } - else if(expr.id()==ID_typecast) - { - assert(expr.operands().size()==1); - const exprt &op=expr.op0(); - - if(expr.type().id()==ID_bool) - { - if(op.type().id()==ID_signedbv || - op.type().id()==ID_unsignedbv || - op.type().id()==ID_pointer) - { - convert_dplib_expr(op); - dplib_prop.out << "/="; - convert_dplib_expr(from_integer(0, op.type())); - } - else - { - // NOLINTNEXTLINE(readability/throw) - throw "TODO typecast1 "+op.type().id_string()+" -> bool"; - } - } - else if(expr.type().id()==ID_signedbv || - expr.type().id()==ID_unsignedbv) - { - unsigned to_width= - unsafe_string2unsigned(id2string(expr.type().get(ID_width))); - - if(op.type().id()==ID_signedbv) - { - unsigned from_width= - unsafe_string2unsigned(id2string(op.type().get(ID_width))); - - if(from_width==to_width) - convert_dplib_expr(op); - else if(from_width1) - { - dplib_prop.out << "(0bin"; - - for(unsigned i=1; i "+expr.type().id_string(); - } - } - else if(expr.type().id()==ID_pointer) - { - if(op.type().id()==ID_pointer) - { - convert_dplib_expr(op); - } - else - // NOLINTNEXTLINE(readability/throw) - throw "TODO typecast3 "+op.type().id_string()+" -> pointer"; - } - else - // NOLINTNEXTLINE(readability/throw) - throw "TODO typecast4 ? -> "+expr.type().id_string(); - } - else if(expr.id()==ID_struct) - { - dplib_prop.out << "(# "; - - const struct_typet &struct_type=to_struct_type(expr.type()); - - const struct_typet::componentst &components= - struct_type.components(); - - assert(components.size()==expr.operands().size()); - - unsigned i=0; - for(struct_typet::componentst::const_iterator - it=components.begin(); - it!=components.end(); - it++, i++) - { - if(i!=0) - dplib_prop.out << ", "; - dplib_prop.out << it->get(ID_name); - dplib_prop.out << ":="; - convert_dplib_expr(expr.operands()[i]); - } - - dplib_prop.out << " #)"; - } - else if(expr.id()==ID_constant) - { - if(expr.type().id()==ID_unsignedbv || - expr.type().id()==ID_signedbv || - expr.type().id()==ID_bv) - { - dplib_prop.out << "0bin" << expr.get(ID_value); - } - else if(expr.type().id()==ID_pointer) - { - const irep_idt &value=expr.get(ID_value); - - if(value=="NULL") - { - dplib_prop.out << "(# object:=" - << pointer_logic.get_null_object() - << ", offset:=" - << bin_zero(config.ansi_c.pointer_width) << " #)"; - } - else - throw "unknown pointer constant: "+id2string(value); - } - else if(expr.type().id()==ID_bool) - { - if(expr.is_true()) - dplib_prop.out << "TRUE"; - else if(expr.is_false()) - dplib_prop.out << "FALSE"; - else - throw "unknown boolean constant"; - } - else if(expr.type().id()==ID_array) - { - dplib_prop.out << "ARRAY (i: " << array_index_type() << "):"; - - assert(!expr.operands().empty()); - - unsigned i=0; - forall_operands(it, expr) - { - if(i==0) - dplib_prop.out << "\n IF "; - else - dplib_prop.out << "\n ELSIF "; - - dplib_prop.out << "i=" << array_index(i) << " THEN "; - convert_array_value(*it); - i++; - } - - dplib_prop.out << "\n ELSE "; - convert_dplib_expr(expr.op0()); - dplib_prop.out << "\n ENDIF"; - } - else if(expr.type().id()==ID_integer || - expr.type().id()==ID_natural || - expr.type().id()==ID_range) - { - dplib_prop.out << expr.get(ID_value); - } - else - throw "unknown constant: "+expr.type().id_string(); - } - else if(expr.id()==ID_concatenation || - expr.id()==ID_bitand || - expr.id()==ID_bitor) - { - dplib_prop.out << "("; - - forall_operands(it, expr) - { - if(it!=expr.operands().begin()) - { - if(expr.id()==ID_concatenation) - dplib_prop.out << " @ "; - else if(expr.id()==ID_bitand) - dplib_prop.out << " & "; - else if(expr.id()==ID_bitor) - dplib_prop.out << " | "; - } - - convert_as_bv(*it); - } - - dplib_prop.out << ")"; - } - else if(expr.id()==ID_bitxor) - { - assert(!expr.operands().empty()); - - if(expr.operands().size()==1) - { - convert_dplib_expr(expr.op0()); - } - else if(expr.operands().size()==2) - { - dplib_prop.out << "BVXOR("; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ", "; - convert_dplib_expr(expr.op1()); - dplib_prop.out << ")"; - } - else - { - assert(expr.operands().size()>=3); - - exprt tmp(expr); - tmp.operands().resize(tmp.operands().size()-1); - - dplib_prop.out << "BVXOR("; - convert_dplib_expr(tmp); - dplib_prop.out << ", "; - convert_dplib_expr(expr.operands().back()); - dplib_prop.out << ")"; - } - } - else if(expr.id()==ID_bitnand) - { - assert(expr.operands().size()==2); - - dplib_prop.out << "BVNAND("; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ", "; - convert_dplib_expr(expr.op1()); - dplib_prop.out << ")"; - } - else if(expr.id()==ID_bitnot) - { - assert(expr.operands().size()==1); - dplib_prop.out << "~("; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ")"; - } - else if(expr.id()==ID_unary_minus) - { - assert(expr.operands().size()==1); - if(expr.type().id()==ID_unsignedbv || - expr.type().id()==ID_signedbv) - { - dplib_prop.out << "BVUMINUS("; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ")"; - } - else - throw "unsupported type for unary-: "+expr.type().id_string(); - } - else if(expr.id()==ID_if) - { - assert(expr.operands().size()==3); - dplib_prop.out << "IF "; - convert_dplib_expr(expr.op0()); - dplib_prop.out << " THEN "; - convert_dplib_expr(expr.op1()); - dplib_prop.out << " ELSE "; - convert_dplib_expr(expr.op2()); - dplib_prop.out << " ENDIF"; - } - else if(expr.id()==ID_and || - expr.id()==ID_or || - expr.id()==ID_xor) - { - assert(expr.type().id()==ID_bool); - - if(expr.operands().size()>=2) - { - forall_operands(it, expr) - { - if(it!=expr.operands().begin()) - { - if(expr.id()==ID_and) - dplib_prop.out << " AND "; - else if(expr.id()==ID_or) - dplib_prop.out << " OR "; - else if(expr.id()==ID_xor) - dplib_prop.out << " XOR "; - } - - dplib_prop.out << "("; - convert_dplib_expr(*it); - dplib_prop.out << ")"; - } - } - else if(expr.operands().size()==1) - { - convert_dplib_expr(expr.op0()); - } - else - assert(false); - } - else if(expr.id()==ID_not) - { - assert(expr.operands().size()==1); - dplib_prop.out << "NOT ("; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ")"; - } - else if(expr.id()==ID_equal || - expr.id()==ID_notequal) - { - assert(expr.operands().size()==2); - assert(expr.op0().type()==expr.op1().type()); - - if(expr.op0().type().id()==ID_bool) - { - if(expr.id()==ID_notequal) - dplib_prop.out << "NOT ("; - dplib_prop.out << "("; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ") <=> ("; - convert_dplib_expr(expr.op1()); - dplib_prop.out << ")"; - if(expr.id()==ID_notequal) - dplib_prop.out << ")"; - } - else - { - dplib_prop.out << "("; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ")"; - dplib_prop.out << (expr.id()==ID_equal?"=":"/="); - dplib_prop.out << "("; - convert_dplib_expr(expr.op1()); - dplib_prop.out << ")"; - } - } - else if(expr.id()==ID_le || - expr.id()==ID_lt || - expr.id()==ID_ge || - expr.id()==ID_gt) - { - assert(expr.operands().size()==2); - - const typet &op_type=expr.op0().type(); - - if(op_type.id()==ID_unsignedbv) - { - if(expr.id()==ID_le) - dplib_prop.out << "BVLE"; - else if(expr.id()==ID_lt) - dplib_prop.out << "BVLT"; - else if(expr.id()==ID_ge) - dplib_prop.out << "BVGE"; - else if(expr.id()==ID_gt) - dplib_prop.out << "BVGT"; - - dplib_prop.out << "("; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ", "; - convert_dplib_expr(expr.op1()); - dplib_prop.out << ")"; - } - else if(op_type.id()==ID_signedbv) - { - if(expr.id()==ID_le) - dplib_prop.out << "SBVLE"; - else if(expr.id()==ID_lt) - dplib_prop.out << "SBVLT"; - else if(expr.id()==ID_ge) - dplib_prop.out << "SBVGE"; - else if(expr.id()==ID_gt) - dplib_prop.out << "SBVGT"; - - dplib_prop.out << "("; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ", "; - convert_dplib_expr(expr.op1()); - dplib_prop.out << ")"; - } - else - throw - "unsupported type for "+expr.id_string()+": "+expr.type().id_string(); - } - else if(expr.id()==ID_plus) - { - if(expr.operands().size()>=2) - { - if(expr.type().id()==ID_unsignedbv || - expr.type().id()==ID_signedbv) - { - dplib_prop.out << "BVPLUS(" << expr.type().get(ID_width); - - forall_operands(it, expr) - { - dplib_prop.out << ", "; - convert_dplib_expr(*it); - } - - dplib_prop.out << ")"; - } - else if(expr.type().id()==ID_pointer) - { - if(expr.operands().size()!=2) - throw "pointer arithmetic with more than two operands"; - - const exprt *p, *i; - - if(expr.op0().type().id()==ID_pointer) - { - p=&expr.op0(); - i=&expr.op1(); - } - else if(expr.op1().type().id()==ID_pointer) - { - p=&expr.op1(); - i=&expr.op0(); - } - else - throw "unexpected mixture in pointer arithmetic"; - - dplib_prop.out << "(LET P: " << dplib_pointer_type() << " = "; - convert_dplib_expr(*p); - dplib_prop.out << " IN P WITH .offset:=BVPLUS(" - << config.ansi_c.pointer_width - << ", P.offset, "; - convert_dplib_expr(*i); - dplib_prop.out << "))"; - } - else - throw "unsupported type for +: "+expr.type().id_string(); - } - else if(expr.operands().size()==1) - { - convert_dplib_expr(expr.op0()); - } - else - assert(false); - } - else if(expr.id()==ID_minus) - { - if(expr.operands().size()==2) - { - if(expr.type().id()==ID_unsignedbv || - expr.type().id()==ID_signedbv) - { - dplib_prop.out << "BVSUB(" << expr.type().get(ID_width) << ", "; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ", "; - convert_dplib_expr(expr.op1()); - dplib_prop.out << ")"; - } - else - throw "unsupported type for -: "+expr.type().id_string(); - } - else if(expr.operands().size()==1) - { - convert_dplib_expr(expr.op0()); - } - else - assert(false); - } - else if(expr.id()==ID_div) - { - assert(expr.operands().size()==2); - - if(expr.type().id()==ID_unsignedbv || - expr.type().id()==ID_signedbv) - { - if(expr.type().id()==ID_unsignedbv) - dplib_prop.out << "BVDIV"; - else - dplib_prop.out << "SBVDIV"; - - dplib_prop.out << "(" << expr.type().get(ID_width) << ", "; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ", "; - convert_dplib_expr(expr.op1()); - dplib_prop.out << ")"; - } - else - throw "unsupported type for /: "+expr.type().id_string(); - } - else if(expr.id()==ID_mod) - { - assert(expr.operands().size()==2); - - if(expr.type().id()==ID_unsignedbv || - expr.type().id()==ID_signedbv) - { - if(expr.type().id()==ID_unsignedbv) - dplib_prop.out << "BVMOD"; - else - dplib_prop.out << "SBVMOD"; - - dplib_prop.out << "(" << expr.type().get(ID_width) << ", "; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ", "; - convert_dplib_expr(expr.op1()); - dplib_prop.out << ")"; - } - else - throw "unsupported type for mod: "+expr.type().id_string(); - } - else if(expr.id()==ID_mult) - { - if(expr.operands().size()==2) - { - if(expr.type().id()==ID_unsignedbv || - expr.type().id()==ID_signedbv) - { - dplib_prop.out << "BVMULT(" << expr.type().get(ID_width) << ", "; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ", "; - convert_dplib_expr(expr.op1()); - dplib_prop.out << ")"; - } - else - throw "unsupported type for *: "+expr.type().id_string(); - } - else if(expr.operands().size()==1) - { - convert_dplib_expr(expr.op0()); - } - else - assert(false); - } - else if(expr.id()==ID_address_of || - expr.id()=="reference_to") - { - assert(expr.operands().size()==1); - assert(expr.type().id()==ID_pointer); - convert_address_of_rec(expr.op0()); - } - else if(expr.id()==ID_array_of) - { - assert(expr.type().id()==ID_array); - assert(expr.operands().size()==1); - dplib_prop.out << "(ARRAY (i: " << array_index_type() << "): "; - convert_array_value(expr.op0()); - dplib_prop.out << ")"; - } - else if(expr.id()==ID_index) - { - assert(expr.operands().size()==2); - dplib_prop.out << "("; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ")["; - convert_array_index(expr.op1()); - dplib_prop.out << "]"; - } - else if(expr.id()==ID_ashr || - expr.id()==ID_lshr || - expr.id()==ID_shl) - { - assert(expr.operands().size()==2); - - if(expr.type().id()==ID_unsignedbv || - expr.type().id()==ID_signedbv) - { - if(expr.id()==ID_ashr) - dplib_prop.out << "BVASHR"; - else if(expr.id()==ID_lshr) - dplib_prop.out << "BVLSHR"; - else if(expr.id()==ID_shl) - dplib_prop.out << "BVSHL"; - else - assert(false); - - dplib_prop.out << "(" << expr.type().get(ID_width) << ", "; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ", "; - convert_dplib_expr(expr.op1()); - dplib_prop.out << ")"; - } - else - throw - "unsupported type for "+expr.id_string()+": "+expr.type().id_string(); - } - else if(expr.id()==ID_with) - { - assert(expr.operands().size()>=1); - dplib_prop.out << "("; - convert_dplib_expr(expr.op0()); - dplib_prop.out << ")"; - - for(unsigned i=1; i s_set; - - ::find_symbols(expr.op1(), s_set); - - if(s_set.find(identifier)==s_set.end()) - { - id.type=expr.op0().type(); - - find_symbols(expr.op1()); - - convert_identifier(id2string(identifier)); - dplib_prop.out << ": "; - convert_dplib_type(expr.op0().type()); - dplib_prop.out << " = "; - convert_dplib_expr(expr.op1()); - - dplib_prop.out << ";\n\n"; - return; - } - } - } - } - - find_symbols(expr); - - dplib_prop.out << "AXIOM "; - - if(!value) - dplib_prop.out << "! ("; - - convert_dplib_expr(expr); - - if(!value) - dplib_prop.out << ")"; - - dplib_prop.out << ";\n\n"; -} - -void dplib_convt::find_symbols(const exprt &expr) -{ - find_symbols(expr.type()); - - forall_operands(it, expr) - find_symbols(*it); - - if(expr.id()==ID_symbol) - { - if(expr.type().id()==ID_code) - return; - - const irep_idt &identifier=expr.get(ID_identifier); - - identifiert &id=identifier_map[identifier]; - - if(id.type.is_nil()) - { - id.type=expr.type(); - - convert_identifier(id2string(identifier)); - dplib_prop.out << ": "; - convert_dplib_type(expr.type()); - dplib_prop.out << ";\n"; - } - } - else if(expr.id()==ID_nondet_symbol) - { - if(expr.type().id()==ID_code) - return; - - const irep_idt identifier="nondet$"+expr.get_string(ID_identifier); - - identifiert &id=identifier_map[identifier]; - - if(id.type.is_nil()) - { - id.type=expr.type(); - - convert_identifier(id2string(identifier)); - dplib_prop.out << ": "; - convert_dplib_type(expr.type()); - dplib_prop.out << ";\n"; - } - } -} - -void dplib_convt::convert_dplib_type(const typet &type) -{ - if(type.id()==ID_array) - { - const array_typet &array_type=to_array_type(type); - - dplib_prop.out << "ARRAY " << array_index_type() - << " OF "; - - if(array_type.subtype().id()==ID_bool) - dplib_prop.out << "BITVECTOR(1)"; - else - convert_dplib_type(array_type.subtype()); - } - else if(type.id()==ID_bool) - { - dplib_prop.out << "boolean"; - } - else if(type.id()==ID_struct || - type.id()==ID_union) - { - const struct_typet &struct_type=to_struct_type(type); - - dplib_prop.out << "[#"; - - const struct_typet::componentst &components= - struct_type.components(); - - for(struct_typet::componentst::const_iterator - it=components.begin(); - it!=components.end(); - it++) - { - if(it!=components.begin()) - dplib_prop.out << ","; - dplib_prop.out << " "; - dplib_prop.out << it->get(ID_name); - dplib_prop.out << ": "; - convert_dplib_type(it->type()); - } - - dplib_prop.out << " #]"; - } - else if(type.id()==ID_pointer || - type.id()==ID_reference) - { - dplib_prop.out << dplib_pointer_type(); - } - else if(type.id()==ID_integer) - { - dplib_prop.out << "int"; - } - else if(type.id()==ID_signedbv) - { - unsigned width=to_signedbv_type(type).get_width(); - - if(width==0) - throw "zero-width vector type: "+type.id_string(); - - dplib_prop.out << "signed[" << width << "]"; - } - else if(type.id()==ID_unsignedbv) - { - unsigned width=to_unsignedbv_type(type).get_width(); - - if(width==0) - throw "zero-width vector type: "+type.id_string(); - - dplib_prop.out << "unsigned[" << width << "]"; - } - else if(type.id()==ID_bv) - { - unsigned width=to_bv_type(type).get_width(); - - if(width==0) - throw "zero-width vector type: "+type.id_string(); - - dplib_prop.out << "bv[" << width << "]"; - } - else - throw "unsupported type: "+type.id_string(); -} - -void dplib_convt::find_symbols(const typet &type) -{ - if(type.id()==ID_array) - { - const array_typet &array_type=to_array_type(type); - find_symbols(array_type.size()); - } - else if(type.id()==ID_struct || - type.id()==ID_union) - { - } -} diff --git a/src/solvers/dplib/dplib_conv.h b/src/solvers/dplib/dplib_conv.h deleted file mode 100644 index 74034d6c1e2..00000000000 --- a/src/solvers/dplib/dplib_conv.h +++ /dev/null @@ -1,73 +0,0 @@ -/*******************************************************************\ - -Module: - -Author: Daniel Kroening, kroening@kroening.com - -\*******************************************************************/ - - -#ifndef CPROVER_SOLVERS_DPLIB_DPLIB_CONV_H -#define CPROVER_SOLVERS_DPLIB_DPLIB_CONV_H - - -#include -#include - -#include "dplib_prop.h" - -class dplib_convt:public prop_convt -{ -public: - dplib_convt( - const namespacet &_ns, - std::ostream &_out): - prop_convt(_ns), - out(_out), - pointer_logic(_ns) { } - - virtual ~dplib_convt() { } - -protected: - std::ostream &out; - - virtual literalt convert_rest(const exprt &expr); - virtual void convert_dplib_expr(const exprt &expr); - virtual void convert_dplib_type(const typet &type); - virtual void set_to(const exprt &expr, bool value); - virtual void convert_address_of_rec(const exprt &expr); - - pointer_logict pointer_logic; - -private: - void convert_identifier(const std::string &identifier); - void find_symbols(const exprt &expr); - void find_symbols(const typet &type); - void convert_array_value(const exprt &expr); - void convert_as_bv(const exprt &expr); - void convert_array_index(const exprt &expr); - static typet gen_array_index_type(); - static std::string bin_zero(unsigned bits); - static std::string array_index_type(); - static std::string array_index(unsigned i); - static std::string dplib_pointer_type(); - - struct identifiert - { - typet type; - exprt value; - - identifiert() - { - type.make_nil(); - value.make_nil(); - } - }; - - typedef std::unordered_map - identifier_mapt; - - identifier_mapt identifier_map; -}; - -#endif // CPROVER_SOLVERS_DPLIB_DPLIB_CONV_H diff --git a/src/solvers/dplib/dplib_dec.cpp b/src/solvers/dplib/dplib_dec.cpp deleted file mode 100644 index 111805276ba..00000000000 --- a/src/solvers/dplib/dplib_dec.cpp +++ /dev/null @@ -1,159 +0,0 @@ -/*******************************************************************\ - -Module: - -Author: Daniel Kroening, kroening@kroening.com - -\*******************************************************************/ - -#include "dplib_dec.h" - -#include -#include - -#if defined(__linux__) || \ - defined(__FreeBSD_kernel__) || \ - defined(__GNU__) || \ - defined(__unix__) || \ - defined(__CYGWIN__) || \ - defined(__MACH__) -#include -#endif - -#ifdef _WIN32 -#include -#define getpid _getpid -#endif - -#include -#include - -dplib_temp_filet::dplib_temp_filet() -{ - temp_out_filename="dplib_dec_out_"+std::to_string(getpid())+".tmp"; - - temp_out.open( - temp_out_filename.c_str(), - std::ios_base::out | std::ios_base::trunc); -} - -dplib_temp_filet::~dplib_temp_filet() -{ - temp_out.close(); - - if(temp_out_filename!="") - unlink(temp_out_filename.c_str()); - - if(temp_result_filename!="") - unlink(temp_result_filename.c_str()); -} - -decision_proceduret::resultt dplib_dect::dec_solve() -{ - dplib_prop.out << "QUERY FALSE;\n"; - dplib_prop.out << "COUNTERMODEL;\n"; - - post_process(); - - temp_out.close(); - - temp_result_filename= - "dplib_dec_result_"+std::to_string(getpid())+".tmp"; - - std::string command= - "dplibl "+temp_out_filename+" > "+temp_result_filename+" 2>&1"; - - int res=system(command.c_str()); - assert(0 == res); - - status("Reading result from CVCL"); - - return read_dplib_result(); -} - -void dplib_dect::read_assert(std::istream &in, std::string &line) -{ - // strip ASSERT - line=std::string(line, strlen("ASSERT "), std::string::npos); - if(line=="") - return; - - // bit-vector - if(line[0]=='(') - { - // get identifier - std::string::size_type pos= - line.find(' '); - - std::string identifier=std::string(line, 1, pos-1); - - // get value - if(!std::getline(in, line)) - return; - - // skip spaces - pos=0; - while(pos" << identifier << "< = >" << value << "<\n"; - #endif - } - else - { - // boolean - tvt value=tvt(true); - - if(has_prefix(line, "NOT ")) - { - line=std::string(line, strlen("NOT "), std::string::npos); - value=tvt(false); - } - - if(line=="") - return; - - if(line[0]=='l') - { - unsigned number=unsafe_str2unsigned(line.c_str()+1); - assert(number - -#include "dplib_conv.h" - -class dplib_temp_filet -{ -public: - dplib_temp_filet(); - ~dplib_temp_filet(); - -protected: - std::ofstream temp_out; - std::string temp_out_filename, temp_result_filename; -}; - -class dplib_dect:protected dplib_temp_filet, public dplib_convt -{ -public: - explicit dplib_dect(const namespacet &_ns): - dplib_convt(_ns, temp_out) - { - } - - virtual resultt dec_solve(); - -protected: - resultt read_dplib_result(); - void read_assert(std::istream &in, std::string &line); -}; - -#endif // CPROVER_SOLVERS_DPLIB_DPLIB_DEC_H diff --git a/src/solvers/dplib/dplib_prop.cpp b/src/solvers/dplib/dplib_prop.cpp deleted file mode 100644 index a0111b3b8fc..00000000000 --- a/src/solvers/dplib/dplib_prop.cpp +++ /dev/null @@ -1,305 +0,0 @@ -/*******************************************************************\ - -Module: - -Author: Daniel Kroening, kroening@kroening.com - -\*******************************************************************/ - -#include "dplib_prop.h" - -#include - -#include - -dplib_propt::dplib_propt(std::ostream &_out):out(_out) -{ - // we skip index 0 - _no_variables=1; -} - -void dplib_propt::land(literalt a, literalt b, literalt o) -{ - out << "// land\n"; - out << "AXIOM (" << dplib_literal(a) << " & " - << dplib_literal(b) << ") <=> " << dplib_literal(o) - << ";\n\n"; -} - -void dplib_propt::lor(literalt a, literalt b, literalt o) -{ - out << "// lor\n"; - out << "AXIOM (" << dplib_literal(a) << " | " - << dplib_literal(b) << ") <=> " << dplib_literal(o) - << ";\n\n"; -} - -void dplib_propt::lxor(literalt a, literalt b, literalt o) -{ - out << "// lxor\n"; - out << "AXIOM (" << dplib_literal(a) << " <=> " - << dplib_literal(b) << ") <=> !" << dplib_literal(o) - << ";\n\n"; -} - -void dplib_propt::lnand(literalt a, literalt b, literalt o) -{ - out << "// lnand\n"; - out << "AXIOM (" << dplib_literal(a) << " & " - << dplib_literal(b) << ") <=> !" << dplib_literal(o) - << ";\n\n"; -} - -void dplib_propt::lnor(literalt a, literalt b, literalt o) -{ - out << "// lnor\n"; - out << "AXIOM (" << dplib_literal(a) << " | " - << dplib_literal(b) << ") <=> !" << dplib_literal(o) - << ";\n\n"; -} - -void dplib_propt::lequal(literalt a, literalt b, literalt o) -{ - out << "// lequal\n"; - out << "AXIOM (" << dplib_literal(a) << " <=> " - << dplib_literal(b) << ") <=> " << dplib_literal(o) - << ";\n\n"; -} - -void dplib_propt::limplies(literalt a, literalt b, literalt o) -{ - out << "// limplies\n"; - out << "AXIOM (" << dplib_literal(a) << " => " - << dplib_literal(b) << ") <=> " << dplib_literal(o) - << ";\n\n"; -} - -literalt dplib_propt::land(const bvt &bv) -{ - out << "// land\n"; - - literalt literal=def_dplib_literal(); - - forall_literals(it, bv) - { - if(it!=bv.begin()) - out << " & "; - out << dplib_literal(*it); - } - - out << "\n\n"; - - return literal; -} - -literalt dplib_propt::lor(const bvt &bv) -{ - out << "// lor\n"; - - literalt literal=def_dplib_literal(); - - forall_literals(it, bv) - { - if(it!=bv.begin()) - out << " | "; - out << dplib_literal(*it); - } - - out << "\n\n"; - - return literal; -} - -literalt dplib_propt::lxor(const bvt &bv) -{ - if(bv.empty()) - return const_literal(false); - if(bv.size()==1) - return bv[0]; - if(bv.size()==2) - return lxor(bv[0], bv[1]); - - literalt literal=const_literal(false); - - forall_literals(it, bv) - literal=lxor(*it, literal); - - return literal; -} - -literalt dplib_propt::land(literalt a, literalt b) -{ - if(a==const_literal(true)) - return b; - if(b==const_literal(true)) - return a; - if(a==const_literal(false)) - return const_literal(false); - if(b==const_literal(false)) - return const_literal(false); - if(a==b) - return a; - - literalt o=def_dplib_literal(); - out << dplib_literal(a) << " & " << dplib_literal(b) - << ";\n\n"; - - return o; -} - -literalt dplib_propt::lor(literalt a, literalt b) -{ - if(a==const_literal(false)) - return b; - if(b==const_literal(false)) - return a; - if(a==const_literal(true)) - return const_literal(true); - if(b==const_literal(true)) - return const_literal(true); - if(a==b) - return a; - - literalt o=def_dplib_literal(); - out << dplib_literal(a) << " | " << dplib_literal(b) - << ";\n\n"; - - return o; -} - -literalt dplib_propt::lxor(literalt a, literalt b) -{ - if(a==const_literal(false)) - return b; - if(b==const_literal(false)) - return a; - if(a==const_literal(true)) - return !b; - if(b==const_literal(true)) - return !a; - - literalt o=def_dplib_literal(); - out << "!(" << dplib_literal(a) << " <-> " << dplib_literal(b) - << ");\n\n"; - - return o; -} - -literalt dplib_propt::lnand(literalt a, literalt b) -{ - return !land(a, b); -} - -literalt dplib_propt::lnor(literalt a, literalt b) -{ - return !lor(a, b); -} - -literalt dplib_propt::lequal(literalt a, literalt b) -{ - return !lxor(a, b); -} - -literalt dplib_propt::limplies(literalt a, literalt b) -{ - return lor(!a, b); -} - -literalt dplib_propt::lselect(literalt a, literalt b, literalt c) -{ - if(a==const_literal(true)) - return b; - if(a==const_literal(false)) - return c; - if(b==c) - return b; - - out << "// lselect\n"; - - literalt o=def_dplib_literal(); - - out << "IF " << dplib_literal(a) << " THEN " - << dplib_literal(b) << " ELSE " - << dplib_literal(c) << " ENDIF;\n\n"; - - return o; -} - -literalt dplib_propt::new_variable() -{ - _no_variables++; - out << "l" << _no_variables << ": boolean;\n"; - literalt l; - l.set(_no_variables, false); - return l; -} - -literalt dplib_propt::def_dplib_literal() -{ - _no_variables++; - out << "l" << _no_variables << ": boolean = "; - literalt l; - l.set(_no_variables, false); - return l; -} - -void dplib_propt::lcnf(const bvt &bv) -{ - if(bv.empty()) - return; - bvt new_bv; - - std::set s; - - new_bv.reserve(bv.size()); - - for(bvt::const_iterator it=bv.begin(); it!=bv.end(); it++) - { - if(s.insert(*it).second) - new_bv.push_back(*it); - - if(s.find(!*it)!=s.end()) - return; // clause satisfied - - assert(it->var_no()<=_no_variables); - } - - assert(!new_bv.empty()); - - out << "// lcnf\n"; - out << "AXIOM "; - - for(bvt::const_iterator it=new_bv.begin(); it!=new_bv.end(); it++) - { - if(it!=new_bv.begin()) - out << " | "; - out << dplib_literal(*it); - } - - out << ";\n\n"; -} - -std::string dplib_propt::dplib_literal(literalt l) -{ - if(l==const_literal(false)) - return "FALSE"; - else if(l==const_literal(true)) - return "TRUE"; - - if(l.sign()) - return "(NOT l"+std::to_string(l.var_no())+")"; - - return "l"+std::to_string(l.var_no()); -} - -void dplib_propt::finish() -{ - // we want satisfiability - out << "THEOREM false;\n"; -} - -propt::resultt dplib_propt::prop_solve() -{ - finish(); - return P_ERROR; -} diff --git a/src/solvers/dplib/dplib_prop.h b/src/solvers/dplib/dplib_prop.h deleted file mode 100644 index 89441646093..00000000000 --- a/src/solvers/dplib/dplib_prop.h +++ /dev/null @@ -1,91 +0,0 @@ -/*******************************************************************\ - -Module: - -Author: Daniel Kroening, kroening@kroening.com - -\*******************************************************************/ - - -#ifndef CPROVER_SOLVERS_DPLIB_DPLIB_PROP_H -#define CPROVER_SOLVERS_DPLIB_DPLIB_PROP_H - -#include - -#include - -#include - -class dplib_propt:virtual public propt -{ -public: - explicit dplib_propt(std::ostream &_out); - virtual ~dplib_propt() { } - - virtual void land(literalt a, literalt b, literalt o); - virtual void lor(literalt a, literalt b, literalt o); - virtual void lxor(literalt a, literalt b, literalt o); - virtual void lnand(literalt a, literalt b, literalt o); - virtual void lnor(literalt a, literalt b, literalt o); - virtual void lequal(literalt a, literalt b, literalt o); - virtual void limplies(literalt a, literalt b, literalt o); - - virtual literalt land(literalt a, literalt b); - virtual literalt lor(literalt a, literalt b); - virtual literalt land(const bvt &bv); - virtual literalt lor(const bvt &bv); - virtual literalt lxor(const bvt &bv); - virtual literalt lxor(literalt a, literalt b); - virtual literalt lnand(literalt a, literalt b); - virtual literalt lnor(literalt a, literalt b); - virtual literalt lequal(literalt a, literalt b); - virtual literalt limplies(literalt a, literalt b); - virtual literalt lselect(literalt a, literalt b, literalt c); // a?b:c - virtual literalt new_variable(); - virtual size_t no_variables() const { return _no_variables; } - virtual void set_no_variables(size_t no) { assert(false); } - // virtual unsigned no_clauses()=0; - - virtual void lcnf(const bvt &bv); - - virtual const std::string solver_text() - { return "DPLIB"; } - - virtual tvt l_get(literalt literal) const - { - unsigned v=literal.var_no(); - if(v>=assignment.size()) - return tvt::unknown(); - tvt r=assignment[v]; - return literal.sign()?!r:r; - } - - virtual propt::resultt prop_solve(); - - friend class dplib_convt; - friend class dplib_dect; - - virtual void clear() - { - assignment.clear(); - } - - void reset_assignment() - { - assignment.clear(); - assignment.resize(no_variables(), tvt::unknown()); - } - -protected: - unsigned _no_variables; - std::ostream &out; - - std::string dplib_literal(literalt l); - literalt def_dplib_literal(); - - std::vector assignment; - - void finish(); -}; - -#endif // CPROVER_SOLVERS_DPLIB_DPLIB_PROP_H diff --git a/src/solvers/floatbv/float_approximation.cpp b/src/solvers/floatbv/float_approximation.cpp index 6a70b5f5091..2c73e517999 100644 --- a/src/solvers/floatbv/float_approximation.cpp +++ b/src/solvers/floatbv/float_approximation.cpp @@ -42,7 +42,7 @@ void float_approximationt::normalization_shift(bvt &fraction, bvt &exponent) if(over_approximate) shifted_fraction=overapproximating_left_shift(fraction, i); else - shifted_fraction=bv_utils.shift(fraction, bv_utilst::LEFT, i); + shifted_fraction=bv_utils.shift(fraction, bv_utilst::shiftt::LEFT, i); bv_utils.cond_implies_equal(shift, shifted_fraction, new_fraction); diff --git a/src/solvers/floatbv/float_approximation.h b/src/solvers/floatbv/float_approximation.h index daaaac8c7f3..a3193126465 100644 --- a/src/solvers/floatbv/float_approximation.h +++ b/src/solvers/floatbv/float_approximation.h @@ -12,7 +12,7 @@ Module: Floating Point with under/over-approximation #ifndef CPROVER_SOLVERS_FLOATBV_FLOAT_APPROXIMATION_H #define CPROVER_SOLVERS_FLOATBV_FLOAT_APPROXIMATION_H -#include +#include "float_utils.h" class float_approximationt:public float_utilst { diff --git a/src/solvers/refinement/bv_refinement.h b/src/solvers/refinement/bv_refinement.h index 6d4fb84db95..79367186b9b 100644 --- a/src/solvers/refinement/bv_refinement.h +++ b/src/solvers/refinement/bv_refinement.h @@ -12,7 +12,7 @@ Author: Daniel Kroening, kroening@kroening.com #ifndef CPROVER_SOLVERS_REFINEMENT_BV_REFINEMENT_H #define CPROVER_SOLVERS_REFINEMENT_BV_REFINEMENT_H -#include +#include #include @@ -25,7 +25,7 @@ class bv_refinementt:public bv_pointerst { const namespacet *ns=nullptr; propt *prop=nullptr; - language_uit::uit ui=language_uit::uit::PLAIN; + ui_message_handlert::uit ui=ui_message_handlert::uit::PLAIN; /// Max number of times we refine a formula node unsigned max_node_refinement=5; /// Enable array refinement @@ -114,7 +114,7 @@ class bv_refinementt:public bv_pointerst protected: // use gui format - language_uit::uit ui; + ui_message_handlert::uit ui; }; #endif // CPROVER_SOLVERS_REFINEMENT_BV_REFINEMENT_H diff --git a/src/solvers/refinement/string_constraint.h b/src/solvers/refinement/string_constraint.h index c553efb8c7e..f2a19153fe6 100644 --- a/src/solvers/refinement/string_constraint.h +++ b/src/solvers/refinement/string_constraint.h @@ -20,7 +20,6 @@ Author: Romain Brenguier, romain.brenguier@diffblue.com #ifndef CPROVER_SOLVERS_REFINEMENT_STRING_CONSTRAINT_H #define CPROVER_SOLVERS_REFINEMENT_STRING_CONSTRAINT_H -#include #include #include #include diff --git a/src/solvers/refinement/string_refinement.h b/src/solvers/refinement/string_refinement.h index 021176d4178..50d0fcfb129 100644 --- a/src/solvers/refinement/string_refinement.h +++ b/src/solvers/refinement/string_refinement.h @@ -37,7 +37,7 @@ class string_refinementt final: public bv_refinementt { const namespacet *ns=nullptr; propt *prop=nullptr; - language_uit::uit ui=language_uit::uit::PLAIN; + ui_message_handlert::uit ui=ui_message_handlert::uit::PLAIN; unsigned refinement_bound=0; size_t string_max_length=std::numeric_limits::max(); /// Make non-deterministic character arrays have at least one character diff --git a/src/solvers/sat/satcheck.h b/src/solvers/sat/satcheck.h index ada65d253e8..4905f3195ee 100644 --- a/src/solvers/sat/satcheck.h +++ b/src/solvers/sat/satcheck.h @@ -14,7 +14,7 @@ Author: Daniel Kroening, kroening@kroening.com // #define SATCHECK_ZCHAFF // #define SATCHECK_MINISAT1 -#define SATCHECK_MINISAT2 +// #define SATCHECK_MINISAT2 // #define SATCHECK_GLUCOSE // #define SATCHECK_BOOLEFORCE // #define SATCHECK_PRECOSAT diff --git a/src/solvers/sat/satcheck_glucose.cpp b/src/solvers/sat/satcheck_glucose.cpp index 3d6e2ae3934..fa146d09414 100644 --- a/src/solvers/sat/satcheck_glucose.cpp +++ b/src/solvers/sat/satcheck_glucose.cpp @@ -114,7 +114,7 @@ void satcheck_glucose_baset::lcnf(const bvt &bv) template propt::resultt satcheck_glucose_baset::prop_solve() { - assert(status!=ERROR); + assert(status!=statust::ERROR); // We start counting at 1, thus there is one variable fewer. { @@ -153,9 +153,8 @@ propt::resultt satcheck_glucose_baset::prop_solve() { messaget::status() << "SAT checker: instance is SATISFIABLE" << eom; - assert(!solver->model.empty()); - status=SAT; - return P_SATISFIABLE; + status=statust::SAT; + return resultt::P_SATISFIABLE; } else { @@ -165,8 +164,8 @@ propt::resultt satcheck_glucose_baset::prop_solve() } } - status=UNSAT; - return P_UNSATISFIABLE; + status=statust::UNSAT; + return resultt::P_UNSATISFIABLE; } template diff --git a/src/solvers/smt1/smt1_prop.cpp b/src/solvers/smt1/smt1_prop.cpp deleted file mode 100644 index 481d0d289c5..00000000000 --- a/src/solvers/smt1/smt1_prop.cpp +++ /dev/null @@ -1,297 +0,0 @@ -/*******************************************************************\ - -Module: - -Author: Daniel Kroening, kroening@kroening.com - -Revisions: Roberto Bruttomesso, roberto.bruttomesso@unisi.ch - -\*******************************************************************/ - -#include "smt1_prop.h" - -#include - -smt1_propt::smt1_propt( - const std::string &benchmark, - const std::string &source, - const std::string &logic, - std::ostream &_out):out(_out) -{ - out << "(benchmark " << benchmark << "\n"; - out << ":source { " << source << " }" << "\n"; - out << ":status unknown" << "\n"; - out << ":logic " << logic << " ; SMT1" << "\n"; - _no_variables=0; -} - -smt1_propt::~smt1_propt() -{ -} - -void smt1_propt::finalize() -{ - out << "\n"; - out << ":formula true" << "\n"; - out << ") ; benchmark" << "\n"; -} - -literalt smt1_propt::land(const bvt &bv) -{ - out << "\n"; - - literalt l=new_variable(); - - out << ":assumption ; land" << "\n"; - out << " (iff " << smt1_literal(l) << " (and"; - - forall_literals(it, bv) - out << " " << smt1_literal(*it); - - out << "))" << "\n"; - - return l; -} - -literalt smt1_propt::lor(const bvt &bv) -{ - out << "\n"; - - literalt l=new_variable(); - - out << ":assumption ; lor" << "\n"; - out << " (iff " << smt1_literal(l) << " (or"; - - forall_literals(it, bv) - out << " " << smt1_literal(*it); - - out << "))" << "\n"; - - return l; -} - -literalt smt1_propt::lxor(const bvt &bv) -{ - if(bv.empty()) - return const_literal(false); - if(bv.size()==1) - return bv[0]; - - out << "\n"; - - literalt l=new_variable(); - - out << ":assumption ; lxor" << "\n"; - out << " (iff " << smt1_literal(l) << " (xor"; - - forall_literals(it, bv) - out << " " << smt1_literal(*it); - - out << "))" << "\n"; - - return l; -} - -literalt smt1_propt::land(literalt a, literalt b) -{ - if(a==const_literal(true)) - return b; - if(b==const_literal(true)) - return a; - if(a==const_literal(false)) - return const_literal(false); - if(b==const_literal(false)) - return const_literal(false); - if(a==b) - return a; - - out << "\n"; - - literalt l=new_variable(); - - out << ":assumption ; land" << "\n"; - out << " (iff " << smt1_literal(l) << " (and"; - out << " " << smt1_literal(a); - out << " " << smt1_literal(b); - out << "))" << "\n"; - - return l; -} - -literalt smt1_propt::lor(literalt a, literalt b) -{ - if(a==const_literal(false)) - return b; - if(b==const_literal(false)) - return a; - if(a==const_literal(true)) - return const_literal(true); - if(b==const_literal(true)) - return const_literal(true); - if(a==b) - return a; - - out << "\n"; - - literalt l=new_variable(); - - out << ":assumption ; lor" << "\n"; - out << " (iff " << smt1_literal(l) << " (or"; - out << " " << smt1_literal(a); - out << " " << smt1_literal(b); - out << "))" << "\n"; - - return l; -} - -literalt smt1_propt::lxor(literalt a, literalt b) -{ - if(a==const_literal(false)) - return b; - if(b==const_literal(false)) - return a; - if(a==const_literal(true)) - return !b; - if(b==const_literal(true)) - return !a; - - out << "\n"; - - literalt l=new_variable(); - - out << ":assumption ; lxor" << "\n"; - out << " (iff " << smt1_literal(l) << " (xor"; - out << " " << smt1_literal(a); - out << " " << smt1_literal(b); - out << "))" << "\n"; - - return l; -} - -literalt smt1_propt::lnand(literalt a, literalt b) -{ - return !land(a, b); -} - -literalt smt1_propt::lnor(literalt a, literalt b) -{ - return !lor(a, b); -} - -literalt smt1_propt::lequal(literalt a, literalt b) -{ - return !lxor(a, b); -} - -literalt smt1_propt::limplies(literalt a, literalt b) -{ - return lor(!a, b); -} - -literalt smt1_propt::lselect(literalt a, literalt b, literalt c) -{ - if(a==const_literal(true)) - return b; - if(a==const_literal(false)) - return c; - if(b==c) - return b; - - if(a==const_literal(false)) - return b; - if(b==const_literal(false)) - return a; - if(a==const_literal(true)) - return !b; - if(b==const_literal(true)) - return !a; - - out << "\n"; - - literalt l=new_variable(); - - out << ":assumption ; lselect" << "\n"; - out << " (iff " << smt1_literal(l) << "(if_then_else " - << smt1_literal(a) << " " << smt1_literal(b) << " " - << smt1_literal(c) << ")" << "\n"; - - return l; -} - -literalt smt1_propt::new_variable() -{ - literalt l; - l.set(_no_variables, false); - _no_variables++; - - out << ":extrapreds((" << smt1_literal(l) << "))" << "\n"; - - return l; -} - -void smt1_propt::lcnf(const bvt &bv) -{ - out << "\n"; - out << ":assumption ; lcnf" << "\n"; - out << " "; - - if(bv.empty()) - out << "false ; the empty clause"; - else if(bv.size()==1) - out << smt1_literal(bv.front()); - else - { - out << "(or"; - - for(bvt::const_iterator it=bv.begin(); it!=bv.end(); it++) - out << " " << smt1_literal(*it); - - out << ")"; - } - - out << "\n"; -} - -std::string smt1_propt::smt1_literal(literalt l) -{ - if(l==const_literal(false)) - return "false"; - else if(l==const_literal(true)) - return "true"; - - std::string v="B"+std::to_string(l.var_no()); - - if(l.sign()) - return "(not "+v+")"; - - return v; -} - -tvt smt1_propt::l_get(literalt literal) const -{ - if(literal.is_true()) - return tvt(true); - if(literal.is_false()) - return tvt(false); - - unsigned v=literal.var_no(); - if(v>=assignment.size()) - return tvt(tvt::tv_enumt::TV_UNKNOWN); - tvt r=assignment[v]; - return literal.sign()?!r:r; -} - -void smt1_propt::set_assignment(literalt literal, bool value) -{ - if(literal.is_true() || literal.is_false()) - return; - - unsigned v=literal.var_no(); - assert(v - -#include - -#include - -class smt1_propt:public propt -{ -public: - smt1_propt( - const std::string &_benchmark, - const std::string &_source, - const std::string &_logic, - std::ostream &_out); - virtual ~smt1_propt(); - - virtual literalt land(literalt a, literalt b); - virtual literalt lor(literalt a, literalt b); - virtual literalt land(const bvt &bv); - virtual literalt lor(const bvt &bv); - virtual literalt lxor(const bvt &bv); - virtual literalt lxor(literalt a, literalt b); - virtual literalt lnand(literalt a, literalt b); - virtual literalt lnor(literalt a, literalt b); - virtual literalt lequal(literalt a, literalt b); - virtual literalt limplies(literalt a, literalt b); - virtual literalt lselect(literalt a, literalt b, literalt c); // a?b:c - - virtual literalt new_variable(); - virtual size_t no_variables() const { return _no_variables; } - virtual void set_no_variables(size_t no) { assert(false); } - - virtual void lcnf(const bvt &bv); - - virtual const std::string solver_text() - { return "SMT"; } - - virtual tvt l_get(literalt literal) const; - virtual void set_assignment(literalt a, bool value); - - virtual propt::resultt prop_solve(); - - virtual void clear() - { - assignment.clear(); - } - - virtual void reset_assignment() - { - assignment.clear(); - assignment.resize(no_variables(), tvt(tvt::tv_enumt::TV_UNKNOWN)); - } - - friend class smt1_convt; - friend class smt1_dect; - - void finalize(); - -protected: - size_t _no_variables; - std::ostream &out; - - std::string smt1_literal(literalt l); - literalt def_smt1_literal(); - - std::vector assignment; -}; - -#endif // CPROVER_SOLVERS_SMT1_SMT1_PROP_H diff --git a/src/solvers/smt2/smt2_prop.cpp b/src/solvers/smt2/smt2_prop.cpp deleted file mode 100644 index d6810e5d0c0..00000000000 --- a/src/solvers/smt2/smt2_prop.cpp +++ /dev/null @@ -1,334 +0,0 @@ -/*******************************************************************\ - -Module: - -Author: Daniel Kroening, kroening@kroening.com - -\*******************************************************************/ - -#include "smt2_prop.h" - -#include - -smt2_propt::smt2_propt( - const std::string &benchmark, - const std::string &source, - const std::string &logic, - bool _core_enabled, - std::ostream &_out): - out(_out), - core_enabled(_core_enabled) -{ - out << "; SMT 2" << "\n"; - - out << "(set-info :source \"" << source << "\")" << "\n"; - out << "(set-option :produce-models true)" << "\n"; - - if(core_enabled) - { - out << "(set-option :produce-unsat-cores true)" << "\n"; - } - - out << "(set-logic " << logic << ")" << "\n"; - - _no_variables=0; -} - -smt2_propt::~smt2_propt() -{ -} - -void smt2_propt::finalize() -{ - out << "\n"; - out << "(check-sat)" << "\n"; - out << "\n"; - - for(smt2_identifierst::const_iterator - it=smt2_identifiers.begin(); - it!=smt2_identifiers.end(); - it++) - out << "(get-value (" << *it << "))" << "\n"; - - out << "\n"; - - if(core_enabled) - out << "(get-unsat-core)" << "\n"; - - out << "; end of SMT2 file" << "\n"; -} - -literalt smt2_propt::land(const bvt &bv) -{ - out << "\n"; - - literalt l=define_new_variable(); - - out << "; land" << "\n"; - out << " (and"; - - forall_literals(it, bv) - out << " " << smt2_literal(*it); - - out << "))" << "\n"; - - return l; -} - -literalt smt2_propt::lor(const bvt &bv) -{ - out << "\n"; - - literalt l=define_new_variable(); - - out << "; lor" << "\n"; - out << " (or"; - - forall_literals(it, bv) - out << " " << smt2_literal(*it); - - out << "))" << "\n"; - - return l; -} - -literalt smt2_propt::lxor(const bvt &bv) -{ - if(bv.empty()) - return const_literal(false); - if(bv.size()==1) - return bv[0]; - - out << "\n"; - - literalt l=define_new_variable(); - - out << "; lxor" << "\n"; - out << " (xor"; - - forall_literals(it, bv) - out << " " << smt2_literal(*it); - - out << "))" << "\n"; - - return l; -} - -literalt smt2_propt::land(literalt a, literalt b) -{ - if(a==const_literal(true)) - return b; - if(b==const_literal(true)) - return a; - if(a==const_literal(false)) - return const_literal(false); - if(b==const_literal(false)) - return const_literal(false); - if(a==b) - return a; - - out << "\n"; - - literalt l=define_new_variable(); - - out << "; land" << "\n"; - out << " (and"; - out << " " << smt2_literal(a); - out << " " << smt2_literal(b); - out << "))" << "\n"; - - return l; -} - -literalt smt2_propt::lor(literalt a, literalt b) -{ - if(a==const_literal(false)) - return b; - if(b==const_literal(false)) - return a; - if(a==const_literal(true)) - return const_literal(true); - if(b==const_literal(true)) - return const_literal(true); - if(a==b) - return a; - - out << "\n"; - - literalt l=define_new_variable(); - - out << "; lor" << "\n"; - out << " (or"; - out << " " << smt2_literal(a); - out << " " << smt2_literal(b); - out << "))" << "\n"; - - return l; -} - -literalt smt2_propt::lxor(literalt a, literalt b) -{ - if(a==const_literal(false)) - return b; - if(b==const_literal(false)) - return a; - if(a==const_literal(true)) - return !b; - if(b==const_literal(true)) - return !a; - - out << "\n"; - - literalt l=new_variable(); - - out << "; lxor" << "\n"; - out << " (xor"; - out << " " << smt2_literal(a); - out << " " << smt2_literal(b); - out << "))" << "\n"; - - return l; -} - -literalt smt2_propt::lnand(literalt a, literalt b) -{ - return !land(a, b); -} - -literalt smt2_propt::lnor(literalt a, literalt b) -{ - return !lor(a, b); -} - -literalt smt2_propt::lequal(literalt a, literalt b) -{ - return !lxor(a, b); -} - -literalt smt2_propt::limplies(literalt a, literalt b) -{ - return lor(!a, b); -} - -literalt smt2_propt::lselect(literalt a, literalt b, literalt c) -{ - if(a==const_literal(true)) - return b; - if(a==const_literal(false)) - return c; - if(b==c) - return b; - - if(a==const_literal(false)) - return b; - if(b==const_literal(false)) - return a; - if(a==const_literal(true)) - return !b; - if(b==const_literal(true)) - return !a; - - out << "\n"; - - literalt l=define_new_variable(); - - out << "; lselect" << "\n"; - out << " (if_then_else " - << smt2_literal(a) << " " << smt2_literal(b) << " " - << smt2_literal(c) << "))" << "\n"; - - return l; -} - -literalt smt2_propt::new_variable() -{ - literalt l; - l.set(_no_variables, false); - _no_variables++; - - out << "(declare-fun " << smt2_literal(l) << " () Bool)" << "\n"; - - return l; -} - -literalt smt2_propt::define_new_variable() -{ - literalt l; - l.set(_no_variables, false); - _no_variables++; - - out << "(define-fun " << smt2_literal(l) << " () Bool "; - // The command is continued elsewhere, and the - // closing parenthesis is missing! - - return l; -} - -void smt2_propt::lcnf(const bvt &bv) -{ - out << "\n"; - out << "(assert ; lcnf" << "\n"; - out << " "; - - if(bv.empty()) - out << "false"; - else if(bv.size()==1) - out << smt2_literal(bv.front()); - else - { - out << "(or"; - - for(bvt::const_iterator it=bv.begin(); it!=bv.end(); it++) - out << " " << smt2_literal(*it); - - out << ")"; - } - - out << ")" << "\n"; -} - -std::string smt2_propt::smt2_literal(literalt l) -{ - if(l==const_literal(false)) - return "false"; - else if(l==const_literal(true)) - return "true"; - - std::string v="B"+std::to_string(l.var_no()); - - smt2_identifiers.insert(v); - - if(l.sign()) - return "(not "+v+")"; - - return v; -} - -tvt smt2_propt::l_get(literalt literal) const -{ - if(literal.is_true()) - return tvt(true); - if(literal.is_false()) - return tvt(false); - - unsigned v=literal.var_no(); - if(v>=assignment.size()) - return tvt(tvt::tv_enumt::TV_UNKNOWN); - tvt r=assignment[v]; - return literal.sign()?!r:r; -} - -void smt2_propt::set_assignment(literalt literal, bool value) -{ - if(literal.is_true() || literal.is_false()) - return; - - unsigned v=literal.var_no(); - assert(v -#include - -#include - -#include - -class smt2_propt:public propt -{ -public: - smt2_propt( - const std::string &_benchmark, - const std::string &_source, - const std::string &_logic, - bool _core_enabled, - std::ostream &_out); - virtual ~smt2_propt(); - - virtual literalt land(literalt a, literalt b); - virtual literalt lor(literalt a, literalt b); - virtual literalt land(const bvt &bv); - virtual literalt lor(const bvt &bv); - virtual literalt lxor(const bvt &bv); - virtual literalt lxor(literalt a, literalt b); - virtual literalt lnand(literalt a, literalt b); - virtual literalt lnor(literalt a, literalt b); - virtual literalt lequal(literalt a, literalt b); - virtual literalt limplies(literalt a, literalt b); - virtual literalt lselect(literalt a, literalt b, literalt c); // a?b:c - - virtual literalt new_variable(); - virtual size_t no_variables() const { return _no_variables; } - virtual void set_no_variables(size_t no) { assert(false); } - - virtual void lcnf(const bvt &bv); - - virtual const std::string solver_text() - { return "SMT"; } - - virtual tvt l_get(literalt literal) const; - virtual void set_assignment(literalt a, bool value); - - virtual propt::resultt prop_solve(); - - virtual void clear() - { - assignment.clear(); - } - - virtual void reset_assignment() - { - assignment.clear(); - assignment.resize(no_variables(), tvt(tvt::tv_enumt::TV_UNKNOWN)); - } - - friend class smt2_convt; - friend class smt2_dect; - - void finalize(); - -protected: - size_t _no_variables; - std::ostream &out; - - std::string smt2_literal(literalt l); - literalt def_smt2_literal(); - - std::vector assignment; - - literalt define_new_variable(); - - typedef std::set smt2_identifierst; - smt2_identifierst smt2_identifiers; - - bool core_enabled; -}; - -#endif // CPROVER_SOLVERS_SMT2_SMT2_PROP_H diff --git a/src/symex/CMakeLists.txt b/src/symex/CMakeLists.txt new file mode 100644 index 00000000000..d4450e79a37 --- /dev/null +++ b/src/symex/CMakeLists.txt @@ -0,0 +1,35 @@ +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +list(REMOVE_ITEM sources + ${CMAKE_CURRENT_SOURCE_DIR}/symex_main.cpp +) +add_library(symex-lib ${sources} ${headers}) + +target_link_libraries(symex-lib + ansi-c + cpp + linking + big-int + goto-programs + analyses + langapi + xml + assembler + solvers + util + goto-symex + pointer-analysis + goto-instrument-lib + path-symex +) + +generic_includes(symex-lib) + +add_if_library(symex-lib bv_refinement) +add_if_library(symex-lib java_bytecode) +add_if_library(symex-lib specc) +add_if_library(symex-lib php) + +add_executable(symex symex_main.cpp) + +target_link_libraries(symex symex-lib) diff --git a/src/symex/symex_parse_options.cpp b/src/symex/symex_parse_options.cpp index d5fd98ff686..e85a369340e 100644 --- a/src/symex/symex_parse_options.cpp +++ b/src/symex/symex_parse_options.cpp @@ -26,23 +26,24 @@ Author: Daniel Kroening, kroening@kroening.com #include #include -#include #include -#include -#include -#include -#include -#include #include -#include +#include +#include +#include +#include #include +#include #include +#include +#include #include +#include #include #include -#include -#include -#include +#include +#include +#include #include #include @@ -59,7 +60,7 @@ Author: Daniel Kroening, kroening@kroening.com symex_parse_optionst::symex_parse_optionst(int argc, const char **argv): parse_options_baset(SYMEX_OPTIONS, argc, argv), - language_uit(cmdline, ui_message_handler), + messaget(ui_message_handler), ui_message_handler(cmdline, "Symex " CBMC_VERSION) { } @@ -304,6 +305,7 @@ bool symex_parse_optionst::process_goto_program(const optionst &options) goto_check(options, goto_model); // remove stuff + remove_returns(goto_model); remove_complex(goto_model); remove_vector(goto_model); // remove function pointers @@ -341,42 +343,15 @@ bool symex_parse_optionst::process_goto_program(const optionst &options) if(cmdline.isset("cover")) { - std::string criterion=cmdline.get_value("cover"); - - coverage_criteriont c; - - if(criterion=="assertion" || criterion=="assertions") - c=coverage_criteriont::ASSERTION; - else if(criterion=="path" || criterion=="paths") - c=coverage_criteriont::PATH; - else if(criterion=="branch" || criterion=="branches") - c=coverage_criteriont::BRANCH; - else if(criterion=="location" || criterion=="locations") - c=coverage_criteriont::LOCATION; - else if(criterion=="decision" || criterion=="decisions") - c=coverage_criteriont::DECISION; - else if(criterion=="condition" || criterion=="conditions") - c=coverage_criteriont::CONDITION; - else if(criterion=="mcdc") - c=coverage_criteriont::MCDC; - else if(criterion=="cover") - c=coverage_criteriont::COVER; - else - { - error() << "unknown coverage criterion" << eom; - return true; - } - status() << "Instrumenting coverage goals" << eom; - instrument_cover_goals( - symbol_table, goto_model.goto_functions, c, get_message_handler()); - goto_model.goto_functions.update(); + if(instrument_cover_goals(cmdline, goto_model, get_message_handler())) + return true; } // show it? if(cmdline.isset("show-loops")) { - show_loop_ids(get_ui(), goto_model.goto_functions); + show_loop_ids(get_ui(), goto_model); return true; } @@ -612,7 +587,7 @@ void symex_parse_optionst::help() " --round-to-plus-inf IEEE floating point rounding mode\n" " --round-to-minus-inf IEEE floating point rounding mode\n" " --round-to-zero IEEE floating point rounding mode\n" - " --function name set main function name\n" + HELP_FUNCTIONS "\n" "Java Bytecode frontend options:\n" JAVA_BYTECODE_LANGUAGE_OPTIONS_HELP diff --git a/src/symex/symex_parse_options.h b/src/symex/symex_parse_options.h index 7278cbf1261..c2aec7a175b 100644 --- a/src/symex/symex_parse_options.h +++ b/src/symex/symex_parse_options.h @@ -17,8 +17,7 @@ Author: Daniel Kroening, kroening@kroening.com #include #include - -#include +#include #include @@ -30,7 +29,7 @@ class goto_functionst; class optionst; #define SYMEX_OPTIONS \ - "(function):" \ + OPT_FUNCTIONS \ "D:I:" \ "(depth):(context-bound):(branch-bound):(unwind):(max-search-time):" \ OPT_GOTO_CHECK \ @@ -55,7 +54,7 @@ class optionst; class symex_parse_optionst: public parse_options_baset, - public language_uit + public messaget { public: virtual int doit(); @@ -80,6 +79,11 @@ class symex_parse_optionst: void eval_verbosity(); std::string get_test(const goto_tracet &goto_trace); + + ui_message_handlert::uit get_ui() const + { + return ui_message_handler.get_ui(); + } }; #endif // CPROVER_SYMEX_SYMEX_PARSE_OPTIONS_H diff --git a/src/util/CMakeLists.txt b/src/util/CMakeLists.txt new file mode 100644 index 00000000000..b073a8baa0e --- /dev/null +++ b/src/util/CMakeLists.txt @@ -0,0 +1,7 @@ +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +add_library(util ${sources} ${headers}) + +generic_includes(util) + +target_link_libraries(util big-int) diff --git a/src/util/language.h b/src/util/language.h index 3472d42216c..ddff8c64ab0 100644 --- a/src/util/language.h +++ b/src/util/language.h @@ -123,6 +123,10 @@ class languaget:public messaget void set_should_generate_opaque_method_stubs(bool should_generate_stubs); + virtual bool generate_start_function( + const irep_idt &entry_function_symbol_id, + class symbol_tablet &symbol_table)=0; + // constructor / destructor languaget() { } @@ -141,7 +145,7 @@ class languaget:public messaget static irep_idt get_stub_return_symbol_name(const irep_idt &function_id); - bool generate_opaque_stubs; + bool generate_opaque_stubs=false; bool language_options_initialized=false; private: diff --git a/src/util/optional.h b/src/util/optional.h new file mode 100644 index 00000000000..a649d8e5ce4 --- /dev/null +++ b/src/util/optional.h @@ -0,0 +1,39 @@ +/*******************************************************************\ + + Module: typedef for optional class template. To be replaced with + std::optional once C++17 support is enabled + + Author: Diffblue Limited. All rights reserved. + +\*******************************************************************/ + +#ifndef CPROVER_UTIL_OPTIONAL_H +#define CPROVER_UTIL_OPTIONAL_H + +#if defined __clang__ + #pragma clang diagnostic push ignore "-Wall" + #pragma clang diagnostic push ignore "-Wpedantic" +#elif defined __GNUC__ + #pragma GCC diagnostic push ignore "-Wall" + #pragma GCC diagnostic push ignore "-Wpedantic" +#elif defined _MSC_VER + #pragma warning(push) +#endif +#include +#if defined __clang__ + #pragma clang diagnostic pop + #pragma clang diagnostic pop +#elif defined __GNUC__ + #pragma GCC diagnostic pop + #pragma GCC diagnostic pop +#elif defined _MSC_VER + #pragma warning(pop) +#endif + +// Swap for std::optional when switching to C++17 +template +using optionalt=nonstd::optional; // NOLINT template typedef + +typedef nonstd::bad_optional_access bad_optional_accesst; + +#endif // CPROVER_UTIL_OPTIONAL_H diff --git a/src/util/pointer_offset_size.cpp b/src/util/pointer_offset_size.cpp index 798266792eb..e5e3dea6796 100644 --- a/src/util/pointer_offset_size.cpp +++ b/src/util/pointer_offset_size.cpp @@ -211,14 +211,11 @@ mp_integer pointer_offset_bits( type.id()==ID_fixedbv || type.id()==ID_floatbv || type.id()==ID_bv || - type.id()==ID_c_bool) + type.id()==ID_c_bool || + type.id()==ID_c_bit_field) { return to_bitvector_type(type).get_width(); } - else if(type.id()==ID_c_bit_field) - { - return to_c_bit_field_type(type).get_width(); - } else if(type.id()==ID_c_enum) { return to_bitvector_type(type.subtype()).get_width(); @@ -233,6 +230,10 @@ mp_integer pointer_offset_bits( } else if(type.id()==ID_pointer) { + // the following is an MS extension + if(type.get_bool(ID_C_ptr32)) + return 32; + return config.ansi_c.pointer_width; } else if(type.id()==ID_symbol) @@ -248,7 +249,7 @@ mp_integer pointer_offset_bits( return 32; } else - return mp_integer(-1); + return -1; } exprt member_offset_expr( @@ -408,7 +409,8 @@ exprt size_of_expr( const union_typet::componentst &components= union_type.components(); - mp_integer result=0; + mp_integer max_bytes=0; + exprt result=from_integer(0, size_type()); // compute max @@ -418,35 +420,52 @@ exprt size_of_expr( it++) { const typet &subtype=it->type(); - mp_integer sub_size; + exprt sub_size; - if(subtype.id()==ID_c_bit_field) + mp_integer sub_bits=pointer_offset_bits(subtype, ns); + + if(sub_bits==-1) { - std::size_t bits=to_c_bit_field_type(subtype).get_width(); - sub_size=bits/8; - if((bits%8)!=0) - ++sub_size; + max_bytes=-1; + + sub_size=size_of_expr(subtype, ns); + if(sub_size.is_nil()) + return nil_exprt(); } else - sub_size=pointer_offset_size(subtype, ns); - - if(sub_size==-1) { - result=-1; - break; + mp_integer sub_bytes=(sub_bits+7)/8; + + if(max_bytes>=0) + { + if(max_bytesresult) - result=sub_size; + + result=if_exprt( + binary_relation_exprt(result, ID_lt, sub_size), + sub_size, result); + + simplify(result, ns); } - return from_integer(result, size_type()); + return result; } else if(type.id()==ID_signedbv || type.id()==ID_unsignedbv || type.id()==ID_fixedbv || type.id()==ID_floatbv || type.id()==ID_bv || - type.id()==ID_c_bool) + type.id()==ID_c_bool || + type.id()==ID_c_bit_field) { std::size_t width=to_bitvector_type(type).get_width(); std::size_t bytes=width/8; @@ -472,6 +491,10 @@ exprt size_of_expr( } else if(type.id()==ID_pointer) { + // the following is an MS extension + if(type.get_bool(ID_C_ptr32)) + return from_integer(4, size_type()); + std::size_t width=config.ansi_c.pointer_width; std::size_t bytes=width/8; if(bytes*8!=width) diff --git a/src/util/run.cpp b/src/util/run.cpp index f106309002e..d0fddab27fd 100644 --- a/src/util/run.cpp +++ b/src/util/run.cpp @@ -127,10 +127,13 @@ int run( dup2(stdin_fd, STDIN_FILENO); if(stdout_fd!=STDOUT_FILENO) dup2(stdout_fd, STDOUT_FILENO); + + errno=0; execvp(what.c_str(), _argv.data()); /* usually no return */ - return 1; + perror(std::string("execvp "+what+" failed").c_str()); + exit(1); } else /* fork() returns new pid to the parent process */ { diff --git a/src/util/std_types.h b/src/util/std_types.h index 5c541c0683e..b525b23f86d 100644 --- a/src/util/std_types.h +++ b/src/util/std_types.h @@ -17,10 +17,9 @@ Author: Daniel Kroening, kroening@kroening.com * \date Sun Jul 31 21:54:44 BST 2011 */ -#include - #include "expr.h" #include "mp_arith.h" +#include "invariant.h" class constant_exprt; @@ -141,7 +140,7 @@ class symbol_typet:public typet */ inline const symbol_typet &to_symbol_type(const typet &type) { - assert(type.id()==ID_symbol); + PRECONDITION(type.id()==ID_symbol); return static_cast(type); } @@ -150,7 +149,7 @@ inline const symbol_typet &to_symbol_type(const typet &type) */ inline symbol_typet &to_symbol_type(typet &type) { - assert(type.id()==ID_symbol); + PRECONDITION(type.id()==ID_symbol); return static_cast(type); } @@ -276,8 +275,7 @@ class struct_union_typet:public typet */ inline const struct_union_typet &to_struct_union_type(const typet &type) { - assert(type.id()==ID_struct || - type.id()==ID_union); + PRECONDITION(type.id()==ID_struct || type.id()==ID_union); return static_cast(type); } @@ -286,8 +284,7 @@ inline const struct_union_typet &to_struct_union_type(const typet &type) */ inline struct_union_typet &to_struct_union_type(typet &type) { - assert(type.id()==ID_struct || - type.id()==ID_union); + PRECONDITION(type.id()==ID_struct || type.id()==ID_union); return static_cast(type); } @@ -316,7 +313,7 @@ class struct_typet:public struct_union_typet */ inline const struct_typet &to_struct_type(const typet &type) { - assert(type.id()==ID_struct); + PRECONDITION(type.id()==ID_struct); return static_cast(type); } @@ -325,7 +322,7 @@ inline const struct_typet &to_struct_type(const typet &type) */ inline struct_typet &to_struct_type(typet &type) { - assert(type.id()==ID_struct); + PRECONDITION(type.id()==ID_struct); return static_cast(type); } @@ -420,7 +417,7 @@ class class_typet:public struct_typet */ inline const class_typet &to_class_type(const typet &type) { - assert(type.id()==ID_struct); + PRECONDITION(type.id()==ID_struct); return static_cast(type); } @@ -429,7 +426,7 @@ inline const class_typet &to_class_type(const typet &type) */ inline class_typet &to_class_type(typet &type) { - assert(type.id()==ID_struct); + PRECONDITION(type.id()==ID_struct); return static_cast(type); } @@ -455,7 +452,7 @@ class union_typet:public struct_union_typet */ inline const union_typet &to_union_type(const typet &type) { - assert(type.id()==ID_union); + PRECONDITION(type.id()==ID_union); return static_cast(type); } @@ -464,7 +461,7 @@ inline const union_typet &to_union_type(const typet &type) */ inline union_typet &to_union_type(typet &type) { - assert(type.id()==ID_union); + PRECONDITION(type.id()==ID_union); return static_cast(type); } @@ -508,9 +505,9 @@ class tag_typet:public typet */ inline const tag_typet &to_tag_type(const typet &type) { - assert(type.id()==ID_c_enum_tag || - type.id()==ID_struct_tag || - type.id()==ID_union_tag); + PRECONDITION(type.id()==ID_c_enum_tag || + type.id()==ID_struct_tag || + type.id()==ID_union_tag); return static_cast(type); } @@ -519,9 +516,9 @@ inline const tag_typet &to_tag_type(const typet &type) */ inline tag_typet &to_tag_type(typet &type) { - assert(type.id()==ID_c_enum_tag || - type.id()==ID_struct_tag || - type.id()==ID_union_tag); + PRECONDITION(type.id()==ID_c_enum_tag || + type.id()==ID_struct_tag || + type.id()==ID_union_tag); return static_cast(type); } @@ -549,7 +546,7 @@ class struct_tag_typet:public tag_typet */ inline const struct_tag_typet &to_struct_tag_type(const typet &type) { - assert(type.id()==ID_struct_tag); + PRECONDITION(type.id()==ID_struct_tag); return static_cast(type); } @@ -558,7 +555,7 @@ inline const struct_tag_typet &to_struct_tag_type(const typet &type) */ inline struct_tag_typet &to_struct_tag_type(typet &type) { - assert(type.id()==ID_struct_tag); + PRECONDITION(type.id()==ID_struct_tag); return static_cast(type); } @@ -586,7 +583,7 @@ class union_tag_typet:public tag_typet */ inline const union_tag_typet &to_union_tag_type(const typet &type) { - assert(type.id()==ID_union_tag); + PRECONDITION(type.id()==ID_union_tag); return static_cast(type); } @@ -595,7 +592,7 @@ inline const union_tag_typet &to_union_tag_type(const typet &type) */ inline union_tag_typet &to_union_tag_type(typet &type) { - assert(type.id()==ID_union_tag); + PRECONDITION(type.id()==ID_union_tag); return static_cast(type); } @@ -632,7 +629,7 @@ class enumeration_typet:public typet */ inline const enumeration_typet &to_enumeration_type(const typet &type) { - assert(type.id()==ID_enumeration); + PRECONDITION(type.id()==ID_enumeration); return static_cast(type); } @@ -641,7 +638,7 @@ inline const enumeration_typet &to_enumeration_type(const typet &type) */ inline enumeration_typet &to_enumeration_type(typet &type) { - assert(type.id()==ID_enumeration); + PRECONDITION(type.id()==ID_enumeration); return static_cast(type); } @@ -693,7 +690,7 @@ class c_enum_typet:public type_with_subtypet */ inline const c_enum_typet &to_c_enum_type(const typet &type) { - assert(type.id()==ID_c_enum); + PRECONDITION(type.id()==ID_c_enum); return static_cast(type); } @@ -702,7 +699,7 @@ inline const c_enum_typet &to_c_enum_type(const typet &type) */ inline c_enum_typet &to_c_enum_type(typet &type) { - assert(type.id()==ID_c_enum); + PRECONDITION(type.id()==ID_c_enum); return static_cast(type); } @@ -730,7 +727,7 @@ class c_enum_tag_typet:public tag_typet */ inline const c_enum_tag_typet &to_c_enum_tag_type(const typet &type) { - assert(type.id()==ID_c_enum_tag); + PRECONDITION(type.id()==ID_c_enum_tag); return static_cast(type); } @@ -739,7 +736,7 @@ inline const c_enum_tag_typet &to_c_enum_tag_type(const typet &type) */ inline c_enum_tag_typet &to_c_enum_tag_type(typet &type) { - assert(type.id()==ID_c_enum_tag); + PRECONDITION(type.id()==ID_c_enum_tag); return static_cast(type); } @@ -933,7 +930,7 @@ class code_typet:public typet */ inline const code_typet &to_code_type(const typet &type) { - assert(type.id()==ID_code); + PRECONDITION(type.id()==ID_code); return static_cast(type); } @@ -942,7 +939,7 @@ inline const code_typet &to_code_type(const typet &type) */ inline code_typet &to_code_type(typet &type) { - assert(type.id()==ID_code); + PRECONDITION(type.id()==ID_code); return static_cast(type); } @@ -995,7 +992,7 @@ class array_typet:public type_with_subtypet */ inline const array_typet &to_array_type(const typet &type) { - assert(type.id()==ID_array); + PRECONDITION(type.id()==ID_array); return static_cast(type); } @@ -1004,7 +1001,7 @@ inline const array_typet &to_array_type(const typet &type) */ inline array_typet &to_array_type(typet &type) { - assert(type.id()==ID_array); + PRECONDITION(type.id()==ID_array); return static_cast(type); } @@ -1035,7 +1032,7 @@ class incomplete_array_typet:public type_with_subtypet */ inline const incomplete_array_typet &to_incomplete_array_type(const typet &type) { - assert(type.id()==ID_array); + PRECONDITION(type.id()==ID_array); return static_cast(type); } @@ -1044,7 +1041,7 @@ inline const incomplete_array_typet &to_incomplete_array_type(const typet &type) */ inline incomplete_array_typet &to_incomplete_array_type(typet &type) { - assert(type.id()==ID_array); + PRECONDITION(type.id()==ID_array); return static_cast(type); } @@ -1100,32 +1097,32 @@ class bitvector_typet:public type_with_subtypet */ inline const bitvector_typet &to_bitvector_type(const typet &type) { - assert(type.id()==ID_signedbv || - type.id()==ID_unsignedbv || - type.id()==ID_fixedbv || - type.id()==ID_floatbv || - type.id()==ID_verilog_signedbv || - type.id()==ID_verilog_unsignedbv || - type.id()==ID_bv || - type.id()==ID_pointer || - type.id()==ID_c_bit_field || - type.id()==ID_c_bool); + PRECONDITION(type.id()==ID_signedbv || + type.id()==ID_unsignedbv || + type.id()==ID_fixedbv || + type.id()==ID_floatbv || + type.id()==ID_verilog_signedbv || + type.id()==ID_verilog_unsignedbv || + type.id()==ID_bv || + type.id()==ID_pointer || + type.id()==ID_c_bit_field || + type.id()==ID_c_bool); return static_cast(type); } inline bitvector_typet &to_bitvector_type(typet &type) { - assert(type.id()==ID_signedbv || - type.id()==ID_unsignedbv || - type.id()==ID_fixedbv || - type.id()==ID_floatbv || - type.id()==ID_verilog_signedbv || - type.id()==ID_verilog_unsignedbv || - type.id()==ID_bv || - type.id()==ID_pointer || - type.id()==ID_c_bit_field || - type.id()==ID_c_bool); + PRECONDITION(type.id()==ID_signedbv || + type.id()==ID_unsignedbv || + type.id()==ID_fixedbv || + type.id()==ID_floatbv || + type.id()==ID_verilog_signedbv || + type.id()==ID_verilog_unsignedbv || + type.id()==ID_bv || + type.id()==ID_pointer || + type.id()==ID_c_bit_field || + type.id()==ID_c_bool); return static_cast(type); } @@ -1157,7 +1154,7 @@ class bv_typet:public bitvector_typet */ inline const bv_typet &to_bv_type(const typet &type) { - assert(type.id()==ID_bv); + PRECONDITION(type.id()==ID_bv); return static_cast(type); } @@ -1166,7 +1163,7 @@ inline const bv_typet &to_bv_type(const typet &type) */ inline bv_typet &to_bv_type(typet &type) { - assert(type.id()==ID_bv); + PRECONDITION(type.id()==ID_bv); return static_cast(type); } @@ -1203,7 +1200,7 @@ class unsignedbv_typet:public bitvector_typet */ inline const unsignedbv_typet &to_unsignedbv_type(const typet &type) { - assert(type.id()==ID_unsignedbv); + PRECONDITION(type.id()==ID_unsignedbv); return static_cast(type); } @@ -1212,7 +1209,7 @@ inline const unsignedbv_typet &to_unsignedbv_type(const typet &type) */ inline unsignedbv_typet &to_unsignedbv_type(typet &type) { - assert(type.id()==ID_unsignedbv); + PRECONDITION(type.id()==ID_unsignedbv); return static_cast(type); } @@ -1249,7 +1246,7 @@ class signedbv_typet:public bitvector_typet */ inline const signedbv_typet &to_signedbv_type(const typet &type) { - assert(type.id()==ID_signedbv); + PRECONDITION(type.id()==ID_signedbv); return static_cast(type); } @@ -1258,7 +1255,7 @@ inline const signedbv_typet &to_signedbv_type(const typet &type) */ inline signedbv_typet &to_signedbv_type(typet &type) { - assert(type.id()==ID_signedbv); + PRECONDITION(type.id()==ID_signedbv); return static_cast(type); } @@ -1296,7 +1293,7 @@ class fixedbv_typet:public bitvector_typet */ inline const fixedbv_typet &to_fixedbv_type(const typet &type) { - assert(type.id()==ID_fixedbv); + PRECONDITION(type.id()==ID_fixedbv); return static_cast(type); } @@ -1335,7 +1332,7 @@ class floatbv_typet:public bitvector_typet */ inline const floatbv_typet &to_floatbv_type(const typet &type) { - assert(type.id()==ID_floatbv); + PRECONDITION(type.id()==ID_floatbv); return static_cast(type); } @@ -1368,7 +1365,7 @@ class c_bit_field_typet:public bitvector_typet */ inline const c_bit_field_typet &to_c_bit_field_type(const typet &type) { - assert(type.id()==ID_c_bit_field); + PRECONDITION(type.id()==ID_c_bit_field); return static_cast(type); } @@ -1384,7 +1381,7 @@ inline const c_bit_field_typet &to_c_bit_field_type(const typet &type) */ inline c_bit_field_typet &to_c_bit_field_type(typet &type) { - assert(type.id()==ID_c_bit_field); + PRECONDITION(type.id()==ID_c_bit_field); return static_cast(type); } @@ -1416,7 +1413,8 @@ class pointer_typet:public bitvector_typet */ inline const pointer_typet &to_pointer_type(const typet &type) { - assert(type.id()==ID_pointer); + PRECONDITION(type.id()==ID_pointer); + PRECONDITION(!type.get(ID_width).empty()); return static_cast(type); } @@ -1425,7 +1423,8 @@ inline const pointer_typet &to_pointer_type(const typet &type) */ inline pointer_typet &to_pointer_type(typet &type) { - assert(type.id()==ID_pointer); + PRECONDITION(type.id()==ID_pointer); + PRECONDITION(!type.get(ID_width).empty()); return static_cast(type); } @@ -1453,7 +1452,8 @@ class reference_typet:public pointer_typet */ inline const reference_typet &to_reference_type(const typet &type) { - assert(type.id()==ID_pointer && type.get_bool(ID_C_reference)); + PRECONDITION(type.id()==ID_pointer && type.get_bool(ID_C_reference)); + PRECONDITION(!type.get(ID_width).empty()); return static_cast(type); } @@ -1462,7 +1462,8 @@ inline const reference_typet &to_reference_type(const typet &type) */ inline reference_typet &to_reference_type(typet &type) { - assert(type.id()==ID_pointer && type.get_bool(ID_C_reference)); + PRECONDITION(type.id()==ID_pointer && type.get_bool(ID_C_reference)); + PRECONDITION(!type.get(ID_width).empty()); return static_cast(type); } @@ -1500,7 +1501,7 @@ class c_bool_typet:public bitvector_typet */ inline const c_bool_typet &to_c_bool_type(const typet &type) { - assert(type.id()==ID_c_bool); + PRECONDITION(type.id()==ID_c_bool); return static_cast(type); } @@ -1509,7 +1510,7 @@ inline const c_bool_typet &to_c_bool_type(const typet &type) */ inline c_bool_typet &to_c_bool_type(typet &type) { - assert(type.id()==ID_c_bool); + PRECONDITION(type.id()==ID_c_bool); return static_cast(type); } @@ -1535,7 +1536,7 @@ class string_typet:public typet */ inline const string_typet &to_string_type(const typet &type) { - assert(type.id()==ID_string); + PRECONDITION(type.id()==ID_string); return static_cast(type); } @@ -1573,7 +1574,7 @@ class range_typet:public typet */ inline const range_typet &to_range_type(const typet &type) { - assert(type.id()==ID_range); + PRECONDITION(type.id()==ID_range); return static_cast(type); } @@ -1616,7 +1617,7 @@ class vector_typet:public type_with_subtypet */ inline const vector_typet &to_vector_type(const typet &type) { - assert(type.id()==ID_vector); + PRECONDITION(type.id()==ID_vector); return static_cast(type); } @@ -1625,7 +1626,7 @@ inline const vector_typet &to_vector_type(const typet &type) */ inline vector_typet &to_vector_type(typet &type) { - assert(type.id()==ID_vector); + PRECONDITION(type.id()==ID_vector); return static_cast(type); } @@ -1656,7 +1657,7 @@ class complex_typet:public type_with_subtypet */ inline const complex_typet &to_complex_type(const typet &type) { - assert(type.id()==ID_complex); + PRECONDITION(type.id()==ID_complex); return static_cast(type); } @@ -1665,7 +1666,7 @@ inline const complex_typet &to_complex_type(const typet &type) */ inline complex_typet &to_complex_type(typet &type) { - assert(type.id()==ID_complex); + PRECONDITION(type.id()==ID_complex); return static_cast(type); } diff --git a/src/xmllang/CMakeLists.txt b/src/xmllang/CMakeLists.txt new file mode 100644 index 00000000000..58879cdee74 --- /dev/null +++ b/src/xmllang/CMakeLists.txt @@ -0,0 +1,15 @@ +generic_bison(xml) +generic_flex(xml) + +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +add_library(xml + ${sources} + ${headers} + ${BISON_parser_OUTPUTS} + ${FLEX_scanner_OUTPUTS} +) + +generic_includes(xml) + +target_link_libraries(xml util) diff --git a/unit/CMakeLists.txt b/unit/CMakeLists.txt new file mode 100644 index 00000000000..623e57ecb50 --- /dev/null +++ b/unit/CMakeLists.txt @@ -0,0 +1,72 @@ +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED true) + +file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h") +list(REMOVE_ITEM sources + # Used in executables + ${CMAKE_CURRENT_SOURCE_DIR}/miniBDD.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/string_utils.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/sharing_node.cpp + + # Don't build + ${CMAKE_CURRENT_SOURCE_DIR}/sharing_map.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/elf_reader.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/smt2_parser.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/json.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/cpp_parser.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/osx_fat_reader.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/unicode.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/wp.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/cpp_scanner.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/float_utils.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/ieee_float.cpp +) + +add_executable(unit ${sources} ${headers}) +target_include_directories(unit + PUBLIC + ${CBMC_BINARY_DIR} + ${CBMC_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR} +) +target_link_libraries(unit ansi-c solvers java_bytecode) +add_test( + NAME unit + COMMAND $ + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} +) +set_tests_properties(unit PROPERTIES LABELS CORE) + +add_executable(miniBDD miniBDD.cpp) +target_include_directories(miniBDD + PUBLIC + ${CBMC_BINARY_DIR} + ${CBMC_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR} +) +target_link_libraries(miniBDD solvers ansi-c) +add_test(NAME miniBDD COMMAND $) +set_tests_properties(miniBDD PROPERTIES LABELS CORE) + +add_executable(string_utils string_utils.cpp) +target_include_directories(string_utils + PUBLIC + ${CBMC_BINARY_DIR} + ${CBMC_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR} +) +target_link_libraries(string_utils solvers ansi-c) +add_test(NAME string_utils COMMAND $) +set_tests_properties(string_utils PROPERTIES LABELS CORE) + +add_executable(sharing_node sharing_node.cpp) +target_include_directories(sharing_node + PUBLIC + ${CBMC_BINARY_DIR} + ${CBMC_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR} +) +target_link_libraries(sharing_node util) +add_test(NAME sharing_node COMMAND $) +set_tests_properties(sharing_node PROPERTIES LABELS CORE) diff --git a/unit/Makefile b/unit/Makefile index a47b3d6ec62..52c60febfda 100644 --- a/unit/Makefile +++ b/unit/Makefile @@ -5,6 +5,10 @@ SRC = src/expr/require_expr.cpp \ src/ansi-c/c_to_expr.cpp \ unit_tests.cpp \ catch_example.cpp \ + util/expr_iterator.cpp \ + util/optional.cpp \ + analyses/call_graph.cpp \ + java_bytecode/java_bytecode_convert_class/convert_abstract_class.cpp \ # Empty last line # Test source files diff --git a/unit/analyses/call_graph.cpp b/unit/analyses/call_graph.cpp index adc2e75e6c8..36b829cd103 100644 --- a/unit/analyses/call_graph.cpp +++ b/unit/analyses/call_graph.cpp @@ -1,3 +1,10 @@ +/*******************************************************************\ + +Module: Unit test for call graph generation + +Author: + +\*******************************************************************/ #include @@ -56,7 +63,7 @@ SCENARIO("call_graph", // void C() { } // void D() { } - symbol_tablet symbol_table; + goto_modelt goto_model; code_typet void_function_type; { @@ -68,7 +75,8 @@ SCENARIO("call_graph", calls.move_to_operands(call1); calls.move_to_operands(call2); - symbol_table.add(create_void_function_symbol("A", calls)); + goto_model.symbol_table.add( + create_void_function_symbol("A", calls)); } { @@ -80,17 +88,19 @@ SCENARIO("call_graph", calls.move_to_operands(call1); calls.move_to_operands(call2); - symbol_table.add(create_void_function_symbol("B", calls)); + goto_model.symbol_table.add( + create_void_function_symbol("B", calls)); } - symbol_table.add(create_void_function_symbol("C", code_skipt())); - symbol_table.add(create_void_function_symbol("D", code_skipt())); + goto_model.symbol_table.add( + create_void_function_symbol("C", code_skipt())); + goto_model.symbol_table.add( + create_void_function_symbol("D", code_skipt())); - goto_functionst goto_functions; stream_message_handlert msg(std::cout); - goto_convert(symbol_table, goto_functions, msg); + goto_convert(goto_model, msg); - call_grapht call_graph_from_goto_functions(goto_functions); + call_grapht call_graph_from_goto_functions(goto_model); WHEN("A call graph is constructed from the GOTO functions") { diff --git a/unit/solvers/refinement/string_constraint_instantiation/instantiate_not_contains.cpp b/unit/solvers/refinement/string_constraint_instantiation/instantiate_not_contains.cpp index 48cf3ed8e27..ed72dc6aa0c 100644 --- a/unit/solvers/refinement/string_constraint_instantiation/instantiate_not_contains.cpp +++ b/unit/solvers/refinement/string_constraint_instantiation/instantiate_not_contains.cpp @@ -122,7 +122,7 @@ decision_proceduret::resultt check_sat(const exprt &expr, const namespacet &ns) bv_refinementt::infot info; info.ns=&ns; info.prop=&sat_check; - const auto ui=language_uit::uit::PLAIN; + const auto ui=ui_message_handlert::uit::PLAIN; info.ui=ui; bv_refinementt solver(info); solver << expr; diff --git a/unit/util/optional.cpp b/unit/util/optional.cpp new file mode 100644 index 00000000000..9c22596bd3d --- /dev/null +++ b/unit/util/optional.cpp @@ -0,0 +1,32 @@ +/*******************************************************************\ + + Module: nonstd::optional unit tests + + Author: Diffblue Limited. All rights reserved. + +\*******************************************************************/ + +#include "catch.hpp" +#include + +TEST_CASE("Optional without a value", "[core][util][optional]") +{ + optionalt maybe_value; + REQUIRE(maybe_value.has_value()==false); + REQUIRE_THROWS_AS(maybe_value.value(), bad_optional_accesst); +} + +TEST_CASE("Optional with a value", "[core][util][optional]") +{ + optionalt maybe_value=false; + REQUIRE(maybe_value.has_value()); + REQUIRE(maybe_value.value()==false); +} + + +TEST_CASE("Optional with a value (operator access)", "[core][util][optional]") +{ + optionalt maybe_value=true; + REQUIRE(maybe_value.has_value()); + REQUIRE(*maybe_value==true); +}