diff --git a/.cirrus.yml b/.cirrus.yml index e4bd46137a..e36ce1dee8 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -1,18 +1,17 @@ task: freebsd_instance: matrix: - - image_family: freebsd-12-2-snap - - image_family: freebsd-13-0-snap + - image_family: freebsd-15-0-snap deps_script: - sed -i.bak -e 's/quarterly/latest/' /etc/pkg/FreeBSD.conf - env ASSUME_ALWAYS_YES=yes pkg update -f - - env ASSUME_ALWAYS_YES=yes pkg install -y llvm90 gmake z3 cmake pkgconf google-perftools python3 py38-sqlite3 py38-tabulate + - env ASSUME_ALWAYS_YES=yes pkg install -y llvm13 gmake z3 cmake pkgconf google-perftools python311 py311-sqlite3 py311-tabulate build_script: - mkdir build - cd build - - cmake -DLLVM_CONFIG_BINARY=/usr/local/bin/llvm-config90 -DMAKE_BINARY=/usr/local/bin/gmake -DENABLE_TCMALLOC:BOOL=true -DENABLE_POSIX_RUNTIME:BOOL=ON -DENABLE_SOLVER_Z3:BOOL=true -DENABLE_SYSTEM_TESTS:BOOL=ON .. + - cmake -DLLVM_DIR=/usr/local/llvm11 -DMAKE_BINARY=/usr/local/bin/gmake -DENABLE_TCMALLOC:BOOL=true -DENABLE_POSIX_RUNTIME:BOOL=ON -DENABLE_SOLVER_Z3:BOOL=true -DENABLE_SYSTEM_TESTS:BOOL=ON .. - gmake test_script: - - sed -i.bak -e 's/lit\./lit90\./' test/lit.cfg + - sed -i.bak -e 's/lit\./lit13\./' test/lit.cfg - cd build - gmake check diff --git a/.clang-format b/.clang-format index b28d36566f..69f0582693 100644 --- a/.clang-format +++ b/.clang-format @@ -1,4 +1,4 @@ --- -BasedOnStyle: LLVM -Standard: Cpp11 +BasedOnStyle: LLVM +Standard: c++17 ... diff --git a/.codecov.yml b/.codecov.yml index bccacde049..5d641d3034 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -2,21 +2,22 @@ codecov: disable_default_path_fixes: true coverage: + range: 70...90 + precision: 2 + round: down status: project: no patch: yes changes: no - precision: 2 - round: down - range: "70...100" fixes: - "/tmp/klee_src::" + ignore: - - "usr/" - "test/" - "unittests" - "**/test-utils" + comment: layout: "header, diff, changes, uncovered, tree" behavior: default diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md index 8b7c7c3a31..ee1afa1b86 100644 --- a/.github/ISSUE_TEMPLATE/question.md +++ b/.github/ISSUE_TEMPLATE/question.md @@ -8,8 +8,8 @@ assignees: '' --- To ask a question about KLEE: -1. Please first check the documentation at http://klee.github.io/docs/ +1. Please first check the documentation at https://klee-se.org/docs/ 2. Then check the [searchable mailing list archive](https://www.mail-archive.com/klee-dev@imperial.ac.uk/) -3. If this still doesn’t answer your questions then please send an email to the [klee-dev mailing list](http://klee.github.io/klee-dev/) +3. If this still doesn’t answer your questions then please send an email to the [klee-dev mailing list](https://klee-se.org/klee-dev/) **We will normally not answer questions asked on GitHub.** diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 9e2941eaae..a1b1382db6 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,7 +1,7 @@ ## Summary: diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index ea21f1ee40..aaaa23e531 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -1,3 +1,4 @@ +--- name: CI on: @@ -8,8 +9,8 @@ on: # Defaults for building KLEE env: - BASE_IMAGE: ubuntu:bionic-20200807 - REPOSITORY: klee + BASE_IMAGE: ubuntu:jammy-20230126 + REPOSITORY: ghcr.io/klee COVERAGE: 0 DISABLE_ASSERTIONS: 0 ENABLE_DOXYGEN: 0 @@ -17,17 +18,17 @@ env: ENABLE_DEBUG: 1 GTEST_VERSION: 1.11.0 KLEE_RUNTIME_BUILD: "Debug+Asserts" - LLVM_VERSION: 9 - METASMT_VERSION: qf_abv + LLVM_VERSION: 13 MINISAT_VERSION: "master" REQUIRES_RTTI: 0 SOLVERS: STP:Z3 STP_VERSION: 2.3.3 - TCMALLOC_VERSION: 2.7 - UCLIBC_VERSION: klee_uclibc_v1.2 + TCMALLOC_VERSION: 2.9.1 + UCLIBC_VERSION: klee_uclibc_v1.4 USE_TCMALLOC: 1 USE_LIBCXX: 1 - Z3_VERSION: 4.8.14 + Z3_VERSION: 4.8.15 + SQLITE_VERSION: 3400100 jobs: Linux: @@ -35,86 +36,74 @@ jobs: strategy: matrix: name: [ - "LLVM 13", - "LLVM 12", - "LLVM 11, Doxygen", - "LLVM 10", - "LLVM 9", - "LLVM 8", - "LLVM 7", - "LLVM 6", - "ASan", - "UBSan", - "MSan", - "Z3 only", - "metaSMT STP", - "metaSMT Boolector", - "STP master", - "Latest klee-uclibc", - "Asserts enabled", - "No TCMalloc, optimised runtime", - ] + "LLVM 16", + "LLVM 15", + "LLVM 14", + "LLVM 13, Doxygen", + "LLVM 12", + "LLVM 11", + "ASan", + "UBSan", + "MSan", + "Z3 only", + "metaSMT", + "STP master", + "Latest klee-uclibc", + "Asserts disabled", + "No TCMalloc, optimised runtime", + ] include: - - name: "LLVM 13" + - name: "LLVM 16" + env: + LLVM_VERSION: 16 + - name: "LLVM 15" + env: + LLVM_VERSION: 15 + - name: "LLVM 14" + env: + LLVM_VERSION: 14 + - name: "LLVM 13, Doxygen" env: LLVM_VERSION: 13 + ENABLE_DOXYGEN: 1 - name: "LLVM 12" env: LLVM_VERSION: 12 - - name: "LLVM 11, Doxygen" + - name: "LLVM 11" env: LLVM_VERSION: 11 - ENABLE_DOXYGEN: 1 - - name: "LLVM 10" - env: - LLVM_VERSION: 10 - - name: "LLVM 9" - env: - LLVM_VERSION: 9 - - name: "LLVM 8" - env: - LLVM_VERSION: 8 - - name: "LLVM 7" - env: - LLVM_VERSION: 7 - - name: "LLVM 6" - env: - LLVM_VERSION: "6.0" - # Sanitizer builds. Do unoptimized build otherwise the optimizer might remove problematic code + # Sanitizer builds. Do unoptimized build otherwise the optimizer + # might remove problematic code - name: "ASan" env: SANITIZER_BUILD: address ENABLE_OPTIMIZED: 0 USE_TCMALLOC: 0 - SANITIZER_LLVM_VERSION: 11 + SANITIZER_LLVM_VERSION: 13 - name: "UBSan" env: SANITIZER_BUILD: undefined ENABLE_OPTIMIZED: 0 USE_TCMALLOC: 0 - SANITIZER_LLVM_VERSION: 11 + SANITIZER_LLVM_VERSION: 13 - name: "MSan" env: SANITIZER_BUILD: memory ENABLE_OPTIMIZED: 0 USE_TCMALLOC: 0 SOLVERS: STP - SANITIZER_LLVM_VERSION: 11 - # Test just using Z3 only + SANITIZER_LLVM_VERSION: 14 + # Test just using Z3 only - name: "Z3 only" env: SOLVERS: Z3 # Test just using metaSMT - - name: "metaSMT STP" + - name: "metaSMT" env: + METASMT_VERSION: qf_abv SOLVERS: metaSMT METASMT_DEFAULT: STP REQUIRES_RTTI: 1 - - name: "metaSMT Boolector" - env: - SOLVERS: metaSMT - METASMT_DEFAULT: BTOR - REQUIRES_RTTI: 1 # Test we can build against STP master - name: "STP master" env: @@ -125,7 +114,7 @@ jobs: env: UCLIBC_VERSION: klee_0_9_29 # Check at least one build with Asserts disabled. - - name: "Asserts enabled" + - name: "Asserts disabled" env: SOLVERS: STP DISABLE_ASSERTIONS: 1 @@ -136,16 +125,19 @@ jobs: KLEE_RUNTIME_BUILD: "Release+Debug+Asserts" steps: - name: Checkout KLEE source code - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Build KLEE env: ${{ matrix.env }} run: scripts/build/build.sh klee --docker --create-final-image - name: Run tests - run: scripts/build/run-tests.sh --run-docker --debug + run: | # XXX: Workaround for https://github.com/llvm/llvm-project/issues/78354 + sudo sysctl vm.mmap_rnd_bits=28 + scripts/build/run-tests.sh --run-docker --debug macOS: runs-on: macos-latest env: + LLVM_VERSION: 14 BASE: /tmp SOLVERS: STP UCLIBC_VERSION: 0 @@ -155,7 +147,7 @@ jobs: - name: Install newer version of Bash run: brew install bash - name: Checkout KLEE source code - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Build KLEE run: scripts/build/build.sh klee --debug --install-system-deps - name: Run tests @@ -165,19 +157,38 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout KLEE Code - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Build Docker image run: docker build . Coverage: runs-on: ubuntu-latest + strategy: + matrix: + name: [ + "STP", + "Z3", + ] + include: + - name: "STP" + env: + SOLVERS: STP:Z3 + - name: "Z3" + env: + SOLVERS: Z3 env: ENABLE_OPTIMIZED: 0 COVERAGE: 1 steps: - name: Checkout KLEE source code - uses: actions/checkout@v2 + uses: actions/checkout@v4 + with: + # Codecov may run into "Issue detecting commit SHA. Please run + # actions/checkout with fetch-depth > 1 or set to 0" when uploading. + # See also https://github.com/codecov/codecov-action/issues/190 + fetch-depth: 2 - name: Build KLEE + env: ${{ matrix.env }} run: scripts/build/build.sh klee --docker --create-final-image - name: Run tests run: scripts/build/run-tests.sh --coverage --upload-coverage --run-docker --debug diff --git a/.github/workflows/differential-shellcheck.yml b/.github/workflows/differential-shellcheck.yml new file mode 100644 index 0000000000..f4c147a8bc --- /dev/null +++ b/.github/workflows/differential-shellcheck.yml @@ -0,0 +1,32 @@ +# Doc: https://github.com/redhat-plumbers-in-action/differential-shellcheck#usage +--- + +name: Differential ShellCheck +on: + push: + branches: [master] + pull_request: + branches: [master] + +permissions: + contents: read + +jobs: + lint: + runs-on: ubuntu-latest + + permissions: + security-events: write + + steps: + - name: Repository checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Differential ShellCheck + uses: redhat-plumbers-in-action/differential-shellcheck@v5 + with: + severity: warning + include-path: scripts/**.inc + token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/docker_release_push.yml b/.github/workflows/docker_release_push.yml new file mode 100644 index 0000000000..7a47c9d14c --- /dev/null +++ b/.github/workflows/docker_release_push.yml @@ -0,0 +1,34 @@ +name: Publish Docker Image for Release Builds + +on: + release: + types: [published] + +jobs: + push_to_registry: + name: Push Docker Image to Docker Hub + runs-on: ubuntu-latest + steps: + - name: Check out the repo + uses: actions/checkout@v4 + + - name: Log in to Docker Hub + uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 + with: + images: klee/klee + + - name: Build and push Docker image + uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 + with: + context: . + file: ./Dockerfile + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} \ No newline at end of file diff --git a/.shellcheckrc b/.shellcheckrc new file mode 100644 index 0000000000..2d9f4198f5 --- /dev/null +++ b/.shellcheckrc @@ -0,0 +1,3 @@ +# Tell ShellCheck to use bash when checking scripts +# This is alternative for disable=SC2148 +shell=bash diff --git a/CMakeLists.txt b/CMakeLists.txt index 16793af9a0..de05d9fee6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,36 +10,14 @@ ############################################################################### # Minimum CMake version and policies ############################################################################### -cmake_minimum_required(VERSION 3.9.0) -if (POLICY CMP0054) - cmake_policy(SET CMP0054 NEW) -endif() - -if (POLICY CMP0042) - # Enable `MACOSX_RPATH` by default. - cmake_policy(SET CMP0042 NEW) -endif() - -if (POLICY CMP0037) - # Disallow reserved target names - cmake_policy(SET CMP0037 NEW) -endif() - -# This overrides the default flags for the different CMAKE_BUILD_TYPEs -set(CMAKE_USER_MAKE_RULES_OVERRIDE_C - "${CMAKE_CURRENT_SOURCE_DIR}/cmake/c_flags_override.cmake") -set(CMAKE_USER_MAKE_RULES_OVERRIDE_CXX - "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cxx_flags_override.cmake") +cmake_minimum_required(VERSION 3.16.0) project(KLEE CXX C) -include(CheckFunctionExists) -include(CheckLibraryExists) - ############################################################################### # Project version ############################################################################### -set(KLEE_VERSION_MAJOR 2) -set(KLEE_VERSION_MINOR 3) +set(KLEE_VERSION_MAJOR 3) +set(KLEE_VERSION_MINOR 2-pre) set(KLEE_VERSION "${KLEE_VERSION_MAJOR}.${KLEE_VERSION_MINOR}") # If a patch is needed, we can add KLEE_VERSION_PATCH @@ -48,7 +26,7 @@ set(KLEE_VERSION "${KLEE_VERSION_MAJOR}.${KLEE_VERSION_MINOR}") message(STATUS "KLEE version ${KLEE_VERSION}") set(PACKAGE_STRING "\"KLEE ${KLEE_VERSION}\"") -set(PACKAGE_URL "\"https://klee.github.io\"") +set(PACKAGE_URL "\"https://klee-se.org/\"") ################################################################################ # Sanity check - Disallow building in source. @@ -88,35 +66,25 @@ else() endif() endif() - # Reference specific library paths used during linking for install SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) +# use, i.e. don't skip the full RPATH for the build tree +set(CMAKE_SKIP_BUILD_RPATH FALSE) ################################################################################ # Add our CMake module directory to the list of module search directories ################################################################################ list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules") -################################################################################ -# Compiler flags for KLEE components -# Subsequent commands will append to these. These are used instead of -# directly modifying CMAKE_CXX_FLAGS so that other code can be easily built with -# different flags. -################################################################################ -set(KLEE_COMPONENT_EXTRA_INCLUDE_DIRS "") -set(KLEE_COMPONENT_CXX_DEFINES "") -set(KLEE_COMPONENT_CXX_FLAGS "") -set(KLEE_SOLVER_LIBRARIES "") -set(KLEE_COMPONENT_EXTRA_LIBRARIES "") - - ################################################################################ # Assertions ################################################################################ option(ENABLE_KLEE_ASSERTS "Enable KLEE assertions" ON) if (ENABLE_KLEE_ASSERTS) message(STATUS "KLEE assertions enabled") - # Assume that -DNDEBUG isn't set. + # We have to undefine `NDEBUG` (which CMake adds by default) using `FLAGS` + # and not `DEFINES` since `target_compile_definitions` does not support `-U`. + list(APPEND KLEE_COMPONENT_CXX_FLAGS "-UNDEBUG") else() message(STATUS "KLEE assertions disabled") list(APPEND KLEE_COMPONENT_CXX_DEFINES "-DNDEBUG") @@ -131,51 +99,30 @@ option(KLEE_ENABLE_TIMESTAMP "Add timestamps to KLEE sources" OFF) # Include useful CMake functions ################################################################################ include(GNUInstallDirs) +include(CheckCSourceCompiles) include(CheckCXXSymbolExists) +include(CheckFunctionExists) include(CheckIncludeFile) include(CheckIncludeFileCXX) +include(CheckLibraryExists) include(CheckPrototypeDefinition) include(CMakePushCheckState) -include("${CMAKE_SOURCE_DIR}/cmake/string_to_list.cmake") -include("${CMAKE_SOURCE_DIR}/cmake/klee_component_add_cxx_flag.cmake") -include("${CMAKE_SOURCE_DIR}/cmake/add_global_flag.cmake") - ################################################################################ # Find LLVM ################################################################################ -include(${CMAKE_SOURCE_DIR}/cmake/find_llvm.cmake) -set(NEEDED_LLVM_VARS - LLVM_PACKAGE_VERSION - LLVM_VERSION_MAJOR - LLVM_VERSION_MINOR - LLVM_VERSION_PATCH - LLVM_DEFINITIONS - LLVM_ENABLE_ASSERTIONS - LLVM_ENABLE_EH - LLVM_ENABLE_RTTI - LLVM_INCLUDE_DIRS - LLVM_LIBRARY_DIRS - LLVM_TOOLS_BINARY_DIR - LLVM_ENABLE_VISIBILITY_INLINES_HIDDEN - TARGET_TRIPLE -) - -foreach (vname ${NEEDED_LLVM_VARS}) - message(STATUS "${vname}: \"${${vname}}\"") - if (NOT (DEFINED "${vname}")) - message(FATAL_ERROR "${vname} was not defined") - endif() -endforeach() - -set(OPTIONAL_LLVM_VARS - LLVM_BUILD_MAIN_SRC_DIR +find_package(LLVM REQUIRED CONFIG HINTS "${LLVM_DIR}") +message(STATUS "LLVM directory ${LLVM_DIR}") +set(LLVMCC "${LLVM_TOOLS_BINARY_DIR}/clang" + CACHE + PATH + "Path to C bitcode compiler" + ) +set(LLVMCXX "${LLVM_TOOLS_BINARY_DIR}/clang++" + CACHE + PATH + "Path to C++ bitcode compiler" ) -foreach (vname ${OPTIONAL_LLVM_VARS}) - if (${vname}) - message(STATUS "${vname}: \"${${vname}}\"") - endif() -endforeach() if (LLVM_ENABLE_ASSERTIONS) # Certain LLVM debugging macros only work when LLVM was built with asserts @@ -199,49 +146,48 @@ elseif ((NOT LLVM_ENABLE_ASSERTIONS) AND ENABLE_KLEE_ASSERTS) ) endif() -if (LLVM_ENABLE_VISIBILITY_INLINES_HIDDEN) - list(APPEND KLEE_COMPONENT_CXX_FLAGS "-fvisibility-inlines-hidden") -endif() - - list(APPEND KLEE_COMPONENT_CXX_DEFINES ${LLVM_DEFINITIONS}) list(APPEND KLEE_COMPONENT_EXTRA_INCLUDE_DIRS ${LLVM_INCLUDE_DIRS}) # Find llvm-link -set(LLVM_LINK "${LLVM_TOOLS_BINARY_DIR}/llvm-link") +set(LLVM_LINK "${LLVM_TOOLS_BINARY_DIR}/llvm-link" + CACHE + PATH + "Path to bitcode linker" + ) if (NOT EXISTS "${LLVM_LINK}") message(FATAL_ERROR "Failed to find llvm-link at \"${LLVM_LINK}\"") endif() # Find llvm-ar -set(LLVM_AR "${LLVM_TOOLS_BINARY_DIR}/llvm-ar") +set(LLVM_AR "${LLVM_TOOLS_BINARY_DIR}/llvm-ar" + CACHE + PATH + "Path to bitcode archive tool" + ) if (NOT EXISTS "${LLVM_AR}") message(FATAL_ERROR "Failed to find llvm-ar at \"${LLVM_AR}\"") endif() # Find llvm-as -set(LLVM_AS "${LLVM_TOOLS_BINARY_DIR}/llvm-as") +set(LLVM_AS "${LLVM_TOOLS_BINARY_DIR}/llvm-as" + CACHE + PATH + "Path to bitcode assembly tool" + ) if (NOT EXISTS "${LLVM_AS}") message(FATAL_ERROR "Failed to find llvm-as at \"${LLVM_AS}\"") endif() -################################################################################ -# Find bitcode compiler -################################################################################ -include("${CMAKE_SOURCE_DIR}/cmake/find_bitcode_compiler.cmake") -message(STATUS "LLVMCC: ${LLVMCC}") -if (NOT EXISTS "${LLVMCC}") - message(FATAL_ERROR "Cannot find C bitcode compiler \"${LLVMCC}\"") -endif() -message(STATUS "LLVMCXX: ${LLVMCXX}") -if (NOT EXISTS "${LLVMCXX}") - message(FATAL_ERROR "Cannot find C++ bitcode compiler \"${LLVMCXX}\"") +# Check for dynamic linking +if (LLVM_LINK_LLVM_DYLIB) + set(USE_LLVM_SHARED USE_SHARED) endif() ################################################################################ # C++ version ################################################################################ -set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) ################################################################################ @@ -275,7 +221,7 @@ if (NOT LLVM_ENABLE_EH) if (ENABLE_SOLVER_METASMT) message(WARNING "Not disabling exceptions because metaSMT uses them") else() - klee_component_add_cxx_flag("-fno-exceptions" REQUIRED) + list(APPEND KLEE_COMPONENT_CXX_FLAGS "-fno-exceptions") endif() endif() @@ -289,7 +235,7 @@ if (NOT LLVM_ENABLE_RTTI) "This build configuration is not supported and will likely not work." "You should recompile LLVM with RTTI enabled.") else() - klee_component_add_cxx_flag("-fno-rtti" REQUIRED) + list(APPEND KLEE_COMPONENT_CXX_FLAGS "-fno-rtti") endif() endif() @@ -307,8 +253,6 @@ if (ENABLE_ZLIB) message(STATUS "Zlib support enabled") if (ZLIB_FOUND) set(HAVE_ZLIB_H 1) # For config.h - set(TARGET_LIBS ${TARGET_LIBS} z) - list(APPEND KLEE_COMPONENT_EXTRA_LIBRARIES ${ZLIB_LIBRARIES}) list(APPEND KLEE_COMPONENT_EXTRA_INCLUDE_DIRS ${ZLIB_INCLUDE_DIRS}) else() message(FATAL_ERROR "ENABLE_ZLIB is true but zlib could not be found") @@ -325,31 +269,30 @@ OPTION(ENABLE_TCMALLOC "Enable TCMalloc support" ON) if (ENABLE_TCMALLOC) message(STATUS "TCMalloc support enabled") set(TCMALLOC_HEADER "gperftools/malloc_extension.h") - find_path(TCMALLOC_INCLUDE_DIR "${TCMALLOC_HEADER}") + find_path(TCMALLOC_INCLUDE_DIR + "${TCMALLOC_HEADER}" + HINTS "${TCMALLOC_DIR}/include" + ) cmake_push_check_state() - set(CMAKE_REQUIRED_INCLUDES "${TCMALLOC_INCLUDE_DIR}") - check_include_file_cxx("${TCMALLOC_HEADER}" HAVE_GPERFTOOLS_MALLOC_EXTENSION_H) + list(APPEND CMAKE_REQUIRED_INCLUDES ${TCMALLOC_INCLUDE_DIR}) + check_include_file_CXX("${TCMALLOC_HEADER}" HAVE_GPERFTOOLS_MALLOC_EXTENSION_H) cmake_pop_check_state() + if (${HAVE_GPERFTOOLS_MALLOC_EXTENSION_H}) find_library(TCMALLOC_LIBRARIES NAMES tcmalloc tcmalloc_minimal + HINTS "${TCMALLOC_DIR}/lib" DOC "TCMalloc libraries" ) if (NOT TCMALLOC_LIBRARIES) message(FATAL_ERROR "Found \"${TCMALLOC_HEADER}\" but could not find library") endif() - list(APPEND KLEE_COMPONENT_EXTRA_LIBRARIES ${TCMALLOC_LIBRARIES}) list(APPEND KLEE_COMPONENT_EXTRA_INCLUDE_DIRS ${TCMALLOC_INCLUDE_DIR}) - if (("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") OR ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")) - # TCMalloc's documentation says its safest to pass these flags when - # building with gcc because gcc can optimize assuming its using its own - # malloc. - klee_component_add_cxx_flag(-fno-builtin-malloc REQUIRED) - klee_component_add_cxx_flag(-fno-builtin-calloc REQUIRED) - klee_component_add_cxx_flag(-fno-builtin-realloc REQUIRED) - klee_component_add_cxx_flag(-fno-builtin-free REQUIRED) - endif() + # TCMalloc's documentation says its safest to pass these flags when + # building with gcc because gcc can optimize assuming its using its own + # malloc. + list(APPEND KLEE_COMPONENT_CXX_FLAGS "-fno-builtin-malloc" "-fno-builtin-calloc" "-fno-builtin-realloc" "-fno-builtin-free") else() message(FATAL_ERROR "Can't find \"${TCMALLOC_HEADER}\"") endif() @@ -363,10 +306,18 @@ endif() # Detect SQLite3 ################################################################################ find_package(SQLite3) -if (SQLITE3_FOUND) - include_directories(${SQLITE3_INCLUDE_DIRS}) -else() - message( FATAL_ERROR "SQLite3 not found, please install" ) +if (NOT SQLite3_FOUND) + message( FATAL_ERROR "SQLite3 not found, please install" ) +endif() + +find_program( + SQLITE_CLI + NAMES "sqlite3" + DOC "Path to sqlite3 tool" +) + +if (NOT SQLITE_CLI) + set(SQLITE_CLI "") endif() ################################################################################ @@ -409,6 +360,7 @@ endif (HAVE_PTY_H OR HAVE_UTIL_H OR HAVE_LIBUTIL_H) ################################################################################ check_cxx_symbol_exists(__ctype_b_loc ctype.h HAVE_CTYPE_EXTERNALS) check_cxx_symbol_exists(mallinfo malloc.h HAVE_MALLINFO) +check_cxx_symbol_exists(mallinfo2 malloc.h HAVE_MALLINFO2) check_cxx_symbol_exists(malloc_zone_statistics malloc/malloc.h HAVE_MALLOC_ZONE_STATISTICS) check_include_file(sys/statfs.h HAVE_SYSSTATFS_H) @@ -453,17 +405,26 @@ else() set(HAVE_SELINUX 0) endif() -################################################################################ -# Workarounds -################################################################################ -include(${CMAKE_SOURCE_DIR}/cmake/workaround_llvm_pr39177.cmake) +cmake_push_check_state() +check_c_source_compiles(" + #include + #include + #include + + int main(void) { + struct stat buf; + #pragma GCC diagnostic error \"-Wnonnull\" + fstatat(0, NULL, &buf, 0); + } + " + FSTATAT_PATH_ACCEPTS_NULL) +cmake_pop_check_state() ################################################################################ # KLEE runtime support ################################################################################ # This is set here and not in `runtime` because `config.h` needs to be generated. - set(available_klee_runtime_build_types "Release" "Release+Debug" @@ -489,8 +450,14 @@ message(STATUS "KLEE_RUNTIME_BUILD_TYPE: ${KLEE_RUNTIME_BUILD_TYPE}") include(CheckCSourceRuns) cmake_push_check_state() set(CMAKE_REQUIRED_FLAGS "-m32") -check_c_source_runs("int main(int argc, char** argv){return 0;}" M32_SUPPORTED) +check_c_source_runs("int main(int argc, char** argv){return 0;}" CHECK_M32_SUPPORT) cmake_pop_check_state() +if (NOT CHECK_M32_SUPPORT) + set(M32_SUPPORTED 0) +else() + set(M32_SUPPORTED 1) +endif() + message(STATUS "32bit platform supported: ${M32_SUPPORTED}") set(KLEE_INSTALL_RUNTIME_DIR "${CMAKE_INSTALL_FULL_LIBDIR}/klee/runtime") @@ -506,11 +473,6 @@ file(MAKE_DIRECTORY ${KLEE_RUNTIME_DIRECTORY}) option(ENABLE_POSIX_RUNTIME "Enable KLEE's POSIX runtime" OFF) if (ENABLE_POSIX_RUNTIME) message(STATUS "POSIX runtime enabled") - if (NOT ENABLE_KLEE_UCLIBC) - message(WARNING "Enabling POSIX runtime without klee-uclibc support." - "The runtime might not work without it. Pass `-DENABLE_KLEE_UCLIBC=ON`" - " to enable klee-uclibc support.") - endif() else() message(STATUS "POSIX runtime disabled") endif() @@ -518,38 +480,23 @@ endif() ################################################################################ # KLEE uclibc support ################################################################################ -option(ENABLE_KLEE_UCLIBC "Enable support for klee-uclibc" OFF) -if (ENABLE_KLEE_UCLIBC) - message(STATUS "klee-uclibc support enabled") - set(SUPPORT_KLEE_UCLIBC 1) # For config.h - set(KLEE_UCLIBC_PATH "" CACHE PATH "Path to klee-uclibc root directory") - if (NOT IS_DIRECTORY "${KLEE_UCLIBC_PATH}") - message(FATAL_ERROR - "KLEE_UCLIBC_PATH (\"${KLEE_UCLIBC_PATH}\") is not a valid directory.\n" - "Try passing -DKLEE_UCLIBC_PATH= to cmake where is the path" - " to the root of the klee-uclibc directory.") - endif() - +set(KLEE_UCLIBC_PATH "" CACHE PATH "Path to klee-uclibc root directory") +set(KLEE_UCLIBC_BCA_NAME "klee-uclibc.bca") +if (NOT KLEE_UCLIBC_PATH STREQUAL "") # Find the C library bitcode archive - set(KLEE_UCLIBC_BCA_NAME "klee-uclibc.bca") set(KLEE_UCLIBC_C_BCA "${KLEE_UCLIBC_PATH}/lib/libc.a") if (NOT EXISTS "${KLEE_UCLIBC_C_BCA}") message(FATAL_ERROR - "klee-uclibc library not found at \"${KLEE_UCLIBC_C_BCA}\"") + "klee-uclibc library not found at \"${KLEE_UCLIBC_C_BCA}\". Set KLEE_UCLIBC_PATH to klee-uclibc root directory or empty string.") endif() message(STATUS "Found klee-uclibc library: \"${KLEE_UCLIBC_C_BCA}\"") - # Copy KLEE_UCLIBC_C_BCA so KLEE can find it where it is expected. execute_process(COMMAND ${CMAKE_COMMAND} -E copy "${KLEE_UCLIBC_C_BCA}" "${KLEE_RUNTIME_DIRECTORY}/${KLEE_UCLIBC_BCA_NAME}" ) - list(APPEND KLEE_COMPONENT_CXX_DEFINES - -DKLEE_UCLIBC_BCA_NAME=\"${KLEE_UCLIBC_BCA_NAME}\") - else() - message(STATUS "klee-uclibc support disabled") - set(SUPPORT_KLEE_UCLIBC 0) # For config.h + message(STATUS "Skipping copying of klee-uclibc runtime") endif() ################################################################################ @@ -559,51 +506,44 @@ option(ENABLE_KLEE_LIBCXX "Enable libc++ for klee" OFF) if (ENABLE_KLEE_LIBCXX) message(STATUS "klee-libc++ support enabled") set(SUPPORT_KLEE_LIBCXX 1) # For config.h - set(KLEE_LIBCXX_DIR "" CACHE PATH "Path to directory containing libc++ shared object (bitcode)") - if (NOT EXISTS "${KLEE_LIBCXX_DIR}") - message(FATAL_ERROR - "KLEE_LIBCXX_DIR (\"${KLEE_LIBCXX_DIR}\") does not exist.\n" - "Try passing -DKLEE_LIBCXX_DIR= to CMake where is the path" - "to the directory containing the libc++ shared object file (as bitcode).") - endif() - set(KLEE_LIBCXX_INCLUDE_DIR "" CACHE PATH "Path to libc++ include directory") - if (NOT EXISTS "${KLEE_LIBCXX_INCLUDE_DIR}") - message(FATAL_ERROR - "KLEE_LIBCXX_INCLUDE_DIR (\"${KLEE_LIBCXX_INCLUDE_DIR}\") does not exist.\n" - "Try passing -DKLEE_LIBCXX_INCLUDE_DIR= to CMake where is the" - "libc++ include directory.") - endif() - message(STATUS "Use libc++ include path: \"${KLEE_LIBCXX_INCLUDE_DIR}\"") - - # Find the library bitcode archive - - # Check for static first - set(KLEE_LIBCXX_BC_NAME "libc++.bca") - set(KLEE_LIBCXX_BC_PATH "${KLEE_LIBCXX_DIR}/lib/${KLEE_LIBCXX_BC_NAME}") - if (NOT EXISTS "${KLEE_LIBCXX_BC_PATH}") - # Check for dynamic so lib - set(KLEE_LIBCXX_BC_NAME "libc++.so.bc") - set(KLEE_LIBCXX_BC_PATH "${KLEE_LIBCXX_DIR}/lib/${KLEE_LIBCXX_BC_NAME}") - if (NOT EXISTS "${KLEE_LIBCXX_BC_PATH}") - set(KLEE_LIBCXX_BC_NAME "libc++.dylib.bc") - set(KLEE_LIBCXX_BC_PATH "${KLEE_LIBCXX_DIR}/lib/${KLEE_LIBCXX_BC_NAME}") - if (NOT EXISTS "${KLEE_LIBCXX_BC_PATH}") - message(FATAL_ERROR - "libc++ library not found at \"${KLEE_LIBCXX_DIR}\"") - endif() - endif() - endif() + find_file(KLEE_LIBCXX_BC_PATH + NAMES libc++.bca libc++.so.bc libc++.dylib.bc + DOC "Path to directory containing libc++ shared object (bitcode)" + PATH_SUFFIXES "lib" "lib/x86_64-unknown-linux-gnu" + HINTS ${KLEE_LIBCXX_DIR} + REQUIRED + ) message(STATUS "Found libc++ library: \"${KLEE_LIBCXX_BC_PATH}\"") + find_path(KLEE_LIBCXX_PLATFORM_INCLUDE_PATH + NAMES __config_site #We are searching for a platform-specific C++ library header called `__config_site` + DOC "Path to platform-specific libc++ include directory" + PATH_SUFFIXES "x86_64-unknown-linux-gnu/c++/v1" "include/x86_64-unknown-linux-gnu/c++/v1" + HINTS ${KLEE_LIBCXX_INCLUDE_DIR} + NO_DEFAULT_PATH # Make sure we don't pick-up the standard library's path + ) + + find_path(KLEE_LIBCXX_INCLUDE_PATH + NAMES cerrno #We are searching for a C++ library header called `cerrno` + DOC "Path to libc++ include directory" + PATH_SUFFIXES "c++/v1" "include/c++/v1" + HINTS ${KLEE_LIBCXX_INCLUDE_DIR} + REQUIRED + NO_DEFAULT_PATH # Make sure we don't pick-up the standard library's path + ) + + message(STATUS "Found libc++ include path: ${KLEE_LIBCXX_INCLUDE_PATH} and ${KLEE_LIBCXX_PLATFORM_INCLUDE_PATH} ") + + # Copy KLEE_LIBCXX_BC_PATH so KLEE can find it where it is expected. file(MAKE_DIRECTORY "${KLEE_RUNTIME_DIRECTORY}") execute_process(COMMAND ${CMAKE_COMMAND} -E copy "${KLEE_LIBCXX_BC_PATH}" - "${KLEE_RUNTIME_DIRECTORY}/${KLEE_LIBCXX_BC_NAME}" + "${KLEE_RUNTIME_DIRECTORY}/${KLEE_LIBCXX_BC_PATH}" ) list(APPEND KLEE_COMPONENT_CXX_DEFINES - -DKLEE_LIBCXX_BC_NAME=\"${KLEE_LIBCXX_BC_NAME}\") + -DKLEE_LIBCXX_BC_NAME=\"${KLEE_LIBCXX_BC_PATH}\") else() message(STATUS "libc++ support disabled") @@ -629,13 +569,8 @@ if (ENABLE_KLEE_EH_CXX) endif() message(STATUS "Use libc++abi source path: \"${KLEE_LIBCXXABI_SRC_DIR}\"") - if (${LLVM_VERSION_MAJOR} GREATER 8 OR ${LLVM_VERSION_MAJOR} EQUAL 8) - set(SUPPORT_KLEE_EH_CXX 1) # For config.h - message(STATUS "Support for C++ Exceptions enabled") - else() - set(SUPPORT_KLEE_EH_CXX 0) # For config.h - message(STATUS "Support for C++ Exceptions (only available for LLVM >= 8.0.0) disabled") - endif() + set(SUPPORT_KLEE_EH_CXX 1) # For config.h + message(STATUS "Support for C++ Exceptions enabled") else() set(SUPPORT_KLEE_EH_CXX 0) # For config.h @@ -648,7 +583,7 @@ message(STATUS "CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}") set(IS_ASAN_BUILD 0) set(IS_UBSAN_BUILD 0) set(IS_MSAN_BUILD 0) -string(REPLACE " " ";" _flags ${CMAKE_CXX_FLAGS}) +string(REPLACE " " ";" _flags "${CMAKE_CXX_FLAGS}") foreach(arg IN ITEMS ${_flags}) if (${arg} STREQUAL -fsanitize=address) set(IS_ASAN_BUILD 1) @@ -686,10 +621,10 @@ configure_file(${CMAKE_SOURCE_DIR}/include/klee/Config/CompileTimeInfo.h.cmin ) ################################################################################ -# Global include directories +# Set KLEE-specific include files ################################################################################ -include_directories("${CMAKE_BINARY_DIR}/include") -include_directories("${CMAKE_SOURCE_DIR}/include") + +set(KLEE_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/include ${CMAKE_BINARY_DIR}/include) ################################################################################ # Set default location for targets in the build directory @@ -706,13 +641,11 @@ set(KLEE_UTILS_DIR ${CMAKE_SOURCE_DIR}/utils) message(STATUS "KLEE_COMPONENT_EXTRA_INCLUDE_DIRS: '${KLEE_COMPONENT_EXTRA_INCLUDE_DIRS}'") message(STATUS "KLEE_COMPONENT_CXX_DEFINES: '${KLEE_COMPONENT_CXX_DEFINES}'") message(STATUS "KLEE_COMPONENT_CXX_FLAGS: '${KLEE_COMPONENT_CXX_FLAGS}'") -message(STATUS "KLEE_COMPONENT_EXTRA_LIBRARIES: '${KLEE_COMPONENT_EXTRA_LIBRARIES}'") message(STATUS "KLEE_SOLVER_LIBRARIES: '${KLEE_SOLVER_LIBRARIES}'") ################################################################################ # KLEE components ################################################################################ -include("${CMAKE_SOURCE_DIR}/cmake/klee_add_component.cmake") add_subdirectory(lib) add_subdirectory(runtime) diff --git a/Dockerfile b/Dockerfile index 0076f9f464..d345ff5c63 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,11 @@ -FROM klee/llvm:110_O_D_A_ubuntu_bionic-20200807 as llvm_base -FROM klee/gtest:1.11.0_ubuntu_bionic-20200807 as gtest_base -FROM klee/uclibc:klee_uclibc_v1.2_90_ubuntu_bionic-20200807 as uclibc_base -FROM klee/tcmalloc:2.7_ubuntu_bionic-20200807 as tcmalloc_base -FROM klee/stp:2.3.3_ubuntu_bionic-20200807 as stp_base -FROM klee/z3:4.8.4_ubuntu_bionic-20200807 as z3_base -FROM klee/libcxx:90_ubuntu_bionic-20200807 as libcxx_base +FROM ghcr.io/klee/llvm:130_O_D_A_ubuntu_jammy-20230126 as llvm_base +FROM ghcr.io/klee/gtest:1.11.0_ubuntu_jammy-20230126 as gtest_base +FROM ghcr.io/klee/uclibc:klee_uclibc_v1.3_130_ubuntu_jammy-20230126 as uclibc_base +FROM ghcr.io/klee/tcmalloc:2.9.1_ubuntu_jammy-20230126 as tcmalloc_base +FROM ghcr.io/klee/stp:2.3.3_ubuntu_jammy-20230126 as stp_base +FROM ghcr.io/klee/z3:4.8.15_ubuntu_jammy-20230126 as z3_base +FROM ghcr.io/klee/libcxx:130_ubuntu_jammy-20230126 as libcxx_base +FROM ghcr.io/klee/sqlite:3400100_ubuntu_jammy-20230126 as sqlite3_base FROM llvm_base as intermediate COPY --from=gtest_base /tmp /tmp/ COPY --from=uclibc_base /tmp /tmp/ @@ -12,10 +13,11 @@ COPY --from=tcmalloc_base /tmp /tmp/ COPY --from=stp_base /tmp /tmp/ COPY --from=z3_base /tmp /tmp/ COPY --from=libcxx_base /tmp /tmp/ +COPY --from=sqlite3_base /tmp /tmp/ ENV COVERAGE=0 ENV USE_TCMALLOC=1 ENV BASE=/tmp -ENV LLVM_VERSION=11.0 +ENV LLVM_VERSION=13.0 ENV ENABLE_DOXYGEN=1 ENV ENABLE_OPTIMIZED=1 ENV ENABLE_DEBUG=1 @@ -23,7 +25,7 @@ ENV DISABLE_ASSERTIONS=0 ENV REQUIRES_RTTI=0 ENV SOLVERS=STP:Z3 ENV GTEST_VERSION=1.11.0 -ENV UCLIBC_VERSION=klee_0_9_29 +ENV UCLIBC_VERSION=klee_uclibc_v1.3 ENV TCMALLOC_VERSION=2.9.1 ENV SANITIZER_BUILD= ENV STP_VERSION=2.3.3 @@ -31,9 +33,9 @@ ENV MINISAT_VERSION=master ENV Z3_VERSION=4.8.15 ENV USE_LIBCXX=1 ENV KLEE_RUNTIME_BUILD="Debug+Asserts" +ENV SQLITE_VERSION=3400100 LABEL maintainer="KLEE Developers" - # TODO remove adding sudo package # Create ``klee`` user for container with password ``klee``. # and give it password-less sudo access (temporarily so we can use the CI scripts) @@ -47,22 +49,25 @@ RUN apt update && DEBIAN_FRONTEND=noninteractive apt -y --no-install-recommends # Copy across source files needed for build COPY --chown=klee:klee . /tmp/klee_src/ +USER klee +WORKDIR /home/klee # Build and set klee user to be owner -RUN /tmp/klee_src/scripts/build/build.sh --debug --install-system-deps klee && chown -R klee:klee /tmp/klee_build* && pip3 install flask wllvm && \ - rm -rf /var/lib/apt/lists/* +RUN /tmp/klee_src/scripts/build/build.sh --debug --install-system-deps klee && pip3 install flask wllvm && \ + sudo rm -rf /var/lib/apt/lists/* -ENV PATH="$PATH:/tmp/llvm-90-install_O_D_A/bin:/home/klee/klee_build/bin" + +ENV PATH="$PATH:/tmp/llvm-130-install_O_D_A/bin:/home/klee/klee_build/bin:/home/klee/.local/bin" ENV BASE=/tmp +# Add path to local LLVM installation - let system install precede local install +RUN /bin/bash -c 'echo "export \"PATH=$PATH:$(cd ${BASE}/llvm-*-install*/bin/ && pwd)\" >> /home/klee/.bashrc"' # Add KLEE header files to system standard include folder -RUN /bin/bash -c 'ln -s ${BASE}/klee_src/include/klee /usr/include/' +RUN sudo /bin/bash -c 'ln -s /tmp/klee_src/include/klee /usr/include/' -USER klee -WORKDIR /home/klee ENV LD_LIBRARY_PATH /home/klee/klee_build/lib/ # Add KLEE binary directory to PATH -RUN /bin/bash -c 'ln -s ${BASE}/klee_src /home/klee/ && ln -s ${BASE}/klee_build* /home/klee/klee_build' +RUN /bin/bash -c 'ln -s ${BASE}/klee_src /home/klee/ && ln -s ${BASE}/klee_build* /home/klee/klee_build' # TODO Remove when STP is fixed -RUN /bin/bash -c 'echo "export LD_LIBRARY_PATH=$(cd ${BASE}/metaSMT-*-deps/stp-git-basic/lib/ && pwd):$LD_LIBRARY_PATH" >> /home/klee/.bashrc' +RUN /bin/bash -c 'echo "export LD_LIBRARY_PATH=$(cd ${BASE}/metaSMT-*-deps/stp-git-basic/lib/ && pwd):$LD_LIBRARY_PATH" >> /home/klee/.bashrc' \ No newline at end of file diff --git a/LICENSE.TXT b/LICENSE.TXT index b358bb352b..62c09d69a9 100644 --- a/LICENSE.TXT +++ b/LICENSE.TXT @@ -4,7 +4,7 @@ KLEE Release License University of Illinois/NCSA Open Source License -http://klee.github.io/ +https://klee-se.org/ Developed by: KLEE Team diff --git a/NEWS b/NEWS index de99b7e145..f4bee5611a 100644 --- a/NEWS +++ b/NEWS @@ -1,9 +1,89 @@ +KLEE 3.1, 29 February 2024 +========================== + +Incorporating changes from 8 June 2023 to 29 February 2024. +Maintainers during this time span: @ccadar, @MartinNowack, @251. +Documentation at https://klee-se.org/releases/docs/v3.1 + +== Major features and important changes == +- New execution tree implementation and klee-exec-tree tool (@251) +- KDAlloc is now the default allocator in KLEE (KDAlloc was introduced in KLEE 3.0) +- Resolve memory reads/writes to single objects in more cases (@tkuchta) +- Concretize values based on seeds when available (@ccadar) +- Fixed some interactions with external code (@ccadar, @MartinNowack, mishok2503) + +== LLVM support == +- Current recommended version is still LLVM 13 +- Added support for LLVM 15 and 16 (@MartinNowack) +- Removed support for LLVM <11 (@danielschemmel) +- KLEE 3.1 will be the last version with support for LLVM <13 + +== Options, scripts and KLEE intrinsics added, changed or removed == +- New klee-exec-tree tool (@251) +- New --write-exec-tree and --exec-tree-batch-size options (@251) +- Renamed --compress-process-tree to --compress-exec-tree (@ccadar) +- PTree is now called ExecutionTree in the code (@ccadar) +- KDAlloc (--kdalloc) is now enabled by default (@ccadar) +- Replaced --suppress-external-warnings and --all-external-warnings with --external-call-warnings=none|once-per-function|all (@ccadar) +- Keep in the KLEE and Kleaver help menus only the KLEE/Kleaver option categories (@ccadar) +- Removed --cex-cache-exp, a broken experimental optimisation for validity (@ccadar) +- Removed --zero-seed-extension, and merge it with --allow-seed-extension (@ccadar) + +== Other changes == +- Improvements to KDAlloc (@danielschemmel) +- Avoid generating array names in solver builders that could accidently collide (@MartinNowack) +- Function has_permission in the POSIX model now returns permission error a single time in symbolic execution mode (@ccadar) +- Smaller refactorings, fixes and improvements, test cases, maintenance, comments, web version, website, etc. (@251, @ccadar, @dependabot, @danielschemmel, @davidtr1037, @jbuening, @marco6, @MartinNowack, @McSinyx, @sp1ff) + + +KLEE 3.0, 7 June 2023 +===================== + +Incorporating changes from 8 April 2022 to 7 June 2023. +Maintainers during this time span: @ccadar, @MartinNowack, @251. +(@251 joined as a new maintainer during 2022). +Documentation at https://klee-se.org/releases/docs/v3.0 + +== Major features == +- Added support for the KDAlloc memory allocator, which enables KLEE to more robustly detect use-after-free errors, improves the detection of buffer overflows, and provides deterministic memory allocation (@danielschemmel, based on https://srg.doc.ic.ac.uk/publications/22-kdalloc-ecoop.html) +- Enabled KLEE to support UBSan-added checks (@operasfantom) +- Added support for concrete inline assembly, which is now handled as an external call (@mishok2503) + +== LLVM support == +- Current recommended version is LLVM 13 +- Added support for LLVM 14 (@lzaoral) +- Removed support for LLVM <9 +- KLEE 3.0 will be the last version with support for LLVM <11 + +== Options, scripts and KLEE intrinsics added, changed or removed == +- Renamed gen-bout to ktest-gen, and gen-random-bout to ktest-randgen (@ccadar) +- Added option --stp-sat-solver for selecting the SAT solver used by STP (@251) +- Added many more runtime statistics that can be inspected with klee-stats, and renamed several of them (@251) +- Removed unused model_version from the tests generated when the POSIX runtime is enabled (@ccadar) +- Removed unused option --replay-keep-symbolic (@251) +- Added support for the @llvm.f{ma,muladd}.f* intrinsics (@lzaoral) +- Allow UcLibc to support a runtime option rather than a compile-time one (@arrowd) +- Added support for llvm.experimental.noalias.scope.decl (@operasfantom) +- Modified names of SMT variables to use underscores instead of dashes, e.g., A_data instead of A-data (@ccadar) + +== Other changes == +- Overhaul of KLEE's CI and build scripts (@MartinNowack, @jbuening) +- Introduce separate categories for different kinds of undefined behavior (@operasfantom) +- Support arguments of width 128, 256 and 512 bits for external calls (@operasfantom) +- Added check for nonnull path APIs in fstatat (@251, @jbuening) +- Fixed a bug in KLEE libc's implementation of strcmp, where characters were not compared as unsigned (@ccadar) +- Added support for Differential ShellCheck (@jamacku) +- Fixed a bug triggered when --entry-point and --libc=uclibc are used together (@ccadar) +- Fixed a bug with --use-batching-search ignoring disabled time budget (@jbuening) +- Smaller refactorings, fixes and improvements, test cases, maintenance, comments, web version, website, etc. (@251, @andronat, @arrowd, @ccadar, @danielschemmel, @dependabot, @fwc, @jamesjer, @jbuening, @jryans, @kt218, @lzaoral, @m-davis, @MartinNowack, @McSinyx, @mishok2503, @operasfantom, @prncoprs, @rriley, @rshariffdeen, @sava-cska, @ZHYfeng) + + KLEE 2.3, 4 April 2022 ====================== -Incorporating changes from 8 December 2020 to March 2022. +Incorporating changes from 8 December 2020 to 4 April 2022. Maintainers during this time span: @ccadar and @MartinNowack -Documentation at http://klee.github.io/releases/docs/v2.3 +Documentation at https://klee-se.org/releases/docs/v2.3 == LLVM support == - Current recommended version is LLVM 11 @@ -35,12 +115,13 @@ Documentation at http://klee.github.io/releases/docs/v2.3 - Removed or updated obsolete Doxygen options and added Doxygen generation to the CI (@ccadar) - Smaller refactorings, fixes and improvements, test cases, maintenance, comments, web version, website, etc. (@251, @aesophor, @arrowd, @bathooman, @ccadar, @carlocab, @davidtr1037, @dependabot, @futile, @iangneal, @jbuening, @jirislaby, @jiseongg, @jordr, @lzaoral, @MartinNowack, @numinit, @operasfantom, @prncoprs) + KLEE 2.2, 7 December 2020 ========================= Incorporating changes from 4 March 2020 to 7 December 2020. Maintainers during this time span: @ccadar and @MartinNowack -Documentation at http://klee.github.io/releases/docs/v2.2 +Documentation at https://klee-se.org/releases/docs/v2.2 == Major features == - Added support for C++ exceptions (@corrodedHash, @futile, @jbuening) @@ -102,7 +183,7 @@ KLEE 2.1, 3 March 2020 ======================= Incorporating changes from 20 March 2019 to 3 March 2020. Maintainers during this time span: @ccadar and @MartinNowack -Documentation at http://klee.github.io/releases/docs/v2.1 +Documentation at https://klee-se.org/releases/docs/v2.1 == Major features == - New container-based architecture for KLEE Web (@Denis-Gavrielov, @andronat) @@ -149,7 +230,7 @@ KLEE 2.0, 19 March 2019 ======================== Incorporating changes from 22 July 2017 to 19 March 2019 Maintainers during this time span: @AndreaMattavelli, @ccadar, @delcypher, @MartinNowack -Documentation at http://klee.github.io/releases/docs/v2.0 +Documentation at https://klee-se.org/releases/docs/v2.0 == Major features == - Added support for KLEE array optimizations from ISSTA'17 paper "Accelerating Array Constraints in Symbolic Execution" (@AndreaMattavelli, @MartinNowack, @ccadar) @@ -241,7 +322,7 @@ comments, web version, website, etc. (@andronat, @251, @andreamattavelli, @ccada KLEE 1.4.0, 21 July 2017 ======================== (Incorporating changes from 4 November 2016 up to and including 21 July 2017) -Documentation at http://klee.github.io/releases/docs/v1.4.0/ +Documentation at https://klee-se.org/releases/docs/v1.4.0/ This will be the last version supporting LLVM 2.9 and the autoconf build system. @@ -296,7 +377,7 @@ KLEE 1.3.0, 30 November 2016 * Improved determinism of KLEE, an essential feature for experiments involving KLEE (@MartinNowack) * KLEE-web has been improved and refactored, and now available at http://klee.doc.ic.ac.uk/ (@giacomoguerci, @helicopter88, @andronat, @ccadar, based on work by @ains, @ben-chin, @ilovepjs, @JamesDavidCarr, Kaho Sato, Conrad Watt, @ccadar) * Renamed --replay-out to --replay-ktest and --replay-out-dir to replay-ktest-dir (@delcypher) -* Split creation of symbolic files and stdin in two distinct options, documented at http://klee.github.io/docs/options/#symbolic-environment (@andreamattavelli) +* Split creation of symbolic files and stdin in two distinct options, documented at https://klee-se.org/docs/options/#symbolic-environment (@andreamattavelli) * Support for logging queries before invoking the solver via --log-partial-queries-early, useful for debugging solver crashes (@MartinNowack) * Added --stats-write-after-instructions and --istats-write-after-instructions to update each statistic after n steps (@MartinNowack) * Added --compress-log and --debug-compress-instructions to gzip-compress logs (@MartinNowack) diff --git a/README-CMake.md b/README-CMake.md index 71984e4d43..23cb7a1413 100644 --- a/README-CMake.md +++ b/README-CMake.md @@ -1,22 +1,16 @@ # CMake build system -KLEE now has a CMake build system which is intended to replace -its autoconf/Makefile based build system. +KLEE has a CMake build system. -## Useful top level targets +## Useful top-level targets * `check` - Build and run all tests. -* `clean` - Invoke CMake's built-in target to clean the build tree. Note this - won't invoke the `clean_*` targets. It is advised that the `clean_all` target - is used instead. -* `clean_all` - Run all clean targets. -* `clean_doxygen` - Clean doxygen build tree. -* `clean_runtime` - Clean the runtime build tree. -* `docs` - Build documentation -* `edit_cache` - Show cmake/ccmake/cmake-gui interface for chaning configure options. -* `help` - Show list of top level targets -* `systemtests` - Run system tests -* `unittests` - Build and run unittests +* `clean` - Clean the build tree. +* `docs` - Build documentation. +* `edit_cache` - Show cmake/ccmake/cmake-gui interface for changing configure options. +* `help` - Show list of top-level targets. +* `systemtests` - Build and run system tests. +* `unittests` - Build and run unit tests. ## Useful CMake variables @@ -49,8 +43,6 @@ cmake -DCMAKE_BUILD_TYPE=Release /path/to/klee/src * `ENABLE_KLEE_LIBCXX` (BOOLEAN) - Enable libc++ for klee. -* `ENABLE_KLEE_UCLIBC` (BOOLEAN) - Enable support for klee-uclibc. - * `ENABLE_POSIX_RUNTIME` (BOOLEAN) - Enable POSIX runtime. * `ENABLE_SOLVER_METASMT` (BOOLEAN) - Enable MetaSMT solver support. @@ -66,8 +58,8 @@ cmake -DCMAKE_BUILD_TYPE=Release /path/to/klee/src * `ENABLE_ZLIB` (BOOLEAN) - Enable zlib support. * `GTEST_SRC_DIR` (STRING) - Path to Google Test source tree. If it is not - specified and `USE_CMAKE_FIND_PACKAGE_LLVM` is used, CMake will try to reuse - the version included within the LLVM source tree. + specified, CMake will try to reuse the version included within the LLVM + source tree or find a system installation of Google Test. * `GTEST_INCLUDE_DIR` (STRING) - Path to Google Test include directory, if it is not under `GTEST_SRC_DIR`. @@ -89,13 +81,7 @@ cmake -DCMAKE_BUILD_TYPE=Release /path/to/klee/src * `LIT_ARGS` (STRING) - Semi-colon separated list of lit options. -* `LLVM_CONFIG_BINARY` (STRING) - Path to `llvm-config` binary. This is - only relevant if `USE_CMAKE_FIND_PACKAGE_LLVM` is `FALSE`. This is used - to detect the LLVM version and find libraries. - -* `LLVM_DIR` (STRING) - Path to `LLVMConfig.cmake`. This is only relevant if - `USE_CMAKE_FIND_PACKAGE_LLVM` is `TRUE`. This can be used to tell CMake where - it can find LLVM outside of standard directories. +* `LLVM_DIR` (STRING) - Path to the target LLVM install directory * `metaSMT_DIR` (STRING) - Provides a hint to CMake, where the metaSMT constraint solver can be found. This should be an absolute path to a directory @@ -107,7 +93,4 @@ cmake -DCMAKE_BUILD_TYPE=Release /path/to/klee/src but also exists in its build directory. This allows KLEE to link against STP in a build directory or an installed copy. -* `USE_CMAKE_FIND_PACKAGE_LLVM` (BOOLEAN) - Use `find_package(LLVM CONFIG)` - to find LLVM (instead of using `llvm-config` with `LLVM_CONFIG_BINARY`). - * `WARNINGS_AS_ERRORS` (BOOLEAN) - Treat warnings as errors when building KLEE. diff --git a/README.md b/README.md index 9aefd2c9bf..83cb50fc31 100644 --- a/README.md +++ b/README.md @@ -24,4 +24,4 @@ environment that matches a computed test input, including setting up files, pipes, environment variables, and passing command line arguments. -For further information, see the [webpage](http://klee.github.io/). +For further information, see the [webpage](https://klee-se.org/). diff --git a/cmake/add_global_flag.cmake b/cmake/add_global_flag.cmake deleted file mode 100644 index 893e1200ab..0000000000 --- a/cmake/add_global_flag.cmake +++ /dev/null @@ -1,55 +0,0 @@ -#===------------------------------------------------------------------------===# -# -# The KLEE Symbolic Virtual Machine -# -# This file is distributed under the University of Illinois Open Source -# License. See LICENSE.TXT for details. -# -#===------------------------------------------------------------------------===# -include(CheckCXXCompilerFlag) -include(CheckCCompilerFlag) -include(CMakeParseArguments) - -function(add_global_cxx_flag flag) - CMAKE_PARSE_ARGUMENTS(add_global_cxx_flag "REQUIRED" "" "" ${ARGN}) - string(REPLACE "-" "_" SANITIZED_FLAG_NAME "${flag}") - string(REPLACE "/" "_" SANITIZED_FLAG_NAME "${SANITIZED_FLAG_NAME}") - string(REPLACE "=" "_" SANITIZED_FLAG_NAME "${SANITIZED_FLAG_NAME}") - string(REPLACE " " "_" SANITIZED_FLAG_NAME "${SANITIZED_FLAG_NAME}") - string(REPLACE "+" "_" SANITIZED_FLAG_NAME "${SANITIZED_FLAG_NAME}") - unset(HAS_${SANITIZED_FLAG_NAME}) - CHECK_CXX_COMPILER_FLAG("${flag}" HAS_${SANITIZED_FLAG_NAME}_CXX) - if (add_global_cxx_flag_REQUIRED AND NOT HAS_${SANITIZED_FLAG_NAME}_CXX) - message(FATAL_ERROR "The flag \"${flag}\" is required but your C++ compiler doesn't support it") - endif() - if (HAS_${SANITIZED_FLAG_NAME}_CXX) - message(STATUS "C++ compiler supports ${flag}") - # NOTE: Have to be careful here as CMAKE_CXX_FLAGS is a string - # and not a list. - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}" PARENT_SCOPE) - else() - message(STATUS "C++ compiler does not support ${flag}") - endif() -endfunction() - -function(add_global_c_flag flag) - CMAKE_PARSE_ARGUMENTS(add_global_c_flag "REQUIRED" "" "" ${ARGN}) - string(REPLACE "-" "_" SANITIZED_FLAG_NAME "${flag}") - string(REPLACE "/" "_" SANITIZED_FLAG_NAME "${SANITIZED_FLAG_NAME}") - string(REPLACE "=" "_" SANITIZED_FLAG_NAME "${SANITIZED_FLAG_NAME}") - string(REPLACE " " "_" SANITIZED_FLAG_NAME "${SANITIZED_FLAG_NAME}") - string(REPLACE "+" "_" SANITIZED_FLAG_NAME "${SANITIZED_FLAG_NAME}") - unset(HAS_${SANITIZED_FLAG_NAME}) - CHECK_C_COMPILER_FLAG("${flag}" HAS_${SANITIZED_FLAG_NAME}_C) - if (add_global_c_flag_REQUIRED AND NOT HAS_${SANITIZED_FLAG_NAME}_C) - message(FATAL_ERROR "The flag \"${flag}\" is required but your C compiler doesn't support it") - endif() - if (HAS_${SANITIZED_FLAG_NAME}_C) - message(STATUS "C compiler supports ${flag}") - # NOTE: Have to be careful here as CMAKE_C_FLAGS is a string - # and not a list. - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flag}" PARENT_SCOPE) - else() - message(STATUS "C compiler does not support ${flag}") - endif() -endfunction() diff --git a/cmake/c_flags_override.cmake b/cmake/c_flags_override.cmake deleted file mode 100644 index 1064022c26..0000000000 --- a/cmake/c_flags_override.cmake +++ /dev/null @@ -1,24 +0,0 @@ -#===------------------------------------------------------------------------===# -# -# The KLEE Symbolic Virtual Machine -# -# This file is distributed under the University of Illinois Open Source -# License. See LICENSE.TXT for details. -# -#===------------------------------------------------------------------------===# -# -# This file overrides the default compiler flags for CMake's built-in -# configurations (CMAKE_BUILD_TYPE). Most compiler flags should not be set -# here. The main purpose is to make sure ``-DNDEBUG`` is never set by default. -# -#===------------------------------------------------------------------------===# -if (("${CMAKE_C_COMPILER_ID}" MATCHES "Clang") OR ("${CMAKE_C_COMPILER_ID}" MATCHES "GNU")) - # Taken from Modules/Compiler/GNU.cmake but -DNDEBUG is removed - set(CMAKE_C_FLAGS_INIT "") - set(CMAKE_C_FLAGS_DEBUG_INIT "-O0 -g") - set(CMAKE_C_FLAGS_MINSIZEREL_INIT "-Os") - set(CMAKE_C_FLAGS_RELEASE_INIT "-O3") - set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-O2 -g") -else() - message(FATAL_ERROR "Overrides not set for compiler ${CMAKE_C_COMPILER_ID}") -endif() diff --git a/cmake/compiler_warnings.cmake b/cmake/compiler_warnings.cmake index 9e6e67efa7..b250483a1d 100644 --- a/cmake/compiler_warnings.cmake +++ b/cmake/compiler_warnings.cmake @@ -9,71 +9,20 @@ ############################################################################### # Compiler warnings -# -# NOTE: All these variables should be lists of flags and NOT a single string. ############################################################################### # FIXME: -Wunused-parameter fires a lot so for now suppress it. -set(GCC_AND_CLANG_WARNINGS_CXX - "-Wall" - "-Wextra" - "-Wno-unused-parameter") -set(GCC_AND_CLANG_WARNINGS_C +add_compile_options( "-Wall" "-Wextra" - "-Wno-unused-parameter") -set(GCC_ONLY_WARNINGS_C "") -set(GCC_ONLY_WARNINGS_CXX "") -set(CLANG_ONLY_WARNINGS_C "") -set(CLANG_ONLY_WARNINGS_CXX "") - -############################################################################### -# Check which warning flags are supported and use them globally -############################################################################### -set(CXX_WARNING_FLAGS_TO_CHECK "") -set(C_WARNING_FLAGS_TO_CHECK "") - -if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU") - list(APPEND CXX_WARNING_FLAGS_TO_CHECK ${GCC_AND_CLANG_WARNINGS_CXX}) - list(APPEND CXX_WARNING_FLAGS_TO_CHECK ${GCC_ONLY_WARNINGS_CXX}) -elseif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") - list(APPEND CXX_WARNING_FLAGS_TO_CHECK ${GCC_AND_CLANG_WARNINGS_CXX}) - list(APPEND CXX_WARNING_FLAGS_TO_CHECK ${CLANG_ONLY_WARNINGS_CXX}) -else() - message(AUTHOR_WARNING "Unknown compiler") -endif() - -if ("${CMAKE_C_COMPILER_ID}" MATCHES "GNU") - list(APPEND C_WARNING_FLAGS_TO_CHECK ${GCC_AND_CLANG_WARNINGS_C}) - list(APPEND C_WARNING_FLAGS_TO_CHECK ${GCC_ONLY_WARNINGS_C}) -elseif ("${CMAKE_C_COMPILER_ID}" MATCHES "Clang") - list(APPEND C_WARNING_FLAGS_TO_CHECK ${GCC_AND_CLANG_WARNINGS_C}) - list(APPEND C_WARNING_FLAGS_TO_CHECK ${CLANG_ONLY_WARNINGS_C}) -else() - message(AUTHOR_WARNING "Unknown compiler") -endif() - -# Loop through flags and use the ones which the compiler supports -foreach (flag ${CXX_WARNING_FLAGS_TO_CHECK}) - # Note `add_global_cxx_flag()` is used rather than - # `klee_component_add_cxx_flag()` because warning - # flags are typically useful for building everything. - add_global_cxx_flag("${flag}") -endforeach() -foreach (flag ${C_WARNING_FLAGS_TO_CHECK}) - add_global_c_flag("${flag}") -endforeach() + "-Wno-unused-parameter" +) ############################################################################### # Warnings as errors ############################################################################### option(WARNINGS_AS_ERRORS "Treat compiler warnings as errors" OFF) if (WARNINGS_AS_ERRORS) - if (("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") OR ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")) - add_global_cxx_flag("-Werror" REQUIRED) - add_global_c_flag("-Werror" REQUIRED) - else() - message(AUTHOR_WARNING "Unknown compiler") - endif() + add_compile_options("-Werror") message(STATUS "Treating compiler warnings as errors") else() message(STATUS "Not treating compiler warnings as errors") diff --git a/cmake/cxx_flags_override.cmake b/cmake/cxx_flags_override.cmake deleted file mode 100644 index 0e3946fe1d..0000000000 --- a/cmake/cxx_flags_override.cmake +++ /dev/null @@ -1,25 +0,0 @@ -#===------------------------------------------------------------------------===# -# -# The KLEE Symbolic Virtual Machine -# -# This file is distributed under the University of Illinois Open Source -# License. See LICENSE.TXT for details. -# -#===------------------------------------------------------------------------===# -# -# This file overrides the default compiler flags for CMake's built-in -# configurations (CMAKE_BUILD_TYPE). Most compiler flags should not be set -# here. The main purpose is to make sure ``-DNDEBUG`` is never set by default. -# -#===------------------------------------------------------------------------===# - -if (("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") OR ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")) - # Taken from Modules/Compiler/GNU.cmake but -DNDEBUG is removed - set(CMAKE_CXX_FLAGS_INIT "") - set(CMAKE_CXX_FLAGS_DEBUG_INIT "-O0 -g") - set(CMAKE_CXX_FLAGS_MINSIZEREL_INIT "-Os") - set(CMAKE_CXX_FLAGS_RELEASE_INIT "-O3") - set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "-O2 -g") -else() - message(FATAL_ERROR "Overrides not set for compiler ${CMAKE_CXX_COMPILER_ID}") -endif() diff --git a/cmake/find_bitcode_compiler.cmake b/cmake/find_bitcode_compiler.cmake deleted file mode 100644 index 615931f3c5..0000000000 --- a/cmake/find_bitcode_compiler.cmake +++ /dev/null @@ -1,96 +0,0 @@ -#===------------------------------------------------------------------------===# -# -# The KLEE Symbolic Virtual Machine -# -# This file is distributed under the University of Illinois Open Source -# License. See LICENSE.TXT for details. -# -#===------------------------------------------------------------------------===# -# -# This file tries to find compilers to build LLVM bitcode. -# It is implicitly dependent on `find_llvm.cmake` already being run in the -# same scope. -# -#===------------------------------------------------------------------------===# - -message(STATUS "Looking for bitcode compilers") - -find_program( - LLVMCC - NAMES "clang-${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}" "clang" "llvm-gcc" - # Give the LLVM tools directory higher priority than the system directory. - HINTS "${LLVM_TOOLS_BINARY_DIR}" -) -if (LLVMCC) - message(STATUS "Found ${LLVMCC}") -else() - message(FATAL_ERROR "Failed to find C bitcode compiler") -endif() - -find_program( - LLVMCXX - NAMES "clang++-${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}" "clang++" "llvm-g++" - # Give the LLVM tools directory higher priority than the system directory. - HINTS "${LLVM_TOOLS_BINARY_DIR}" -) -if (LLVMCXX) - message(STATUS "Found ${LLVMCXX}") -else() - message(FATAL_ERROR "Failed to find C++ bitcode compiler") -endif() - -# Check `llvm-dis` is available -set(LLVM_DIS_TOOL "${LLVM_TOOLS_BINARY_DIR}/llvm-dis") -if (NOT EXISTS "${LLVM_DIS_TOOL}") - message(FATAL_ERROR - "The llvm-dis tool cannot be found at \"${LLVM_DIS_TOOL}\"") -endif() - -# Test compiler -function(test_bitcode_compiler COMPILER SRC_EXT) - message(STATUS "Testing bitcode compiler ${COMPILER}") - set(SRC_FILE "${CMAKE_BINARY_DIR}/test_bitcode_compiler.${SRC_EXT}") - file(WRITE "${SRC_FILE}" "int main(int argc, char** argv) { return 0;}") - set(BC_FILE "${SRC_FILE}.bc") - execute_process( - COMMAND - "${COMPILER}" - "-c" - "-emit-llvm" - "-o" "${BC_FILE}" - "${SRC_FILE}" - RESULT_VARIABLE COMPILE_INVOKE_EXIT_CODE - ) - if ("${COMPILE_INVOKE_EXIT_CODE}" EQUAL 0) - message(STATUS "Compile success") - else() - message(FATAL_ERROR "Compilation failed") - endif() - - message(STATUS "Checking compatibility with LLVM ${LLVM_PACKAGE_VERSION}") - # Check if the LLVM version we are using is compatible - # with this compiler by invoking the `llvm-dis` tool - # on the generated bitcode. - set(LL_FILE "${SRC_FILE}.ll") - execute_process( - COMMAND - "${LLVM_DIS_TOOL}" - "-o" "${LL_FILE}" - "${BC_FILE}" - RESULT_VARIABLE LLVM_DIS_INVOKE_EXIT_CODE - ) - if ("${LLVM_DIS_INVOKE_EXIT_CODE}" EQUAL 0) - message(STATUS "\"${COMPILER}\" is compatible") - else() - message(FATAL_ERROR "\"${COMPILER}\" is not compatible with LLVM ${LLVM_PACKAGE_VERSION}") - endif() - - # Remove temporary files. It's okay to not remove these on failure - # as they will be useful for developer debugging. - file(REMOVE "${SRC_FILE}") - file(REMOVE "${BC_FILE}") - file(REMOVE "${LL_FILE}") -endfunction() - -test_bitcode_compiler("${LLVMCC}" "c") -test_bitcode_compiler("${LLVMCXX}" "cxx") diff --git a/cmake/find_llvm.cmake b/cmake/find_llvm.cmake deleted file mode 100644 index 0f80a28b0e..0000000000 --- a/cmake/find_llvm.cmake +++ /dev/null @@ -1,246 +0,0 @@ -#===------------------------------------------------------------------------===# -# -# The KLEE Symbolic Virtual Machine -# -# This file is distributed under the University of Illinois Open Source -# License. See LICENSE.TXT for details. -# -#===------------------------------------------------------------------------===# -# -# This file provides multiple methods to detect LLVM. -# -# * llvm-config executable. This method is portable across LLVM build systems -# (i.e. works if LLVM was built with autoconf/Makefile or with CMake). -# -# * find_package(LLVM CONFIG). This method relies on the `LLVMConfig.cmake` file -# generated by LLVM's build system. -# -#===------------------------------------------------------------------------===# - -option(USE_CMAKE_FIND_PACKAGE_LLVM "Use find_package(LLVM CONFIG) to find LLVM" OFF) - -if (USE_CMAKE_FIND_PACKAGE_LLVM) - # Use find_package() to detect LLVM in the user's environment. - # The user can force a particular copy by passing - # `-DLLVM_DIR=/path/to/LLVMConfig.cmake` to CMake. - find_package(LLVM CONFIG REQUIRED) - - list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_DIR}") - include(AddLLVM) - - # Provide function to map LLVM components to libraries. - function(klee_get_llvm_libs output_var) - llvm_map_components_to_libnames(${output_var} ${ARGN}) - set(${output_var} ${${output_var}} PARENT_SCOPE) - endfunction() - - # HACK: This information is not exported so just pretend its OFF for now. - set(LLVM_ENABLE_VISIBILITY_INLINES_HIDDEN OFF) - - # make LLVM_DEFINITIONS into proper list - set(_new_llvm_definitions "${LLVM_DEFINITIONS}") - string(REPLACE " " ";" LLVM_DEFINITIONS "${_new_llvm_definitions}") - unset(_new_llvm_definitions) -else() - # Use the llvm-config binary to get the information needed. - # Try to detect it in the user's environment. The user can force a particular - # binary by passing `-DLLVM_CONFIG_BINARY=/path/to/llvm-config` to CMake. - find_program(LLVM_CONFIG_BINARY - NAMES llvm-config) - message(STATUS "LLVM_CONFIG_BINARY: ${LLVM_CONFIG_BINARY}") - - if (NOT LLVM_CONFIG_BINARY) - message(FATAL_ERROR - "Failed to find llvm-config.\n" - "Try passing -DLLVM_CONFIG_BINARY=/path/to/llvm-config to cmake") - endif() - - function(_run_llvm_config output_var) - set(_command "${LLVM_CONFIG_BINARY}" ${ARGN}) - execute_process(COMMAND ${_command} - RESULT_VARIABLE _exit_code - OUTPUT_VARIABLE ${output_var} - OUTPUT_STRIP_TRAILING_WHITESPACE - ERROR_STRIP_TRAILING_WHITESPACE - ) - if (NOT ("${_exit_code}" EQUAL "0")) - message(FATAL_ERROR "Failed running ${_command}") - endif() - set(${output_var} ${${output_var}} PARENT_SCOPE) - endfunction() - - # Get LLVM version - _run_llvm_config(LLVM_PACKAGE_VERSION "--version") - # Try x.y.z patern - set(_llvm_version_regex "^([0-9]+)\\.([0-9]+)\\.([0-9]+)(svn|git|-rust-dev)?$") - if ("${LLVM_PACKAGE_VERSION}" MATCHES "${_llvm_version_regex}") - string(REGEX REPLACE - "${_llvm_version_regex}" - "\\1" - LLVM_VERSION_MAJOR - "${LLVM_PACKAGE_VERSION}") - string(REGEX REPLACE - "${_llvm_version_regex}" - "\\2" - LLVM_VERSION_MINOR - "${LLVM_PACKAGE_VERSION}") - string(REGEX REPLACE - "${_llvm_version_regex}" - "\\3" - LLVM_VERSION_PATCH - "${LLVM_PACKAGE_VERSION}") - else() - # try x.y pattern - set(_llvm_version_regex "^([0-9]+)\\.([0-9]+)(svn|git)?$") - if ("${LLVM_PACKAGE_VERSION}" MATCHES "${_llvm_version_regex}") - string(REGEX REPLACE - "${_llvm_version_regex}" - "\\1" - LLVM_VERSION_MAJOR - "${LLVM_PACKAGE_VERSION}") - string(REGEX REPLACE - "${_llvm_version_regex}" - "\\2" - LLVM_VERSION_MINOR - "${LLVM_PACKAGE_VERSION}") - set(LLVM_VERSION_PATCH 0) - else() - message(FATAL_ERROR - "Failed to parse LLVM version from \"${LLVM_PACKAGE_VERSION}\"") - endif() - endif() - - set(LLVM_DEFINITIONS "") - _run_llvm_config(_llvm_cpp_flags "--cppflags") - string_to_list("${_llvm_cpp_flags}" _llvm_cpp_flags_list) - foreach (flag ${_llvm_cpp_flags_list}) - # Filter out -I flags by only looking for -D flags. - if ("${flag}" MATCHES "^-D" AND NOT ("${flag}" STREQUAL "-D_DEBUG")) - list(APPEND LLVM_DEFINITIONS "${flag}") - endif() - endforeach() - - set(LLVM_ENABLE_ASSERTIONS ON) - set(LLVM_ENABLE_EH ON) - set(LLVM_ENABLE_RTTI ON) - set(LLVM_ENABLE_VISIBILITY_INLINES_HIDDEN OFF) - _run_llvm_config(_llvm_cxx_flags "--cxxflags") - string_to_list("${_llvm_cxx_flags}" _llvm_cxx_flags_list) - foreach (flag ${_llvm_cxx_flags_list}) - if ("${flag}" STREQUAL "-DNDEBUG") - # Note we don't rely on `llvm-config --build-mode` because - # that seems broken when LLVM is built with CMake. - set(LLVM_ENABLE_ASSERTIONS OFF) - elseif ("${flag}" STREQUAL "-fno-exceptions") - set(LLVM_ENABLE_EH OFF) - elseif ("${flag}" STREQUAL "-fno-rtti") - set(LLVM_ENABLE_RTTI OFF) - elseif ("${flag}" STREQUAL "-fvisibility-inlines-hidden") - set(LLVM_ENABLE_VISIBILITY_INLINES_HIDDEN ON) - endif() - endforeach() - - set(LLVM_INCLUDE_DIRS "") - foreach (flag ${_llvm_cpp_flags_list}) - # Filter out -D flags by only looking for -I flags. - if ("${flag}" MATCHES "^-I") - string(REGEX REPLACE "^-I(.+)$" "\\1" _include_dir "${flag}") - list(APPEND LLVM_INCLUDE_DIRS "${_include_dir}") - endif() - endforeach() - - _run_llvm_config(LLVM_LIBRARY_DIRS "--libdir") - _run_llvm_config(LLVM_TOOLS_BINARY_DIR "--bindir") - _run_llvm_config(TARGET_TRIPLE "--host-target") - - _run_llvm_config(LLVM_BUILD_MAIN_SRC_DIR "--src-root") - if (NOT EXISTS "${LLVM_BUILD_MAIN_SRC_DIR}") - set(LLVM_BUILD_MAIN_SRC_DIR "") - endif() - - # Provide function to map LLVM components to libraries. - function(klee_get_llvm_libs OUTPUT_VAR) - _run_llvm_config(_llvm_libs "--libfiles" ${ARGN}) - string_to_list("${_llvm_libs}" _llvm_libs_list) - - # Now find the system libs that are needed. - _run_llvm_config(_system_libs "--system-libs") - string_to_list("${_system_libs}" _system_libs_list) - - # Create an imported target for each LLVM library - # if it doesn't already exist. We need to do this - # so we can tell CMake that these libraries depend - # on the necessary libraries so that CMake - # can get the link order right. - set(targets_to_return "") - set(created_targets "") - foreach (llvm_lib ${_llvm_libs_list}) - get_filename_component(llvm_lib_file_name "${llvm_lib}" NAME) - - string(REGEX REPLACE "^(lib)?(LLVM[-.a-zA-Z0-9]+)\\..+$" "\\2" target_name "${llvm_lib_file_name}") - list(APPEND targets_to_return "${target_name}") - if (NOT TARGET "${target_name}") - # DEBUG: message(STATUS "Creating imported target \"${target_name}\"" " for \"${llvm_lib}\"") - list(APPEND created_targets "${target_name}") - - set(import_library_type "STATIC") - if ("${llvm_lib_file_name}" MATCHES "(so|dylib|dll)$") - set(import_library_type "SHARED") - endif() - # Create an imported target for the library - add_library("${target_name}" "${import_library_type}" IMPORTED GLOBAL) - set_property(TARGET "${target_name}" PROPERTY - IMPORTED_LOCATION "${llvm_lib}" - ) - endif() - endforeach() - - # Now state the dependencies of the created imported targets which we - # assume to be for each imported target the libraries which appear after - # the library in `{_llvm_libs_list}` and then finally the system libs. - # It is **essential** that we do this otherwise CMake will get the - # link order of the imported targets wrong. - list(LENGTH targets_to_return length_targets_to_return) - if ("${length_targets_to_return}" GREATER 0) - math(EXPR targets_to_return_last_index "${length_targets_to_return} -1") - foreach (llvm_target_lib ${created_targets}) - # DEBUG: message(STATUS "Adding deps for target ${llvm_target_lib}") - # Find position in `targets_to_return` - list(FIND targets_to_return "${llvm_target_lib}" position) - if ("${position}" EQUAL "-1") - message(FATAL_ERROR "couldn't find \"${llvm_target_lib}\" in list of targets") - endif() - if ("${position}" LESS "${targets_to_return_last_index}") - math(EXPR position_plus_one "${position} + 1") - foreach (index RANGE ${position_plus_one} ${targets_to_return_last_index}) - # Get the target for this index - list(GET targets_to_return ${index} target_for_index) - # DEBUG: message(STATUS "${llvm_target_libs} depends on ${target_for_index}") - set_property(TARGET "${llvm_target_lib}" APPEND PROPERTY - INTERFACE_LINK_LIBRARIES "${target_for_index}" - ) - endforeach() - endif() - # Now finally add the system library dependencies. These must be last. - set_property(TARGET "${target_name}" APPEND PROPERTY - INTERFACE_LINK_LIBRARIES "${_system_libs_list}" - ) - endforeach() - endif() - - set(${OUTPUT_VAR} ${targets_to_return} PARENT_SCOPE) - endfunction() -endif() - -# Filter out `-DNEBUG` from LLVM_DEFINITIONS. The caller can use -# `LLVM_ENABLE_ASSERTIONS` to decide how to set their defines. -set(_new_llvm_definitions "") -foreach (llvm_define ${LLVM_DEFINITIONS}) - if ("${llvm_define}" STREQUAL "-DNDEBUG") - # Skip - else() - list(APPEND _new_llvm_definitions "${llvm_define}") - endif() -endforeach() -set(LLVM_DEFINITIONS "${_new_llvm_definitions}") -unset(_new_llvm_definitions) diff --git a/cmake/find_metasmt.cmake b/cmake/find_metasmt.cmake index 3dc9fe50a9..d4a2c15547 100644 --- a/cmake/find_metasmt.cmake +++ b/cmake/find_metasmt.cmake @@ -34,13 +34,12 @@ if (ENABLE_SOLVER_METASMT) " `/path` is the directory containing `metaSMTConfig.cmake`") endif() message(STATUS "metaSMT_DIR: ${metaSMT_DIR}") - list(APPEND KLEE_COMPONENT_EXTRA_INCLUDE_DIRS - "${metaSMT_INCLUDE_DIR}" ${metaSMT_INCLUDE_DIRS}) + list(APPEND KLEE_SOLVER_INCLUDE_DIRS "${metaSMT_INCLUDE_DIR}" ${metaSMT_INCLUDE_DIRS}) # FIXME: We should test linking list(APPEND KLEE_SOLVER_LIBRARIES ${metaSMT_LIBRARIES}) # Separate flags and defines from ${metaSMT_CXXFLAGS} - string_to_list("${metaSMT_CXXFLAGS}" _metaSMT_CXXFLAGS_list) + string(REPLACE " " ";" _metaSMT_CXXFLAGS_list "${metaSMT_CXXFLAGS}") set(_metasmt_flags "") set(_metasmt_defines "") foreach (flag ${_metaSMT_CXXFLAGS_list}) @@ -59,12 +58,12 @@ if (ENABLE_SOLVER_METASMT) message(STATUS "metaSMT flags: ${_metasmt_flags}") foreach (f ${_metasmt_flags}) # Test the flag and fail if it can't be used - klee_component_add_cxx_flag(${f} REQUIRED) + list(APPEND KLEE_COMPONENT_CXX_FLAGS "${f}") endforeach() # Check if metaSMT provides an useable backend if (NOT metaSMT_AVAILABLE_QF_ABV_SOLVERS) - message(FATAL_ERROR "metaSMT does not provide an useable backend.") + message(FATAL_ERROR "metaSMT does not provide an usable backend.") endif() message(STATUS "metaSMT has the following backend(s): ${metaSMT_AVAILABLE_QF_ABV_SOLVERS}.") @@ -72,7 +71,7 @@ if (ENABLE_SOLVER_METASMT) set(METASMT_DEFAULT_BACKEND "STP" CACHE STRING - "Default metaSMT backend. Availabe options ${available_metasmt_backends}") + "Default metaSMT backend. Available options ${available_metasmt_backends}") # Provide drop down menu options in cmake-gui set_property(CACHE METASMT_DEFAULT_BACKEND PROPERTY STRINGS ${available_metasmt_backends}) @@ -91,6 +90,9 @@ if (ENABLE_SOLVER_METASMT) foreach(backend ${available_metasmt_backends}) list(APPEND KLEE_COMPONENT_CXX_DEFINES -DMETASMT_HAVE_${backend}) endforeach() + + # Support newer CVC4 versions + list(APPEND KLEE_COMPONENT_CXX_DEFINES CVC4_WITHOUT_KIND_IFF) else() message(STATUS "metaSMT solver support disabled") set(ENABLE_METASMT 0) # For config.h diff --git a/cmake/find_stp.cmake b/cmake/find_stp.cmake index 7b10f1fe7f..2206cc887a 100644 --- a/cmake/find_stp.cmake +++ b/cmake/find_stp.cmake @@ -44,7 +44,7 @@ if (ENABLE_SOLVER_STP) message(STATUS "Using STP shared library") list(APPEND KLEE_SOLVER_LIBRARIES "${STP_SHARED_LIBRARY}") endif() - list(APPEND KLEE_COMPONENT_EXTRA_INCLUDE_DIRS "${STP_INCLUDE_DIRS}") + list(APPEND KLEE_SOLVER_INCLUDE_DIRS ${STP_INCLUDE_DIRS}) message(STATUS "STP_DIR: ${STP_DIR}") set(ENABLE_STP 1) # For config.h else() diff --git a/cmake/find_z3.cmake b/cmake/find_z3.cmake index 823cc051d6..c4e96fd78a 100644 --- a/cmake/find_z3.cmake +++ b/cmake/find_z3.cmake @@ -26,6 +26,8 @@ option(ENABLE_SOLVER_Z3 "Enable Z3 solver support" ${ENABLE_SOLVER_Z3_DEFAULT}) if (ENABLE_SOLVER_Z3) message(STATUS "Z3 solver support enabled") if (Z3_FOUND) + include(CheckCXXSourceCompiles) + message(STATUS "Found Z3") set(ENABLE_Z3 1) # For config.h list(APPEND KLEE_COMPONENT_EXTRA_INCLUDE_DIRS ${Z3_INCLUDE_DIRS}) @@ -51,6 +53,10 @@ if (ENABLE_SOLVER_Z3) else() message(STATUS "Z3_get_error_msg does not require context") endif() + + list(APPEND KLEE_SOLVER_INCLUDE_DIRS ${Z3_INCLUDE_DIRS}) + list(APPEND KLEE_SOLVER_LIBRARY_DIRS ${Z3_LIBRARIES}) + else() message(FATAL_ERROR "Z3 not found.") endif() diff --git a/cmake/klee_add_component.cmake b/cmake/klee_add_component.cmake deleted file mode 100644 index 4f9770ac03..0000000000 --- a/cmake/klee_add_component.cmake +++ /dev/null @@ -1,20 +0,0 @@ -#===------------------------------------------------------------------------===# -# -# The KLEE Symbolic Virtual Machine -# -# This file is distributed under the University of Illinois Open Source -# License. See LICENSE.TXT for details. -# -#===------------------------------------------------------------------------===# - -function(klee_add_component target_name) - # Components are explicitly STATIC because we don't support building them - # as shared libraries. - add_library(${target_name} STATIC ${ARGN}) - # In newer CMakes we can make sure that the flags are only used when compiling C++ - target_compile_options(${target_name} PUBLIC - $<$:${KLEE_COMPONENT_CXX_FLAGS}>) - target_include_directories(${target_name} PUBLIC ${KLEE_COMPONENT_EXTRA_INCLUDE_DIRS}) - target_compile_definitions(${target_name} PUBLIC ${KLEE_COMPONENT_CXX_DEFINES}) - target_link_libraries(${target_name} PUBLIC ${KLEE_COMPONENT_EXTRA_LIBRARIES}) -endfunction() diff --git a/cmake/klee_component_add_cxx_flag.cmake b/cmake/klee_component_add_cxx_flag.cmake deleted file mode 100644 index c866f6dab7..0000000000 --- a/cmake/klee_component_add_cxx_flag.cmake +++ /dev/null @@ -1,31 +0,0 @@ -#===------------------------------------------------------------------------===# -# -# The KLEE Symbolic Virtual Machine -# -# This file is distributed under the University of Illinois Open Source -# License. See LICENSE.TXT for details. -# -#===------------------------------------------------------------------------===# -include(CheckCXXCompilerFlag) -include(CMakeParseArguments) - -function(klee_component_add_cxx_flag flag) - CMAKE_PARSE_ARGUMENTS(klee_component_add_cxx_flag "REQUIRED" "" "" ${ARGN}) - string(REPLACE "-" "_" SANITIZED_FLAG_NAME "${flag}") - string(REPLACE "/" "_" SANITIZED_FLAG_NAME "${SANITIZED_FLAG_NAME}") - string(REPLACE "=" "_" SANITIZED_FLAG_NAME "${SANITIZED_FLAG_NAME}") - string(REPLACE " " "_" SANITIZED_FLAG_NAME "${SANITIZED_FLAG_NAME}") - string(REPLACE "+" "_" SANITIZED_FLAG_NAME "${SANITIZED_FLAG_NAME}") - unset(HAS_${SANITIZED_FLAG_NAME}) - CHECK_CXX_COMPILER_FLAG("${flag}" HAS_${SANITIZED_FLAG_NAME}) - if (klee_component_add_cxx_flag_REQUIRED AND NOT HAS_${SANITIZED_FLAG_NAME}) - message(FATAL_ERROR "The flag \"${flag}\" is required but your C++ compiler doesn't support it") - endif() - if (HAS_${SANITIZED_FLAG_NAME}) - message(STATUS "C++ compiler supports ${flag}") - list(APPEND KLEE_COMPONENT_CXX_FLAGS "${flag}") - set(KLEE_COMPONENT_CXX_FLAGS ${KLEE_COMPONENT_CXX_FLAGS} PARENT_SCOPE) - else() - message(STATUS "C++ compiler does not support ${flag}") - endif() -endfunction() diff --git a/cmake/modules/FindSQLite3.cmake b/cmake/modules/FindSQLite3.cmake deleted file mode 100644 index 66540fb085..0000000000 --- a/cmake/modules/FindSQLite3.cmake +++ /dev/null @@ -1,37 +0,0 @@ -# Copyright (C) 2007-2009 LuaDist. -# Created by Peter Kapec -# Redistribution and use of this file is allowed according to the terms of the MIT license. -# For details see the COPYRIGHT file distributed with LuaDist. -# Note: -# Searching headers and libraries is very simple and is NOT as powerful as scripts -# distributed with CMake, because LuaDist defines directories to search for. -# Everyone is encouraged to contact the author with improvements. Maybe this file -# becomes part of CMake distribution sometimes. - -# - Find sqlite3 -# Find the native SQLITE3 headers and libraries. -# -# SQLITE3_INCLUDE_DIRS - where to find sqlite3.h, etc. -# SQLITE3_LIBRARIES - List of libraries when using sqlite. -# SQLITE3_FOUND - True if sqlite found. - -# Look for the header file. -FIND_PATH(SQLITE3_INCLUDE_DIR NAMES sqlite3.h) - -# Look for the library. -FIND_LIBRARY(SQLITE3_LIBRARY NAMES sqlite3) - -# Handle the QUIETLY and REQUIRED arguments and set SQLITE3_FOUND to TRUE if all listed variables are TRUE. -INCLUDE(FindPackageHandleStandardArgs) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(SQLite3 DEFAULT_MSG SQLITE3_LIBRARY SQLITE3_INCLUDE_DIR) - -# Copy the results to the output variables. -IF(SQLITE3_FOUND) - SET(SQLITE3_LIBRARIES ${SQLITE3_LIBRARY}) - SET(SQLITE3_INCLUDE_DIRS ${SQLITE3_INCLUDE_DIR}) -ELSE(SQLITE3_FOUND) - SET(SQLITE3_LIBRARIES) - SET(SQLITE3_INCLUDE_DIRS) -ENDIF(SQLITE3_FOUND) - -MARK_AS_ADVANCED(SQLITE3_INCLUDE_DIRS SQLITE3_LIBRARIES) diff --git a/cmake/workaround_llvm_pr39177.cmake b/cmake/workaround_llvm_pr39177.cmake deleted file mode 100644 index 9e0ac8bd7c..0000000000 --- a/cmake/workaround_llvm_pr39177.cmake +++ /dev/null @@ -1,133 +0,0 @@ -# Workaround for LLVM PR39177 -# - https://bugs.llvm.org/show_bug.cgi?id=39177 -# - https://github.com/klee/klee/issues/1000 -# -# TODO: remove when support for LLVM <= 7 is dropped -# -# Short description of the bug: -# The LLVM pass `-instcombine` optimizes calls to C standard lib functions by, -# e.g. transforming the following call to a call to fwrite(): -# fprintf(stderr, "hello world!\n"); -# In uClibc, and thus klee-uclibc, fwrite() is defined as an alias to a function -# fwrite_unlocked(). This translates to a GlobalAlias in LLVM IR. When trying to -# infer function attributes from fwrite(), LLVM tries to cast a GlobalAlias to a -# Function, which results in a null-pointer dereference. When calling KLEE with -# `-optimize`, this leads to a crash of KLEE. -# -# This bug affects LLVM 3.9 - 7.0.0. -# -# As the bug results in a null-pointer dereference when trying to access a -# Function that is only available as GlobalAlias, this workaround introduces a -# pass into KLEE that replaces aliases for certain C standard lib function with -# clones of the corresponding aliasee function. -# -# The bug was fixed in the following commits in LLVM: -# - https://reviews.llvm.org/rL344454 -# - https://reviews.llvm.org/rL344455 -# - https://reviews.llvm.org/rL344645 -# These patches were then applied to the release_70 branch to land in 7.0.1: -# - https://reviews.llvm.org/rL345921 -# -# This CMake file checks whether the method responsible for the null-pointer -# dereference leads to a crash of the program given in this file. -# -# Files that were created/modified for this workaround: -# [NEW FILE] cmake/workaround_llvm_pr39177.cmake (this file) -# [NEW FILE] cmake/workaround_llvm_pr39177.ll (auxiliary file for feature test) -# [NEW FILE] lib/Module/WorkaroundLLVMPR39177.cpp -# -# [MODIFIED] CMakeLists.txt (including this file) -# [MODIFIED] include/klee/Config/config.h.cmin (cmakedefine) -# [MODIFIED] lib/Module/CMakeLists.txt -# [MODIFIED] lib/Module/Optimize.cpp (add pass during optimization) -# [MODIFIED] lib/Module/Passes.h - -# Detect whether LLVM version is affected by PR39177 -if (${LLVM_VERSION_MAJOR} LESS 7 OR (${LLVM_VERSION_MAJOR} EQUAL 7 AND ${LLVM_VERSION_MINOR} EQUAL 0 AND ${LLVM_VERSION_PATCH} EQUAL 0)) # LLVM <= 7.0.0 - set(DISABLE_WORKAROUND_LLVM_PR39177_DEFAULT OFF) -else() - set(DISABLE_WORKAROUND_LLVM_PR39177_DEFAULT ON) -endif() - -option(DISABLE_WORKAROUND_LLVM_PR39177 "Disable Workaround for LLVM PR39177 (affecting LLVM 3.9 - 7.0.0)" ${DISABLE_WORKAROUND_LLVM_PR39177_DEFAULT}) - -if (NOT DISABLE_WORKAROUND_LLVM_PR39177) - # Detect whether PR39177 leads to crash - include(CheckCXXSourceRuns) - - cmake_push_check_state() - klee_get_llvm_libs(LLVM_LIBS asmparser transformutils) - set(CMAKE_REQUIRED_INCLUDES "${LLVM_INCLUDE_DIRS}") - set(CMAKE_REQUIRED_LIBRARIES "${LLVM_LIBS}") - - check_cxx_source_runs(" - #include \"llvm/Analysis/TargetLibraryInfo.h\" - #include \"llvm/AsmParser/Parser.h\" - #include \"llvm/AsmParser/SlotMapping.h\" - #include \"llvm/IR/ConstantFolder.h\" - #include \"llvm/IR/Constants.h\" - #include \"llvm/IR/DataLayout.h\" - #include \"llvm/IR/DiagnosticInfo.h\" - #include \"llvm/IR/Instructions.h\" - #include \"llvm/IR/IRBuilder.h\" - #include \"llvm/IR/LLVMContext.h\" - #include \"llvm/Transforms/Utils/BuildLibCalls.h\" - - #include - - void handler(int, siginfo_t*, void*) { - // program received SIGSEGV - exit(1); - } - - using namespace llvm; - - int main() { - // capture segfault - struct sigaction action; - memset(&action, 0, sizeof(struct sigaction)); - action.sa_flags = SA_SIGINFO; - action.sa_sigaction = handler; - sigaction(SIGSEGV, &action, NULL); - - // setup test - LLVMContext Ctx; - SMDiagnostic Error; - SlotMapping Mapping; - auto M = llvm::parseAssemblyFile(\"${CMAKE_SOURCE_DIR}/cmake/workaround_llvm_pr39177.ll\", Error, Ctx, &Mapping); - if (!M) { - Error.print(\"AssemblyString\", llvm::errs()); - return -1; - } - - auto *F = M->getFunction(\"test\"); - auto *CI = cast(&*std::next(F->begin()->begin())); - auto &DL = M->getDataLayout(); - Value *Size = ConstantInt::get(DL.getIntPtrType(Ctx), 8); - ConstantFolder CF; - IRBuilder<> B(&*F->begin(), CF); - TargetLibraryInfo TLI = TargetLibraryInfoWrapperPass({\"x86_64\", \"\", \"linux-gnu\"}).getTLI(); - - // test if this call produces segfault - emitFWrite(CI->getArgOperand(1), Size, CI->getArgOperand(0), B, DL, &TLI); - - return 0; - }" - LLVM_PR39177_FIXED - ) - cmake_pop_check_state() - - if (NOT LLVM_PR39177_FIXED) - message(STATUS "Workaround for LLVM PR39177 (affecting LLVM 3.9 - 7.0.0) enabled") - set(USE_WORKAROUND_LLVM_PR39177 1) # For config.h - else() - message(FATAL_ERROR "DISABLE_WORKAROUND_LLVM_PR39177 is not set to true" - "but crash resulting from PR39177 could not be detected." - "You may try to disable the workaround using" - "-DDISABLE_WORKAROUND_LLVM_PR39177=1 if you believe the issue is patched" - "in your version of LLVM.") - endif() -else() - message(STATUS "Workaround for LLVM PR39177 (affecting LLVM 3.9 - 7.0.0) disabled") - unset(USE_WORKAROUND_LLVM_PR39177) # For config.h -endif() diff --git a/cmake/workaround_llvm_pr39177.ll b/cmake/workaround_llvm_pr39177.ll deleted file mode 100644 index ebca4f1cc0..0000000000 --- a/cmake/workaround_llvm_pr39177.ll +++ /dev/null @@ -1,18 +0,0 @@ -%struct._IO_FILE = type { i32, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, %struct._IO_marker*, %struct._IO_FILE*, i32, i32, i64, i16, i8, [1 x i8], i8*, i64, i8*, i8*, i8*, i8*, i64, i32, [20 x i8] } -%struct._IO_marker = type { %struct._IO_marker*, %struct._IO_FILE*, i32 } - -@stdout = external global %struct._IO_FILE*, align 8 -@.str = private unnamed_addr constant [11 x i8] c"abcdefgh!\0A\00", align 1 -@fwrite = alias i64 (i8*, i64, i64, %struct._IO_FILE*), i64 (i8*, i64, i64, %struct._IO_FILE*)* @__fwrite_alias - -define i64 @__fwrite_alias(i8*, i64, i64, %struct._IO_FILE*) { - ret i64 0 -} - -define void @test() { - %1 = load %struct._IO_FILE*, %struct._IO_FILE** @stdout, align 8 - %2 = call i32 (%struct._IO_FILE*, i8*, ...) @fprintf(%struct._IO_FILE* %1, i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str, i32 0, i32 0)) - ret void -} - -declare i32 @fprintf(%struct._IO_FILE*, i8*, ...) diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt index b8a4a38bd5..964e9b0313 100644 --- a/docs/CMakeLists.txt +++ b/docs/CMakeLists.txt @@ -15,8 +15,8 @@ if (ENABLE_DOXYGEN) find_package(Doxygen OPTIONAL_COMPONENTS dot) if (DOXYGEN_FOUND AND TARGET Doxygen::dot) message(STATUS "Doxygen and dot found") - set(abs_top_srcdir "${CMAKE_SOURCE_DIR}") - set(abs_top_builddir "${CMAKE_BINARY_DIR}") + + set(DOXYGEN_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/doxygen") # Configure the Doxyfile configure_file(doxygen.cfg.in doxygen.cfg @ONLY) @@ -29,17 +29,8 @@ if (ENABLE_DOXYGEN) ) add_dependencies(docs doc-doxygen) - # FIXME: This variable should be used to set `OUTPUT_DIRECTORY` in - # doxygen.cfg - set(DOXYGEN_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/doxygen") - - if ("${CMAKE_VERSION}" VERSION_LESS "3.15") - set_directory_properties(PROPERTY ADDITIONAL_MAKE_CLEAN_FILES - "${DOXYGEN_OUTPUT_DIR}") - else () - set_directory_properties(PROPERTY ADDITIONAL_CLEAN_FILES - "${DOXYGEN_OUTPUT_DIR}") - endif () + set_directory_properties(PROPERTY ADDITIONAL_CLEAN_FILES + "${DOXYGEN_OUTPUT_DIR}") else() if (NOT DOXYGEN_FOUND) diff --git a/docs/doxygen.cfg.in b/docs/doxygen.cfg.in index f06af13afb..6c4aa54ef0 100644 --- a/docs/doxygen.cfg.in +++ b/docs/doxygen.cfg.in @@ -38,7 +38,7 @@ PROJECT_NUMBER = # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. -OUTPUT_DIRECTORY = @abs_top_builddir@/docs/doxygen +OUTPUT_DIRECTORY = @DOXYGEN_OUTPUT_DIR@ # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output @@ -464,11 +464,11 @@ WARN_LOGFILE = # directories like "/usr/src/myproject". Separate the files or directories # with spaces. -INPUT = @abs_top_srcdir@/tools/ \ - @abs_top_srcdir@/lib/ \ - @abs_top_srcdir@/include/ \ - @abs_top_srcdir@/docs/intro \ - @abs_top_srcdir@/docs/overview +INPUT = @PROJECT_SOURCE_DIR@/tools/ \ + @PROJECT_SOURCE_DIR@/lib/ \ + @PROJECT_SOURCE_DIR@/include/ \ + @PROJECT_SOURCE_DIR@/docs/intro \ + @PROJECT_SOURCE_DIR@/docs/overview # This tag can be used to specify the character encoding of the source files that # doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default diff --git a/include/klee/ADT/Bits.h b/include/klee/ADT/Bits.h index 5f64e2441f..ba25f94f08 100644 --- a/include/klee/ADT/Bits.h +++ b/include/klee/ADT/Bits.h @@ -11,8 +11,14 @@ #define KLEE_BITS_H #include "klee/Config/Version.h" + #include "llvm/Support/DataTypes.h" -#include + +#include +#include +#include +#include +#include namespace klee { namespace bits32 { @@ -57,10 +63,6 @@ namespace klee { assert(res < 32); assert((UINT32_C(1) << res) == x); return res; - } - - inline unsigned indexOfRightmostBit(unsigned x) { - return indexOfSingleBit(isolateRightmostBit(x)); } } @@ -103,12 +105,87 @@ namespace klee { assert(res < 64); assert((UINT64_C(1) << res) == x); return res; - } - - inline uint64_t indexOfRightmostBit(uint64_t x) { - return indexOfSingleBit(isolateRightmostBit(x)); } } + + template + [[nodiscard]] static constexpr inline auto countLeadingZeroes(T &&x) noexcept + -> std::enable_if_t>::is_signed && + std::numeric_limits>::digits == + std::numeric_limits::digits, + int> { + assert(x > 0); + return __builtin_clz(static_cast(x)); + } + + template + [[nodiscard]] static constexpr inline auto countLeadingZeroes(T &&x) noexcept + -> std::enable_if_t>::is_signed && + std::numeric_limits>::digits == + std::numeric_limits::digits && + std::numeric_limits::digits != + std::numeric_limits::digits, + int> { + assert(x > 0); + return __builtin_clzl(static_cast(x)); + } + + template + [[nodiscard]] static constexpr inline auto countLeadingZeroes(T &&x) noexcept + -> std::enable_if_t< + !std::numeric_limits>::is_signed && + std::numeric_limits>::digits == + std::numeric_limits::digits && + std::numeric_limits::digits != + std::numeric_limits::digits && + std::numeric_limits::digits != + std::numeric_limits::digits, + int> { + assert(x > 0); + return __builtin_clzll(static_cast(x)); + } + + template + [[nodiscard]] static constexpr inline auto countTrailingZeroes(T &&x) noexcept + -> std::enable_if_t>::is_signed && + std::numeric_limits>::digits == + std::numeric_limits::digits, + int> { + assert(x > 0); + return __builtin_ctz(static_cast(x)); + } + + template + [[nodiscard]] static constexpr inline auto countTrailingZeroes(T &&x) noexcept + -> std::enable_if_t>::is_signed && + std::numeric_limits>::digits == + std::numeric_limits::digits && + std::numeric_limits::digits != + std::numeric_limits::digits, + int> { + assert(x > 0); + return __builtin_ctzl(static_cast(x)); + } + + template + [[nodiscard]] static constexpr inline auto countTrailingZeroes(T &&x) noexcept + -> std::enable_if_t< + !std::numeric_limits>::is_signed && + std::numeric_limits>::digits == + std::numeric_limits::digits && + std::numeric_limits::digits != + std::numeric_limits::digits && + std::numeric_limits::digits != + std::numeric_limits::digits, + int> { + assert(x > 0); + return __builtin_ctzll(static_cast(x)); + } + + [[nodiscard]] static constexpr inline std::size_t + roundUpToMultipleOf4096(std::size_t const x) { + return ((x - 1) | static_cast(4096 - 1)) + 1; + } } // End klee namespace #endif /* KLEE_BITS_H */ diff --git a/include/klee/ADT/RNG.h b/include/klee/ADT/RNG.h index 1c8eed1501..1e7a1682bf 100644 --- a/include/klee/ADT/RNG.h +++ b/include/klee/ADT/RNG.h @@ -10,40 +10,19 @@ #ifndef KLEE_RNG_H #define KLEE_RNG_H -namespace klee { - class RNG { - private: - /* Period parameters */ - static const int N = 624; - static const int M = 397; - static const unsigned int MATRIX_A = 0x9908b0dfUL; /* constant vector a */ - static const unsigned int UPPER_MASK = 0x80000000UL; /* most significant w-r bits */ - static const unsigned int LOWER_MASK = 0x7fffffffUL; /* least significant r bits */ - - private: - unsigned int mt[N]; /* the array for the state vector */ - int mti; +#include - public: +namespace klee { + struct RNG : std::mt19937 { RNG(); - explicit RNG(unsigned int seed); - - /* set seed value */ - void seed(unsigned int seed); + explicit RNG(RNG::result_type seed); /* generates a random number on [0,0xffffffff]-interval */ unsigned int getInt32(); - /* generates a random number on [0,0x7fffffff]-interval */ - int getInt31(); - /* generates a random number on [0,1]-real-interval */ - double getDoubleLR(); - float getFloatLR(); /* generates a random number on [0,1)-real-interval */ double getDoubleL(); - float getFloatL(); /* generates a random number on (0,1)-real-interval */ double getDouble(); - float getFloat(); /* generators a random flop */ bool getBool(); }; diff --git a/include/klee/Config/config.h.cmin b/include/klee/Config/config.h.cmin index 0043111787..f0c3f629d3 100644 --- a/include/klee/Config/config.h.cmin +++ b/include/klee/Config/config.h.cmin @@ -13,6 +13,9 @@ /* Using Z3 Solver backend */ #cmakedefine ENABLE_Z3 @ENABLE_Z3@ +/* Define if fstatat() accepts NULL as pathname argument. */ +#cmakedefine FSTATAT_PATH_ACCEPTS_NULL 1 + /* Does the platform use __ctype_b_loc, etc. */ #cmakedefine HAVE_CTYPE_EXTERNALS @HAVE_CTYPE_EXTERNALS@ @@ -22,6 +25,9 @@ /* Define if mallinfo() is available on this platform. */ #cmakedefine HAVE_MALLINFO @HAVE_MALLINFO@ +/* Define if mallinfo2() is available on this platform. */ +#cmakedefine HAVE_MALLINFO2 @HAVE_MALLINFO2@ + /* Define to 1 if you have the `malloc_zone_statistics' function. */ #cmakedefine HAVE_MALLOC_ZONE_STATISTICS @HAVE_MALLOC_ZONE_STATISTICS@ @@ -83,12 +89,6 @@ /* Define to the version of this package. */ #cmakedefine PACKAGE_VERSION @PACKAGE_VERSION@ -/* Use Workaround for LLVM PR39177 (affecting LLVM 3.9 - 7.0.0) */ -#cmakedefine USE_WORKAROUND_LLVM_PR39177 @USE_WORKAROUND_LLVM_PR39177@ - -/* klee-uclibc is supported */ -#cmakedefine SUPPORT_KLEE_UCLIBC @SUPPORT_KLEE_UCLIBC@ - /* libcxx is supported */ #cmakedefine SUPPORT_KLEE_LIBCXX @SUPPORT_KLEE_LIBCXX@ @@ -98,6 +98,12 @@ /* Configuration type of KLEE's runtime libraries */ #define RUNTIME_CONFIGURATION "@KLEE_RUNTIME_BUILD_TYPE@" +/* Configure name of KLEE's uClibc library */ +#cmakedefine KLEE_UCLIBC_BCA_NAME "@KLEE_UCLIBC_BCA_NAME@" + +/* Configure name of the libCXX bitcode library */ +#cmakedefine KLEE_LIBCXX_BC_NAME "@KLEE_LIBCXX_BC_NAME@" + /* FIXME: This is a stupid name. Also this is only used for figuring out where the runtime directory is in the build tree. Instead we should just define a macro for that. That would simplify the C++ code. */ diff --git a/include/klee/Core/BranchTypes.h b/include/klee/Core/BranchTypes.h index 5c3e5f32a0..e8b48cd83b 100644 --- a/include/klee/Core/BranchTypes.h +++ b/include/klee/Core/BranchTypes.h @@ -14,9 +14,9 @@ /// \cond DO_NOT_DOCUMENT #define BRANCH_TYPES \ - BTYPE(NONE, 0U) \ - BTYPE(ConditionalBranch, 1U) \ - BTYPE(IndirectBranch, 2U) \ + BTYPEDEFAULT(NONE, 0U) \ + BTYPE(Conditional, 1U) \ + BTYPE(Indirect, 2U) \ BTYPE(Switch, 3U) \ BTYPE(Call, 4U) \ BTYPE(MemOp, 5U) \ @@ -25,7 +25,7 @@ BTYPE(Realloc, 8U) \ BTYPE(Free, 9U) \ BTYPE(GetVal, 10U) \ - MARK(END, 10U) + BMARK(END, 10U) /// \endcond /** @enum BranchType @@ -34,8 +34,8 @@ * | Value | Description | * |---------------------------------|----------------------------------------------------------------------------------------------------| * | `BranchType::NONE` | default value (no branch) | - * | `BranchType::ConditionalBranch` | branch caused by `br` instruction with symbolic condition | - * | `BranchType::IndirectBranch` | branch caused by `indirectbr` instruction with symbolic address | + * | `BranchType::Conditional` | branch caused by `br` instruction with symbolic condition | + * | `BranchType::Indirect` | branch caused by `indirectbr` instruction with symbolic address | * | `BranchType::Switch` | branch caused by `switch` instruction with symbolic value | * | `BranchType::Call` | branch caused by `call` with symbolic function pointer | * | `BranchType::MemOp` | branch caused by memory operation with symbolic address (e.g. multiple resolutions, out-of-bounds) | @@ -46,13 +46,20 @@ * | `BranchType::GetVal` | branch caused by user-invoked concretization while seeding | */ enum class BranchType : std::uint8_t { -/// \cond DO_NOT_DOCUMENT -#define BTYPE(N,I) N = (I), -#define MARK(N,I) N = (I), + /// \cond DO_NOT_DOCUMENT + #define BTYPEDEFAULT(N,I) N = (I), + #define BTYPE(N,I) N = (I), + #define BMARK(N,I) N = (I), BRANCH_TYPES -#undef BTYPE -#undef MARK -/// \endcond + /// \endcond }; -#endif \ No newline at end of file + +#undef BTYPEDEFAULT +#undef BTYPE +#undef BMARK +#define BTYPEDEFAULT(N,I) +#define BTYPE(N,I) +#define BMARK(N,I) + +#endif diff --git a/include/klee/Core/Interpreter.h b/include/klee/Core/Interpreter.h index f14e3d887b..04fdef8803 100644 --- a/include/klee/Core/Interpreter.h +++ b/include/klee/Core/Interpreter.h @@ -9,6 +9,7 @@ #ifndef KLEE_INTERPRETER_H #define KLEE_INTERPRETER_H +#include #include #include #include diff --git a/include/klee/Core/TerminationTypes.h b/include/klee/Core/TerminationTypes.h index 592cd3cb0c..25e5ef4a5d 100644 --- a/include/klee/Core/TerminationTypes.h +++ b/include/klee/Core/TerminationTypes.h @@ -12,44 +12,85 @@ #include + +#define TERMINATION_CLASSES \ + TCLASS(Exit, 1U) \ + TCLASS(Early, 2U) \ + TCLASS(SolverError, 3U) \ + TCLASS(ProgramError, 4U) \ + TCLASS(UserError, 5U) \ + TCLASS(ExecutionError, 6U) \ + TCLASS(EarlyAlgorithm, 7U) \ + TCLASS(EarlyUser, 8U) + +///@brief Termination classes categorize termination types +enum class StateTerminationClass : std::uint8_t { + /// \cond DO_NOT_DOCUMENT + #define TCLASS(N,I) N = (I), + TERMINATION_CLASSES + /// \endcond +}; + + +// (Name, ID, file suffix) #define TERMINATION_TYPES \ TTYPE(RUNNING, 0U, "") \ TTYPE(Exit, 1U, "") \ - MARK(NORMAL, 1U) \ - TTYPE(Interrupted, 2U, "early") \ - TTYPE(MaxDepth, 3U, "early") \ - TTYPE(OutOfMemory, 4U, "early") \ - TTYPE(OutOfStackMemory, 5U, "early") \ - MARK(EARLY, 5U) \ - TTYPE(Solver, 8U, "solver.err") \ - MARK(SOLVERERR, 8U) \ - TTYPE(Abort, 10U, "abort.err") \ - TTYPE(Assert, 11U, "assert.err") \ - TTYPE(BadVectorAccess, 12U, "bad_vector_access.err") \ - TTYPE(Free, 13U, "free.err") \ - TTYPE(Model, 14U, "model.err") \ - TTYPE(Overflow, 15U, "overflow.err") \ - TTYPE(Ptr, 16U, "ptr.err") \ - TTYPE(ReadOnly, 17U, "read_only.err") \ - TTYPE(ReportError, 18U, "report_error.err") \ - MARK(PROGERR, 18U) \ - TTYPE(User, 23U, "user.err") \ - MARK(USERERR, 23U) \ - TTYPE(Execution, 25U, "exec.err") \ - TTYPE(External, 26U, "external.err") \ - MARK(EXECERR, 26U) \ - TTYPE(Replay, 27U, "") \ - TTYPE(Merge, 28U, "") \ - TTYPE(SilentExit, 29U, "") \ - MARK(END, 29U) + TTMARK(EXIT, 1U) \ + TTYPE(Interrupted, 10U, "early") \ + TTYPE(MaxDepth, 11U, "early") \ + TTYPE(OutOfMemory, 12U, "early") \ + TTYPE(OutOfStackMemory, 13U, "early") \ + TTMARK(EARLY, 13U) \ + TTYPE(Solver, 20U, "solver.err") \ + TTMARK(SOLVERERR, 20U) \ + TTYPE(Abort, 30U, "abort.err") \ + TTYPE(Assert, 31U, "assert.err") \ + TTYPE(BadVectorAccess, 32U, "bad_vector_access.err") \ + TTYPE(Free, 33U, "free.err") \ + TTYPE(Model, 34U, "model.err") \ + TTYPE(Overflow, 35U, "overflow.err") \ + TTYPE(Ptr, 36U, "ptr.err") \ + TTYPE(ReadOnly, 37U, "read_only.err") \ + TTYPE(ReportError, 38U, "report_error.err") \ + TTYPE(InvalidBuiltin, 39U, "invalid_builtin_use.err") \ + TTYPE(ImplicitTruncation, 40U, "implicit_truncation.err") \ + TTYPE(ImplicitConversion, 41U, "implicit_conversion.err") \ + TTYPE(UnreachableCall, 42U, "unreachable_call.err") \ + TTYPE(MissingReturn, 43U, "missing_return.err") \ + TTYPE(InvalidLoad, 44U, "invalid_load.err") \ + TTYPE(NullableAttribute, 45U, "nullable_attribute.err") \ + TTMARK(PROGERR, 45U) \ + TTYPE(User, 50U, "user.err") \ + TTMARK(USERERR, 50U) \ + TTYPE(Execution, 60U, "exec.err") \ + TTYPE(External, 61U, "external.err") \ + TTMARK(EXECERR, 61U) \ + TTYPE(Replay, 70U, "") \ + TTYPE(Merge, 71U, "") \ + TTMARK(EARLYALGORITHM, 71U) \ + TTYPE(SilentExit, 80U, "") \ + TTMARK(EARLYUSER, 80U) \ + TTMARK(END, 80U) + ///@brief Reason an ExecutionState got terminated. enum class StateTerminationType : std::uint8_t { -#define TTYPE(N,I,S) N = (I), -#define MARK(N,I) N = (I), + /// \cond DO_NOT_DOCUMENT + #define TTYPE(N,I,S) N = (I), + #define TTMARK(N,I) N = (I), TERMINATION_TYPES -#undef TTYPE -#undef MARK + /// \endcond }; + +// reset definitions + +#undef TCLASS +#undef TTYPE +#undef TTMARK +#define TCLASS(N,I) +#define TTYPE(N,I,S) +#define TTMARK(N,I) + #endif diff --git a/include/klee/Expr/ArrayExprVisitor.h b/include/klee/Expr/ArrayExprVisitor.h index 28f485d9b8..b2941e42ee 100644 --- a/include/klee/Expr/ArrayExprVisitor.h +++ b/include/klee/Expr/ArrayExprVisitor.h @@ -35,8 +35,6 @@ class ConstantArrayExprVisitor : public ExprVisitor { private: using bindings_ty = std::map>>; bindings_ty &arrays; - // Avoids adding the same index twice - std::unordered_set addedIndexes; bool incompatible; protected: diff --git a/include/klee/Expr/Assignment.h b/include/klee/Expr/Assignment.h index 7384e0ccfe..ba0c2a6cd1 100644 --- a/include/klee/Expr/Assignment.h +++ b/include/klee/Expr/Assignment.h @@ -44,7 +44,7 @@ namespace klee { } ref evaluate(const Array *mo, unsigned index) const; - ref evaluate(ref e); + ref evaluate(ref e) const; ConstraintSet createConstraintsFromAssignment() const; template @@ -82,7 +82,7 @@ namespace klee { } } - inline ref Assignment::evaluate(ref e) { + inline ref Assignment::evaluate(ref e) const { AssignmentEvaluator v(*this); return v.visit(e); } diff --git a/include/klee/Expr/Expr.h b/include/klee/Expr/Expr.h index b509294c10..eb936c3d6d 100644 --- a/include/klee/Expr/Expr.h +++ b/include/klee/Expr/Expr.h @@ -12,12 +12,17 @@ #include "klee/ADT/Bits.h" #include "klee/ADT/Ref.h" + +#include "klee/Support/CompilerWarning.h" +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS #include "llvm/ADT/APFloat.h" #include "llvm/ADT/APInt.h" #include "llvm/ADT/DenseSet.h" #include "llvm/ADT/SmallVector.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/raw_ostream.h" +DISABLE_WARNING_POP #include #include @@ -95,7 +100,9 @@ class Expr { /// The type of an expression is simply its width, in bits. typedef unsigned Width; - + + // NOTE: The prefix "Int" in no way implies the integer type of expression. + // For example, Int64 can indicate i64, double or <2 * i32> in different cases. static const Width InvalidWidth = 0; static const Width Bool = 1; static const Width Int8 = 8; @@ -103,6 +110,10 @@ class Expr { static const Width Int32 = 32; static const Width Int64 = 64; static const Width Fl80 = 80; + static const Width Int128 = 128; + static const Width Int256 = 256; + static const Width Int512 = 512; + static const Width MaxWidth = Int512; enum Kind { @@ -1106,7 +1117,13 @@ class ConstantExpr : public Expr { } /// isAllOnes - Is this constant all ones. - bool isAllOnes() const { return getAPValue().isAllOnesValue(); } + bool isAllOnes() const { +#if LLVM_VERSION_CODE <= LLVM_VERSION(13, 0) + return getAPValue().isAllOnesValue(); +#else + return getAPValue().isAllOnes(); +#endif + } /* Constant Operations */ diff --git a/include/klee/KDAlloc/allocator.h b/include/klee/KDAlloc/allocator.h new file mode 100644 index 0000000000..5588d1d1a0 --- /dev/null +++ b/include/klee/KDAlloc/allocator.h @@ -0,0 +1,478 @@ +//===-- allocator.h ---------------------------------------------*- C++ -*-===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef KDALLOC_ALLOCATOR_H +#define KDALLOC_ALLOCATOR_H + +#include "define.h" +#include "location_info.h" +#include "mapping.h" +#include "suballocators/loh.h" +#include "suballocators/slot_allocator.h" +#include "tagged_logger.h" + +#include "klee/ADT/Bits.h" +#include "klee/ADT/Ref.h" + +#include +#include +#include +#include +#include +#include +#include + +namespace klee::kdalloc { +/// Wraps a mapping and delegates allocation to one of 8 sized-bin slot +/// allocators (size < 4096) or a large object allocator (size >= 4096). +class Allocator final : public TaggedLogger { +public: + class Control final { + friend class Allocator; + friend class AllocatorFactory; + + static constexpr const std::uint32_t unlimitedQuarantine = + static_cast(-1); + + static constexpr const std::array meta = { + 1u, // bool + 4u, // int + 8u, // pointer size + 16u, // double + 32u, // compound types #1 + 64u, // compound types #2 + 256u, // compound types #3 + 2048u, // reasonable buffers + }; + + [[nodiscard]] static inline int + convertSizeToBinIndex(std::size_t const size) noexcept { + for (std::size_t i = 0; i < meta.size(); ++i) { + if (meta[i] >= size) { + return i; + } + } + return meta.size(); + } + + [[nodiscard]] inline int + convertPtrToBinIndex(void const *const p) noexcept { + for (std::size_t i = 0; i < sizedBins.size(); ++i) { + if (p >= sizedBins[i].mapping_begin() && + p < sizedBins[i].mapping_end()) { + return i; + } + } + assert(p >= largeObjectBin.mapping_begin() && + p < largeObjectBin.mapping_end()); + return meta.size(); + } + + public: + mutable class klee::ReferenceCounter _refCount; + + private: + Mapping mapping; + std::array sizedBins; + suballocators::LargeObjectAllocator::Control largeObjectBin; + + public: + Control() = delete; + Control(Control const &) = delete; + Control &operator=(Control const &) = delete; + Control(Control &&) = delete; + Control &operator=(Control &&) = delete; + + private: + Control(Mapping &&mapping) : mapping(std::move(mapping)) {} + }; + + static constexpr const auto unlimitedQuarantine = + Control::unlimitedQuarantine; + +private: + klee::ref control; + + std::array, + suballocators::SlotAllocator>, + Control::meta.size()> + sizedBins; + suballocators::LargeObjectAllocator largeObjectBin; + + void initializeSizedBins() { + if (control) { + for (std::size_t i = 0; i < sizedBins.size(); ++i) { + if (control->sizedBins[i].isQuarantineUnlimited()) { + new (&sizedBins[i]) suballocators::SlotAllocator{}; + } else { + new (&sizedBins[i]) suballocators::SlotAllocator{}; + } + } + } + } + + void destroySizedBins() { + if (control) { + for (std::size_t i = 0; i < sizedBins.size(); ++i) { + if (control->sizedBins[i].isQuarantineUnlimited()) { + reinterpret_cast &>(sizedBins[i]) + .~SlotAllocator(); + } else { + reinterpret_cast &>(sizedBins[i]) + .~SlotAllocator(); + } + } + } + } + +public: + std::ostream &logTag(std::ostream &out) const noexcept { + return out << "[alloc] "; + } + + Allocator() = default; + + Allocator(Allocator const &rhs) + : control(rhs.control), largeObjectBin(rhs.largeObjectBin) { + if (control) { + for (std::size_t i = 0; i < sizedBins.size(); ++i) { + if (control->sizedBins[i].isQuarantineUnlimited()) { + new (&sizedBins[i]) suballocators::SlotAllocator{ + reinterpret_cast const &>( + rhs.sizedBins[i])}; + } else { + new (&sizedBins[i]) suballocators::SlotAllocator{ + reinterpret_cast const &>( + rhs.sizedBins[i])}; + } + } + } + } + + Allocator &operator=(Allocator const &rhs) { + if (this != &rhs) { + // `control` may differ in whether it is initialized and in the properties + // of any one bin. However, in the expected usage, allocators that are + // assigned always either share the same `control' or are uninitialized + // (i.e. have a `nullptr` control). + if (control.get() != rhs.control.get()) { + destroySizedBins(); + control = rhs.control; + initializeSizedBins(); + } else { + control = rhs.control; + } + + if (control) { + for (std::size_t i = 0; i < sizedBins.size(); ++i) { + if (control->sizedBins[i].isQuarantineUnlimited()) { + reinterpret_cast &>( + sizedBins[i]) = + reinterpret_cast const &>( + rhs.sizedBins[i]); + } else { + reinterpret_cast &>( + sizedBins[i]) = + reinterpret_cast const &>( + rhs.sizedBins[i]); + } + } + } + largeObjectBin = rhs.largeObjectBin; + } + return *this; + } + + Allocator(Allocator &&rhs) + : control(std::move(rhs.control)), + largeObjectBin(std::move(rhs.largeObjectBin)) { + if (control) { + for (std::size_t i = 0; i < sizedBins.size(); ++i) { + if (control->sizedBins[i].isQuarantineUnlimited()) { + new (&sizedBins[i]) suballocators::SlotAllocator{ + std::move(reinterpret_cast &>( + rhs.sizedBins[i]))}; + reinterpret_cast &>( + rhs.sizedBins[i]) + .~SlotAllocator(); + } else { + new (&sizedBins[i]) suballocators::SlotAllocator{ + std::move(reinterpret_cast &>( + rhs.sizedBins[i]))}; + reinterpret_cast &>( + rhs.sizedBins[i]) + .~SlotAllocator(); + } + } + } + } + + Allocator &operator=(Allocator &&rhs) { + if (this != &rhs) { + // `control` may differ in whether it is initialized and in the properties + // of any one bin. However, in the expected usage, allocators that are + // assigned always either share the same `control' or are uninitialized + // (i.e. have a `nullptr` control). + if (control.get() != rhs.control.get()) { + destroySizedBins(); + control = std::move(rhs.control); + initializeSizedBins(); + } else { + control = std::move(rhs.control); + } + + if (control) { + for (std::size_t i = 0; i < sizedBins.size(); ++i) { + if (control->sizedBins[i].isQuarantineUnlimited()) { + reinterpret_cast &>( + sizedBins[i]) = + std::move( + reinterpret_cast &>( + rhs.sizedBins[i])); + } else { + reinterpret_cast &>( + sizedBins[i]) = + std::move( + reinterpret_cast &>( + rhs.sizedBins[i])); + } + } + } + largeObjectBin = std::move(rhs.largeObjectBin); + } + return *this; + } + + Allocator(klee::ref control) : control(std::move(control)) { + initializeSizedBins(); + } + + ~Allocator() { destroySizedBins(); } + + explicit operator bool() const noexcept { return !control.isNull(); } + + Mapping &getMapping() noexcept { + assert(!!*this && "Cannot get mapping of uninitialized allocator."); + return control->mapping; + } + + Mapping const &getMapping() const noexcept { + assert(!!*this && "Cannot get mapping of uninitialized allocator."); + return control->mapping; + } + + [[nodiscard]] void *allocate(std::size_t size) { + assert(*this && "Invalid allocator"); + + auto const bin = Control::convertSizeToBinIndex(size); + traceLine("Allocating ", size, " bytes in bin ", bin); + + void *result = nullptr; + if (bin < static_cast(sizedBins.size())) { + if (control->sizedBins[bin].isQuarantineUnlimited()) { + result = reinterpret_cast &>( + sizedBins[bin]) + .allocate(control->sizedBins[bin]); + } else { + result = reinterpret_cast &>( + sizedBins[bin]) + .allocate(control->sizedBins[bin]); + } + } else { + result = largeObjectBin.allocate(control->largeObjectBin, size); + } + traceLine("Allocated ", result); + return result; + } + + void free(void *ptr) { + assert(*this && "Invalid allocator"); + assert(ptr && "Freeing nullptrs is not supported"); // we are not ::free! + + auto bin = control->convertPtrToBinIndex(ptr); + traceLine("Freeing ", ptr, " in bin ", bin); + + if (bin < static_cast(sizedBins.size())) { + if (control->sizedBins[bin].isQuarantineUnlimited()) { + return reinterpret_cast &>( + sizedBins[bin]) + .deallocate(control->sizedBins[bin], ptr); + } else { + return reinterpret_cast &>( + sizedBins[bin]) + .deallocate(control->sizedBins[bin], ptr); + } + } else { + return largeObjectBin.deallocate(control->largeObjectBin, ptr); + } + } + + void free(void *ptr, std::size_t size) { + assert(*this && "Invalid allocator"); + assert(ptr && "Freeing nullptrs is not supported"); // we are not ::free! + + auto const bin = Control::convertSizeToBinIndex(size); + traceLine("Freeing ", ptr, " of size ", size, " in bin ", bin); + + if (bin < static_cast(sizedBins.size())) { + if (control->sizedBins[bin].isQuarantineUnlimited()) { + return reinterpret_cast &>( + sizedBins[bin]) + .deallocate(control->sizedBins[bin], ptr); + } else { + return reinterpret_cast &>( + sizedBins[bin]) + .deallocate(control->sizedBins[bin], ptr); + } + } else { + return largeObjectBin.deallocate(control->largeObjectBin, ptr); + } + } + + std::size_t getSize(void const *const ptr) const noexcept { + assert(!!ptr); + + auto bin = control->convertPtrToBinIndex(ptr); + traceLine("Getting size for ", ptr, " in bin ", bin); + + if (bin < static_cast(sizedBins.size())) { + return Control::meta[bin]; + } else { + return largeObjectBin.getSize(control->largeObjectBin, ptr); + } + } + + LocationInfo locationInfo(void const *const ptr, + std::size_t const size) const noexcept { + assert(*this && "Invalid allocator"); + + if (!ptr || reinterpret_cast(ptr) < 4096) { + return LocationInfo::LI_NullPage; + } + + // the following is technically UB if `ptr` does not actually point inside + // the mapping at all + for (std::size_t i = 0; i < Allocator::Control::meta.size(); ++i) { + if (control->sizedBins[i].mapping_begin() <= ptr && + ptr < control->sizedBins[i].mapping_end()) { + if (reinterpret_cast(ptr) + size <= + control->sizedBins[i].mapping_end()) { + if (control->sizedBins[i].isQuarantineUnlimited()) { + return reinterpret_cast const &>( + sizedBins[i]) + .getLocationInfo(control->sizedBins[i], ptr, size); + } else { + return reinterpret_cast< + suballocators::SlotAllocator const &>( + sizedBins[i]) + .getLocationInfo(control->sizedBins[i], ptr, size); + } + } else { + return LocationInfo::LI_SpansSuballocators; + } + } + } + if (control->largeObjectBin.mapping_begin() <= ptr && + ptr < control->largeObjectBin.mapping_end()) { + if (reinterpret_cast(ptr) + size <= + control->largeObjectBin.mapping_end()) { + return largeObjectBin.getLocationInfo(control->largeObjectBin, ptr, + size); + } else { + // the loh is the suballocator using the largest addresses, therefore + // its mapping is not followed by that of another suballocator, but + // rather the end of the mapping + return LocationInfo::LI_NonNullOutsideMapping; + } + } + + return LocationInfo::LI_NonNullOutsideMapping; + } +}; + +class AllocatorFactory { +public: + static constexpr const auto unlimitedQuarantine = + Allocator::Control::unlimitedQuarantine; + +private: + klee::ref control; + +public: + AllocatorFactory() = default; + + AllocatorFactory(std::size_t const size, std::uint32_t const quarantineSize) + : AllocatorFactory(Mapping{0, size}, quarantineSize) {} + + AllocatorFactory(std::uintptr_t const address, std::size_t const size, + std::uint32_t const quarantineSize) + : AllocatorFactory(Mapping{address, size}, quarantineSize) {} + + AllocatorFactory(Mapping &&mapping, std::uint32_t const quarantineSize) { + if (mapping) { + assert(mapping.getSize() > + Allocator::Control::meta.size() * 4096 + 3 * 4096 && + "Mapping is *far* too small"); + + control = new Allocator::Control(std::move(mapping)); + auto const binSize = + static_cast(1) + << (std::numeric_limits::digits - 1 - + countLeadingZeroes(control->mapping.getSize() / + (Allocator::Control::meta.size() + 1))); + char *const base = static_cast(control->mapping.getBaseAddress()); + std::size_t totalSize = 0; + for (std::size_t i = 0; i < Allocator::Control::meta.size(); ++i) { + control->sizedBins[i].initialize( + base + totalSize, binSize, Allocator::Control::meta[i], + quarantineSize == unlimitedQuarantine, + quarantineSize == unlimitedQuarantine ? 0 : quarantineSize); + + totalSize += binSize; + assert(totalSize <= control->mapping.getSize() && "Mapping too small"); + } + + auto largeObjectBinSize = control->mapping.getSize() - totalSize; + assert(largeObjectBinSize > 0); + control->largeObjectBin.initialize( + base + totalSize, largeObjectBinSize, + quarantineSize == unlimitedQuarantine, + quarantineSize == unlimitedQuarantine ? 0 : quarantineSize); + } + } + + explicit operator bool() const noexcept { return !control.isNull(); } + + Mapping &getMapping() noexcept { + assert(!!*this && "Cannot get mapping of uninitialized factory."); + return control->mapping; + } + + Mapping const &getMapping() const noexcept { + assert(!!*this && "Cannot get mapping of uninitialized factory."); + return control->mapping; + } + + Allocator makeAllocator() const { + assert(!!*this && + "Can only create an allocator from an initialized factory."); + + return Allocator{control}; + } + + explicit operator Allocator() && { + assert(!!*this && + "Can only create an allocator from an initialized factory."); + + return Allocator{std::move(control)}; + } +}; +} // namespace klee::kdalloc + +#endif diff --git a/include/klee/KDAlloc/define.h b/include/klee/KDAlloc/define.h new file mode 100644 index 0000000000..b20bf13e8a --- /dev/null +++ b/include/klee/KDAlloc/define.h @@ -0,0 +1,17 @@ +//===-- define.h ------------------------------------------------*- C++ -*-===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef KDALLOC_DEFINE_H +#define KDALLOC_DEFINE_H + +#ifndef KDALLOC_TRACE +#define KDALLOC_TRACE 0 +#endif + +#endif diff --git a/include/klee/KDAlloc/kdalloc.h b/include/klee/KDAlloc/kdalloc.h new file mode 100644 index 0000000000..c04a4ebf49 --- /dev/null +++ b/include/klee/KDAlloc/kdalloc.h @@ -0,0 +1,21 @@ +//===-- kdalloc.h -----------------------------------------------*- C++ -*-===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef KDALLOC_KDALLOC_H +#define KDALLOC_KDALLOC_H + +#include "allocator.h" +#include "mapping.h" + +namespace klee::kdalloc { +using StackAllocator = Allocator; +using StackAllocatorFactory = AllocatorFactory; +} // namespace klee::kdalloc + +#endif diff --git a/include/klee/KDAlloc/location_info.h b/include/klee/KDAlloc/location_info.h new file mode 100644 index 0000000000..d9852e7ecb --- /dev/null +++ b/include/klee/KDAlloc/location_info.h @@ -0,0 +1,71 @@ +//===-- location_info.h -----------------------------------------*- C++ -*-===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef KDALLOC_LOCATION_INFO_H +#define KDALLOC_LOCATION_INFO_H + +#include + +namespace klee::kdalloc { +class LocationInfo { +public: + enum Enum { + /// refers to the null page + LI_NullPage, + /// location is not inside the mapping (but not on the null page) + LI_NonNullOutsideMapping, + /// location spans suballocator mapping boundary + LI_SpansSuballocators, + /// area spans object alignment boundary + LI_Unaligned, + /// location always refers to a redzone + LI_AlwaysRedzone, + /// location currently refers to a redzone + LI_CurrentRedzone, + /// location is inside an object that is either currently allocated or in + /// quarantine + LI_AllocatedOrQuarantined, + /// location is potentially valid, but not currently allocated + LI_Unallocated, + }; + +private: + Enum value; + void *address; + +public: + constexpr LocationInfo(Enum value, void *address = nullptr) noexcept + : value(value), address(address) {} + constexpr operator Enum() noexcept { return value; } + + /// location is (partially) outside the mapping + constexpr bool isOutsideMapping() const noexcept { + return value != Enum::LI_NullPage && + value != Enum::LI_NonNullOutsideMapping; + } + + /// location is potentially valid + constexpr bool isValid() const noexcept { + return value == Enum::LI_AllocatedOrQuarantined || + value == Enum::LI_Unallocated || value == Enum::LI_CurrentRedzone; + } + + /// location (partially) refers to a redzone + constexpr bool isRedzone() const noexcept { + return value == Enum::LI_AlwaysRedzone || value == Enum::LI_CurrentRedzone; + } + + constexpr void *getBaseAddress() const noexcept { + assert(value == Enum::LI_AllocatedOrQuarantined); + return address; + } +}; +} // namespace klee::kdalloc + +#endif diff --git a/include/klee/KDAlloc/mapping.h b/include/klee/KDAlloc/mapping.h new file mode 100644 index 0000000000..c66e2f4b37 --- /dev/null +++ b/include/klee/KDAlloc/mapping.h @@ -0,0 +1,154 @@ +//===-- mapping.h -----------------------------------------------*- C++ -*-===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef KDALLOC_MAPPING_H +#define KDALLOC_MAPPING_H + +#include +#include +#include +#include +#include + +#include +#include + +#if defined(__linux__) +#include +#endif + +#if defined(__APPLE__) +#include +#include +#endif + +#include "klee/Support/ErrorHandling.h" + +namespace klee::kdalloc { +class Mapping { + void *baseAddress = MAP_FAILED; + std::size_t size = 0; + + bool try_map(std::uintptr_t baseAddress) noexcept { + assert(this->baseAddress == MAP_FAILED); + + int flags = MAP_ANON | MAP_PRIVATE; +#if defined(__linux__) + flags |= MAP_NORESERVE; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 17, 0) + if (baseAddress != 0) { + flags |= MAP_FIXED_NOREPLACE; + } +#endif +#elif defined(__FreeBSD__) + if (baseAddress != 0) { + flags |= MAP_FIXED | MAP_EXCL; + } +#endif + + auto mappedAddress = ::mmap(reinterpret_cast(baseAddress), size, + PROT_READ | PROT_WRITE, flags, -1, 0); + if (mappedAddress == MAP_FAILED) { + this->baseAddress = MAP_FAILED; + return false; + } + if (baseAddress != 0 && + baseAddress != reinterpret_cast(mappedAddress)) { + [[maybe_unused]] int rc = ::munmap(mappedAddress, size); + assert(rc == 0 && "munmap failed"); + this->baseAddress = MAP_FAILED; + return false; + } + this->baseAddress = mappedAddress; + +#if defined(__linux__) + { + [[maybe_unused]] int rc = + ::madvise(this->baseAddress, size, + MADV_NOHUGEPAGE | MADV_DONTFORK | MADV_RANDOM); + assert(rc == 0 && "madvise failed"); + } +#elif defined(__FreeBSD__) + { + [[maybe_unused]] int rc = + ::minherit(this->baseAddress, size, INHERIT_NONE); + assert(rc == 0 && "minherit failed"); + } +#elif defined(__APPLE__) + { + [[maybe_unused]] int rc = + ::minherit(this->baseAddress, size, VM_INHERIT_NONE); + assert(rc == 0 && "minherit failed"); + } +#endif + + return true; + } + +public: + Mapping() = default; + + explicit Mapping(std::size_t size) noexcept : Mapping(0, size) {} + + Mapping(std::uintptr_t baseAddress, std::size_t size) noexcept : size(size) { + try_map(baseAddress); + } + + Mapping(Mapping const &) = delete; + Mapping &operator=(Mapping const &) = delete; + + Mapping(Mapping &&other) noexcept + : baseAddress(other.baseAddress), size(other.size) { + other.baseAddress = MAP_FAILED; + other.size = 0; + } + Mapping &operator=(Mapping &&other) noexcept { + if (&other != this) { + using std::swap; + swap(other.baseAddress, baseAddress); + swap(other.size, size); + } + return *this; + } + + [[nodiscard]] void *getBaseAddress() const noexcept { + assert(*this && "Invalid mapping"); + return baseAddress; + } + + [[nodiscard]] std::size_t getSize() const noexcept { return size; } + + void clear() { + assert(*this && "Invalid mapping"); + +#if defined(__linux__) + [[maybe_unused]] int rc = ::madvise(baseAddress, size, MADV_DONTNEED); + assert(rc == 0 && "madvise failed"); +#else + auto address = reinterpret_cast(baseAddress); + [[maybe_unused]] int rc = ::munmap(baseAddress, size); + assert(rc == 0 && "munmap failed"); + baseAddress = MAP_FAILED; + [[maybe_unused]] auto success = try_map(address); + assert(success && "could not recreate the mapping"); +#endif + } + + explicit operator bool() const noexcept { return baseAddress != MAP_FAILED; } + + ~Mapping() { + if (*this) { + [[maybe_unused]] int rc = ::munmap(baseAddress, size); + assert(rc == 0 && "munmap failed"); + } + } +}; +} // namespace klee::kdalloc + +#endif diff --git a/include/klee/KDAlloc/suballocators/cow_ptr.h b/include/klee/KDAlloc/suballocators/cow_ptr.h new file mode 100644 index 0000000000..ce5957df1c --- /dev/null +++ b/include/klee/KDAlloc/suballocators/cow_ptr.h @@ -0,0 +1,165 @@ +//===-- cow_ptr.h -----------------------------------------------*- C++ -*-===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef KDALLOC_UTIL_COW_H +#define KDALLOC_UTIL_COW_H + +#include +#include +#include +#include +#include +#include + +namespace klee::kdalloc::suballocators { +template class CoWPtr { + struct Wrapper { + std::size_t referenceCount; + T data; + + template + explicit Wrapper(std::size_t const referenceCount, V &&...args) + : referenceCount(referenceCount), data(std::forward(args)...) {} + }; + + Wrapper *ptr = nullptr; + +public: + constexpr CoWPtr() = default; + + CoWPtr(CoWPtr const &other) noexcept : ptr(other.ptr) { + if (ptr != nullptr) { + ++ptr->referenceCount; + assert(ptr->referenceCount > 1); + } + } + + CoWPtr &operator=(CoWPtr const &other) { + if (this != &other) { + release(); + + ptr = other.ptr; + if (ptr != nullptr) { + ++ptr->referenceCount; + assert(ptr->referenceCount > 1); + } + } + return *this; + } + + CoWPtr(CoWPtr &&other) noexcept : ptr(std::exchange(other.ptr, nullptr)) {} + + CoWPtr &operator=(CoWPtr &&other) noexcept { + if (this != &other) { + release(); + ptr = std::exchange(other.ptr, nullptr); + } + return *this; + } + + /// A stand-in for C++17's `std::in_place_t` + struct in_place_t {}; + + template + explicit CoWPtr(in_place_t, V &&...args) + : ptr(new Wrapper(1, std::forward(args)...)) {} + + ~CoWPtr() { release(); } + + /// Returns `true` iff `*this` is not in an empty state. + [[nodiscard]] explicit operator bool() const noexcept { return !isEmpty(); } + + /// Returns `true` iff `*this` is in an empty state. + [[nodiscard]] bool isEmpty() const noexcept { return ptr == nullptr; } + + /// Returns `true` iff `*this` is not in an empty state and owns the CoW + /// object. + [[nodiscard]] bool isOwned() const noexcept { + return ptr != nullptr && ptr->referenceCount == 1; + } + + /// Accesses an existing object. + /// Must not be called when `*this` is in an empty state. + T const &operator*() const noexcept { + assert(!isEmpty() && "the `CoWPtr` must not be empty"); + return *get(); + } + + /// Accesses an existing object. + /// Must not be called when `*this` is in an empty state. + T const *operator->() const noexcept { + assert(!isEmpty() && "the `CoWPtr` must not be empty"); + return get(); + } + + /// Gets a pointer to the managed object. + /// Returns `nullptr` if no object is currently managed. + T const *get() const noexcept { return ptr ? &ptr->data : nullptr; } + + /// Gets a pointer to an existing, owned object. + /// Must not be called when `*this` does not hold CoW ownership. + T *getOwned() noexcept { + assert(isOwned() && "the `CoWPtr` must be owned"); + return &ptr->data; + } + + /// Acquires CoW ownership of an existing object and returns a reference to + /// the owned object. Must not be called when `*this` is in an empty state. + T &acquire() { + assert(ptr != nullptr && + "May only call `acquire` for an active CoW object"); + assert(ptr->referenceCount > 0); + if (ptr->referenceCount > 1) { + --ptr->referenceCount; + ptr = new Wrapper{*ptr}; + ptr->referenceCount = 1; + } + assert(ptr->referenceCount == 1); + return ptr->data; + } + + /// Releases CoW ownership of an existing object or does nothing if the object + /// does not exist. Leaves `*this` in an empty state. + void release() noexcept(noexcept(delete ptr)) { + if (ptr != nullptr) { + --ptr->referenceCount; + if (ptr->referenceCount == 0) { + delete ptr; + } + ptr = nullptr; + } + } + + /// Leaves `*this` holding and owning an object `T(std::forward(args)...)`. + /// This function is always safe to call and will perform the operation as + /// efficient as possible. Notably, `foo.emplace(...)` may be more efficient + /// than the otherwise equivalent `foo = CoWPtr(CoWPtr::in_place_t{}, ...)`. + template T &emplace(V &&...args) { + if (ptr) { + if (ptr->referenceCount == 1) { + ptr->data = T(std::forward(args)...); + } else { + auto *new_ptr = new Wrapper( + 1, std::forward(args)...); // possibly throwing operation + + assert(ptr->referenceCount > 1); + --ptr->referenceCount; + ptr = new_ptr; + } + } else { + ptr = new Wrapper(1, std::forward(args)...); + } + assert(ptr != nullptr); + assert(ptr->referenceCount == 1); + return ptr->data; + } +}; +} // namespace klee::kdalloc::suballocators + +#endif diff --git a/include/klee/KDAlloc/suballocators/loh.h b/include/klee/KDAlloc/suballocators/loh.h new file mode 100644 index 0000000000..16baf911ed --- /dev/null +++ b/include/klee/KDAlloc/suballocators/loh.h @@ -0,0 +1,344 @@ +//===-- loh.h ---------------------------------------------------*- C++ -*-===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef KDALLOC_SUBALLOCATORS_LOH_H +#define KDALLOC_SUBALLOCATORS_LOH_H + +#include "../define.h" +#include "../location_info.h" +#include "../tagged_logger.h" +#include "sized_regions.h" + +#include "klee/ADT/Bits.h" + +#include +#include +#include +#include +#include +#include + +#if KDALLOC_TRACE >= 2 +#include +#endif + +namespace klee::kdalloc::suballocators { +/// The large object heap is implemented as what amounts to as a bi-directional +/// mapping between the position of each unallocated region and its actual size. +/// The implemented algorithm performs allocations in the middle of the largest +/// available unallocated region. Allocations are guaranteed to be aligned to +/// 4096 bytes. +class LargeObjectAllocator final : public TaggedLogger { + struct Data final { + /// The reference count. + std::size_t referenceCount = 1; + + /// A CoW enabled treap that is a tree over base addresses and a max-heap + /// over sizes + SizedRegions regions; + + static_assert(sizeof(void *) >= sizeof(std::size_t), + "The quarantine structure contains a `std::size_t` followed " + "by many `void*`s"); + static_assert(alignof(void *) >= alignof(std::size_t), + "The quarantine structure contains a `std::size_t` followed " + "by many `void*`s"); + using QuarantineElement = + std::aligned_storage_t; + + /// The quarantine position followed by the quarantine ring buffer + /// Structure: [pos, ptr1, ptr2, ...] + QuarantineElement quarantine[]; + + Data() = default; + Data(Data const &rhs) : regions(rhs.regions) {} + Data &operator=(Data const &) = delete; + Data(Data &&) = delete; + Data &operator=(Data &&) = delete; + }; + +public: + class Control final : public TaggedLogger { + friend class LargeObjectAllocator; + + void *baseAddress = nullptr; + std::size_t size = 0; + std::uint32_t quarantineSize = 0; + bool unlimitedQuarantine = false; + + public: + Control() = default; + Control(Control const &) = delete; + Control &operator=(Control const &) = delete; + Control(Control &&) = delete; + Control &operator=(Control &&) = delete; + + void initialize(void *const baseAddress, std::size_t const size, + bool const unlimitedQuarantine, + std::uint32_t const quarantineSize) { + assert(size >= 3 * 4096 && "The LOH requires at least three pages"); + + this->baseAddress = baseAddress; + this->size = size; + if (unlimitedQuarantine) { + this->quarantineSize = 0; + this->unlimitedQuarantine = true; + } else { + this->quarantineSize = quarantineSize == 0 ? 0 : quarantineSize + 1; + this->unlimitedQuarantine = false; + } + + traceLine("Initialization complete for region ", baseAddress, " + ", + size); + } + + inline std::ostream &logTag(std::ostream &out) const noexcept { + return out << "[LOH control] "; + } + + constexpr void *mapping_begin() const noexcept { return baseAddress; } + constexpr void *mapping_end() const noexcept { + return static_cast(static_cast(baseAddress) + size); + } + }; + +private: + Data *data = nullptr; + + inline void releaseData() noexcept { + if (data) { + --data->referenceCount; + if (data->referenceCount == 0) { + data->~Data(); + std::free(data); + } + data = nullptr; + } + } + + inline void acquireData(Control const &control) noexcept { + assert(!!data); + if (data->referenceCount > 1) { + auto newData = static_cast(std::malloc( + sizeof(Data) + control.quarantineSize * sizeof(std::size_t))); + assert(newData && "allocation failure"); + + new (newData) Data(*data); + std::memcpy(&newData->quarantine[0], &data->quarantine[0], + sizeof(Data::QuarantineElement) * control.quarantineSize); + + --data->referenceCount; + assert(data->referenceCount > 0); + data = newData; + } + assert(data->referenceCount == 1); + } + + void *quarantine(Control const &control, void *const ptr) { + assert(!!data && + "Deallocations can only happen if allocations happened beforehand"); + assert(!control.unlimitedQuarantine); + + if (control.quarantineSize == 0) { + return ptr; + } + + assert(data->referenceCount == 1 && + "Must hold CoW ownership to quarantine a new pointer+size pair"); + + auto const pos = reinterpret_cast(data->quarantine[0]); + if (pos + 1 == control.quarantineSize) { + reinterpret_cast(data->quarantine[0]) = 1; + } else { + reinterpret_cast(data->quarantine[0]) = pos + 1; + } + + return std::exchange(reinterpret_cast(data->quarantine[pos]), + std::move(ptr)); + } + +public: + constexpr LargeObjectAllocator() = default; + + LargeObjectAllocator(LargeObjectAllocator const &rhs) noexcept + : data(rhs.data) { + if (data) { + ++data->referenceCount; + assert(data->referenceCount > 1); + } + } + + LargeObjectAllocator &operator=(LargeObjectAllocator const &rhs) noexcept { + if (data != rhs.data) { + releaseData(); + data = rhs.data; + if (data) { + ++data->referenceCount; + assert(data->referenceCount > 1); + } + } + return *this; + } + + LargeObjectAllocator(LargeObjectAllocator &&rhs) noexcept + : data(std::exchange(rhs.data, nullptr)) { + if (data) { + assert(data->referenceCount > 0); + } + } + + LargeObjectAllocator &operator=(LargeObjectAllocator &&rhs) noexcept { + if (data != rhs.data) { + releaseData(); + data = std::exchange(rhs.data, nullptr); + } + return *this; + } + + ~LargeObjectAllocator() noexcept { releaseData(); } + + inline std::ostream &logTag(std::ostream &out) const noexcept { + return out << "[LOH] "; + } + + std::size_t getSize(Control const &control, + void const *const ptr) const noexcept { + assert(control.mapping_begin() <= ptr && ptr < control.mapping_end() && + "This property should have been ensured by the caller"); + assert(!!data && + "Can only get size of an object if objects already exist..."); + + return data->regions.getSize(static_cast(ptr)); + } + + LocationInfo getLocationInfo(Control const &control, void const *const ptr, + std::size_t const size) const noexcept { + assert(control.mapping_begin() <= ptr && + reinterpret_cast(ptr) + size < control.mapping_end() && + "This property should have been ensured by the caller"); + + if (!data) { + return LocationInfo::LI_Unallocated; + } + assert(!data->regions.isEmpty()); + + if (reinterpret_cast(control.mapping_begin()) + 4096 > + reinterpret_cast(ptr) || + reinterpret_cast(control.mapping_end()) - 4096 < + reinterpret_cast(ptr) + size) { + return LocationInfo::LI_AlwaysRedzone; + } + + return data->regions.getLocationInfo(reinterpret_cast(ptr), + size); + } + + [[nodiscard]] void *allocate(Control const &control, std::size_t size) { + if (!data) { + data = static_cast(std::malloc( + sizeof(Data) + control.quarantineSize * sizeof(std::size_t))); + assert(data && "allocation failure"); + + new (data) Data(); + if (control.quarantineSize > 0) { + reinterpret_cast(data->quarantine[0]) = 1; + std::memset(&data->quarantine[1], 0, + (control.quarantineSize - 1) * + sizeof(Data::QuarantineElement)); + } + + data->regions.insert(static_cast(control.baseAddress), + control.size); + } else { + acquireData(control); + } + assert(data->referenceCount == 1); + + auto const quantizedSize = roundUpToMultipleOf4096(size); + traceLine("Allocating ", size, " (", quantizedSize, ") bytes"); + assert(size > 0); + assert(quantizedSize % 4096 == 0); + traceContents(control); + + size = quantizedSize; + + assert(!data->regions.isEmpty()); + auto const &node = data->regions.getLargestRegion(); + std::size_t const rangeSize = node->getSize(); + assert(rangeSize + 2 * 4096 >= size && "Zero (or below) red zone size!"); + char *const rangePos = node->getBaseAddress(); + + auto offset = (rangeSize - size) / 2; + offset = roundUpToMultipleOf4096(offset); + + // left subrange + data->regions.resizeLargestRegion(offset); + + // right subrange + data->regions.insert(rangePos + offset + size, rangeSize - offset - size); + + auto const result = static_cast(rangePos + offset); + traceLine("Allocation result: ", result); + return result; + } + + void deallocate(Control const &control, void *ptr) { + assert(!!data && + "Deallocations can only happen if allocations happened beforehand"); + + if (control.unlimitedQuarantine) { + traceLine("Quarantining ", ptr, " for ever"); + } else { + traceLine("Quarantining ", ptr, " for ", control.quarantineSize - 1, + " deallocations"); + + acquireData(control); // we will need quarantine and/or region ownership + ptr = quarantine(control, ptr); + if (!ptr) { + return; + } + + traceLine("Deallocating ", ptr); + + assert(data->referenceCount == 1); + traceContents(control); + traceLine("Merging regions around ", + static_cast(static_cast(ptr))); + + data->regions.mergeAroundAddress(static_cast(ptr)); + } + } + + void traceContents(Control const &) const noexcept { + if (data->regions.isEmpty()) { + traceLine("regions is empty"); + } else { +#if KDALLOC_TRACE >= 2 + traceLine("regions:"); + data->regions.dump(std::cout); + +#if !defined(NDEBUG) + auto invariantsHold = data->regions.checkInvariants(); + if (!invariantsHold.first) { + traceln("TREE INVARIANT DOES NOT HOLD!"); + } + if (!invariantsHold.second) { + traceln("HEAP INVARIANT DOES NOT HOLD!"); + } + assert(invariantsHold.first && invariantsHold.second); +#endif +#else + traceLine("regions is not empty"); +#endif + } + } +}; +} // namespace klee::kdalloc::suballocators + +#endif diff --git a/include/klee/KDAlloc/suballocators/sized_regions.h b/include/klee/KDAlloc/suballocators/sized_regions.h new file mode 100644 index 0000000000..8683f4d9c8 --- /dev/null +++ b/include/klee/KDAlloc/suballocators/sized_regions.h @@ -0,0 +1,524 @@ +//===-- sized_regions.h -----------------------------------------*- C++ -*-===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef KDALLOC_UTIL_SIZED_REGIONS_H +#define KDALLOC_UTIL_SIZED_REGIONS_H + +#include "../define.h" +#include "../location_info.h" +#include "cow_ptr.h" + +#include +#include +#include +#include +#include + +namespace klee::kdalloc::suballocators { +class SizedRegions; + +class Node final { + friend class SizedRegions; + + CoWPtr lhs; + CoWPtr rhs; + + // std::size_t _precomputed_hash; + char *baseAddress; + std::size_t size; + + inline std::uintptr_t hash() const noexcept { + // This hash function implements a very simple hash based only on the base + // address. The hash is (only) used to break ties w.r.t. the heap property. + // Note that multiplication with an odd number (as done here) modulo a power + // of two (the domain of std::size_t) is a permutation, meaning that the + // hash is guaranteed to break any ties (as tree-keys are unique in the + // treap). The constant is chosen in such a way that the high bits of the + // result depend each byte of input while still enabling a fast computation + // due to the low number of 1-bits involved. It is also chosen odd to ensure + // co-primality with powers of two. + + static_assert( + std::numeric_limits::digits <= 64, + "Please choose a more appropriate constant in the line below."); + return reinterpret_cast(baseAddress) * + static_cast(0x8080'8080'8080'8081u); + } + +public: + char *const &getBaseAddress() const noexcept { return baseAddress; } + void setBaseAddress(char *const newBaseAddress) noexcept { + baseAddress = newBaseAddress; + } + + std::size_t const &getSize() const noexcept { return size; } + void setSize(std::size_t const newSize) noexcept { size = newSize; } + + Node(char *const baseAddress, std::size_t const size) noexcept + : baseAddress(baseAddress), size(size) {} +}; + +class SizedRegions { + CoWPtr root; + + static void insertRec(CoWPtr &treap, CoWPtr &®ion) { + assert(treap && "target subtreap must exist (insertion at the call " + "site is trivial otherwise)"); + assert(region && "region to be inserted must exist"); + assert(treap->getBaseAddress() != region->getBaseAddress() && + "multiple insertions of the same tree-key are not supported"); + + auto &node = treap.acquire(); + if (region->getBaseAddress() < node.getBaseAddress()) { + if (node.lhs) { + insertRec(node.lhs, std::move(region)); + } else { + node.lhs = std::move(region); + } + if (node.lhs->getSize() > node.getSize() || + (node.lhs->getSize() == node.getSize() && + node.lhs->hash() > node.hash())) { + auto temp = std::move(node.lhs); + auto &nodeTemp = temp.acquire(); + node.lhs = std::move(nodeTemp.rhs); + nodeTemp.rhs = std::move(treap); + treap = std::move(temp); + } + } else { + if (node.rhs) { + insertRec(node.rhs, std::move(region)); + } else { + node.rhs = std::move(region); + } + if (node.rhs->getSize() > node.getSize() || + (node.rhs->getSize() == node.getSize() && + node.rhs->hash() > node.hash())) { + auto temp = std::move(node.rhs); + auto &nodeTemp = temp.acquire(); + node.rhs = std::move(nodeTemp.lhs); + nodeTemp.lhs = std::move(treap); + treap = std::move(temp); + } + } + } + + static void mergeTreaps(CoWPtr *target, CoWPtr lhs, + CoWPtr rhs) { + assert(!*target && "empty the target first"); + assert( + (lhs || rhs) && + "merging two empty subtreaps should be handled by hand, as it does not " + "require " + "acquisition of the object holding `*target` (usually a parent node)"); + for (;;) { + assert(!*target); + if (!lhs) { + *target = std::move(rhs); + break; + } + if (!rhs) { + *target = std::move(lhs); + break; + } + assert(lhs->getBaseAddress() < rhs->getBaseAddress() && + "tree property violated"); + if (lhs->getSize() > rhs->getSize() || + (lhs->getSize() == rhs->getSize() && lhs->hash() > rhs->hash())) { + // Ties w.r.t. the heap property (size) are explicitly broken using a + // hash derived from the tree key. At the time of writing, the "hash" + // function is a permutation (if `std::size_t` and `std::uintptr_t` are + // of the same size), which means that hash collisions are not just + // unlikely, but rather impossible. + Node &lhsNode = lhs.acquire(); + *target = std::move(lhs); + lhs = std::move(lhsNode.rhs); + target = &lhsNode.rhs; + } else { + Node &rhsNode = rhs.acquire(); + *target = std::move(rhs); + rhs = std::move(rhsNode.lhs); + target = &rhsNode.lhs; + } + } + assert(!lhs && "lhs must have been consumed"); + assert(!rhs && "rhs must have been consumed"); + } + +public: + constexpr SizedRegions() = default; + SizedRegions(SizedRegions const &other) = default; + SizedRegions &operator=(SizedRegions const &other) = default; + SizedRegions(SizedRegions &&other) = default; + SizedRegions &operator=(SizedRegions &&other) = default; + + [[nodiscard]] bool isEmpty() const noexcept { return !root; } + + [[nodiscard]] std::size_t getSize(char const *const address) const noexcept { + assert(root && "Cannot get size from an empty treap"); + + Node const *currentNode = root.get(); + Node const *closestPredecessor = nullptr; + Node const *closestSuccessor = nullptr; + while (currentNode) { + if (address < currentNode->getBaseAddress()) { + assert(!closestSuccessor || currentNode->getBaseAddress() < + closestSuccessor->getBaseAddress()); + closestSuccessor = currentNode; + currentNode = currentNode->lhs.get(); + } else { + assert(!closestPredecessor || currentNode->getBaseAddress() > + closestPredecessor->getBaseAddress()); + closestPredecessor = currentNode; + currentNode = currentNode->rhs.get(); + } + } + + assert(closestPredecessor && closestSuccessor && + "address must be in between two regions"); + + return closestSuccessor->getBaseAddress() - + (closestPredecessor->getBaseAddress() + + closestPredecessor->getSize()); + } + + /// Computes the LocationInfo. This functionality really belongs to the + /// `LargeObjectAllocator`, as it assumes that this treap contains free + /// regions in between allocations. It also knows that there is a redzone at + /// the beginning and end and in between any two allocations. + inline LocationInfo getLocationInfo(char const *const address, + std::size_t const size) const noexcept { + assert(root && "Cannot compute location info for an empty treap"); + + Node const *currentNode = root.get(); + Node const *closestPredecessor = nullptr; + while (currentNode) { + if (address < currentNode->getBaseAddress()) { + if (address + size > currentNode->getBaseAddress()) { + return LocationInfo::LI_Unaligned; + } + currentNode = currentNode->lhs.get(); + } else { + if (address < currentNode->getBaseAddress() + currentNode->getSize()) { + if (address + size > + currentNode->getBaseAddress() + currentNode->getSize()) { + return LocationInfo::LI_Unaligned; + } else { + return LocationInfo::LI_Unallocated; + } + } + assert(!closestPredecessor || currentNode->getBaseAddress() > + closestPredecessor->getBaseAddress()); + closestPredecessor = currentNode; + currentNode = currentNode->rhs.get(); + } + } + + assert(closestPredecessor && "the caller must ensure that the requested " + "address is in range of the sized region"); + + return {LocationInfo::LI_AllocatedOrQuarantined, + closestPredecessor->getBaseAddress() + + closestPredecessor->getSize()}; + } + + void insert(char *const baseAddress, std::size_t const size) { + assert(size > 0 && "region to be inserted must contain at least one byte"); + insert(CoWPtr(CoWPtr::in_place_t{}, baseAddress, size)); + } + + void insert(CoWPtr region) { + assert(region && "region to be inserted must exist"); + assert(region->getSize() > 0 && + "region to be inserted must contain at least one byte"); + if (region->lhs || region->rhs) { + if (region.isOwned()) { + auto &node = region.acquire(); + node.lhs.release(); + node.rhs.release(); + } else { + // If region is not owned, then acquiring it would copy the `lhs` and + // `rhs` members, thereby incrementing and decrementing the refcounts in + // unrelated objects. To avoid this, we simply recreate the region. + region = CoWPtr(CoWPtr::in_place_t{}, + region->getBaseAddress(), region->getSize()); + } + } + assert(!region->lhs); + assert(!region->rhs); + + auto *target = &root; + while (*target && ((*target)->getSize() > region->getSize() || + ((*target)->getSize() == region->getSize() && + (*target)->hash() > region->hash()))) { + auto &node = target->acquire(); + assert(node.getBaseAddress() != region->getBaseAddress() && + "multiple insertions of the same tree-key are not supported"); + target = region->getBaseAddress() < node.getBaseAddress() ? &node.lhs + : &node.rhs; + } + if (!*target) { + *target = std::move(region); + } else { + insertRec(*target, std::move(region)); + } + } + + [[nodiscard]] CoWPtr const &getLargestRegion() const noexcept { + assert(root && "querying the largest region only makes sense if the " + "treap is not empty"); + return root; + } + + CoWPtr extractLargestRegion() { + assert(root && "cannot extract the largest region of an empty treap"); + + auto result = std::move(root); + if (result->lhs || result->rhs) { + auto &node = result.acquire(); + mergeTreaps(&root, std::move(node.lhs), std::move(node.rhs)); + } + return result; + } + +private: + static void pushDownRightHeap(CoWPtr *target, CoWPtr update, + CoWPtr rhs, std::size_t const newSize, + std::uintptr_t const newHash) { + while (rhs && (newSize < rhs->getSize() || + (newSize == rhs->getSize() && newHash < rhs->hash()))) { + // optimization opportunity: once lhs does not exist anymore, it will + // never exist in the future + *target = std::move(rhs); + auto &targetNode = target->acquire(); + rhs = std::move(targetNode.lhs); + target = &targetNode.lhs; + } + + update.getOwned()->rhs = std::move(rhs); + *target = std::move(update); + } + + static void pushDownLeftHeap(CoWPtr *target, CoWPtr update, + CoWPtr lhs, std::size_t const newSize, + std::uintptr_t const newHash) { + while (lhs && (newSize < lhs->getSize() || + (newSize == lhs->getSize() && newHash < lhs->hash()))) { + // optimization opportunity: once lhs does not exist anymore, it will + // never exist in the future + *target = std::move(lhs); + auto &targetNode = target->acquire(); + lhs = std::move(targetNode.rhs); + target = &targetNode.rhs; + } + + update.getOwned()->lhs = std::move(lhs); + *target = std::move(update); + } + +public: + void resizeLargestRegion(std::size_t const newSize) { + assert(root && "updating the largest region only makes sense if the " + "treap is not empty"); + + auto update = std::move(root); + auto &node = update.acquire(); + node.setSize(newSize); + auto const newHash = node.hash(); + auto lhs = std::move(node.lhs); + auto rhs = std::move(node.rhs); + + auto *target = &root; + + if (!lhs || !(newSize < lhs->getSize() || + (newSize == lhs->getSize() && newHash < lhs->hash()))) { + node.lhs = std::move(lhs); + pushDownRightHeap(target, std::move(update), std::move(rhs), newSize, + newHash); + } else if (!rhs || + !(newSize < rhs->getSize() || + (newSize == rhs->getSize() && newHash < rhs->hash()))) { + node.rhs = std::move(rhs); + pushDownLeftHeap(target, std::move(update), std::move(lhs), newSize, + newHash); + } else { + for (;;) { + assert(lhs && (newSize < lhs->getSize() || + (newSize == lhs->getSize() && newHash < lhs->hash()))); + assert(rhs && (newSize < rhs->getSize() || + (newSize == rhs->getSize() && newHash < rhs->hash()))); + + if (lhs->getSize() < rhs->getSize() || + (lhs->getSize() == rhs->getSize() && lhs->hash() < rhs->hash())) { + *target = std::move(rhs); + auto &targetNode = target->acquire(); + rhs = std::move(targetNode.lhs); + target = &targetNode.lhs; + + if (!rhs || !(newSize < rhs->getSize() || + (newSize == rhs->getSize() && newHash < rhs->hash()))) { + node.rhs = std::move(rhs); + pushDownLeftHeap(target, std::move(update), std::move(lhs), newSize, + newHash); + return; + } + } else { + *target = std::move(lhs); + auto &targetNode = target->acquire(); + lhs = std::move(targetNode.rhs); + target = &targetNode.rhs; + + if (!lhs || !(newSize < lhs->getSize() || + (newSize == lhs->getSize() && newHash < lhs->hash()))) { + node.lhs = std::move(lhs); + pushDownRightHeap(target, std::move(update), std::move(rhs), + newSize, newHash); + return; + } + } + } + } + } + + CoWPtr extractRegion(char const *const baseAddress) { + CoWPtr *target = &root; + for (;;) { + assert(*target && "cannot extract region that is not part of the treap"); + if ((*target)->getBaseAddress() < baseAddress) { + target = &target->acquire().rhs; + } else if ((*target)->getBaseAddress() > baseAddress) { + target = &target->acquire().lhs; + } else { + assert((*target)->getBaseAddress() == baseAddress); + auto result = std::move(*target); + if (result->lhs || result->rhs) { + auto &node = result.acquire(); + mergeTreaps(target, std::move(node.lhs), std::move(node.rhs)); + } + return result; + } + } + } + + /// This function merges the region after the given address, with the region + /// immediately preceding it. There must be a region before and a region after + /// `address`. + void mergeAroundAddress(char const *const address) noexcept { + assert(root && "An empty treap holds no regions to merge"); + + CoWPtr *currentNode = &root; + CoWPtr *closestPredecessor = nullptr; + CoWPtr *closestSuccessor = nullptr; + for (;;) { + if (address < (*currentNode)->getBaseAddress()) { + assert(!closestSuccessor || (*currentNode)->getBaseAddress() < + (*closestSuccessor)->getBaseAddress()); + closestSuccessor = currentNode; + if ((*currentNode)->lhs) { + currentNode = ¤tNode->acquire().lhs; + } else { + break; + } + } else { + assert(!closestPredecessor || + (*currentNode)->getBaseAddress() > + (*closestPredecessor)->getBaseAddress()); + closestPredecessor = currentNode; + if ((*currentNode)->rhs) { + currentNode = ¤tNode->acquire().rhs; + } else { + break; + } + } + } + + assert(closestPredecessor && closestSuccessor && + "address must be in between two regions"); + + closestPredecessor->acquire().setSize( + (*closestSuccessor)->getBaseAddress() + (*closestSuccessor)->getSize() - + (*closestPredecessor)->getBaseAddress()); + CoWPtr lhs = (*closestSuccessor)->lhs; + CoWPtr rhs = (*closestSuccessor)->rhs; + closestSuccessor->release(); + if (lhs || rhs) { + mergeTreaps(closestSuccessor, lhs, rhs); + } + } + +private: + template + static void dumpRec(OutStream &out, std::string &prefix, + CoWPtr const &treap) { + if (treap) { + out << "[" << static_cast(treap->getBaseAddress()) << "; " + << static_cast(treap->getBaseAddress() + treap->getSize()) + << ") of size " << treap->getSize() << "\n"; + + auto oldPrefix = prefix.size(); + + out << prefix << "├"; + prefix += "│"; + dumpRec(out, prefix, treap->lhs); + + prefix.resize(oldPrefix); + + out << prefix << "╰"; + prefix += " "; + dumpRec(out, prefix, treap->rhs); + } else { + out << "\n"; + } + } + +public: + template OutStream &dump(OutStream &out) { + std::string prefix; + dumpRec(out, prefix, root); + return out; + } + +private: + static void checkInvariants(std::pair &result, + CoWPtr const &treap) { + if (!result.first && !result.second) { + return; + } + + if (treap->lhs) { + if (treap->lhs->getBaseAddress() >= treap->getBaseAddress()) { + result.first = false; + } + if (treap->lhs->getSize() > treap->getSize()) { + result.second = false; + } + checkInvariants(result, treap->lhs); + } + if (treap->rhs) { + if (treap->rhs->getBaseAddress() <= treap->getBaseAddress()) { + result.first = false; + } + if (treap->rhs->getSize() > treap->getSize()) { + result.second = false; + } + checkInvariants(result, treap->rhs); + } + } + +public: + std::pair checkInvariants() const { + std::pair result = {true, true}; + if (root) { + checkInvariants(result, root); + } + return result; + } +}; +} // namespace klee::kdalloc::suballocators + +#endif diff --git a/include/klee/KDAlloc/suballocators/slot_allocator.h b/include/klee/KDAlloc/suballocators/slot_allocator.h new file mode 100644 index 0000000000..9be5d2df4e --- /dev/null +++ b/include/klee/KDAlloc/suballocators/slot_allocator.h @@ -0,0 +1,590 @@ +//===-- slot_allocator.h ----------------------------------------*- C++ -*-===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef KDALLOC_SUBALLOCATORS_SLOT_ALLOCATOR_H +#define KDALLOC_SUBALLOCATORS_SLOT_ALLOCATOR_H + +#include "../define.h" +#include "../location_info.h" +#include "../tagged_logger.h" + +#include "klee/ADT/Bits.h" + +#include +#include +#include +#include +#include +#include + +namespace klee::kdalloc::suballocators { +namespace slotallocator { +template class SlotAllocator; + +struct Data final { + /// The reference count. + std::size_t referenceCount; // initial value is 1 as soon as this member + // is actually allocated + + /// The number of allocated words. Always non-negative. + std::ptrdiff_t capacity; // initial value is 0 (changes as soon as this + // member is actually allocated) + + /// Always less than or equal to the first word that contains a one bit. + /// Less than or equal to _capacity. Always non-negative. + std::ptrdiff_t firstFreeFinger; // initial value is 0 + + /// Always greater than or equal to the last word that contains a zero bit. + /// Less than _capacity. May be negative (exactly -1). + std::ptrdiff_t lastUsedFinger; // initial value is -1 + + /// position in the quarantine, followed by the quarantine ring buffer, + /// followed by the bitmap + std::size_t quarantineAndBitmap[]; +}; + +class Control final : public TaggedLogger { + template friend class SlotAllocator; + + /// pointer to the start of the range managed by this allocator + char *baseAddress = nullptr; + + /// size in bytes of the range managed by this allocator + std::size_t size = 0; + + /// size in bytes of the slots that are managed in this slot allocator + std::size_t slotSize = 0; + + /// number of bytes before the start of the bitmap (includes ordinary + /// members and quarantine) + std::size_t prefixSize = -1; + + /// quarantine size *including* the position (=> is never 1) + std::uint32_t quarantineSize = 0; + + /// true iff the quarantine is unlimited (=> quarantineSize == 0) + bool unlimitedQuarantine = false; + + [[nodiscard]] inline std::size_t + convertIndexToPosition(std::size_t index) const noexcept { + index += 1; + int const layer = + std::numeric_limits::digits - countLeadingZeroes(index); + auto const layerSlots = static_cast(1) << (layer - 1); + auto const currentSlotSize = (size >> layer); + assert(currentSlotSize > slotSize && "Zero (or below) red zone size!"); + + auto const highBit = static_cast(1) << (layer - 1); + assert((index & highBit) != 0 && "Failed to compute high bit"); + assert((index ^ highBit) < highBit && "Failed to compute high bit"); + + auto layerIndex = index ^ highBit; + if (layerIndex % 2 == 0) { + layerIndex /= 2; // drop trailing 0 + } else { + layerIndex /= 2; // drop trailing 1 + layerIndex = layerSlots - 1 - layerIndex; + } + assert(layerIndex < highBit && "Invalid tempering"); + auto const pos = layerIndex * 2 + 1; + return currentSlotSize * pos; + } + + [[nodiscard]] inline std::size_t + convertPositionToIndex(std::size_t const Position) const noexcept { + int const trailingZeroes = countTrailingZeroes(Position); + auto const layer = countTrailingZeroes(size) - trailingZeroes; + auto const layerSlots = static_cast(1) << (layer - 1); + + auto const highBit = static_cast(1) << (layer - 1); + auto layerIndex = Position >> (trailingZeroes + 1); + assert(layerIndex < highBit && "Tempered value was not restored correctly"); + + if (layerIndex < (layerSlots + 1) / 2) { + layerIndex *= 2; // add trailing 0 + } else { + layerIndex = layerSlots - 1 - layerIndex; + layerIndex = layerIndex * 2 + 1; // add trailing 1 + } + assert(layerIndex < highBit && "Invalid reverse tempering"); + + auto const index = highBit ^ layerIndex; + return index - 1; + } + +public: + Control() = default; + Control(Control const &) = delete; + Control &operator=(Control const &) = delete; + Control(Control &&) = delete; + Control &operator=(Control &&) = delete; + + void initialize(void *const baseAddress, std::size_t const size, + std::size_t const slotSize, bool const unlimitedQuarantine, + std::uint32_t const quarantineSize) noexcept { + assert(size > 0 && (size & (size - 1)) == 0 && + "Sizes of sized bins must be powers of two"); + + this->baseAddress = static_cast(baseAddress); + this->size = size; + this->slotSize = slotSize; + if (unlimitedQuarantine) { + this->quarantineSize = 0; + this->unlimitedQuarantine = true; + } else { + this->quarantineSize = quarantineSize == 0 ? 0 : quarantineSize + 1; + this->unlimitedQuarantine = false; + } + this->prefixSize = + sizeof(Data) + this->quarantineSize * sizeof(std::size_t); + + traceLine("Initialization complete"); + } + + inline std::ostream &logTag(std::ostream &out) const noexcept { + return out << "[slot " << slotSize << " Control] "; + } + + bool isQuarantineUnlimited() const noexcept { return unlimitedQuarantine; } + + constexpr void *mapping_begin() const noexcept { return baseAddress; } + constexpr void *mapping_end() const noexcept { + return static_cast(static_cast(baseAddress) + size); + } +}; + +template <> +class SlotAllocator final : public TaggedLogger> { + static_assert(static_cast(-1) == ~static_cast(0), + "-1 must be ~0 for size_t"); + + static_assert(std::is_trivial::value && + std::is_standard_layout::value, + "Data must be POD"); + + Data *data = nullptr; + + inline void releaseData() noexcept { + if (data) { + --data->referenceCount; + if (data->referenceCount == 0) { + std::free(data); + } + data = nullptr; + } + } + + inline void acquireData(Control const &Control) noexcept { + assert(!!data); + if (data->referenceCount > 1) { + auto newCapacity = computeNextCapacity( + getLastUsed(Control) + + 1); // one more, since `getLastUsed` is an index, not a size + auto objectSize = Control.prefixSize + newCapacity * sizeof(std::size_t); + auto newData = static_cast(std::malloc(objectSize)); + assert(newData && "allocation failure"); + + std::memcpy(newData, data, + static_cast( + reinterpret_cast( + &data->quarantineAndBitmap[Control.quarantineSize + + data->lastUsedFinger] + + 1) - + reinterpret_cast(data))); + newData->referenceCount = 1; + newData->capacity = newCapacity; + std::fill( + &newData->quarantineAndBitmap[Control.quarantineSize + + newData->lastUsedFinger + 1], + &newData->quarantineAndBitmap[Control.quarantineSize + newCapacity], + ~static_cast(0)); + + --data->referenceCount; + assert(data->referenceCount > 0); + data = newData; + } + assert(data->referenceCount == 1); + } + + std::size_t quarantine(Control const &control, std::size_t const index) { + assert(!!data && + "Deallocations can only happen if allocations happened beforehand"); + + if (control.quarantineSize == 0) { + return index; + } + + assert(data->referenceCount == 1 && + "Must hold CoW ownership to quarantine a new index"); + + auto const pos = data->quarantineAndBitmap[0]; + if (pos + 1 == control.quarantineSize) { + data->quarantineAndBitmap[0] = 1; + } else { + data->quarantineAndBitmap[0] = pos + 1; + } + + return std::exchange(data->quarantineAndBitmap[pos], index); + } + + inline static constexpr std::ptrdiff_t + computeNextCapacity(std::ptrdiff_t oldCapacity) noexcept { + assert(oldCapacity >= 0); + assert(oldCapacity < + (std::numeric_limits::max)() / + std::max(8, sizeof(std::uint64_t))); + return std::max(8, (oldCapacity * 7) / 4); + } + + /// Get index of first word that contains a one bit. (Internally update the + /// associated finger.) + [[nodiscard]] std::ptrdiff_t + getFirstFree(Control const &control) const noexcept { + if (!data) { + return 0; + } + + assert(data->firstFreeFinger >= 0); + assert(data->firstFreeFinger <= data->capacity); + + while (data->firstFreeFinger < data->capacity && + data->quarantineAndBitmap[control.quarantineSize + + data->firstFreeFinger] == 0) { + ++data->firstFreeFinger; + } + assert(data->firstFreeFinger <= data->capacity); + + return data->firstFreeFinger; + } + + /// Get index of last word that contains a zero bit. (Internally update the + /// associated finger.) + [[nodiscard]] inline std::ptrdiff_t + getLastUsed(Control const &control) const noexcept { + if (!data) { + return -1; + } + + assert(data->lastUsedFinger >= -1); + assert(data->lastUsedFinger < data->capacity); + + while (data->lastUsedFinger >= 0 && + ~data->quarantineAndBitmap[control.quarantineSize + + data->lastUsedFinger] == 0) { + --data->lastUsedFinger; + } + assert(data->lastUsedFinger >= -1); + + return data->lastUsedFinger; + } + + /// Returns true iff the bit at `index` is used + [[nodiscard]] bool isUsed(Control const &control, + std::size_t const index) const noexcept { + if (!data) { + return false; + } + + auto const loc = static_cast( + index / std::numeric_limits::digits); + auto const shift = + static_cast(index % std::numeric_limits::digits); + + if (loc <= data->lastUsedFinger) { + return (data->quarantineAndBitmap[control.quarantineSize + loc] & + (static_cast(1) << shift)) == 0; + } else { + return false; + } + } + + void setFree(Control const &control, std::size_t const index) noexcept { + auto const loc = static_cast( + index / std::numeric_limits::digits); + auto const shift = + static_cast(index % std::numeric_limits::digits); + + assert(!!data); + assert(loc <= data->lastUsedFinger); + assert(data->lastUsedFinger < data->capacity); + // 0 <= loc <= _last_used_finger < _capacity + + acquireData(control); + + auto word = data->quarantineAndBitmap[control.quarantineSize + loc]; + auto const mask = static_cast(1) << shift; + assert((word & mask) == 0); + word ^= mask; + data->quarantineAndBitmap[control.quarantineSize + loc] = word; + + if (~word == 0 && loc == data->lastUsedFinger) { + data->lastUsedFinger = loc - 1; + } + + if (loc < data->firstFreeFinger) { + data->firstFreeFinger = loc; + } + } + + /// Toggles the first free bit to allocated and returns its index + [[nodiscard]] std::size_t + setFirstFreeToUsed(Control const &control) noexcept { + auto const loc = getFirstFree(control); + if (!data) { + auto newCapacity = computeNextCapacity(0); + auto objectSize = control.prefixSize + newCapacity * sizeof(std::size_t); + data = static_cast(std::malloc(objectSize)); + assert(data && "allocation failure"); + data->referenceCount = 1; + data->capacity = newCapacity; + data->firstFreeFinger = 0; + data->lastUsedFinger = -1; + + if (control.quarantineSize == 0) { + std::fill(&data->quarantineAndBitmap[0], + &data->quarantineAndBitmap[newCapacity], + ~static_cast(0)); + } else { + data->quarantineAndBitmap[0] = 1; + std::fill( + &data->quarantineAndBitmap[1], + &data->quarantineAndBitmap[control.quarantineSize + newCapacity], + ~static_cast(0)); + } + } else { + if (loc == data->capacity && data->referenceCount == 1) { + auto newCapacity = computeNextCapacity(data->capacity); + auto objectSize = + control.prefixSize + newCapacity * sizeof(std::size_t); + data = static_cast(std::realloc(data, objectSize)); + assert(data && "allocation failure"); + std::fill( + &data->quarantineAndBitmap[control.quarantineSize + data->capacity], + &data->quarantineAndBitmap[control.quarantineSize + newCapacity], + ~static_cast(0)); + data->capacity = newCapacity; + } else { + acquireData(control); + assert(loc < data->capacity && + "acquire_data performs a growth step in the sense of " + "`computeNextCapacity`"); + } + } + + assert(!!data); + assert(data->referenceCount == 1); + assert(loc < data->capacity); + + auto word = data->quarantineAndBitmap[control.quarantineSize + loc]; + auto const shift = countTrailingZeroes(word); + auto const mask = static_cast(1) << shift; + assert((word & mask) == mask); + word ^= mask; + data->quarantineAndBitmap[control.quarantineSize + loc] = word; + + if (word == 0 && data->firstFreeFinger == loc) { + data->firstFreeFinger = loc + 1; + } + + if (loc > data->lastUsedFinger) { + data->lastUsedFinger = loc; + } + + return static_cast( + loc * std::numeric_limits::digits + shift); + } + +public: + constexpr SlotAllocator() = default; + + SlotAllocator(SlotAllocator const &rhs) noexcept : data(rhs.data) { + if (data) { + ++data->referenceCount; + assert(data->referenceCount > 1); + } + } + + SlotAllocator &operator=(SlotAllocator const &rhs) noexcept { + if (data != rhs.data) { + releaseData(); + data = rhs.data; + if (data) { + ++data->referenceCount; + assert(data->referenceCount > 1); + } + } + return *this; + } + + SlotAllocator(SlotAllocator &&rhs) noexcept + : data(std::exchange(rhs.data, nullptr)) { + assert(data == nullptr || data->referenceCount > 0); + } + + SlotAllocator &operator=(SlotAllocator &&rhs) noexcept { + if (data != rhs.data) { + releaseData(); + data = std::exchange(rhs.data, nullptr); + } + return *this; + } + + ~SlotAllocator() noexcept { releaseData(); } + + inline std::ostream &logTag(std::ostream &out) const noexcept { + return out << "[slot] "; + } + + LocationInfo getLocationInfo(Control const &control, void const *const ptr, + std::size_t const size) const noexcept { + assert(control.mapping_begin() <= ptr && + reinterpret_cast(ptr) + size < control.mapping_end() && + "This property should have been ensured by the caller"); + + auto const begin = static_cast(static_cast(ptr) - + control.baseAddress); + auto const end = static_cast(static_cast(ptr) + + size - control.baseAddress); + assert(control.slotSize > 0 && "Uninitialized Control structure"); + auto const pos = begin - begin % control.slotSize; + if (pos != (end - 1) - (end - 1) % control.slotSize) { + return LocationInfo::LI_Unaligned; + } + + auto const index = control.convertPositionToIndex(pos); + auto const loc = static_cast( + index / std::numeric_limits::digits); + auto const shift = + static_cast(index % std::numeric_limits::digits); + + if (!data || loc > data->lastUsedFinger) { + return LocationInfo::LI_Unallocated; + } + assert(data->lastUsedFinger < data->capacity); + + auto word = data->quarantineAndBitmap[control.quarantineSize + loc]; + auto const mask = static_cast(1) << shift; + if ((word & mask) == 0) { + return {LocationInfo::LI_AllocatedOrQuarantined, + control.baseAddress + pos}; + } else { + return LocationInfo::LI_Unallocated; + } + } + + [[nodiscard]] void *allocate(Control const &control) noexcept { + traceLine("Allocating ", control.slotSize, " bytes"); + traceContents(control); + + auto const index = setFirstFreeToUsed(control); + return control.baseAddress + control.convertIndexToPosition(index); + } + + void deallocate(Control const &control, void *const ptr) { + assert(!!data && + "Deallocations can only happen if allocations happened beforehand"); + + auto pos = static_cast(static_cast(ptr) - + control.baseAddress); + acquireData(control); // we will need quarantine and/or bitmap ownership + + traceLine("Quarantining ", ptr, " as ", pos, " for ", + control.quarantineSize, " deallocations"); + pos = quarantine(control, pos); + + if (pos == static_cast(-1)) { + traceLine("Nothing to deallocate"); + } else { + traceLine("Deallocating ", pos); + traceContents(control); + assert(pos < control.size); + + setFree(control, control.convertPositionToIndex(pos)); + } + } + + void traceContents(Control const &control) const noexcept { + static_cast(control); + +#if KDALLOC_TRACE >= 2 + traceLine("bitmap:"); + bool isEmpty = true; + for (std::size_t i = 0; i < data->capacity; ++i) { + if (is_used(Control, i)) { + isEmpty = false; + traceLine(" ", i, " ", + static_cast(control.baseAddress + + control.convertIndexToPosition(i))); + } + } + if (isEmpty) { + traceLine(" "); + } +#else + traceLine("bitmap has a capacity of ", data ? data->capacity : 0, + " entries"); +#endif + } +}; + +template <> +class SlotAllocator final : public TaggedLogger> { + std::size_t next; + +public: + inline std::ostream &logTag(std::ostream &out) const noexcept { + return out << "[uslot] "; + } + + LocationInfo getLocationInfo(Control const &control, void const *const ptr, + std::size_t const size) const noexcept { + assert(control.mapping_begin() <= ptr && + reinterpret_cast(ptr) + size < control.mapping_end() && + "This property should have been ensured by the caller"); + + auto const begin = static_cast(static_cast(ptr) - + control.baseAddress); + auto const end = static_cast(static_cast(ptr) + + size - control.baseAddress); + assert(control.slotSize > 0 && "Uninitialized Control structure"); + auto const pos = begin - begin % control.slotSize; + if (pos != (end - 1) - (end - 1) % control.slotSize) { + return LocationInfo::LI_Unaligned; + } + + auto const index = control.convertPositionToIndex(pos); + if (index >= next) { + return LocationInfo::LI_Unallocated; + } else { + return {LocationInfo::LI_AllocatedOrQuarantined, + control.baseAddress + pos}; + } + } + + [[nodiscard]] void *allocate(Control const &control) noexcept { + traceLine("Allocating ", control.slotSize, " bytes"); + + return control.baseAddress + control.convertIndexToPosition(next++); + } + + void deallocate(Control const &control, void *const ptr) { + traceLine("Quarantining ", ptr, " for ever"); + } + + void traceContents(Control const &) const noexcept { + traceLine("next: ", next); + } +}; +} // namespace slotallocator + +using slotallocator::SlotAllocator; +using SlotAllocatorControl = slotallocator::Control; +} // namespace klee::kdalloc::suballocators + +#endif diff --git a/include/klee/KDAlloc/tagged_logger.h b/include/klee/KDAlloc/tagged_logger.h new file mode 100644 index 0000000000..e0c9c194e8 --- /dev/null +++ b/include/klee/KDAlloc/tagged_logger.h @@ -0,0 +1,43 @@ +//===-- tagged_logger.h -----------------------------------------*- C++ -*-===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef KDALLOC_UTIL_TAGGED_LOGGER_H +#define KDALLOC_UTIL_TAGGED_LOGGER_H + +#include "define.h" + +#include + +#if KDALLOC_TRACE >= 1 +#include +#endif + +namespace klee::kdalloc { +template class TaggedLogger { + template inline void traceLineImpl(O &out) const noexcept { + out << "\n"; + } + + template + inline void traceLineImpl(O &out, T &&head, V &&...tail) const noexcept { + out << head; + traceLineImpl(out, std::forward(tail)...); + } + +protected: + template inline void traceLine(V &&...args) const noexcept { +#if KDALLOC_TRACE >= 1 + traceLineImpl(static_cast(this)->logTag(std::cout), + std::forward(args)); +#endif + } +}; +} // namespace klee::kdalloc + +#endif diff --git a/include/klee/Module/KCallable.h b/include/klee/Module/KCallable.h new file mode 100644 index 0000000000..ade28cfc82 --- /dev/null +++ b/include/klee/Module/KCallable.h @@ -0,0 +1,77 @@ +//===-- KCallable.h ---------------------------------------------*- C++ -*-===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef KLEE_KCALLABLE_H +#define KLEE_KCALLABLE_H + +#include + +#include "klee/Support/CompilerWarning.h" +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS +#include "llvm/ADT/Twine.h" +#include "llvm/IR/Function.h" +#include "llvm/IR/InlineAsm.h" +#include "llvm/IR/LLVMContext.h" +DISABLE_WARNING_POP + +namespace klee { +/// Wrapper for callable objects passed in callExternalFunction +class KCallable { +public: + enum CallableKind { CK_Function, CK_InlineAsm }; + +private: + const CallableKind Kind; + +public: + KCallable(CallableKind Kind) : Kind(Kind) {} + + CallableKind getKind() const { return Kind; } + + virtual llvm::StringRef getName() const = 0; + virtual llvm::FunctionType *getFunctionType() const = 0; + virtual llvm::Value *getValue() = 0; + + virtual ~KCallable() = default; +}; + +class KInlineAsm : public KCallable { +private: + static unsigned getFreshAsmId() { + static unsigned globalId = 0; + return globalId++; + } + + llvm::InlineAsm *value; + std::string name; + +public: + KInlineAsm(llvm::InlineAsm *value) + : KCallable(CK_InlineAsm), value(value), + name("__asm__" + llvm::Twine(getFreshAsmId()).str()) {} + + llvm::StringRef getName() const override { return name; } + + llvm::FunctionType *getFunctionType() const override { + return value->getFunctionType(); + } + + llvm::Value *getValue() override { return value; } + + static bool classof(const KCallable *callable) { + return callable->getKind() == CK_InlineAsm; + } + + llvm::InlineAsm *getInlineAsm() { return value; } +}; + +} // namespace klee + +#endif /* KLEE_KCALLABLE_H */ diff --git a/include/klee/Module/KModule.h b/include/klee/Module/KModule.h index 9c24cb31fc..e2dc71d1a2 100644 --- a/include/klee/Module/KModule.h +++ b/include/klee/Module/KModule.h @@ -12,6 +12,7 @@ #include "klee/Config/Version.h" #include "klee/Core/Interpreter.h" +#include "klee/Module/KCallable.h" #include "llvm/ADT/ArrayRef.h" @@ -39,7 +40,7 @@ namespace klee { class KModule; template class ref; - struct KFunction { + struct KFunction : public KCallable { llvm::Function *function; unsigned numArgs, numRegisters; @@ -53,14 +54,25 @@ namespace klee { /// "coverable" for statistics and search heuristics. bool trackCoverage; - public: - explicit KFunction(llvm::Function*, KModule *); + explicit KFunction(llvm::Function*, KModule*); KFunction(const KFunction &) = delete; KFunction &operator=(const KFunction &) = delete; ~KFunction(); unsigned getArgRegister(unsigned index) { return index; } + + llvm::StringRef getName() const override { return function->getName(); } + + llvm::FunctionType *getFunctionType() const override { + return function->getFunctionType(); + } + + llvm::Value *getValue() override { return function; } + + static bool classof(const KCallable *callable) { + return callable->getKind() == CK_Function; + } }; diff --git a/include/klee/Solver/Common.h b/include/klee/Solver/Common.h index 7b2441586a..626ea55a41 100644 --- a/include/klee/Solver/Common.h +++ b/include/klee/Solver/Common.h @@ -24,13 +24,10 @@ namespace klee { const char ALL_QUERIES_KQUERY_FILE_NAME[]="all-queries.kquery"; const char SOLVER_QUERIES_KQUERY_FILE_NAME[]="solver-queries.kquery"; - Solver *constructSolverChain(Solver *coreSolver, - std::string querySMT2LogPath, - std::string baseSolverQuerySMT2LogPath, - std::string queryKQueryLogPath, - std::string baseSolverQueryKQueryLogPath); -} - - +std::unique_ptr constructSolverChain( + std::unique_ptr coreSolver, std::string querySMT2LogPath, + std::string baseSolverQuerySMT2LogPath, std::string queryKQueryLogPath, + std::string baseSolverQueryKQueryLogPath); +} // namespace klee #endif /* KLEE_COMMON_H */ diff --git a/include/klee/Solver/IncompleteSolver.h b/include/klee/Solver/IncompleteSolver.h index 3841c38bcc..1a45405b30 100644 --- a/include/klee/Solver/IncompleteSolver.h +++ b/include/klee/Solver/IncompleteSolver.h @@ -13,6 +13,8 @@ #include "klee/Solver/Solver.h" #include "klee/Solver/SolverImpl.h" +#include + namespace klee { /// IncompleteSolver - Base class for incomplete solver @@ -61,25 +63,23 @@ class IncompleteSolver { /// The IncompleteSolver class provides an implementation of /// computeValidity using computeTruth. Sub-classes may override /// this if a more efficient implementation is available. - virtual IncompleteSolver::PartialValidity computeValidity(const Query&); + virtual IncompleteSolver::PartialValidity computeValidity(const Query &); /// computeValidity - Compute a partial validity for the given query. /// /// The passed expression is non-constant with bool type. - virtual IncompleteSolver::PartialValidity computeTruth(const Query&) = 0; - + virtual IncompleteSolver::PartialValidity computeTruth(const Query &) = 0; + /// computeValue - Attempt to compute a value for the given expression. - virtual bool computeValue(const Query&, ref &result) = 0; + virtual bool computeValue(const Query &, ref &result) = 0; /// computeInitialValues - Attempt to compute the constant values /// for the initial state of each given object. If a correct result /// is not found, then the values array must be unmodified. - virtual bool computeInitialValues(const Query&, - const std::vector - &objects, - std::vector< std::vector > - &values, - bool &hasSolution) = 0; + virtual bool + computeInitialValues(const Query &, const std::vector &objects, + std::vector> &values, + bool &hasSolution) = 0; }; /// StagedSolver - Adapter class for staging an incomplete solver with @@ -87,25 +87,25 @@ class IncompleteSolver { /// solver. class StagedSolverImpl : public SolverImpl { private: - IncompleteSolver *primary; - Solver *secondary; - + std::unique_ptr primary; + std::unique_ptr secondary; + public: - StagedSolverImpl(IncompleteSolver *_primary, Solver *_secondary); - ~StagedSolverImpl(); - - bool computeTruth(const Query&, bool &isValid); - bool computeValidity(const Query&, Solver::Validity &result); - bool computeValue(const Query&, ref &result); - bool computeInitialValues(const Query&, - const std::vector &objects, - std::vector< std::vector > &values, - bool &hasSolution); - SolverRunStatus getOperationStatusCode(); - char *getConstraintLog(const Query&); - void setCoreSolverTimeout(time::Span timeout); + StagedSolverImpl(std::unique_ptr primary, + std::unique_ptr secondary); + + bool computeTruth(const Query &, bool &isValid) override; + bool computeValidity(const Query &, Solver::Validity &result) override; + bool computeValue(const Query &, ref &result) override; + bool computeInitialValues(const Query &, + const std::vector &objects, + std::vector> &values, + bool &hasSolution) override; + SolverRunStatus getOperationStatusCode() override; + std::string getConstraintLog(const Query &) override; + void setCoreSolverTimeout(time::Span timeout) override; }; -} +} // namespace klee #endif /* KLEE_INCOMPLETESOLVER_H */ diff --git a/include/klee/Solver/Solver.h b/include/klee/Solver/Solver.h index 263f16266e..8679cb87c6 100644 --- a/include/klee/Solver/Solver.h +++ b/include/klee/Solver/Solver.h @@ -14,6 +14,8 @@ #include "klee/System/Time.h" #include "klee/Solver/SolverCmdLine.h" +#include +#include #include namespace klee { @@ -58,10 +60,6 @@ namespace klee { }; class Solver { - // DO NOT IMPLEMENT. - Solver(const Solver&); - void operator=(const Solver&); - public: enum Validity { True = 1, @@ -69,15 +67,12 @@ namespace klee { Unknown = 0 }; - public: /// validity_to_str - Return the name of given Validity enum value. static const char *validity_to_str(Validity v); - public: - SolverImpl *impl; + std::unique_ptr impl; - public: - Solver(SolverImpl *_impl) : impl(_impl) {} + Solver(std::unique_ptr impl); virtual ~Solver(); /// evaluate - Determine for a particular state if the query @@ -208,7 +203,7 @@ namespace klee { // FIXME: This should go into a helper class, and should handle failure. virtual std::pair< ref, ref > getRange(const Query&); - virtual char *getConstraintLog(const Query& query); + virtual std::string getConstraintLog(const Query& query); virtual void setCoreSolverTimeout(time::Span timeout); }; @@ -221,19 +216,22 @@ namespace klee { /// /// \param s - The primary underlying solver to use. /// \param oracle - The solver to check query results against. - Solver *createValidatingSolver(Solver *s, Solver *oracle); + std::unique_ptr createValidatingSolver(std::unique_ptr s, + Solver *oracle, + bool ownsOracle); /// createAssignmentValidatingSolver - Create a solver that when requested /// for an assignment will check that the computed assignment satisfies /// the Query. /// \param s - The underlying solver to use. - Solver *createAssignmentValidatingSolver(Solver *s); + std::unique_ptr + createAssignmentValidatingSolver(std::unique_ptr s); /// createCachingSolver - Create a solver which will cache the queries in /// memory (without eviction). /// /// \param s - The underlying solver to use. - Solver *createCachingSolver(Solver *s); + std::unique_ptr createCachingSolver(std::unique_ptr s); /// createCexCachingSolver - Create a counterexample caching solver. This is a /// more sophisticated cache which records counterexamples for a constraint @@ -241,41 +239,40 @@ namespace klee { /// quickly find satisfying assignments. /// /// \param s - The underlying solver to use. - Solver *createCexCachingSolver(Solver *s); + std::unique_ptr createCexCachingSolver(std::unique_ptr s); /// createFastCexSolver - Create a "fast counterexample solver", which tries /// to quickly compute a satisfying assignment for a constraint set using /// value propogation and range analysis. /// /// \param s - The underlying solver to use. - Solver *createFastCexSolver(Solver *s); + std::unique_ptr createFastCexSolver(std::unique_ptr s); /// createIndependentSolver - Create a solver which will eliminate any /// unnecessary constraints before propogating the query to the underlying /// solver. /// /// \param s - The underlying solver to use. - Solver *createIndependentSolver(Solver *s); - + std::unique_ptr createIndependentSolver(std::unique_ptr s); + /// createKQueryLoggingSolver - Create a solver which will forward all queries /// after writing them to the given path in .kquery format. - Solver *createKQueryLoggingSolver(Solver *s, std::string path, - time::Span minQueryTimeToLog, - bool logTimedOut); + std::unique_ptr + createKQueryLoggingSolver(std::unique_ptr s, std::string path, + time::Span minQueryTimeToLog, bool logTimedOut); /// createSMTLIBLoggingSolver - Create a solver which will forward all queries /// after writing them to the given path in .smt2 format. - Solver *createSMTLIBLoggingSolver(Solver *s, std::string path, - time::Span minQueryTimeToLog, - bool logTimedOut); - + std::unique_ptr + createSMTLIBLoggingSolver(std::unique_ptr s, std::string path, + time::Span minQueryTimeToLog, bool logTimedOut); /// createDummySolver - Create a dummy solver implementation which always /// fails. - Solver *createDummySolver(); + std::unique_ptr createDummySolver(); // Create a solver based on the supplied ``CoreSolverType``. - Solver *createCoreSolver(CoreSolverType cst); -} + std::unique_ptr createCoreSolver(CoreSolverType cst); + } // namespace klee #endif /* KLEE_SOLVER_H */ diff --git a/include/klee/Solver/SolverCmdLine.h b/include/klee/Solver/SolverCmdLine.h index b453d058dc..4414dc7ae1 100644 --- a/include/klee/Solver/SolverCmdLine.h +++ b/include/klee/Solver/SolverCmdLine.h @@ -16,9 +16,15 @@ #define KLEE_SOLVERCMDLINE_H #include "klee/Config/config.h" +#include "klee/Support/CompilerWarning.h" +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS #include "llvm/ADT/ArrayRef.h" #include "llvm/Support/CommandLine.h" +DISABLE_WARNING_POP + +#include namespace klee { @@ -82,12 +88,12 @@ extern llvm::cl::opt MetaSMTBackend; class KCommandLine { public: - /// Hide all options in the specified category - static void HideOptions(llvm::cl::OptionCategory &Category); - - /// Hide all options except the ones in the specified category - static void HideUnrelatedOptions(llvm::cl::OptionCategory &Category); + /// Keep only the options in the provided categories, + /// together with --help, --help-list, --version and --color + static void + KeepOnlyCategories(std::set const &categories); }; + } // namespace klee #endif /* KLEE_SOLVERCMDLINE_H */ diff --git a/include/klee/Solver/SolverImpl.h b/include/klee/Solver/SolverImpl.h index f03db9648c..a8b4f8e486 100644 --- a/include/klee/Solver/SolverImpl.h +++ b/include/klee/Solver/SolverImpl.h @@ -23,12 +23,12 @@ namespace klee { /// SolverImpl - Abstract base clase for solver implementations. class SolverImpl { - // DO NOT IMPLEMENT. - SolverImpl(const SolverImpl&); - void operator=(const SolverImpl&); - public: - SolverImpl() {} + SolverImpl() = default; + + SolverImpl(const SolverImpl&) = delete; + SolverImpl& operator=(const SolverImpl&) = delete; + virtual ~SolverImpl(); enum SolverRunStatus { SOLVER_RUN_STATUS_SUCCESS_SOLVABLE, @@ -101,9 +101,9 @@ namespace klee { /// status code static const char* getOperationStatusString(SolverRunStatus statusCode); - virtual char *getConstraintLog(const Query& query) { - // dummy - return nullptr; + virtual std::string getConstraintLog(const Query &query) { + // dummy + return {}; } virtual void setCoreSolverTimeout(time::Span timeout) {}; diff --git a/include/klee/Solver/SolverStats.h b/include/klee/Solver/SolverStats.h index fe14d9e555..fd4a3ab6cc 100644 --- a/include/klee/Solver/SolverStats.h +++ b/include/klee/Solver/SolverStats.h @@ -16,6 +16,7 @@ namespace klee { namespace stats { extern Statistic cexCacheTime; + extern Statistic solverQueries; extern Statistic queries; extern Statistic queriesInvalid; extern Statistic queriesValid; diff --git a/include/klee/Statistics/Statistic.h b/include/klee/Statistics/Statistic.h index bbb67116db..e675b06741 100644 --- a/include/klee/Statistics/Statistic.h +++ b/include/klee/Statistics/Statistic.h @@ -10,6 +10,7 @@ #ifndef KLEE_STATISTIC_H #define KLEE_STATISTIC_H +#include #include namespace klee { diff --git a/include/klee/Support/Casting.h b/include/klee/Support/Casting.h index 865218a065..5b04380e74 100644 --- a/include/klee/Support/Casting.h +++ b/include/klee/Support/Casting.h @@ -21,14 +21,7 @@ using llvm::cast_or_null; using llvm::dyn_cast; using llvm::dyn_cast_or_null; using llvm::isa; -#if LLVM_VERSION_CODE >= LLVM_VERSION(9, 0) using llvm::isa_and_nonnull; -#else -template -inline bool isa_and_nonnull(const Y &value) { - return value && isa(value); -} -#endif } // namespace klee diff --git a/include/klee/Support/CompilerWarning.h b/include/klee/Support/CompilerWarning.h new file mode 100644 index 0000000000..41029decd7 --- /dev/null +++ b/include/klee/Support/CompilerWarning.h @@ -0,0 +1,39 @@ +//===-- CompilerWarning.h ---------------------------------------*- C++ -*-===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef KLEE_INCLUDE_KLEE_SUPPORT_COMPILERWARNING_H +#define KLEE_INCLUDE_KLEE_SUPPORT_COMPILERWARNING_H + +#include "klee/Config/Version.h" + +// Disables different warnings +#if defined(__GNUC__) || defined(__clang__) +#define ENABLE_PRAGMA(X) _Pragma(#X) +#define DISABLE_WARNING_PUSH ENABLE_PRAGMA(GCC diagnostic push) +#define DISABLE_WARNING_POP ENABLE_PRAGMA(GCC diagnostic pop) +#define DISABLE_WARNING(warningName) \ + ENABLE_PRAGMA(GCC diagnostic ignored #warningName) + +#if LLVM_VERSION_CODE >= LLVM_VERSION(14, 0) +#define DISABLE_WARNING_DEPRECATED_DECLARATIONS +#else +#define DISABLE_WARNING_DEPRECATED_DECLARATIONS \ + DISABLE_WARNING(-Wdeprecated-declarations) +#endif + +#else + +#define DISABLE_WARNING_PUSH +#define DISABLE_WARNING_POP +#define DISABLE_WARNING(warningName) + +#define DISABLE_WARNING_DEPRECATED_DECLARATIONS +#endif + +#endif // KLEE_INCLUDE_KLEE_SUPPORT_COMPILERWARNING_H diff --git a/include/klee/Support/FileHandling.h b/include/klee/Support/FileHandling.h index 90ce20b352..a0dd0e9575 100644 --- a/include/klee/Support/FileHandling.h +++ b/include/klee/Support/FileHandling.h @@ -10,7 +10,12 @@ #ifndef KLEE_FILEHANDLING_H #define KLEE_FILEHANDLING_H +#include "klee/Support/CompilerWarning.h" +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS #include "llvm/Support/raw_ostream.h" +DISABLE_WARNING_POP + #include #include diff --git a/include/klee/Support/FloatEvaluation.h b/include/klee/Support/FloatEvaluation.h deleted file mode 100644 index d6fcc73c66..0000000000 --- a/include/klee/Support/FloatEvaluation.h +++ /dev/null @@ -1,264 +0,0 @@ -//===-- FloatEvaluation.h ---------------------------------------*- C++ -*-===// -// -// The KLEE Symbolic Virtual Machine -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -// FIXME: Ditch this and use APFloat. - -#ifndef KLEE_FLOATEVALUATION_H -#define KLEE_FLOATEVALUATION_H - -#include "IntEvaluation.h" // ints::sext - -#include "klee/ADT/Bits.h" // bits64::truncateToNBits - -#include "llvm/Support/ErrorHandling.h" -#include "llvm/Support/MathExtras.h" - -#include - -namespace klee { -namespace floats { - -// ********************************** // -// *** Pack uint64_t into FP types ** // -// ********************************** // - -// interpret the 64 bits as a double instead of a uint64_t -inline double UInt64AsDouble( uint64_t bits ) { - double ret; - assert( sizeof(bits) == sizeof(ret) ); - memcpy( &ret, &bits, sizeof bits ); - return ret; -} - -// interpret the first 32 bits as a float instead of a uint64_t -inline float UInt64AsFloat( uint64_t bits ) { - uint32_t tmp = bits; // ensure that we read correct bytes - float ret; - assert( sizeof(tmp) == sizeof(ret) ); - memcpy( &ret, &tmp, sizeof tmp ); - return ret; -} - - -// ********************************** // -// *** Pack FP types into uint64_t ** // -// ********************************** // - -// interpret the 64 bits as a uint64_t instead of a double -inline uint64_t DoubleAsUInt64( double d ) { - uint64_t ret; - assert( sizeof(d) == sizeof(ret) ); - memcpy( &ret, &d, sizeof d ); - return ret; -} - -// interpret the 32 bits as a uint64_t instead of as a float (add 32 0s) -inline uint64_t FloatAsUInt64( float f ) { - uint32_t tmp; - assert( sizeof(tmp) == sizeof(f) ); - memcpy( &tmp, &f, sizeof f ); - return (uint64_t)tmp; -} - - -// ********************************** // -// ************ Constants *********** // -// ********************************** // - -const unsigned FLT_BITS = 32; -const unsigned DBL_BITS = 64; - - - -// ********************************** // -// ***** LLVM Binary Operations ***** // -// ********************************** // - -// add of l and r -inline uint64_t add(uint64_t l, uint64_t r, unsigned inWidth) { - switch( inWidth ) { - case FLT_BITS: return bits64::truncateToNBits(FloatAsUInt64(UInt64AsFloat(l) + UInt64AsFloat(r)), FLT_BITS); - case DBL_BITS: return bits64::truncateToNBits(DoubleAsUInt64(UInt64AsDouble(l) + UInt64AsDouble(r)), DBL_BITS); - default: llvm::report_fatal_error("unsupported floating point width"); - } -} - -// difference of l and r -inline uint64_t sub(uint64_t l, uint64_t r, unsigned inWidth) { - switch( inWidth ) { - case FLT_BITS: return bits64::truncateToNBits(FloatAsUInt64(UInt64AsFloat(l) - UInt64AsFloat(r)), FLT_BITS); - case DBL_BITS: return bits64::truncateToNBits(DoubleAsUInt64(UInt64AsDouble(l) - UInt64AsDouble(r)), DBL_BITS); - default: llvm::report_fatal_error("unsupported floating point width"); - } -} - -// product of l and r -inline uint64_t mul(uint64_t l, uint64_t r, unsigned inWidth) { - switch( inWidth ) { - case FLT_BITS: return bits64::truncateToNBits(FloatAsUInt64(UInt64AsFloat(l) * UInt64AsFloat(r)), FLT_BITS); - case DBL_BITS: return bits64::truncateToNBits(DoubleAsUInt64(UInt64AsDouble(l) * UInt64AsDouble(r)), DBL_BITS); - default: llvm::report_fatal_error("unsupported floating point width"); - } -} - -// signed divide of l by r -inline uint64_t div(uint64_t l, uint64_t r, unsigned inWidth) { - switch( inWidth ) { - case FLT_BITS: return bits64::truncateToNBits(FloatAsUInt64(UInt64AsFloat(l) / UInt64AsFloat(r)), FLT_BITS); - case DBL_BITS: return bits64::truncateToNBits(DoubleAsUInt64(UInt64AsDouble(l) / UInt64AsDouble(r)), DBL_BITS); - default: llvm::report_fatal_error("unsupported floating point width"); - } -} - -// signed modulo of l by r -inline uint64_t mod(uint64_t l, uint64_t r, unsigned inWidth) { - switch( inWidth ) { - case FLT_BITS: return bits64::truncateToNBits(FloatAsUInt64( fmod(UInt64AsFloat(l), UInt64AsFloat(r)) ), FLT_BITS); - case DBL_BITS: return bits64::truncateToNBits(DoubleAsUInt64( fmod(UInt64AsDouble(l), UInt64AsDouble(r)) ), DBL_BITS); - default: llvm::report_fatal_error("unsupported floating point width"); - } -} - - -// ********************************** // -// *** LLVM Comparison Operations *** // -// ********************************** // - -// determine if l represents NaN -inline bool isNaN(uint64_t l, unsigned inWidth) { - switch( inWidth ) { - case FLT_BITS: - return std::isnan(UInt64AsFloat(l)); - case DBL_BITS: - return std::isnan(UInt64AsDouble(l)); - default: llvm::report_fatal_error("unsupported floating point width"); - } -} - -inline uint64_t eq(uint64_t l, uint64_t r, unsigned inWidth) { - switch( inWidth ) { - case FLT_BITS: return UInt64AsFloat(l) == UInt64AsFloat(r); - case DBL_BITS: return UInt64AsDouble(l) == UInt64AsDouble(r); - default: llvm::report_fatal_error("unsupported floating point width"); - } -} - -inline uint64_t ne(uint64_t l, uint64_t r, unsigned inWidth) { - switch( inWidth ) { - case FLT_BITS: return UInt64AsFloat(l) != UInt64AsFloat(r); - case DBL_BITS: return UInt64AsDouble(l) != UInt64AsDouble(r); - default: llvm::report_fatal_error("unsupported floating point width"); - } -} - -inline uint64_t lt(uint64_t l, uint64_t r, unsigned inWidth) { - switch( inWidth ) { - case FLT_BITS: return UInt64AsFloat(l) < UInt64AsFloat(r); - case DBL_BITS: return UInt64AsDouble(l) < UInt64AsDouble(r); - default: llvm::report_fatal_error("unsupported floating point width"); - } -} - -inline uint64_t le(uint64_t l, uint64_t r, unsigned inWidth) { - switch( inWidth ) { - case FLT_BITS: return UInt64AsFloat(l) <= UInt64AsFloat(r); - case DBL_BITS: return UInt64AsDouble(l) <= UInt64AsDouble(r); - default: llvm::report_fatal_error("unsupported floating point width"); - } -} - -inline uint64_t gt(uint64_t l, uint64_t r, unsigned inWidth) { - switch( inWidth ) { - case FLT_BITS: return UInt64AsFloat(l) > UInt64AsFloat(r); - case DBL_BITS: return UInt64AsDouble(l) > UInt64AsDouble(r); - default: llvm::report_fatal_error("unsupported floating point width"); - } -} - -inline uint64_t ge(uint64_t l, uint64_t r, unsigned inWidth) { - switch( inWidth ) { - case FLT_BITS: return UInt64AsFloat(l) >= UInt64AsFloat(r); - case DBL_BITS: return UInt64AsDouble(l) >= UInt64AsDouble(r); - default: llvm::report_fatal_error("unsupported floating point width"); - } -} - - -// ********************************** // -// *** LLVM Conversion Operations *** // -// ********************************** // - -// truncation of l (which must be a double) to float (casts a double to a float) -inline uint64_t trunc(uint64_t l, unsigned outWidth, unsigned inWidth) { - // FIXME: Investigate this, should this not happen? Was a quick - // patch for busybox. - if (inWidth==64 && outWidth==64) { - return l; - } else { - assert(inWidth==64 && "can only truncate from a 64-bit double"); - assert(outWidth==32 && "can only truncate to a 32-bit float"); - float trunc = (float)UInt64AsDouble(l); - return bits64::truncateToNBits(FloatAsUInt64(trunc), outWidth); - } -} - -// extension of l (which must be a float) to double (casts a float to a double) -inline uint64_t ext(uint64_t l, unsigned outWidth, unsigned inWidth) { - // FIXME: Investigate this, should this not happen? Was a quick - // patch for busybox. - if (inWidth==64 && outWidth==64) { - return l; - } else { - assert(inWidth==32 && "can only extend from a 32-bit float"); - assert(outWidth==64 && "can only extend to a 64-bit double"); - double ext = (double)UInt64AsFloat(l); - return bits64::truncateToNBits(DoubleAsUInt64(ext), outWidth); - } -} - -// conversion of l to an unsigned integer, rounding towards zero -inline uint64_t toUnsignedInt( uint64_t l, unsigned outWidth, unsigned inWidth ) { - switch( inWidth ) { - case FLT_BITS: return bits64::truncateToNBits((uint64_t)UInt64AsFloat(l), outWidth ); - case DBL_BITS: return bits64::truncateToNBits((uint64_t)UInt64AsDouble(l), outWidth ); - default: llvm::report_fatal_error("unsupported floating point width"); - } -} - -// conversion of l to a signed integer, rounding towards zero -inline uint64_t toSignedInt( uint64_t l, unsigned outWidth, unsigned inWidth ) { - switch( inWidth ) { - case FLT_BITS: return bits64::truncateToNBits((int64_t)UInt64AsFloat(l), outWidth); - case DBL_BITS: return bits64::truncateToNBits((int64_t)UInt64AsDouble(l), outWidth); - default: llvm::report_fatal_error("unsupported floating point width"); - } -} - -// conversion of l, interpreted as an unsigned int, to a floating point number -inline uint64_t UnsignedIntToFP( uint64_t l, unsigned outWidth ) { - switch( outWidth ) { - case FLT_BITS: return bits64::truncateToNBits(FloatAsUInt64((float)l), outWidth); - case DBL_BITS: return bits64::truncateToNBits(DoubleAsUInt64((double)l), outWidth); - default: llvm::report_fatal_error("unsupported floating point width"); - } -} - -// conversion of l, interpreted as a signed int, to a floating point number -inline uint64_t SignedIntToFP( uint64_t l, unsigned outWidth, unsigned inWidth ) { - switch( outWidth ) { - case FLT_BITS: return bits64::truncateToNBits(FloatAsUInt64((float)(int64_t)ints::sext(l, 64, inWidth)), outWidth); - case DBL_BITS: return bits64::truncateToNBits(DoubleAsUInt64((double)(int64_t)ints::sext(l,64, inWidth)), outWidth); - default: llvm::report_fatal_error("unsupported floating point width"); - } -} - -} // end namespace ints -} // end namespace klee - -#endif /* KLEE_FLOATEVALUATION_H */ diff --git a/include/klee/Support/IntEvaluation.h b/include/klee/Support/IntEvaluation.h deleted file mode 100644 index 0e9a40d637..0000000000 --- a/include/klee/Support/IntEvaluation.h +++ /dev/null @@ -1,164 +0,0 @@ -//===-- IntEvaluation.h -----------------------------------------*- C++ -*-===// -// -// The KLEE Symbolic Virtual Machine -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#ifndef KLEE_INTEVALUATION_H -#define KLEE_INTEVALUATION_H - -#include "klee/ADT/Bits.h" - -#define MAX_BITS (sizeof(uint64_t) * 8) - -// ASSUMPTION: invalid bits in each uint64_t are 0. the trade-off here is -// between making trunc/zext/sext fast and making operations that depend -// on the invalid bits being 0 fast. - -namespace klee { -namespace ints { - -// add of l and r -inline uint64_t add(uint64_t l, uint64_t r, unsigned inWidth) { - return bits64::truncateToNBits(l + r, inWidth); -} - -// difference of l and r -inline uint64_t sub(uint64_t l, uint64_t r, unsigned inWidth) { - return bits64::truncateToNBits(l - r, inWidth); -} - -// product of l and r -inline uint64_t mul(uint64_t l, uint64_t r, unsigned inWidth) { - return bits64::truncateToNBits(l * r, inWidth); -} - -// truncation of l to outWidth bits -inline uint64_t trunc(uint64_t l, unsigned outWidth, unsigned inWidth) { - return bits64::truncateToNBits(l, outWidth); -} - -// zero-extension of l from inWidth to outWidth bits -inline uint64_t zext(uint64_t l, unsigned outWidth, unsigned inWidth) { - return l; -} - -// sign-extension of l from inWidth to outWidth bits -inline uint64_t sext(uint64_t l, unsigned outWidth, unsigned inWidth) { - uint32_t numInvalidBits = MAX_BITS - inWidth; - return bits64::truncateToNBits(((int64_t)(l << numInvalidBits)) >> numInvalidBits, outWidth); -} - -// unsigned divide of l by r -inline uint64_t udiv(uint64_t l, uint64_t r, unsigned inWidth) { - return bits64::truncateToNBits(l / r, inWidth); -} - -// unsigned mod of l by r -inline uint64_t urem(uint64_t l, uint64_t r, unsigned inWidth) { - return bits64::truncateToNBits(l % r, inWidth); -} - -// signed divide of l by r -inline uint64_t sdiv(uint64_t l, uint64_t r, unsigned inWidth) { - // sign extend operands so that signed operation on 64-bits works correctly - int64_t sl = sext(l, MAX_BITS, inWidth); - int64_t sr = sext(r, MAX_BITS, inWidth); - return bits64::truncateToNBits(sl / sr, inWidth); -} - -// signed mod of l by r -inline uint64_t srem(uint64_t l, uint64_t r, unsigned inWidth) { - // sign extend operands so that signed operation on 64-bits works correctly - int64_t sl = sext(l, MAX_BITS, inWidth); - int64_t sr = sext(r, MAX_BITS, inWidth); - return bits64::truncateToNBits(sl % sr, inWidth); -} - -// arithmetic shift right of l by r bits -inline uint64_t ashr(uint64_t l, uint64_t shift, unsigned inWidth) { - int64_t sl = sext(l, MAX_BITS, inWidth); - return bits64::truncateToNBits(sl >> shift, inWidth); -} - -// logical shift right of l by r bits -inline uint64_t lshr(uint64_t l, uint64_t shift, unsigned inWidth) { - return l >> shift; -} - -// shift left of l by r bits -inline uint64_t shl(uint64_t l, uint64_t shift, unsigned inWidth) { - return bits64::truncateToNBits(l << shift, inWidth); -} - -// logical AND of l and r -inline uint64_t land(uint64_t l, uint64_t r, unsigned inWidth) { - return l & r; -} - -// logical OR of l and r -inline uint64_t lor(uint64_t l, uint64_t r, unsigned inWidth) { - return l | r; -} - -// logical XOR of l and r -inline uint64_t lxor(uint64_t l, uint64_t r, unsigned inWidth) { - return l ^ r; -} - -// comparison operations -inline uint64_t eq(uint64_t l, uint64_t r, unsigned inWidth) { - return l == r; -} - -inline uint64_t ne(uint64_t l, uint64_t r, unsigned inWidth) { - return l != r; -} - -inline uint64_t ult(uint64_t l, uint64_t r, unsigned inWidth) { - return l < r; -} - -inline uint64_t ule(uint64_t l, uint64_t r, unsigned inWidth) { - return l <= r; -} - -inline uint64_t ugt(uint64_t l, uint64_t r, unsigned inWidth) { - return l > r; -} - -inline uint64_t uge(uint64_t l, uint64_t r, unsigned inWidth) { - return l >= r; -} - -inline uint64_t slt(uint64_t l, uint64_t r, unsigned inWidth) { - int64_t sl = sext(l, MAX_BITS, inWidth); - int64_t sr = sext(r, MAX_BITS, inWidth); - return sl < sr; -} - -inline uint64_t sle(uint64_t l, uint64_t r, unsigned inWidth) { - int64_t sl = sext(l, MAX_BITS, inWidth); - int64_t sr = sext(r, MAX_BITS, inWidth); - return sl <= sr; -} - -inline uint64_t sgt(uint64_t l, uint64_t r, unsigned inWidth) { - int64_t sl = sext(l, MAX_BITS, inWidth); - int64_t sr = sext(r, MAX_BITS, inWidth); - return sl > sr; -} - -inline uint64_t sge(uint64_t l, uint64_t r, unsigned inWidth) { - int64_t sl = sext(l, MAX_BITS, inWidth); - int64_t sr = sext(r, MAX_BITS, inWidth); - return sl >= sr; -} - -} // end namespace ints -} // end namespace klee - -#endif /* KLEE_INTEVALUATION_H */ diff --git a/include/klee/Support/ModuleUtil.h b/include/klee/Support/ModuleUtil.h index 40c58f4e7b..f1c4c4072e 100644 --- a/include/klee/Support/ModuleUtil.h +++ b/include/klee/Support/ModuleUtil.h @@ -12,12 +12,12 @@ #include "klee/Config/Version.h" -#if LLVM_VERSION_CODE >= LLVM_VERSION(8, 0) +#include "klee/Support/CompilerWarning.h" +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS #include "llvm/IR/InstrTypes.h" -#else -#include "llvm/IR/CallSite.h" -#endif #include "llvm/IR/Module.h" +DISABLE_WARNING_POP #include #include @@ -44,17 +44,11 @@ linkModules(std::vector> &modules, /// calls, although complicated constant expressions might be /// another possibility). /// -/// If `moduleIsFullyLinked` is set to true it will be assumed that the -/// module containing the `llvm::CallSite` (`llvm::CallBase` on LLVM 8+) -/// is fully linked. This assumption allows resolution of functions -/// that are marked as overridable. -llvm::Function *getDirectCallTarget( -#if LLVM_VERSION_CODE >= LLVM_VERSION(8, 0) - const llvm::CallBase &cb, -#else - const llvm::CallSite &cs, -#endif - bool moduleIsFullyLinked); +/// If `moduleIsFullyLinked` is set to true it will be assumed that the module +/// containing the `llvm::CallBase` is fully linked. This assumption allows +/// resolution of functions that are marked as overridable. +llvm::Function *getDirectCallTarget(const llvm::CallBase &cb, + bool moduleIsFullyLinked); /// Return true iff the given Function value is used in something /// other than a direct call (or a constant expression that diff --git a/include/klee/Support/OptionCategories.h b/include/klee/Support/OptionCategories.h index 40f3deb8be..bee6e52ae9 100644 --- a/include/klee/Support/OptionCategories.h +++ b/include/klee/Support/OptionCategories.h @@ -14,15 +14,25 @@ #ifndef KLEE_OPTIONCATEGORIES_H #define KLEE_OPTIONCATEGORIES_H +#include "klee/Support/CompilerWarning.h" +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS #include "llvm/Support/CommandLine.h" +DISABLE_WARNING_POP namespace klee { extern llvm::cl::OptionCategory DebugCat; + extern llvm::cl::OptionCategory ExprCat; + extern llvm::cl::OptionCategory ExtCallsCat; + extern llvm::cl::OptionCategory MemoryCat; extern llvm::cl::OptionCategory MergeCat; extern llvm::cl::OptionCategory MiscCat; extern llvm::cl::OptionCategory ModuleCat; + extern llvm::cl::OptionCategory SearchCat; + extern llvm::cl::OptionCategory ExecTreeCat; extern llvm::cl::OptionCategory SeedingCat; extern llvm::cl::OptionCategory SolvingCat; + extern llvm::cl::OptionCategory StatsCat; extern llvm::cl::OptionCategory TerminationCat; extern llvm::cl::OptionCategory TestGenCat; } diff --git a/include/klee/Support/PrintVersion.h b/include/klee/Support/PrintVersion.h index 1c95245191..f4999debc2 100644 --- a/include/klee/Support/PrintVersion.h +++ b/include/klee/Support/PrintVersion.h @@ -10,7 +10,11 @@ #ifndef KLEE_PRINTVERSION_H #define KLEE_PRINTVERSION_H +#include "klee/Support/CompilerWarning.h" +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS #include "llvm/Support/raw_ostream.h" +DISABLE_WARNING_POP #include "klee/Config/Version.h" diff --git a/include/klee/System/Time.h b/include/klee/System/Time.h index 2ebebdfda1..14d9ab4b76 100644 --- a/include/klee/System/Time.h +++ b/include/klee/System/Time.h @@ -10,7 +10,11 @@ #ifndef KLEE_TIME_H #define KLEE_TIME_H +#include "klee/Support/CompilerWarning.h" +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS #include "llvm/Support/raw_ostream.h" +DISABLE_WARNING_POP #include #include diff --git a/lib/Basic/CMakeLists.txt b/lib/Basic/CMakeLists.txt index d156116f45..db630893df 100644 --- a/lib/Basic/CMakeLists.txt +++ b/lib/Basic/CMakeLists.txt @@ -6,13 +6,13 @@ # License. See LICENSE.TXT for details. # #===------------------------------------------------------------------------===# -klee_add_component(kleeBasic +add_library(kleeBasic KTest.cpp Statistics.cpp ) -set(LLVM_COMPONENTS - support -) -klee_get_llvm_libs(LLVM_LIBS ${LLVM_COMPONENTS}) -target_link_libraries(kleeBasic PUBLIC ${LLVM_LIBS}) +llvm_config(kleeBasic "${USE_LLVM_SHARED}" support) +target_compile_options(kleeBasic PRIVATE ${KLEE_COMPONENT_CXX_FLAGS}) +target_compile_definitions(kleeBasic PRIVATE ${KLEE_COMPONENT_CXX_DEFINES}) + +target_include_directories(kleeBasic PRIVATE ${KLEE_INCLUDE_DIRS}) diff --git a/lib/Core/AddressSpace.cpp b/lib/Core/AddressSpace.cpp index f3462ca177..138119b110 100644 --- a/lib/Core/AddressSpace.cpp +++ b/lib/Core/AddressSpace.cpp @@ -297,29 +297,35 @@ bool AddressSpace::resolve(ExecutionState &state, TimingSolver *solver, // transparently avoid screwing up symbolics (if the byte is symbolic // then its concrete cache byte isn't being used) but is just a hack. -void AddressSpace::copyOutConcretes() { - for (MemoryMap::iterator it = objects.begin(), ie = objects.end(); - it != ie; ++it) { - const MemoryObject *mo = it->first; - - if (!mo->isUserSpecified) { - const auto &os = it->second; - auto address = reinterpret_cast(mo->address); - - if (!os->readOnly) - memcpy(address, os->concreteStore, mo->size); +std::size_t AddressSpace::copyOutConcretes() { + std::size_t numPages{}; + for (const auto &object : objects) { + auto &mo = object.first; + auto &os = object.second; + if (!mo->isUserSpecified && !os->readOnly && os->size != 0) { + auto size = std::max(os->size, mo->alignment); + numPages += + (size + MemoryManager::pageSize - 1) / MemoryManager::pageSize; + copyOutConcrete(mo, os.get()); } } + return numPages; +} + +void AddressSpace::copyOutConcrete(const MemoryObject *mo, + const ObjectState *os) const { + auto address = reinterpret_cast(mo->address); + std::memcpy(address, os->concreteStore, mo->size); } -bool AddressSpace::copyInConcretes() { +bool AddressSpace::copyInConcretes(bool concretize) { for (auto &obj : objects) { const MemoryObject *mo = obj.first; if (!mo->isUserSpecified) { const auto &os = obj.second; - if (!copyInConcrete(mo, os.get(), mo->address)) + if (!copyInConcrete(mo, os.get(), mo->address, concretize)) return false; } } @@ -328,14 +334,40 @@ bool AddressSpace::copyInConcretes() { } bool AddressSpace::copyInConcrete(const MemoryObject *mo, const ObjectState *os, - uint64_t src_address) { + uint64_t src_address, bool concretize) { auto address = reinterpret_cast(src_address); - if (memcmp(address, os->concreteStore, mo->size) != 0) { - if (os->readOnly) { - return false; - } else { - ObjectState *wos = getWriteable(mo, os); - memcpy(wos->concreteStore, address, mo->size); + + // Don't do anything if the underlying representation has not been changed + // externally. + if (std::memcmp(address, os->concreteStore, mo->size) == 0) + return true; + + // External object representation has been changed + + // Return `false` if the object is marked as read-only + if (os->readOnly) + return false; + + ObjectState *wos = getWriteable(mo, os); + // Check if the object is fully concrete object. If so, use the fast + // path and `memcpy` the new values from the external object to the internal + // representation + if (!wos->unflushedMask) { + std::memcpy(wos->concreteStore, address, mo->size); + return true; + } + + // Check if object should be concretized + if (concretize) { + wos->makeConcrete(); + std::memcpy(wos->concreteStore, address, mo->size); + } else { + // The object is partially symbolic, it needs to be updated byte-by-byte + // via object state's `write` function + for (size_t i = 0, ie = mo->size; i < ie; ++i) { + u_int8_t external_byte_value = *(address + i); + if (external_byte_value != wos->concreteStore[i]) + wos->write8(i, external_byte_value); } } return true; diff --git a/lib/Core/AddressSpace.h b/lib/Core/AddressSpace.h index 4df8d5f0b9..fa4fb94018 100644 --- a/lib/Core/AddressSpace.h +++ b/lib/Core/AddressSpace.h @@ -126,7 +126,11 @@ namespace klee { /// Copy the concrete values of all managed ObjectStates into the /// actual system memory location they were allocated at. - void copyOutConcretes(); + /// Returns the (hypothetical) number of pages needed provided each written + /// object occupies (at least) a single page. + std::size_t copyOutConcretes(); + + void copyOutConcrete(const MemoryObject *mo, const ObjectState *os) const; /// Copy the concrete values of all managed ObjectStates back from /// the actual system memory location they were allocated @@ -134,18 +138,22 @@ namespace klee { /// potentially copied) if the memory values are different from /// the current concrete values. /// - /// \retval true The copy succeeded. - /// \retval false The copy failed because a read-only object was modified. - bool copyInConcretes(); + /// \param concretize fully concretize the object representation if changed + /// externally + /// \return true if copy succeeded, otherwise false (e.g. try to modify + /// read-only object) + bool copyInConcretes(bool concretize); /// Updates the memory object with the raw memory from the address /// /// @param mo The MemoryObject to update /// @param os The associated memory state containing the actual data /// @param src_address the address to copy from + /// @param concretize fully concretize the object representation if changed + /// externally /// @return bool copyInConcrete(const MemoryObject *mo, const ObjectState *os, - uint64_t src_address); + uint64_t src_address, bool concretize); }; } // End klee namespace diff --git a/lib/Core/CMakeLists.txt b/lib/Core/CMakeLists.txt index de52cd1111..021c3ce735 100644 --- a/lib/Core/CMakeLists.txt +++ b/lib/Core/CMakeLists.txt @@ -6,20 +6,21 @@ # License. See LICENSE.TXT for details. # #===------------------------------------------------------------------------===# -klee_add_component(kleeCore +add_library(kleeCore AddressSpace.cpp MergeHandler.cpp CallPathManager.cpp Context.cpp CoreStats.cpp ExecutionState.cpp + ExecutionTree.cpp + ExecutionTreeWriter.cpp Executor.cpp ExecutorUtil.cpp ExternalDispatcher.cpp ImpliedValue.cpp Memory.cpp MemoryManager.cpp - PTree.cpp Searcher.cpp SeedInfo.cpp SpecialFunctionHandler.cpp @@ -28,18 +29,6 @@ klee_add_component(kleeCore UserSearcher.cpp ) -# TODO: Work out what the correct LLVM components are for -# kleeCore. -set(LLVM_COMPONENTS - core - executionengine - mcjit - native - support -) - -klee_get_llvm_libs(LLVM_LIBS ${LLVM_COMPONENTS}) -target_link_libraries(kleeCore PUBLIC ${LLVM_LIBS} ${SQLITE3_LIBRARIES}) target_link_libraries(kleeCore PRIVATE kleeBasic kleeModule @@ -47,3 +36,9 @@ target_link_libraries(kleeCore PRIVATE kleaverExpr kleeSupport ) + +llvm_config(kleeCore "${USE_LLVM_SHARED}" core executionengine mcjit native support) +target_link_libraries(kleeCore PRIVATE ${SQLite3_LIBRARIES}) +target_include_directories(kleeCore PRIVATE ${KLEE_INCLUDE_DIRS} ${LLVM_INCLUDE_DIRS} ${SQLite3_INCLUDE_DIRS}) +target_compile_options(kleeCore PRIVATE ${KLEE_COMPONENT_CXX_FLAGS}) +target_compile_definitions(kleeCore PRIVATE ${KLEE_COMPONENT_CXX_DEFINES}) diff --git a/lib/Core/CallPathManager.cpp b/lib/Core/CallPathManager.cpp index 2c0e4ae3ff..34040dc6af 100644 --- a/lib/Core/CallPathManager.cpp +++ b/lib/Core/CallPathManager.cpp @@ -11,8 +11,12 @@ #include "klee/Statistics/Statistics.h" +#include "klee/Support/CompilerWarning.h" +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS #include "llvm/IR/Function.h" #include "llvm/Support/raw_ostream.h" +DISABLE_WARNING_POP #include #include diff --git a/lib/Core/CoreStats.cpp b/lib/Core/CoreStats.cpp index 2589d7dac4..48eb1e85b6 100644 --- a/lib/Core/CoreStats.cpp +++ b/lib/Core/CoreStats.cpp @@ -8,14 +8,18 @@ //===----------------------------------------------------------------------===// #include "CoreStats.h" +#include "klee/Support/ErrorHandling.h" + using namespace klee; Statistic stats::allocations("Allocations", "Alloc"); Statistic stats::coveredInstructions("CoveredInstructions", "Icov"); +Statistic stats::externalCalls("ExternalCalls", "ExtC"); Statistic stats::falseBranches("FalseBranches", "Bf"); Statistic stats::forkTime("ForkTime", "Ftime"); Statistic stats::forks("Forks", "Forks"); +Statistic stats::inhibitedForks("InhibitedForks", "InhibForks"); Statistic stats::instructionRealTime("InstructionRealTimes", "Ireal"); Statistic stats::instructionTime("InstructionTimes", "Itime"); Statistic stats::instructions("Instructions", "I"); @@ -26,3 +30,28 @@ Statistic stats::solverTime("SolverTime", "Stime"); Statistic stats::states("States", "States"); Statistic stats::trueBranches("TrueBranches", "Bt"); Statistic stats::uncoveredInstructions("UncoveredInstructions", "Iuncov"); + + +// branch stats and setter + +#undef BTYPE +#define BTYPE(Name,I) Statistic stats::branches ## Name("Branches"#Name, "Br"#Name); +BRANCH_TYPES + +void stats::incBranchStat(BranchType reason, std::uint32_t value) { +#undef BTYPE +#define BTYPE(N,I) case BranchType::N : stats::branches ## N += value; break; + switch (reason) { + BRANCH_TYPES + default: + klee_error("Illegal branch type in incBranchStat(): %hhu", + static_cast(reason)); + } +} + + +// termination types + +#undef TCLASS +#define TCLASS(Name,I) Statistic stats::termination ## Name("Termination"#Name, "Trm"#Name); +TERMINATION_CLASSES diff --git a/lib/Core/CoreStats.h b/lib/Core/CoreStats.h index 354706f589..609e976a6a 100644 --- a/lib/Core/CoreStats.h +++ b/lib/Core/CoreStats.h @@ -10,6 +10,8 @@ #ifndef KLEE_CORESTATS_H #define KLEE_CORESTATS_H +#include "klee/Core/BranchTypes.h" +#include "klee/Core/TerminationTypes.h" #include "klee/Statistics/Statistic.h" namespace klee { @@ -27,9 +29,15 @@ namespace stats { extern Statistic forkTime; extern Statistic solverTime; + /// The number of external calls. + extern Statistic externalCalls; + /// The number of process forks. extern Statistic forks; + /// Number of inhibited forks. + extern Statistic inhibitedForks; + /// Number of states, this is a "fake" statistic used by istats, it /// isn't normally up-to-date. extern Statistic states; @@ -43,6 +51,18 @@ namespace stats { /// distance to a function return. extern Statistic minDistToReturn; + /// Count branch types in execution tree. Inhibited branches are ignored. + #undef BTYPE + #define BTYPE(Name,I) extern Statistic branches ## Name; + BRANCH_TYPES + + /// Count termination types. + #undef TCLASS + #define TCLASS(Name,I) extern Statistic termination ## Name; + TERMINATION_CLASSES + + /// Increase a branch statistic for the given reason by value. + void incBranchStat(BranchType reason, std::uint32_t value); } } diff --git a/lib/Core/ExecutionState.cpp b/lib/Core/ExecutionState.cpp index 54fe752e88..cb8a3ceda2 100644 --- a/lib/Core/ExecutionState.cpp +++ b/lib/Core/ExecutionState.cpp @@ -38,6 +38,10 @@ cl::opt DebugLogStateMerge( "debug-log-state-merge", cl::init(false), cl::desc("Debug information for underlying state merging (default=false)"), cl::cat(MergeCat)); + +} +namespace klee { + extern cl::opt SingleObjectResolution; } /***/ @@ -70,10 +74,14 @@ StackFrame::~StackFrame() { /***/ -ExecutionState::ExecutionState(KFunction *kf) +ExecutionState::ExecutionState(KFunction *kf, MemoryManager *mm) : pc(kf->instructions), prevPC(pc) { pushFrame(nullptr, kf); setID(); + if (mm->stackFactory && mm->heapFactory) { + stackAllocator = mm->stackFactory.makeAllocator(); + heapAllocator = mm->heapFactory.makeAllocator(); + } } ExecutionState::~ExecutionState() { @@ -91,6 +99,8 @@ ExecutionState::ExecutionState(const ExecutionState& state): incomingBBIndex(state.incomingBBIndex), depth(state.depth), addressSpace(state.addressSpace), + stackAllocator(state.stackAllocator), + heapAllocator(state.heapAllocator), constraints(state.constraints), pathOS(state.pathOS), symPathOS(state.symPathOS), @@ -105,7 +115,9 @@ ExecutionState::ExecutionState(const ExecutionState& state): ? state.unwindingInformation->clone() : nullptr), coveredNew(state.coveredNew), - forkDisabled(state.forkDisabled) { + forkDisabled(state.forkDisabled), + base_addrs(state.base_addrs), + base_mos(state.base_mos) { for (const auto &cur_mergehandler: openMergeStack) cur_mergehandler->addOpenState(this); } @@ -127,11 +139,35 @@ void ExecutionState::pushFrame(KInstIterator caller, KFunction *kf) { void ExecutionState::popFrame() { const StackFrame &sf = stack.back(); - for (const auto * memoryObject : sf.allocas) + for (const auto *memoryObject : sf.allocas) { + deallocate(memoryObject); addressSpace.unbindObject(memoryObject); + } stack.pop_back(); } +void ExecutionState::deallocate(const MemoryObject *mo) { + if (SingleObjectResolution) { + auto mos_it = base_mos.find(mo->address); + if (mos_it != base_mos.end()) { + for (auto it = mos_it->second.begin(); it != mos_it->second.end(); ++it) { + base_addrs.erase(*it); + } + base_mos.erase(mos_it->first); + } + } + + if (!stackAllocator || !heapAllocator) + return; + + auto address = reinterpret_cast(mo->address); + if (mo->isLocal) { + stackAllocator.free(address, std::max(mo->size, mo->alignment)); + } else { + heapAllocator.free(address, std::max(mo->size, mo->alignment)); + } +} + void ExecutionState::addSymbolic(const MemoryObject *mo, const Array *array) { symbolics.emplace_back(ref(mo), array); } @@ -327,18 +363,22 @@ void ExecutionState::dumpStack(llvm::raw_ostream &out) const { std::stringstream AssStream; AssStream << std::setw(8) << std::setfill('0') << ii.assemblyLine; out << AssStream.str(); - out << " in " << f->getName().str() << " ("; + out << " in " << f->getName().str() << "("; // Yawn, we could go up and print varargs if we wanted to. unsigned index = 0; for (Function::arg_iterator ai = f->arg_begin(), ae = f->arg_end(); ai != ae; ++ai) { if (ai!=f->arg_begin()) out << ", "; - out << ai->getName().str(); - // XXX should go through function + if (ai->hasName()) + out << ai->getName().str() << "="; + ref value = sf.locals[sf.kf->getArgRegister(index++)].value; - if (isa_and_nonnull(value)) - out << "=" << value; + if (isa_and_nonnull(value)) { + out << value; + } else { + out << "symbolic"; + } } out << ")"; if (ii.file != "") diff --git a/lib/Core/ExecutionState.h b/lib/Core/ExecutionState.h index 49e232dcf7..0e28e04f00 100644 --- a/lib/Core/ExecutionState.h +++ b/lib/Core/ExecutionState.h @@ -11,12 +11,14 @@ #define KLEE_EXECUTIONSTATE_H #include "AddressSpace.h" +#include "MemoryManager.h" #include "MergeHandler.h" #include "klee/ADT/ImmutableSet.h" #include "klee/ADT/TreeStream.h" #include "klee/Expr/Constraints.h" #include "klee/Expr/Expr.h" +#include "klee/KDAlloc/kdalloc.h" #include "klee/Module/KInstIterator.h" #include "klee/Solver/Solver.h" #include "klee/System/Time.h" @@ -30,10 +32,10 @@ namespace klee { class Array; class CallPathNode; struct Cell; +class ExecutionTreeNode; struct KFunction; struct KInstruction; class MemoryObject; -class PTreeNode; struct InstructionInfo; llvm::raw_ostream &operator<<(llvm::raw_ostream &os, const MemoryMap &mm); @@ -180,6 +182,12 @@ class ExecutionState { /// @brief Address space used by this state (e.g. Global and Heap) AddressSpace addressSpace; + /// @brief Stack allocator (used with deterministic allocation) + kdalloc::StackAllocator stackAllocator; + + /// @brief Heap allocator (used with deterministic allocation) + kdalloc::Allocator heapAllocator; + /// @brief Constraints collected so far ConstraintSet constraints; @@ -199,9 +207,9 @@ class ExecutionState { /// @brief Set containing which lines in which files are covered by this state std::map> coveredLines; - /// @brief Pointer to the process tree of the current state - /// Copies of ExecutionState should not copy ptreeNode - PTreeNode *ptreeNode = nullptr; + /// @brief Pointer to the execution tree of the current state + /// Copies of ExecutionState should not copy executionTreeNode + ExecutionTreeNode *executionTreeNode = nullptr; /// @brief Ordered list of symbolics: used to generate test cases. // @@ -240,13 +248,20 @@ class ExecutionState { /// @brief Disables forking for this state. Set by user code bool forkDisabled = false; + /// @brief Mapping symbolic address expressions to concrete base addresses + using base_addrs_t = std::map, ref>; + base_addrs_t base_addrs; + /// @brief Mapping MemoryObject addresses to refs used in the base_addrs map + using base_mo_t = std::map>>; + base_mo_t base_mos; + public: #ifdef KLEE_UNITTEST // provide this function only in the context of unittests ExecutionState() = default; #endif // only to create the initial state - explicit ExecutionState(KFunction *kf); + explicit ExecutionState(KFunction *kf, MemoryManager *mm); // no copy assignment, use copy constructor ExecutionState &operator=(const ExecutionState &) = delete; // no move ctor @@ -261,6 +276,8 @@ class ExecutionState { void pushFrame(KInstIterator caller, KFunction *kf); void popFrame(); + void deallocate(const MemoryObject *mo); + void addSymbolic(const MemoryObject *mo, const Array *array); void addConstraint(ref e); @@ -271,6 +288,7 @@ class ExecutionState { std::uint32_t getID() const { return id; }; void setID() { id = nextID++; }; + static std::uint32_t getLastID() { return nextID - 1; }; }; struct ExecutionStateIDCompare { diff --git a/lib/Core/ExecutionTree.cpp b/lib/Core/ExecutionTree.cpp new file mode 100644 index 0000000000..a2c8821cc8 --- /dev/null +++ b/lib/Core/ExecutionTree.cpp @@ -0,0 +1,243 @@ +//===-- ExecutionTree.cpp -------------------------------------------------===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "ExecutionTree.h" + +#include "ExecutionState.h" + +#include "klee/Core/Interpreter.h" +#include "klee/Expr/ExprPPrinter.h" +#include "klee/Module/KInstruction.h" +#include "klee/Support/OptionCategories.h" + +#include +#include + +using namespace klee; + +namespace klee { +llvm::cl::OptionCategory + ExecTreeCat("Execution tree related options", + "These options affect the execution tree handling."); +} + +namespace { +llvm::cl::opt CompressExecutionTree( + "compress-exec-tree", + llvm::cl::desc("Remove intermediate nodes in the execution " + "tree whenever possible (default=false)"), + llvm::cl::init(false), llvm::cl::cat(ExecTreeCat)); + +llvm::cl::opt WriteExecutionTree( + "write-exec-tree", llvm::cl::init(false), + llvm::cl::desc("Write execution tree into exec_tree.db (default=false)"), + llvm::cl::cat(ExecTreeCat)); +} // namespace + +// ExecutionTreeNode + +ExecutionTreeNode::ExecutionTreeNode(ExecutionTreeNode *parent, + ExecutionState *state) noexcept + : parent{parent}, left{nullptr}, right{nullptr}, state{state} { + state->executionTreeNode = this; +} + +// AnnotatedExecutionTreeNode + +AnnotatedExecutionTreeNode::AnnotatedExecutionTreeNode( + ExecutionTreeNode *parent, ExecutionState *state) noexcept + : ExecutionTreeNode(parent, state) { + id = nextID++; +} + +// NoopExecutionTree + +void NoopExecutionTree::dump(llvm::raw_ostream &os) noexcept { + os << "digraph G {\nTreeNotAvailable [shape=box]\n}"; +} + +// InMemoryExecutionTree + +InMemoryExecutionTree::InMemoryExecutionTree( + ExecutionState &initialState) noexcept { + root = ExecutionTreeNodePtr(createNode(nullptr, &initialState)); + initialState.executionTreeNode = root.getPointer(); +} + +ExecutionTreeNode *InMemoryExecutionTree::createNode(ExecutionTreeNode *parent, + ExecutionState *state) { + return new ExecutionTreeNode(parent, state); +} + +void InMemoryExecutionTree::attach(ExecutionTreeNode *node, + ExecutionState *leftState, + ExecutionState *rightState, + BranchType reason) noexcept { + assert(node && !node->left.getPointer() && !node->right.getPointer()); + assert(node == rightState->executionTreeNode && + "Attach assumes the right state is the current state"); + node->left = ExecutionTreeNodePtr(createNode(node, leftState)); + // The current node inherits the tag + uint8_t currentNodeTag = root.getInt(); + if (node->parent) + currentNodeTag = node->parent->left.getPointer() == node + ? node->parent->left.getInt() + : node->parent->right.getInt(); + node->right = + ExecutionTreeNodePtr(createNode(node, rightState), currentNodeTag); + updateBranchingNode(*node, reason); + node->state = nullptr; +} + +void InMemoryExecutionTree::remove(ExecutionTreeNode *n) noexcept { + assert(!n->left.getPointer() && !n->right.getPointer()); + updateTerminatingNode(*n); + do { + ExecutionTreeNode *p = n->parent; + if (p) { + if (n == p->left.getPointer()) { + p->left = ExecutionTreeNodePtr(nullptr); + } else { + assert(n == p->right.getPointer()); + p->right = ExecutionTreeNodePtr(nullptr); + } + } + delete n; + n = p; + } while (n && !n->left.getPointer() && !n->right.getPointer()); + + if (n && CompressExecutionTree) { + // We are now at a node that has exactly one child; we've just deleted the + // other one. Eliminate the node and connect its child to the parent + // directly (if it's not the root). + ExecutionTreeNodePtr child = n->left.getPointer() ? n->left : n->right; + ExecutionTreeNode *parent = n->parent; + + child.getPointer()->parent = parent; + if (!parent) { + // We are at the root + root = child; + } else { + if (n == parent->left.getPointer()) { + parent->left = child; + } else { + assert(n == parent->right.getPointer()); + parent->right = child; + } + } + + delete n; + } +} + +void InMemoryExecutionTree::dump(llvm::raw_ostream &os) noexcept { + std::unique_ptr pp(ExprPPrinter::create(os)); + pp->setNewline("\\l"); + os << "digraph G {\n" + << "\tsize=\"10,7.5\";\n" + << "\tratio=fill;\n" + << "\trotate=90;\n" + << "\tcenter = \"true\";\n" + << "\tnode [style=\"filled\",width=.1,height=.1,fontname=\"Terminus\"]\n" + << "\tedge [arrowsize=.3]\n"; + std::vector stack; + stack.push_back(root.getPointer()); + while (!stack.empty()) { + const ExecutionTreeNode *n = stack.back(); + stack.pop_back(); + os << "\tn" << n << " [shape=diamond"; + if (n->state) + os << ",fillcolor=green"; + os << "];\n"; + if (n->left.getPointer()) { + os << "\tn" << n << " -> n" << n->left.getPointer() << " [label=0b" + << std::bitset(n->left.getInt()).to_string() << "];\n"; + stack.push_back(n->left.getPointer()); + } + if (n->right.getPointer()) { + os << "\tn" << n << " -> n" << n->right.getPointer() << " [label=0b" + << std::bitset(n->right.getInt()).to_string() << "];\n"; + stack.push_back(n->right.getPointer()); + } + } + os << "}\n"; +} + +std::uint8_t InMemoryExecutionTree::getNextId() noexcept { + static_assert(PtrBitCount <= 8); + std::uint8_t id = 1 << registeredIds++; + if (registeredIds > PtrBitCount) { + klee_error("ExecutionTree cannot support more than %d RandomPathSearchers", + PtrBitCount); + } + return id; +} + +// PersistentExecutionTree + +PersistentExecutionTree::PersistentExecutionTree( + ExecutionState &initialState, InterpreterHandler &ih) noexcept + : writer(ih.getOutputFilename("exec_tree.db")) { + root = ExecutionTreeNodePtr(createNode(nullptr, &initialState)); + initialState.executionTreeNode = root.getPointer(); +} + +void PersistentExecutionTree::dump(llvm::raw_ostream &os) noexcept { + writer.batchCommit(true); + InMemoryExecutionTree::dump(os); +} + +ExecutionTreeNode * +PersistentExecutionTree::createNode(ExecutionTreeNode *parent, + ExecutionState *state) { + return new AnnotatedExecutionTreeNode(parent, state); +} + +void PersistentExecutionTree::setTerminationType(ExecutionState &state, + StateTerminationType type) { + auto *annotatedNode = + llvm::cast(state.executionTreeNode); + annotatedNode->kind = type; +} + +void PersistentExecutionTree::updateBranchingNode(ExecutionTreeNode &node, + BranchType reason) { + auto *annotatedNode = llvm::cast(&node); + const auto &state = *node.state; + const auto prevPC = state.prevPC; + annotatedNode->asmLine = + prevPC && prevPC->info ? prevPC->info->assemblyLine : 0; + annotatedNode->kind = reason; + writer.write(*annotatedNode); +} + +void PersistentExecutionTree::updateTerminatingNode(ExecutionTreeNode &node) { + assert(node.state); + auto *annotatedNode = llvm::cast(&node); + const auto &state = *node.state; + const auto prevPC = state.prevPC; + annotatedNode->asmLine = + prevPC && prevPC->info ? prevPC->info->assemblyLine : 0; + annotatedNode->stateID = state.getID(); + writer.write(*annotatedNode); +} + +// Factory + +std::unique_ptr +klee::createExecutionTree(ExecutionState &initialState, bool inMemory, + InterpreterHandler &ih) { + if (WriteExecutionTree) + return std::make_unique(initialState, ih); + + if (inMemory) + return std::make_unique(initialState); + + return std::make_unique(); +}; diff --git a/lib/Core/ExecutionTree.h b/lib/Core/ExecutionTree.h new file mode 100644 index 0000000000..cd28a85ca6 --- /dev/null +++ b/lib/Core/ExecutionTree.h @@ -0,0 +1,203 @@ +//===-- ExecutionTree.h -----------------------------------------*- C++ -*-===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef KLEE_EXECUTION_TREE_H +#define KLEE_EXECUTION_TREE_H + +#include "ExecutionTreeWriter.h" +#include "UserSearcher.h" +#include "klee/Core/BranchTypes.h" +#include "klee/Core/TerminationTypes.h" +#include "klee/Expr/Expr.h" +#include "klee/Support/ErrorHandling.h" + +#include "llvm/ADT/PointerIntPair.h" +#include "llvm/Support/Casting.h" + +#include +#include + +namespace klee { +class ExecutionState; +class Executor; +class InMemoryExecutionTree; +class InterpreterHandler; +class ExecutionTreeNode; +class Searcher; + +/* ExecutionTreeNodePtr is used by the Random Path Searcher object to +efficiently record which ExecutionTreeNode belongs to it. ExecutionTree is a +global structure that captures all states, whereas a Random Path Searcher might +only care about a subset. The integer part of ExecutionTreeNodePtr is a bitmask +(a "tag") of which Random Path Searchers ExecutionTreeNode belongs to. */ +constexpr std::uint8_t PtrBitCount = 3; +using ExecutionTreeNodePtr = + llvm::PointerIntPair; + +class ExecutionTreeNode { +public: + enum class NodeType : std::uint8_t { Basic, Annotated }; + + ExecutionTreeNode *parent{nullptr}; + ExecutionTreeNodePtr left; + ExecutionTreeNodePtr right; + ExecutionState *state{nullptr}; + + ExecutionTreeNode(ExecutionTreeNode *parent, ExecutionState *state) noexcept; + virtual ~ExecutionTreeNode() = default; + ExecutionTreeNode(const ExecutionTreeNode &) = delete; + ExecutionTreeNode &operator=(ExecutionTreeNode const &) = delete; + ExecutionTreeNode(ExecutionTreeNode &&) = delete; + ExecutionTreeNode &operator=(ExecutionTreeNode &&) = delete; + + [[nodiscard]] virtual NodeType getType() const { return NodeType::Basic; } + static bool classof(const ExecutionTreeNode *N) { return true; } +}; + +class AnnotatedExecutionTreeNode : public ExecutionTreeNode { + inline static std::uint32_t nextID{1}; + +public: + std::uint32_t id{0}; + std::uint32_t stateID{0}; + std::uint32_t asmLine{0}; + std::variant kind{BranchType::NONE}; + + AnnotatedExecutionTreeNode(ExecutionTreeNode *parent, + ExecutionState *state) noexcept; + ~AnnotatedExecutionTreeNode() override = default; + + [[nodiscard]] NodeType getType() const override { return NodeType::Annotated; } + + static bool classof(const ExecutionTreeNode *N) { + return N->getType() == NodeType::Annotated; + } +}; + +class ExecutionTree { +public: + enum class ExecutionTreeType : std::uint8_t { + Basic, + Noop, + InMemory, + Persistent + }; + + /// Branch from ExecutionTreeNode and attach states, convention: rightState is + /// parent + virtual void attach(ExecutionTreeNode *node, ExecutionState *leftState, + ExecutionState *rightState, BranchType reason) = 0; + /// Dump execution tree in .dot format into os (debug) + virtual void dump(llvm::raw_ostream &os) = 0; + /// Remove node from tree + virtual void remove(ExecutionTreeNode *node) = 0; + /// Set termination type (on state removal) + virtual void setTerminationType(ExecutionState &state, + StateTerminationType type){} + + virtual ~ExecutionTree() = default; + ExecutionTree(ExecutionTree const &) = delete; + ExecutionTree &operator=(ExecutionTree const &) = delete; + ExecutionTree(ExecutionTree &&) = delete; + ExecutionTree &operator=(ExecutionTree &&) = delete; + + [[nodiscard]] virtual ExecutionTreeType getType() const = 0; + static bool classof(const ExecutionTreeNode *N) { return true; } + +protected: + explicit ExecutionTree() noexcept = default; +}; + +/// @brief A pseudo execution tree that does not maintain any nodes. +class NoopExecutionTree final : public ExecutionTree { +public: + NoopExecutionTree() noexcept = default; + ~NoopExecutionTree() override = default; + void attach(ExecutionTreeNode *node, ExecutionState *leftState, + ExecutionState *rightState, BranchType reason) noexcept override {} + void dump(llvm::raw_ostream &os) noexcept override; + void remove(ExecutionTreeNode *node) noexcept override {} + + [[nodiscard]] ExecutionTreeType getType() const override { + return ExecutionTreeType::Noop; + }; + + static bool classof(const ExecutionTree *T) { + return T->getType() == ExecutionTreeType::Noop; + } +}; + +/// @brief An in-memory execution tree required by RandomPathSearcher +class InMemoryExecutionTree : public ExecutionTree { +public: + ExecutionTreeNodePtr root; + +private: + /// Number of registered IDs ("users", e.g. RandomPathSearcher) + std::uint8_t registeredIds = 0; + + virtual ExecutionTreeNode *createNode(ExecutionTreeNode *parent, + ExecutionState *state); + virtual void updateBranchingNode(ExecutionTreeNode &node, BranchType reason) {} + virtual void updateTerminatingNode(ExecutionTreeNode &node) {} + +public: + InMemoryExecutionTree() noexcept = default; + explicit InMemoryExecutionTree(ExecutionState &initialState) noexcept; + ~InMemoryExecutionTree() override = default; + + void attach(ExecutionTreeNode *node, ExecutionState *leftState, + ExecutionState *rightState, BranchType reason) noexcept override; + void dump(llvm::raw_ostream &os) noexcept override; + std::uint8_t getNextId() noexcept; + void remove(ExecutionTreeNode *node) noexcept override; + + [[nodiscard]] ExecutionTreeType getType() const override { + return ExecutionTreeType::InMemory; + }; + + static bool classof(const ExecutionTree *T) { + return (T->getType() == ExecutionTreeType::InMemory) || + (T->getType() == ExecutionTreeType::Persistent); + } +}; + +/// @brief An in-memory execution tree that also writes its nodes into an SQLite +/// database (exec_tree.db) with a ExecutionTreeWriter +class PersistentExecutionTree : public InMemoryExecutionTree { + ExecutionTreeWriter writer; + + ExecutionTreeNode *createNode(ExecutionTreeNode *parent, + ExecutionState *state) override; + void updateBranchingNode(ExecutionTreeNode &node, BranchType reason) override; + void updateTerminatingNode(ExecutionTreeNode &node) override; + +public: + explicit PersistentExecutionTree(ExecutionState &initialState, + InterpreterHandler &ih) noexcept; + ~PersistentExecutionTree() override = default; + void dump(llvm::raw_ostream &os) noexcept override; + void setTerminationType(ExecutionState &state, + StateTerminationType type) override; + + [[nodiscard]] ExecutionTreeType getType() const override { + return ExecutionTreeType::Persistent; + }; + + static bool classof(const ExecutionTree *T) { + return T->getType() == ExecutionTreeType::Persistent; + } +}; + +std::unique_ptr createExecutionTree(ExecutionState &initialState, + bool inMemory, + InterpreterHandler &ih); +} // namespace klee + +#endif /* KLEE_EXECUTION_TREE_H */ diff --git a/lib/Core/ExecutionTreeWriter.cpp b/lib/Core/ExecutionTreeWriter.cpp new file mode 100644 index 0000000000..e1091eb041 --- /dev/null +++ b/lib/Core/ExecutionTreeWriter.cpp @@ -0,0 +1,198 @@ +//===-- ExecutionTreeWriter.cpp -------------------------------------------===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "ExecutionTreeWriter.h" + +#include "ExecutionTree.h" +#include "klee/Support/ErrorHandling.h" +#include "klee/Support/OptionCategories.h" + +#include "llvm/Support/CommandLine.h" + +namespace { +llvm::cl::opt BatchSize( + "exec-tree-batch-size", llvm::cl::init(100U), + llvm::cl::desc("Number of execution tree nodes to batch for writing, " + "see --write-exec-tree (default=100)"), + llvm::cl::cat(klee::ExecTreeCat)); +} // namespace + +using namespace klee; + +void prepare_statement(sqlite3 *db, const std::string &query, sqlite3_stmt **stmt) { + int result; +#ifdef SQLITE_PREPARE_PERSISTENT + result = sqlite3_prepare_v3(db, query.c_str(), -1, SQLITE_PREPARE_PERSISTENT, + stmt, nullptr); +#else + result = sqlite3_prepare_v3(db, query.c_str(), -1, 0, stmt, nullptr); +#endif + if (result != SQLITE_OK) { + klee_warning("Execution tree database: cannot prepare query: %s [%s]", + sqlite3_errmsg(db), query.c_str()); + sqlite3_close(db); + klee_error("Execution tree database: cannot prepare query: %s", + query.c_str()); + } +} + +ExecutionTreeWriter::ExecutionTreeWriter(const std::string &dbPath) { + // create database file + if (sqlite3_open(dbPath.c_str(), &db) != SQLITE_OK) + klee_error("Cannot create execution tree database: %s", sqlite3_errmsg(db)); + + // - set options: asynchronous + WAL + char *errMsg = nullptr; + if (sqlite3_exec(db, "PRAGMA synchronous = OFF;", nullptr, nullptr, + &errMsg) != SQLITE_OK) { + klee_warning("Execution tree database: cannot set option: %s", errMsg); + sqlite3_free(errMsg); + } + if (sqlite3_exec(db, "PRAGMA journal_mode = WAL;", nullptr, nullptr, + &errMsg) != SQLITE_OK) { + klee_warning("Execution tree database: cannot set option: %s", errMsg); + sqlite3_free(errMsg); + } + + // - create table + std::string query = + "CREATE TABLE IF NOT EXISTS nodes (" + "ID INT PRIMARY KEY, stateID INT, leftID INT, rightID INT," + "asmLine INT, kind INT);"; + char *zErr = nullptr; + if (sqlite3_exec(db, query.c_str(), nullptr, nullptr, &zErr) != SQLITE_OK) { + klee_warning("Execution tree database: initialisation error: %s", zErr); + sqlite3_free(zErr); + sqlite3_close(db); + klee_error("Execution tree database: initialisation error."); + } + + // create prepared statements + // - insertStmt + query = "INSERT INTO nodes VALUES (?, ?, ?, ?, ?, ?);"; + prepare_statement(db, query, &insertStmt); + // - transactionBeginStmt + query = "BEGIN TRANSACTION"; + prepare_statement(db, query, &transactionBeginStmt); + // - transactionCommitStmt + query = "COMMIT TRANSACTION"; + prepare_statement(db, query, &transactionCommitStmt); + + // begin transaction + if (sqlite3_step(transactionBeginStmt) != SQLITE_DONE) { + klee_warning("Execution tree database: cannot begin transaction: %s", + sqlite3_errmsg(db)); + } + if (sqlite3_reset(transactionBeginStmt) != SQLITE_OK) { + klee_warning("Execution tree database: cannot reset transaction: %s", + sqlite3_errmsg(db)); + } +} + +ExecutionTreeWriter::~ExecutionTreeWriter() { + batchCommit(!flushed); + + // finalize prepared statements + sqlite3_finalize(insertStmt); + sqlite3_finalize(transactionBeginStmt); + sqlite3_finalize(transactionCommitStmt); + + // commit + if (sqlite3_exec(db, "END TRANSACTION", nullptr, nullptr, nullptr) != + SQLITE_OK) { + klee_warning("Execution tree database: cannot end transaction: %s", + sqlite3_errmsg(db)); + } + + if (sqlite3_close(db) != SQLITE_OK) { + klee_warning("Execution tree database: cannot close database: %s", + sqlite3_errmsg(db)); + } +} + +void ExecutionTreeWriter::batchCommit(bool force) { + ++batch; + if (batch < BatchSize && !force) + return; + + // commit and begin transaction + if (sqlite3_step(transactionCommitStmt) != SQLITE_DONE) { + klee_warning("Execution tree database: transaction commit error: %s", + sqlite3_errmsg(db)); + } + + if (sqlite3_reset(transactionCommitStmt) != SQLITE_OK) { + klee_warning("Execution tree database: transaction reset error: %s", + sqlite3_errmsg(db)); + } + + if (sqlite3_step(transactionBeginStmt) != SQLITE_DONE) { + klee_warning("Execution tree database: transaction begin error: %s", + sqlite3_errmsg(db)); + } + + if (sqlite3_reset(transactionBeginStmt) != SQLITE_OK) { + klee_warning("Execution tree database: transaction reset error: %s", + sqlite3_errmsg(db)); + } + + batch = 0; + flushed = true; +} + +void ExecutionTreeWriter::write(const AnnotatedExecutionTreeNode &node) { + unsigned rc = 0; + + // bind values (SQLITE_OK is defined as 0 - just check success once at the + // end) + rc |= sqlite3_bind_int64(insertStmt, 1, node.id); + rc |= sqlite3_bind_int(insertStmt, 2, node.stateID); + rc |= sqlite3_bind_int64( + insertStmt, 3, + node.left.getPointer() + ? (static_cast(node.left.getPointer()))->id + : 0); + rc |= sqlite3_bind_int64( + insertStmt, 4, + node.right.getPointer() + ? (static_cast(node.right.getPointer()))->id + : 0); + rc |= sqlite3_bind_int(insertStmt, 5, node.asmLine); + std::uint8_t value{0}; + if (std::holds_alternative(node.kind)) { + value = static_cast(std::get(node.kind)); + } else if (std::holds_alternative(node.kind)) { + value = + static_cast(std::get(node.kind)); + } else { + assert(false && "ExecutionTreeWriter: Illegal node kind!"); + } + rc |= sqlite3_bind_int(insertStmt, 6, value); + if (rc != SQLITE_OK) { + // This is either a programming error (e.g. SQLITE_MISUSE) or we ran out of + // resources (e.g. SQLITE_NOMEM). Calling sqlite3_errmsg() after a possible + // successful call above is undefined, hence no error message here. + klee_error("Execution tree database: cannot persist data for node: %u", + node.id); + } + + // insert + if (sqlite3_step(insertStmt) != SQLITE_DONE) { + klee_warning( + "Execution tree database: cannot persist data for node: %u: %s", + node.id, sqlite3_errmsg(db)); + } + + if (sqlite3_reset(insertStmt) != SQLITE_OK) { + klee_warning("Execution tree database: error reset node: %u: %s", node.id, + sqlite3_errmsg(db)); + } + + batchCommit(); +} diff --git a/lib/Core/ExecutionTreeWriter.h b/lib/Core/ExecutionTreeWriter.h new file mode 100644 index 0000000000..d78ad0b1f2 --- /dev/null +++ b/lib/Core/ExecutionTreeWriter.h @@ -0,0 +1,46 @@ +//===-- ExecutionTreeWriter.h -----------------------------------*- C++ -*-===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#pragma once + +#include + +#include +#include + +namespace klee { +class AnnotatedExecutionTreeNode; + +/// @brief Writes execution tree nodes into an SQLite database +class ExecutionTreeWriter { + friend class PersistentExecutionTree; + + ::sqlite3 *db{nullptr}; + ::sqlite3_stmt *insertStmt{nullptr}; + ::sqlite3_stmt *transactionBeginStmt{nullptr}; + ::sqlite3_stmt *transactionCommitStmt{nullptr}; + std::uint32_t batch{0}; + bool flushed{true}; + + /// Writes nodes in batches + void batchCommit(bool force = false); + +public: + explicit ExecutionTreeWriter(const std::string &dbPath); + ~ExecutionTreeWriter(); + ExecutionTreeWriter(const ExecutionTreeWriter &other) = delete; + ExecutionTreeWriter(ExecutionTreeWriter &&other) noexcept = delete; + ExecutionTreeWriter &operator=(const ExecutionTreeWriter &other) = delete; + ExecutionTreeWriter &operator=(ExecutionTreeWriter &&other) noexcept = delete; + + /// Write new node into database + void write(const AnnotatedExecutionTreeNode &node); +}; + +} // namespace klee diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp index 1a16d389ed..bc27c5f3da 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -9,15 +9,18 @@ #include "Executor.h" +#include "AddressSpace.h" #include "Context.h" #include "CoreStats.h" #include "ExecutionState.h" +#include "ExecutionTree.h" #include "ExternalDispatcher.h" +#if LLVM_VERSION_CODE <= LLVM_VERSION(14, 0) #include "GetElementPtrTypeIterator.h" +#endif #include "ImpliedValue.h" #include "Memory.h" #include "MemoryManager.h" -#include "PTree.h" #include "Searcher.h" #include "SeedInfo.h" #include "SpecialFunctionHandler.h" @@ -35,8 +38,10 @@ #include "klee/Expr/ExprPPrinter.h" #include "klee/Expr/ExprSMTLIBPrinter.h" #include "klee/Expr/ExprUtil.h" +#include "klee/KDAlloc/kdalloc.h" #include "klee/Module/Cell.h" #include "klee/Module/InstructionInfoTable.h" +#include "klee/Module/KCallable.h" #include "klee/Module/KInstruction.h" #include "klee/Module/KModule.h" #include "klee/Solver/Common.h" @@ -46,7 +51,6 @@ #include "klee/Support/Casting.h" #include "klee/Support/ErrorHandling.h" #include "klee/Support/FileHandling.h" -#include "klee/Support/FloatEvaluation.h" #include "klee/Support/ModuleUtil.h" #include "klee/Support/OptionCategories.h" #include "klee/System/MemoryUsage.h" @@ -56,32 +60,31 @@ #include "llvm/ADT/StringExtras.h" #include "llvm/IR/Attributes.h" #include "llvm/IR/BasicBlock.h" -#if LLVM_VERSION_CODE < LLVM_VERSION(8, 0) -#include "llvm/IR/CallSite.h" -#endif #include "llvm/IR/Constants.h" #include "llvm/IR/DataLayout.h" #include "llvm/IR/Function.h" +#include "llvm/IR/InlineAsm.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/IntrinsicInst.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" #include "llvm/IR/Operator.h" +#if LLVM_VERSION_CODE >= LLVM_VERSION(15, 0) +#include "llvm/IR/GetElementPtrTypeIterator.h" +#endif #include "llvm/Support/CommandLine.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" #include "llvm/Support/Process.h" -#if LLVM_VERSION_CODE >= LLVM_VERSION(10, 0) #include "llvm/Support/TypeSize.h" -#else -typedef unsigned TypeSize; -#endif #include "llvm/Support/raw_ostream.h" #include #include #include +#include +#include #include #include #include @@ -91,6 +94,7 @@ typedef unsigned TypeSize; #include #include #include +#include #include using namespace llvm; @@ -121,6 +125,13 @@ cl::opt MaxTime( "Set to 0s to disable (default=0s)"), cl::init("0s"), cl::cat(TerminationCat)); + +/*** Misc options ***/ +cl::opt SingleObjectResolution( + "single-object-resolution", + cl::desc("Try to resolve memory reads/writes to single objects " + "when offsets are symbolic (default=false)"), + cl::init(false), cl::cat(MiscCat)); } // namespace klee namespace { @@ -173,9 +184,10 @@ cl::opt /*** External call policy options ***/ enum class ExternalCallPolicy { - None, // No external calls allowed - Concrete, // Only external calls with concrete arguments allowed - All, // All external calls allowed + None, // No external calls allowed + Concrete, // Only external calls with concrete arguments allowed + All, // All external calls allowed, symbolic arguments concretized + OverApprox, // All external calls allowed, symbolic inputs are not constrained by the call }; cl::opt ExternalCalls( @@ -192,23 +204,45 @@ cl::opt ExternalCalls( "allowed (default)"), clEnumValN(ExternalCallPolicy::All, "all", "All external function calls are allowed. This concretizes " - "any symbolic arguments in calls to external functions.")), + "any symbolic arguments in calls to external functions."), + clEnumValN(ExternalCallPolicy::OverApprox, "over-approx", + "All external function calls are allowed. This concretizes " + "any symbolic arguments in calls to external functions but" + "the concretization is ignored after the call (see docs).")), cl::init(ExternalCallPolicy::Concrete), cl::cat(ExtCallsCat)); -cl::opt SuppressExternalWarnings( - "suppress-external-warnings", - cl::init(false), - cl::desc("Supress warnings about calling external functions."), - cl::cat(ExtCallsCat)); -cl::opt AllExternalWarnings( - "all-external-warnings", - cl::init(false), - cl::desc("Issue a warning everytime an external call is made, " - "as opposed to once per function (default=false)"), +/*** External call warnings options ***/ + +enum class ExtCallWarnings { + None, // Never warn on external calls + OncePerFunction, // Only warn once per function on external calls + All, // Always warn on external calls +}; + +cl::opt ExternalCallWarnings( + "external-call-warnings", + cl::desc("Specify when to warn about external calls"), + cl::values( + clEnumValN( + ExtCallWarnings::None, "none", + "Never warn"), + clEnumValN(ExtCallWarnings::OncePerFunction, "once-per-function", + "Warn once per external function (default)"), + clEnumValN(ExtCallWarnings::All, "all", + "Always warn")), + cl::init(ExtCallWarnings::OncePerFunction), cl::cat(ExtCallsCat)); +cl::opt ExternalPageThreshold( + "kdalloc-external-page-threshold", cl::init(1024), + cl::desc( + "Threshold for garbage collecting pages used by external calls. If " + "there is a significant number of infrequently used pages resident in " + "memory, these will only be cleaned up if the total number of pages " + "used for external calls is above the given threshold (default=1024)."), + cl::cat(ExtCallsCat)); /*** Seeding options ***/ @@ -231,18 +265,10 @@ cl::opt OnlySeed("only-seed", "doing regular search (default=false)."), cl::cat(SeedingCat)); -cl::opt - AllowSeedExtension("allow-seed-extension", - cl::init(false), - cl::desc("Allow extra (unbound) values to become " - "symbolic during seeding (default=false)."), - cl::cat(SeedingCat)); - -cl::opt ZeroSeedExtension( - "zero-seed-extension", - cl::init(false), - cl::desc( - "Use zero-filled objects if matching seed not found (default=false)"), +cl::opt AllowSeedExtension( + "allow-seed-extension", cl::init(false), + cl::desc("Allow extra values to become symbolic during seeding; " + "the seed is extended with zeros (default=false)."), cl::cat(SeedingCat)); cl::opt AllowSeedTruncation( @@ -271,7 +297,7 @@ cl::list ExitOnErrorType( cl::desc("Stop execution after reaching a specified condition (default=false)"), cl::values( clEnumValN(StateTerminationType::Abort, "Abort", - "The program crashed (reached abort()/klee_abort())"), + "The program reached abort or klee_abort"), clEnumValN(StateTerminationType::Assert, "Assert", "An assertion was hit"), clEnumValN(StateTerminationType::BadVectorAccess, "BadVectorAccess", @@ -291,8 +317,26 @@ cl::list ExitOnErrorType( "Write to read-only memory"), clEnumValN(StateTerminationType::ReportError, "ReportError", "klee_report_error called"), + clEnumValN(StateTerminationType::InvalidBuiltin, "InvalidBuiltin", + "Passing invalid value to compiler builtin"), + clEnumValN(StateTerminationType::ImplicitTruncation, "ImplicitTruncation", + "Implicit conversion from integer of larger bit width to " + "smaller bit width that results in data loss"), + clEnumValN(StateTerminationType::ImplicitConversion, "ImplicitConversion", + "Implicit conversion between integer types that changes the " + "sign of the value"), + clEnumValN(StateTerminationType::UnreachableCall, "UnreachableCall", + "Control flow reached an unreachable program point"), + clEnumValN(StateTerminationType::MissingReturn, "MissingReturn", + "Reaching the end of a value-returning function without " + "returning a value"), + clEnumValN(StateTerminationType::InvalidLoad, "InvalidLoad", + "Load of a value which is not in the range of representable " + "values for that type"), + clEnumValN(StateTerminationType::NullableAttribute, "NullableAttribute", + "Violation of nullable attribute detected"), clEnumValN(StateTerminationType::User, "User", - "Wrong klee_* functions invocation")), + "Wrong klee_* function invocation")), cl::ZeroOrMore, cl::cat(TerminationCat)); @@ -408,6 +452,7 @@ llvm::cl::bits DebugPrintInstructions( "Log all instructions to file " "instructions.txt in format [src, " "inst_id]"), + clEnumValN(FILE_COMPACT, "compact:file", "Log all instructions to file instructions.txt in format " "[inst_id]")), @@ -430,8 +475,8 @@ cl::opt DebugCheckForImpliedValues( } // namespace // XXX hack -extern "C" unsigned dumpStates, dumpPTree; -unsigned dumpStates = 0, dumpPTree = 0; +extern "C" unsigned dumpStates, dumpExecutionTree; +unsigned dumpStates = 0, dumpExecutionTree = 0; Executor::Executor(LLVMContext &ctx, const InterpreterOptions &opts, InterpreterHandler *ih) @@ -452,20 +497,20 @@ Executor::Executor(LLVMContext &ctx, const InterpreterOptions &opts, coreSolverTimeout = time::Span{MaxCoreSolverTime}; if (coreSolverTimeout) UseForkedCoreSolver = true; - Solver *coreSolver = klee::createCoreSolver(CoreSolverToUse); + std::unique_ptr coreSolver = klee::createCoreSolver(CoreSolverToUse); if (!coreSolver) { klee_error("Failed to create core solver\n"); } - Solver *solver = constructSolverChain( - coreSolver, + std::unique_ptr solver = constructSolverChain( + std::move(coreSolver), interpreterHandler->getOutputFilename(ALL_QUERIES_SMT2_FILE_NAME), interpreterHandler->getOutputFilename(SOLVER_QUERIES_SMT2_FILE_NAME), interpreterHandler->getOutputFilename(ALL_QUERIES_KQUERY_FILE_NAME), interpreterHandler->getOutputFilename(SOLVER_QUERIES_KQUERY_FILE_NAME)); - this->solver = new TimingSolver(solver, EqualitySubstitution); - memory = new MemoryManager(&arrayCache); + this->solver = std::make_unique(std::move(solver), EqualitySubstitution); + memory = std::make_unique(&arrayCache); initializeSearchOptions(); @@ -560,11 +605,9 @@ Executor::setModule(std::vector> &modules, } Executor::~Executor() { - delete memory; delete externalDispatcher; delete specialFunctionHandler; delete statsTracker; - delete solver; } /***/ @@ -667,7 +710,7 @@ void Executor::allocateGlobalObjects(ExecutionState &state) { // We allocate an object to represent each function, // its address can be used for function pointers. // TODO: Check whether the object is accessed? - auto mo = memory->allocate(8, false, true, &f, 8); + auto mo = memory->allocate(8, false, true, &state, &f, 8); addr = Expr::createPointer(mo->address); legalFunctions.emplace(mo->address, &f); } @@ -711,7 +754,7 @@ void Executor::allocateGlobalObjects(ExecutionState &state) { for (const GlobalVariable &v : m->globals()) { std::size_t globalObjectAlignment = getAllocationAlignment(&v); - Type *ty = v.getType()->getElementType(); + Type *ty = v.getValueType(); std::uint64_t size = 0; if (ty->isSized()) size = kmodule->targetData->getTypeStoreSize(ty); @@ -746,7 +789,8 @@ void Executor::allocateGlobalObjects(ExecutionState &state) { } MemoryObject *mo = memory->allocate(size, /*isLocal=*/false, - /*isGlobal=*/true, /*allocSite=*/&v, + /*isGlobal=*/true, /*state=*/nullptr, + /*allocSite=*/&v, /*alignment=*/globalObjectAlignment); if (!mo) klee_error("out of memory"); @@ -796,9 +840,6 @@ void Executor::initializeGlobalAliases() { void Executor::initializeGlobalObjects(ExecutionState &state) { const Module *m = kmodule->module.get(); - // remember constant objects to initialise their counter part for external - // calls - std::vector constantObjects; for (const GlobalVariable &v : m->globals()) { MemoryObject *mo = globalObjects.find(&v)->second; ObjectState *os = bindObjectInState(state, mo, false); @@ -821,22 +862,15 @@ void Executor::initializeGlobalObjects(ExecutionState &state) { } } else if (v.hasInitializer()) { initializeGlobalObject(state, os, v.getInitializer(), 0); - if (v.isConstant()) - constantObjects.emplace_back(os); + if (v.isConstant()) { + os->setReadOnly(true); + // initialise constant memory that may be used with external calls + state.addressSpace.copyOutConcrete(mo, os); + } } else { os->initializeToRandom(); } } - - // initialise constant memory that is potentially used with external calls - if (!constantObjects.empty()) { - // initialise the actual memory with constant values - state.addressSpace.copyOutConcretes(); - - // mark constant objects as read-only - for (auto obj : constantObjects) - obj->setReadOnly(true); - } } @@ -878,8 +912,10 @@ void Executor::branch(ExecutionState &state, result.push_back(nullptr); } } + stats::inhibitedForks += N - 1; } else { stats::forks += N-1; + stats::incBranchStat(reason, N-1); // XXX do proper balance or keep random? result.push_back(&state); @@ -888,7 +924,7 @@ void Executor::branch(ExecutionState &state, ExecutionState *ns = es->branch(); addedStates.push_back(ns); result.push_back(ns); - processTree->attach(es->ptreeNode, ns, es, reason); + executionTree->attach(es->executionTreeNode, ns, es, reason); } } @@ -932,7 +968,7 @@ void Executor::branch(ExecutionState &state, if (OnlyReplaySeeds) { for (unsigned i=0; i condition, addConstraint(current, Expr::createIsZero(condition)); res = Solver::False; } + ++stats::inhibitedForks; } } } @@ -1158,7 +1195,8 @@ Executor::StatePair Executor::fork(ExecutionState ¤t, ref condition, } } - processTree->attach(current.ptreeNode, falseState, trueState, reason); + executionTree->attach(current.executionTreeNode, falseState, trueState, reason); + stats::incBranchStat(reason, 1); if (pathWriter) { // Need to update the pathOS.id field of falseState, otherwise the same id @@ -1212,7 +1250,7 @@ void Executor::addConstraint(ExecutionState &state, ref condition) { assert(success && "FIXME: Unhandled solver failure"); (void) success; if (res) { - siit->patchSeed(state, condition, solver); + siit->patchSeed(state, condition, solver.get()); warn = true; } } @@ -1278,37 +1316,51 @@ ref Executor::toUnique(const ExecutionState &state, return result; } - -/* Concretize the given expression, and return a possible constant value. - 'reason' is just a documentation string stating the reason for concretization. */ -ref -Executor::toConstant(ExecutionState &state, - ref e, - const char *reason) { +ref Executor::toConstant(ExecutionState &state, ref e, + const std::string &reason, + bool concretize) { e = ConstraintManager::simplifyExpr(state.constraints, e); if (ConstantExpr *CE = dyn_cast(e)) return CE; - ref value; - bool success = - solver->getValue(state.constraints, e, value, state.queryMetaData); - assert(success && "FIXME: Unhandled solver failure"); - (void) success; + /* If no seed evaluation results in a constant, call the solver */ + ref cvalue = getValueFromSeeds(state, e); + if (!cvalue) { + [[maybe_unused]] bool success = + solver->getValue(state.constraints, e, cvalue, state.queryMetaData); + assert(success && "FIXME: Unhandled solver failure"); + } std::string str; llvm::raw_string_ostream os(str); os << "silently concretizing (reason: " << reason << ") expression " << e - << " to value " << value << " (" << (*(state.pc)).info->file << ":" + << " to value " << cvalue << " (" << (*(state.pc)).info->file << ":" << (*(state.pc)).info->line << ")"; - if (AllExternalWarnings) + if (ExternalCallWarnings == ExtCallWarnings::All) klee_warning("%s", os.str().c_str()); else - klee_warning_once(reason, "%s", os.str().c_str()); + klee_warning_once(reason.c_str(), "%s", os.str().c_str()); - addConstraint(state, EqExpr::create(e, value)); - - return value; + if (concretize) + addConstraint(state, EqExpr::create(e, cvalue)); + + return cvalue; +} + +ref Executor::getValueFromSeeds(ExecutionState &state, + ref e) { + auto found = seedMap.find(&state); + if (found == seedMap.end()) + return nullptr; + + auto seeds = found->second; + for (auto const &seed : seeds) { + auto value = seed.assignment.evaluate(e); + if (isa(value)) + return value; + } + return nullptr; } void Executor::executeGetValue(ExecutionState &state, @@ -1432,24 +1484,25 @@ MemoryObject *Executor::serializeLandingpad(ExecutionState &state, stateTerminated = false; std::vector serialized; - for (unsigned current_clause_id = 0; current_clause_id < lpi.getNumClauses(); ++current_clause_id) { - llvm::Constant *current_clause = lpi.getClause(current_clause_id); if (lpi.isCatch(current_clause_id)) { // catch-clause serialized.push_back(0); std::uint64_t ti_addr = 0; - llvm::BitCastOperator *clause_bitcast = - dyn_cast(current_clause); - if (clause_bitcast) { - llvm::GlobalValue *clause_type = + llvm::Constant *catchClause = lpi.getClause(current_clause_id); + llvm::Constant *typeInfo = catchClause->stripPointerCasts(); + if (auto *gv = dyn_cast(typeInfo)) { + ti_addr = globalAddresses[gv]->getZExtValue(); + } else if (auto *clause_bitcast = + dyn_cast(catchClause)) { + auto *clause_type = dyn_cast(clause_bitcast->getOperand(0)); ti_addr = globalAddresses[clause_type]->getZExtValue(); - } else if (current_clause->isNullValue()) { + } else if (catchClause->isNullValue()) { ti_addr = 0; } else { terminateStateOnExecError( @@ -1461,15 +1514,16 @@ MemoryObject *Executor::serializeLandingpad(ExecutionState &state, serialized.resize(old_size + 8); memcpy(serialized.data() + old_size, &ti_addr, sizeof(ti_addr)); } else if (lpi.isFilter(current_clause_id)) { - if (current_clause->isNullValue()) { + llvm::Constant *filter_clause = lpi.getClause(current_clause_id); + + if (filter_clause->isNullValue()) { // special handling for a catch-all filter clause, i.e., "[0 x i8*]" // for this case we serialize 1 element.. serialized.push_back(1); // which is a 64bit-wide 0. serialized.resize(serialized.size() + 8, 0); } else { - llvm::ConstantArray const *ca = - cast(current_clause); + const auto *ca = cast(filter_clause); // serialize `num_elements+1` as unsigned char unsigned const num_elements = ca->getNumOperands(); @@ -1488,18 +1542,16 @@ MemoryObject *Executor::serializeLandingpad(ExecutionState &state, // serialize the exception-types occurring in this filter-clause for (llvm::Value const *v : ca->operands()) { - llvm::BitCastOperator const *bitcast = - dyn_cast(v); - if (!bitcast) { - terminateStateOnExecError(state, - "Internal: expected value inside a " - "filter-clause to be a bitcast"); - stateTerminated = true; - return nullptr; + llvm::GlobalValue const *clause_value = nullptr; + + if (auto const *bitcast = dyn_cast(v)) { + clause_value = dyn_cast(bitcast->getOperand(0)); + } + + if (auto const *gv = dyn_cast(v)) { + clause_value = gv; } - llvm::GlobalValue const *clause_value = - dyn_cast(bitcast->getOperand(0)); if (!clause_value) { terminateStateOnExecError(state, "Internal: expected value inside a " @@ -1520,7 +1572,7 @@ MemoryObject *Executor::serializeLandingpad(ExecutionState &state, } MemoryObject *mo = - memory->allocate(serialized.size(), true, false, nullptr, 1); + memory->allocate(serialized.size(), true, false, &state, nullptr, 1); ObjectState *os = bindObjectInState(state, mo, false); for (unsigned i = 0; i < serialized.size(); i++) { os->write8(i, serialized[i]); @@ -1661,10 +1713,11 @@ void Executor::executeCall(ExecutionState &state, KInstruction *ki, Function *f, return; if (f && f->isDeclaration()) { switch (f->getIntrinsicID()) { - case Intrinsic::not_intrinsic: + case Intrinsic::not_intrinsic: { // state may be destroyed by this call, cannot touch - callExternalFunction(state, ki, f, arguments); + callExternalFunction(state, ki, kmodule->functionMap[f], arguments); break; + } case Intrinsic::fabs: { ref arg = toConstant(state, arguments[0], "floating point"); @@ -1680,6 +1733,41 @@ void Executor::executeCall(ExecutionState &state, KInstruction *ki, Function *f, break; } + case Intrinsic::fma: + case Intrinsic::fmuladd: { + // Both fma and fmuladd support float, double and fp80. Note, that fp80 + // is not mentioned in the documentation of fmuladd, nevertheless, it is + // still supported. For details see + // https://github.com/klee/klee/pull/1507/files#r894993332 + + if (isa(i->getOperand(0)->getType())) + return terminateStateOnExecError( + state, f->getName() + " with vectors is not supported"); + + ref op1 = + toConstant(state, eval(ki, 1, state).value, "floating point"); + ref op2 = + toConstant(state, eval(ki, 2, state).value, "floating point"); + ref op3 = + toConstant(state, eval(ki, 3, state).value, "floating point"); + + if (!fpWidthToSemantics(op1->getWidth()) || + !fpWidthToSemantics(op2->getWidth()) || + !fpWidthToSemantics(op3->getWidth())) + return terminateStateOnExecError( + state, "Unsupported " + f->getName() + " call"); + + // (op1 * op2) + op3 + APFloat Res(*fpWidthToSemantics(op1->getWidth()), op1->getAPValue()); + Res.fusedMultiplyAdd( + APFloat(*fpWidthToSemantics(op2->getWidth()), op2->getAPValue()), + APFloat(*fpWidthToSemantics(op3->getWidth()), op3->getAPValue()), + APFloat::rmNearestTiesToEven); + + bindLocal(ki, state, ConstantExpr::alloc(Res.bitcastToAPInt())); + break; + } + #if LLVM_VERSION_CODE >= LLVM_VERSION(12, 0) case Intrinsic::abs: { if (isa(i->getOperand(0)->getType())) @@ -1747,7 +1835,6 @@ void Executor::executeCall(ExecutionState &state, KInstruction *ki, Function *f, } #endif -#if LLVM_VERSION_CODE >= LLVM_VERSION(7, 0) case Intrinsic::fshr: case Intrinsic::fshl: { ref op1 = eval(ki, 1, state).value; @@ -1772,7 +1859,6 @@ void Executor::executeCall(ExecutionState &state, KInstruction *ki, Function *f, } break; } -#endif // va_arg is handled by caller and intrinsic lowering, see comment for // ExecutionState::varargs @@ -1893,37 +1979,21 @@ void Executor::executeCall(ExecutionState &state, KInstruction *ki, Function *f, uint64_t offsets[callingArgs]; // offsets of variadic arguments uint64_t argWidth; // width of current variadic argument -#if LLVM_VERSION_CODE >= LLVM_VERSION(8, 0) - const CallBase &cs = cast(*i); -#else - const CallSite cs(i); -#endif + const CallBase &cb = cast(*i); for (unsigned k = funcArgs; k < callingArgs; k++) { - if (cs.isByValArgument(k)) { -#if LLVM_VERSION_CODE >= LLVM_VERSION(9, 0) - Type *t = cs.getParamByValType(k); -#else - auto arg = cs.getArgOperand(k); - Type *t = arg->getType(); - assert(t->isPointerTy()); - t = t->getPointerElementType(); -#endif + if (cb.isByValArgument(k)) { + Type *t = cb.getParamByValType(k); argWidth = kmodule->targetData->getTypeSizeInBits(t); } else { argWidth = arguments[k]->getWidth(); } - if (WordSize == Expr::Int32) { - offsets[k] = size; - size += Expr::getMinBytesForWidth(argWidth); - } else { -#if LLVM_VERSION_CODE >= LLVM_VERSION(11, 0) - MaybeAlign ma = cs.getParamAlign(k); - unsigned alignment = ma ? ma->value() : 0; -#else - unsigned alignment = cs.getParamAlignment(k); -#endif + MaybeAlign ma = cb.getParamAlign(k); + unsigned alignment = ma ? ma->value() : 0; + if (WordSize == Expr::Int32 && !alignment) + alignment = 4; + else { // AMD64-ABI 3.5.7p5: Step 7. Align l->overflow_arg_area upwards to a // 16 byte boundary if alignment needed by type exceeds 8 byte // boundary. @@ -1934,10 +2004,14 @@ void Executor::executeCall(ExecutionState &state, KInstruction *ki, Function *f, if (!alignment) alignment = 8; + } - size = llvm::alignTo(size, alignment); - offsets[k] = size; + size = llvm::alignTo(size, alignment); + offsets[k] = size; + if (WordSize == Expr::Int32) + size += Expr::getMinBytesForWidth(argWidth); + else { // AMD64-ABI 3.5.7p5: Step 9. Set l->overflow_arg_area to: // l->overflow_arg_area + sizeof(type) // Step 10. Align l->overflow_arg_area upwards to an 8 byte boundary. @@ -1947,7 +2021,7 @@ void Executor::executeCall(ExecutionState &state, KInstruction *ki, Function *f, StackFrame &sf = state.stack.back(); MemoryObject *mo = sf.varargs = - memory->allocate(size, true, false, state.prevPC->inst, + memory->allocate(size, true, false, &state, state.prevPC->inst, (requires16ByteAlignment ? 16 : 8)); if (!mo && size) { terminateStateOnExecError(state, "out of memory (varargs)"); @@ -1965,7 +2039,7 @@ void Executor::executeCall(ExecutionState &state, KInstruction *ki, Function *f, ObjectState *os = bindObjectInState(state, mo, true); for (unsigned k = funcArgs; k < callingArgs; k++) { - if (!cs.isByValArgument(k)) { + if (!cb.isByValArgument(k)) { os->write(offsets[k], arguments[k]); } else { ConstantExpr *CE = dyn_cast(arguments[k]); @@ -2014,7 +2088,7 @@ void Executor::transferToBasicBlock(BasicBlock *dst, BasicBlock *src, /// Compute the true target of a function call, resolving LLVM aliases /// and bitcasts. -Function* Executor::getTargetFunction(Value *calledVal, ExecutionState &state) { +Function *Executor::getTargetFunction(Value *calledVal) { SmallPtrSet Visited; Constant *c = dyn_cast(calledVal); @@ -2092,7 +2166,7 @@ void Executor::executeInstruction(ExecutionState &state, KInstruction *ki) { unwindToNextLandingpad(state); } else { // a clause (or a catch-all clause or filter clause) matches: - // remember the stack index and switch to cleanup phase + // remember the stack index and switch to clean-up phase state.unwindingInformation = std::make_unique( sui->exceptionObject, cast(result), @@ -2117,16 +2191,10 @@ void Executor::executeInstruction(ExecutionState &state, KInstruction *ki) { Expr::Width to = getWidthForLLVMType(t); if (from != to) { -#if LLVM_VERSION_CODE >= LLVM_VERSION(8, 0) - const CallBase &cs = cast(*caller); -#else - const CallSite cs(isa(caller) - ? CallSite(cast(caller)) - : CallSite(cast(caller))); -#endif + const CallBase &cb = cast(*caller); // XXX need to check other param attrs ? - bool isSExt = cs.hasRetAttr(llvm::Attribute::SExt); + bool isSExt = cb.hasRetAttr(llvm::Attribute::SExt); if (isSExt) { result = SExtExpr::create(result, to); } else { @@ -2158,7 +2226,7 @@ void Executor::executeInstruction(ExecutionState &state, KInstruction *ki) { ref cond = eval(ki, 0, state).value; cond = optimizer.optimizeExpr(cond, false); - Executor::StatePair branches = fork(state, cond, false, BranchType::ConditionalBranch); + Executor::StatePair branches = fork(state, cond, false, BranchType::Conditional); // NOTE: There is a hidden dependency here, markBranchVisited // requires that we still be in the context of the branch @@ -2231,7 +2299,7 @@ void Executor::executeInstruction(ExecutionState &state, KInstruction *ki) { // fork states std::vector branches; - branch(state, expressions, branches, BranchType::IndirectBranch); + branch(state, expressions, branches, BranchType::Indirect); // terminate error state if (result) { @@ -2381,21 +2449,11 @@ void Executor::executeInstruction(ExecutionState &state, KInstruction *ki) { if (isa(i)) break; -#if LLVM_VERSION_CODE >= LLVM_VERSION(8, 0) - const CallBase &cs = cast(*i); - Value *fp = cs.getCalledOperand(); -#else - const CallSite cs(i); - Value *fp = cs.getCalledValue(); -#endif - - unsigned numArgs = cs.arg_size(); - Function *f = getTargetFunction(fp, state); + const CallBase &cb = cast(*i); + Value *fp = cb.getCalledOperand(); + unsigned numArgs = cb.arg_size(); + Function *f = getTargetFunction(fp); - if (isa(fp)) { - terminateStateOnExecError(state, "inline assembly is unsupported"); - break; - } // evaluate arguments std::vector< ref > arguments; arguments.reserve(numArgs); @@ -2403,11 +2461,24 @@ void Executor::executeInstruction(ExecutionState &state, KInstruction *ki) { for (unsigned j=0; j(fp)) { //TODO: move to `executeCall` + if (ExternalCalls != ExternalCallPolicy::None) { + KInlineAsm callable(asmValue); + callExternalFunction(state, ki, &callable, arguments); + } else { + terminateStateOnExecError(state, "external calls disallowed (in particular inline asm)"); + } + break; + } + if (f) { - const FunctionType *fType = - dyn_cast(cast(f->getType())->getElementType()); + const FunctionType *fType = f->getFunctionType(); +#if LLVM_VERSION_MAJOR >= 15 + const FunctionType *fpType = cb.getFunctionType(); +#else const FunctionType *fpType = - dyn_cast(cast(fp->getType())->getElementType()); + dyn_cast(fp->getType()->getPointerElementType()); +#endif // special case the call with a bitcast case if (fType != fpType) { @@ -2427,7 +2498,7 @@ void Executor::executeInstruction(ExecutionState &state, KInstruction *ki) { if (from != to) { // XXX need to check other param attrs ? - bool isSExt = cs.paramHasAttr(i, llvm::Attribute::SExt); + bool isSExt = cb.paramHasAttr(i, llvm::Attribute::SExt); if (isSExt) { arguments[i] = SExtExpr::create(arguments[i], to); } else { @@ -2732,6 +2803,7 @@ void Executor::executeInstruction(ExecutionState &state, KInstruction *ki) { case Instruction::GetElementPtr: { KGEPInstruction *kgepi = static_cast(ki); ref base = eval(ki, 0, state).value; + ref original_base = base; for (std::vector< std::pair >::iterator it = kgepi->indices.begin(), ie = kgepi->indices.end(); @@ -2745,6 +2817,46 @@ void Executor::executeInstruction(ExecutionState &state, KInstruction *ki) { if (kgepi->offset) base = AddExpr::create(base, Expr::createPointer(kgepi->offset)); + + if (SingleObjectResolution) { + if (isa(original_base) && !isa(base)) { + // the initial base address was a constant expression, the final is not: + // store the mapping between constant address and the non-const + // reference in the state + ref c_orig_base = dyn_cast(original_base); + + ObjectPair op; + if (state.addressSpace.resolveOne(c_orig_base, op)) { + // store the address of the MemoryObject associated with this GEP + // instruction + state.base_mos[op.first->address].insert(base); + ref r = + ConstantExpr::alloc(op.first->address, Expr::Int64); + state.base_addrs[base] = r; + } else { + // this case should not happen - we have a GEP instruction with const + // base address, so we should be able to find an exact memory object + // match + klee_warning("Failed to find a memory object for address %" PRIx64, + c_orig_base->getZExtValue()); + } + + } else if (!isa(original_base)) { + auto base_it = state.base_addrs.find(original_base); + if (base_it != state.base_addrs.end()) { + // we need to update the current entry with a new value + uint64_t address = base_it->second->getZExtValue(); + auto refs_it = state.base_mos[address].find(base_it->first); + if (refs_it != state.base_mos[address].end()) { + state.base_mos[address].erase(refs_it); + } + state.base_mos[address].insert(base); + state.base_addrs[base] = base_it->second; + state.base_addrs.erase(base_it->first); + } + } + } + bindLocal(ki, state, base); break; } @@ -2795,8 +2907,6 @@ void Executor::executeInstruction(ExecutionState &state, KInstruction *ki) { } // Floating point instructions - -#if LLVM_VERSION_CODE >= LLVM_VERSION(8, 0) case Instruction::FNeg: { ref arg = toConstant(state, eval(ki, 0, state).value, "floating point"); @@ -2808,7 +2918,6 @@ void Executor::executeInstruction(ExecutionState &state, KInstruction *ki) { bindLocal(ki, state, ConstantExpr::alloc(Res.bitcastToAPInt())); break; } -#endif case Instruction::FAdd: { ref left = toConstant(state, eval(ki, 0, state).value, @@ -2928,7 +3037,11 @@ void Executor::executeInstruction(ExecutionState &state, KInstruction *ki) { llvm::APFloat Arg(*fpWidthToSemantics(arg->getWidth()), arg->getAPValue()); uint64_t value = 0; bool isExact = true; +#if LLVM_VERSION_CODE >= LLVM_VERSION(16, 0) + auto valueRef = llvm::MutableArrayRef(value); +#else auto valueRef = makeMutableArrayRef(value); +#endif Arg.convertToInteger(valueRef, resultType, false, llvm::APFloat::rmTowardZero, &isExact); bindLocal(ki, state, ConstantExpr::alloc(value, resultType)); @@ -2946,7 +3059,11 @@ void Executor::executeInstruction(ExecutionState &state, KInstruction *ki) { uint64_t value = 0; bool isExact = true; +#if LLVM_VERSION_CODE >= LLVM_VERSION(16, 0) + auto valueRef = llvm::MutableArrayRef(value); +#else auto valueRef = makeMutableArrayRef(value); +#endif Arg.convertToInteger(valueRef, resultType, true, llvm::APFloat::rmTowardZero, &isExact); bindLocal(ki, state, ConstantExpr::alloc(value, resultType)); @@ -3122,17 +3239,14 @@ void Executor::executeInstruction(ExecutionState &state, KInstruction *ki) { return; } uint64_t iIdx = cIdx->getZExtValue(); -#if LLVM_VERSION_MAJOR >= 11 const auto *vt = cast(iei->getType()); -#else - const llvm::VectorType *vt = iei->getType(); -#endif unsigned EltBits = getWidthForLLVMType(vt->getElementType()); if (iIdx >= vt->getNumElements()) { // Out of bounds write - terminateStateOnError(state, "Out of bounds write when inserting element", - StateTerminationType::BadVectorAccess); + terminateStateOnProgramError(state, + "Out of bounds write when inserting element", + StateTerminationType::BadVectorAccess); return; } @@ -3163,17 +3277,14 @@ void Executor::executeInstruction(ExecutionState &state, KInstruction *ki) { return; } uint64_t iIdx = cIdx->getZExtValue(); -#if LLVM_VERSION_MAJOR >= 11 const auto *vt = cast(eei->getVectorOperandType()); -#else - const llvm::VectorType *vt = eei->getVectorOperandType(); -#endif unsigned EltBits = getWidthForLLVMType(vt->getElementType()); if (iIdx >= vt->getNumElements()) { // Out of bounds read - terminateStateOnError(state, "Out of bounds read when extracting element", - StateTerminationType::BadVectorAccess); + terminateStateOnProgramError(state, + "Out of bounds read when extracting element", + StateTerminationType::BadVectorAccess); return; } @@ -3305,19 +3416,27 @@ void Executor::updateStates(ExecutionState *current) { seedMap.find(es); if (it3 != seedMap.end()) seedMap.erase(it3); - processTree->remove(es->ptreeNode); + executionTree->remove(es->executionTreeNode); delete es; } removedStates.clear(); } -template +template void Executor::computeOffsetsSeqTy(KGEPInstruction *kgepi, ref &constantOffset, uint64_t index, const TypeIt it) { - const auto *sq = cast(*it); +#if LLVM_VERSION_CODE <= LLVM_VERSION(14, 0) + assert(it->getNumContainedTypes() == 1 && + "Sequential type must contain one subtype"); uint64_t elementSize = - kmodule->targetData->getTypeStoreSize(sq->getElementType()); + kmodule->targetData->getTypeStoreSize(it->getContainedType(0)); +#else + assert(it.isSequential() && "Called with non-sequential type"); + // Get the size of a single element + std::uint64_t elementSize = + kmodule->targetData->getTypeStoreSize(it.getIndexedType()); +#endif const Value *operand = it.getOperand(); if (const Constant *c = dyn_cast(operand)) { ref index = @@ -3336,18 +3455,22 @@ void Executor::computeOffsets(KGEPInstruction *kgepi, TypeIt ib, TypeIt ie) { ConstantExpr::alloc(0, Context::get().getPointerWidth()); uint64_t index = 1; for (TypeIt ii = ib; ii != ie; ++ii) { +#if LLVM_VERSION_CODE <= LLVM_VERSION(14, 0) if (StructType *st = dyn_cast(*ii)) { +#else + if (StructType *st = ii.getStructTypeOrNull()) { +#endif const StructLayout *sl = kmodule->targetData->getStructLayout(st); const ConstantInt *ci = cast(ii.getOperand()); uint64_t addend = sl->getElementOffset((unsigned) ci->getZExtValue()); constantOffset = constantOffset->Add(ConstantExpr::alloc(addend, Context::get().getPointerWidth())); - } else if (isa(*ii)) { - computeOffsetsSeqTy(kgepi, constantOffset, index, ii); - } else if (isa(*ii)) { - computeOffsetsSeqTy(kgepi, constantOffset, index, ii); - } else if (isa(*ii)) { - computeOffsetsSeqTy(kgepi, constantOffset, index, ii); +#if LLVM_VERSION_CODE <= LLVM_VERSION(14, 0) + } else if (ii->isArrayTy() || ii->isVectorTy() || ii->isPointerTy()) { +#else + } else if (ii.isSequential()) { +#endif + computeOffsetsSeqTy(kgepi, constantOffset, index, ii); } else assert("invalid type" && 0); index++; @@ -3358,15 +3481,55 @@ void Executor::computeOffsets(KGEPInstruction *kgepi, TypeIt ib, TypeIt ie) { void Executor::bindInstructionConstants(KInstruction *KI) { if (GetElementPtrInst *gepi = dyn_cast(KI->inst)) { KGEPInstruction *kgepi = static_cast(KI); - computeOffsets(kgepi, gep_type_begin(gepi), gep_type_end(gepi)); +#if LLVM_VERSION_CODE <= LLVM_VERSION(14, 0) + computeOffsets(kgepi, klee::gep_type_begin(gepi), klee::gep_type_end(gepi)); +#else + computeOffsets(kgepi, llvm::gep_type_begin(gepi), llvm::gep_type_end(gepi)); +#endif } else if (InsertValueInst *ivi = dyn_cast(KI->inst)) { KGEPInstruction *kgepi = static_cast(KI); - computeOffsets(kgepi, iv_type_begin(ivi), iv_type_end(ivi)); - assert(kgepi->indices.empty() && "InsertValue constant offset expected"); + llvm::Value *agg = ivi->getAggregateOperand(); + llvm::Type *current_type = agg->getType(); + std::uint64_t offset = 0; + for (auto index : ivi->indices()) { + if (StructType *st = dyn_cast(current_type)) { + const StructLayout *sl = kmodule->targetData->getStructLayout(st); + std::uint64_t addend = sl->getElementOffset(index); + offset = offset + addend; + } else if (current_type->isArrayTy() || current_type->isVectorTy() || + current_type->isPointerTy()) { + std::uint64_t elementSize = kmodule->targetData->getTypeStoreSize( + current_type->getArrayElementType()); + offset += elementSize * index; + } else { + assert(0 && "Unknown type"); + } + + current_type = GetElementPtrInst::getTypeAtIndex(current_type, index); + } + kgepi->offset = offset; } else if (ExtractValueInst *evi = dyn_cast(KI->inst)) { KGEPInstruction *kgepi = static_cast(KI); - computeOffsets(kgepi, ev_type_begin(evi), ev_type_end(evi)); - assert(kgepi->indices.empty() && "ExtractValue constant offset expected"); + llvm::Value *agg = evi->getAggregateOperand(); + llvm::Type *current_type = agg->getType(); + uint64_t offset = 0; + for (auto index : evi->indices()) { + if (StructType *st = dyn_cast(current_type)) { + const StructLayout *sl = kmodule->targetData->getStructLayout(st); + uint64_t addend = sl->getElementOffset(index); + offset = offset + addend; + } else if (current_type->isArrayTy() || current_type->isVectorTy() || + current_type->isPointerTy()) { + uint64_t elementSize = kmodule->targetData->getTypeStoreSize( + current_type->getArrayElementType()); + offset += elementSize * index; + } else { + assert(0 && "Unknown type"); + } + + current_type = GetElementPtrInst::getTypeAtIndex(current_type, index); + } + kgepi->offset = offset; } } @@ -3475,7 +3638,8 @@ void Executor::run(ExecutionState &initialState) { executeInstruction(state, ki); timers.invoke(); if (::dumpStates) dumpStates(); - if (::dumpPTree) dumpPTree(); + if (::dumpExecutionTree) + dumpExecutionTree(); updateStates(&state); if ((stats::instructions % 1000) == 0) { @@ -3524,7 +3688,8 @@ void Executor::run(ExecutionState &initialState) { executeInstruction(state, ki); timers.invoke(); if (::dumpStates) dumpStates(); - if (::dumpPTree) dumpPTree(); + if (::dumpExecutionTree) + dumpExecutionTree(); updateStates(&state); @@ -3592,14 +3757,15 @@ std::string Executor::getAddressInfo(ExecutionState &state, return info.str(); } - -void Executor::terminateState(ExecutionState &state) { +void Executor::terminateState(ExecutionState &state, + StateTerminationType reason) { if (replayKTest && replayPosition!=replayKTest->numObjects) { klee_warning_once(replayKTest, "replay did not consume all objects in test input."); } interpreterHandler->incPathsExplored(); + executionTree->setTerminationType(state, reason); std::vector::iterator it = std::find(addedStates.begin(), addedStates.end(), &state); @@ -3614,7 +3780,7 @@ void Executor::terminateState(ExecutionState &state) { if (it3 != seedMap.end()) seedMap.erase(it3); addedStates.erase(it); - processTree->remove(state.ptreeNode); + executionTree->remove(state.executionTreeNode); delete &state; } } @@ -3625,41 +3791,57 @@ static bool shouldWriteTest(const ExecutionState &state) { static std::string terminationTypeFileExtension(StateTerminationType type) { std::string ret; -#define TTYPE(N,I,S) case StateTerminationType::N: ret = (S); break; -#define MARK(N,I) + #undef TTYPE + #undef TTMARK + #define TTYPE(N,I,S) case StateTerminationType::N: ret = (S); break; + #define TTMARK(N,I) switch (type) { - TERMINATION_TYPES + TERMINATION_TYPES } -#undef TTYPE -#undef MARK return ret; }; void Executor::terminateStateOnExit(ExecutionState &state) { + ++stats::terminationExit; if (shouldWriteTest(state) || (AlwaysOutputSeeds && seedMap.count(&state))) interpreterHandler->processTestCase( state, nullptr, terminationTypeFileExtension(StateTerminationType::Exit).c_str()); interpreterHandler->incPathsCompleted(); - terminateState(state); + terminateState(state, StateTerminationType::Exit); } void Executor::terminateStateEarly(ExecutionState &state, const Twine &message, - StateTerminationType terminationType) { - if ((terminationType <= StateTerminationType::EXECERR && - shouldWriteTest(state)) || + StateTerminationType reason) { + if (reason <= StateTerminationType::EARLY) { + assert(reason > StateTerminationType::EXIT); + ++stats::terminationEarly; + } + + if ((reason <= StateTerminationType::EARLY && shouldWriteTest(state)) || (AlwaysOutputSeeds && seedMap.count(&state))) { interpreterHandler->processTestCase( state, (message + "\n").str().c_str(), - terminationTypeFileExtension(terminationType).c_str()); + terminationTypeFileExtension(reason).c_str()); } - terminateState(state); + terminateState(state, reason); } -void Executor::terminateStateOnUserError(ExecutionState &state, const llvm::Twine &message) { - terminateStateOnError(state, message, StateTerminationType::User, ""); +void Executor::terminateStateEarlyAlgorithm(ExecutionState &state, + const llvm::Twine &message, + StateTerminationType reason) { + assert(reason > StateTerminationType::EXECERR && + reason <= StateTerminationType::EARLYALGORITHM); + ++stats::terminationEarlyAlgorithm; + terminateStateEarly(state, message, reason); +} + +void Executor::terminateStateEarlyUser(ExecutionState &state, + const llvm::Twine &message) { + ++stats::terminationEarlyUser; + terminateStateEarly(state, message, StateTerminationType::SilentExit); } const InstructionInfo & Executor::getLastNonKleeInternalInstruction(const ExecutionState &state, @@ -3752,7 +3934,7 @@ void Executor::terminateStateOnError(ExecutionState &state, interpreterHandler->processTestCase(state, msg.str().c_str(), file_suffix); } - terminateState(state); + terminateState(state, terminationType); if (shouldExitOn(terminationType)) haltExecution = true; @@ -3760,15 +3942,41 @@ void Executor::terminateStateOnError(ExecutionState &state, void Executor::terminateStateOnExecError(ExecutionState &state, const llvm::Twine &message, - const llvm::Twine &info) { - terminateStateOnError(state, message, StateTerminationType::Execution, info); + StateTerminationType reason) { + assert(reason > StateTerminationType::USERERR && + reason <= StateTerminationType::EXECERR); + ++stats::terminationExecutionError; + terminateStateOnError(state, message, reason, ""); +} + +void Executor::terminateStateOnProgramError(ExecutionState &state, + const llvm::Twine &message, + StateTerminationType reason, + const llvm::Twine &info, + const char *suffix) { + assert(reason > StateTerminationType::SOLVERERR && + reason <= StateTerminationType::PROGERR); + ++stats::terminationProgramError; + terminateStateOnError(state, message, reason, info, suffix); } void Executor::terminateStateOnSolverError(ExecutionState &state, const llvm::Twine &message) { + ++stats::terminationSolverError; terminateStateOnError(state, message, StateTerminationType::Solver, ""); } +void Executor::terminateStateOnUserError(ExecutionState &state, + const llvm::Twine &message, + bool writeErr) { + ++stats::terminationUserError; + if (writeErr) { + terminateStateOnError(state, message, StateTerminationType::User, ""); + } else { + terminateState(state, StateTerminationType::User); + } +} + // XXX shoot me static const char *okExternalsList[] = { "printf", "fprintf", @@ -3778,48 +3986,53 @@ static std::set okExternals(okExternalsList, okExternalsList + (sizeof(okExternalsList)/sizeof(okExternalsList[0]))); -void Executor::callExternalFunction(ExecutionState &state, - KInstruction *target, - Function *function, - std::vector< ref > &arguments) { +void Executor::callExternalFunction(ExecutionState &state, KInstruction *target, + KCallable *callable, + std::vector> &arguments) { // check if specialFunctionHandler wants it - if (specialFunctionHandler->handle(state, function, target, arguments)) + if (const auto *func = dyn_cast(callable); + func && + specialFunctionHandler->handle(state, func->function, target, arguments)) return; if (ExternalCalls == ExternalCallPolicy::None && - !okExternals.count(function->getName().str())) { + !okExternals.count(callable->getName().str())) { klee_warning("Disallowed call to external function: %s\n", - function->getName().str().c_str()); + callable->getName().str().c_str()); terminateStateOnUserError(state, "external calls disallowed"); return; } // normal external function handling path - // allocate 128 bits for each argument (+return value) to support fp80's; + // allocate 512 bits for each argument (+return value) to support + // fp80's and SIMD vectors as parameters for external calls; // we could iterate through all the arguments first and determine the exact // size we need, but this is faster, and the memory usage isn't significant. - uint64_t *args = (uint64_t*) alloca(2*sizeof(*args) * (arguments.size() + 1)); - memset(args, 0, 2 * sizeof(*args) * (arguments.size() + 1)); + size_t allocatedBytes = Expr::MaxWidth / 8 * (arguments.size() + 1); + uint64_t *args = (uint64_t *)alloca(allocatedBytes); + memset(args, 0, allocatedBytes); unsigned wordIndex = 2; - for (std::vector >::iterator ai = arguments.begin(), - ae = arguments.end(); ai!=ae; ++ai) { - if (ExternalCalls == ExternalCallPolicy::All) { // don't bother checking uniqueness - *ai = optimizer.optimizeExpr(*ai, true); - ref ce; - bool success = - solver->getValue(state.constraints, *ai, ce, state.queryMetaData); - assert(success && "FIXME: Unhandled solver failure"); - (void) success; - ce->toMemory(&args[wordIndex]); - ObjectPair op; - // Checking to see if the argument is a pointer to something - if (ce->getWidth() == Context::get().getPointerWidth() && - state.addressSpace.resolveOne(ce, op)) { - op.second->flushToConcreteStore(solver, state); + for (auto &a : arguments) { + if (ExternalCalls == ExternalCallPolicy::All || + ExternalCalls == ExternalCallPolicy::OverApprox) { + a = optimizer.optimizeExpr(a, true); + ref cvalue = toConstant( + state, a, "external call", ExternalCalls == ExternalCallPolicy::All); + cvalue->toMemory(&args[wordIndex]); + + // If the argument points to a valid and writable object, concretise it + // according to the selected policy + if (ObjectPair op; + cvalue->getWidth() == Context::get().getPointerWidth() && + state.addressSpace.resolveOne(cvalue, op) && !op.second->readOnly) { + auto *os = state.addressSpace.getWriteable(op.first, op.second); + os->flushToConcreteStore(*this, state, + ExternalCalls == ExternalCallPolicy::All); } - wordIndex += (ce->getWidth()+63)/64; + + wordIndex += (cvalue->getWidth() + 63) / 64; } else { - ref arg = toUnique(state, *ai); + ref arg = toUnique(state, a); if (ConstantExpr *ce = dyn_cast(arg)) { // fp80 must be aligned to 16 according to the System V AMD 64 ABI if (ce->getWidth() == Expr::Fl80 && wordIndex & 0x01) @@ -3827,18 +4040,46 @@ void Executor::callExternalFunction(ExecutionState &state, // XXX kick toMemory functions from here ce->toMemory(&args[wordIndex]); - wordIndex += (ce->getWidth()+63)/64; + wordIndex += (ce->getWidth() + 63) / 64; } else { terminateStateOnExecError(state, "external call with symbolic argument: " + - function->getName()); + callable->getName()); return; } } } // Prepare external memory for invoking the function - state.addressSpace.copyOutConcretes(); + static std::size_t residentPages = 0; + double avgNeededPages = 0; + if (MemoryManager::isDeterministic) { + auto const minflt = [] { + struct rusage ru = {}; + [[maybe_unused]] int ret = getrusage(RUSAGE_SELF, &ru); + assert(!ret && "getrusage failed"); + assert(ru.ru_minflt >= 0); + return ru.ru_minflt; + }; + + auto tmp = minflt(); + std::size_t neededPages = state.addressSpace.copyOutConcretes(); + auto newPages = minflt() - tmp; + assert(newPages >= 0); + residentPages += newPages; + assert(residentPages >= neededPages && + "allocator too full, assumption that each object occupies its own " + "page is no longer true"); + + // average of pages needed for an external function call + static double avgNeededPages_ = residentPages; + // exponential moving average with alpha = 1/3 + avgNeededPages_ = (3.0 * avgNeededPages_ + neededPages) / 4.0; + avgNeededPages = avgNeededPages_; + } else { + state.addressSpace.copyOutConcretes(); + } + #ifndef WINDOWS // Update external errno state with local state value int *errno_addr = getErrnoLocation(state); @@ -3852,7 +4093,7 @@ void Executor::callExternalFunction(ExecutionState &state, if (!errnoValue) { terminateStateOnExecError(state, "external call with errno value symbolic: " + - function->getName()); + callable->getName()); return; } @@ -3860,48 +4101,57 @@ void Executor::callExternalFunction(ExecutionState &state, errnoValue->getZExtValue(sizeof(*errno_addr) * 8)); #endif - if (!SuppressExternalWarnings) { - + if (ExternalCallWarnings != ExtCallWarnings::None) { std::string TmpStr; llvm::raw_string_ostream os(TmpStr); - os << "calling external: " << function->getName().str() << "("; - for (unsigned i=0; igetName().str() << "("; + for (unsigned i = 0; i < arguments.size(); i++) { os << arguments[i]; - if (i != arguments.size()-1) + if (i != arguments.size() - 1) os << ", "; } os << ") at " << state.pc->getSourceLocation(); - - if (AllExternalWarnings) + + if (ExternalCallWarnings == ExtCallWarnings::All) klee_warning("%s", os.str().c_str()); else - klee_warning_once(function, "%s", os.str().c_str()); + klee_warning_once(callable->getValue(), "%s", os.str().c_str()); } - bool success = externalDispatcher->executeCall(function, target->inst, args); + bool success = externalDispatcher->executeCall(callable, target->inst, args); if (!success) { - terminateStateOnError(state, "failed external call: " + function->getName(), - StateTerminationType::External); + terminateStateOnExecError(state, + "failed external call: " + callable->getName(), + StateTerminationType::External); return; } - if (!state.addressSpace.copyInConcretes()) { - terminateStateOnError(state, "external modified read-only object", - StateTerminationType::External); + if (!state.addressSpace.copyInConcretes(ExternalCalls == + ExternalCallPolicy::All)) { + terminateStateOnExecError(state, "external modified read-only object", + StateTerminationType::External); return; } + if (MemoryManager::isDeterministic && residentPages > ExternalPageThreshold && + residentPages > 2 * avgNeededPages) { + if (memory->markMappingsAsUnneeded()) { + residentPages = 0; + } + } + #ifndef WINDOWS // Update errno memory object with the errno value from the call int error = externalDispatcher->getLastErrno(); state.addressSpace.copyInConcrete(result.first, result.second, - (uint64_t)&error); + (uint64_t)&error, + ExternalCalls == ExternalCallPolicy::All); #endif Type *resultType = target->inst->getType(); - if (resultType != Type::getVoidTy(function->getContext())) { - ref e = ConstantExpr::fromMemory((void*) args, - getWidthForLLVMType(resultType)); + if (resultType != Type::getVoidTy(kmodule->module->getContext())) { + ref e = + ConstantExpr::fromMemory((void *)args, getWidthForLLVMType(resultType)); bindLocal(target, state, e); } } @@ -3967,7 +4217,7 @@ void Executor::executeAlloc(ExecutionState &state, } MemoryObject *mo = memory->allocate(CE->getZExtValue(), isLocal, /*isGlobal=*/false, - allocSite, allocationAlignment); + &state, allocSite, allocationAlignment); if (!mo) { bindLocal(target, state, ConstantExpr::alloc(0, Context::get().getPointerWidth())); @@ -3984,7 +4234,9 @@ void Executor::executeAlloc(ExecutionState &state, unsigned count = std::min(reallocFrom->size, os->size); for (unsigned i=0; iwrite(i, reallocFrom->read8(i)); - state.addressSpace.unbindObject(reallocFrom->getObject()); + const MemoryObject *reallocObject = reallocFrom->getObject(); + state.deallocate(reallocObject); + state.addressSpace.unbindObject(reallocObject); } } } else { @@ -4001,25 +4253,27 @@ void Executor::executeAlloc(ExecutionState &state, size = optimizer.optimizeExpr(size, true); - ref example; - bool success = - solver->getValue(state.constraints, size, example, state.queryMetaData); - assert(success && "FIXME: Unhandled solver failure"); - (void) success; - - // Try and start with a small example. - Expr::Width W = example->getWidth(); - while (example->Ugt(ConstantExpr::alloc(128, W))->isTrue()) { - ref tmp = example->LShr(ConstantExpr::alloc(1, W)); - bool res; - bool success = - solver->mayBeTrue(state.constraints, EqExpr::create(tmp, size), res, - state.queryMetaData); - assert(success && "FIXME: Unhandled solver failure"); - (void) success; - if (!res) - break; - example = tmp; + // Check if in seed mode, then try to replicate size from a seed + ref example = getValueFromSeeds(state, size); + if (!example) { + bool success = solver->getValue(state.constraints, size, example, + state.queryMetaData); + assert(success && "FIXME: Unhandled solver failure"); + (void)success; + + // Try and start with a small example. + Expr::Width W = example->getWidth(); + while (example->Ugt(ConstantExpr::alloc(128, W))->isTrue()) { + ref tmp = example->LShr(ConstantExpr::alloc(1, W)); + bool res; + [[maybe_unused]] bool success = + solver->mayBeTrue(state.constraints, EqExpr::create(tmp, size), res, + state.queryMetaData); + assert(success && "FIXME: Unhandled solver failure"); + if (!res) + break; + example = tmp; + } } StatePair fixedSize = @@ -4046,8 +4300,9 @@ void Executor::executeAlloc(ExecutionState &state, // malloc will fail for it, so lets fork and return 0. StatePair hugeSize = fork(*fixedSize.second, - UltExpr::create(ConstantExpr::alloc(1U << 31, W), size), true, - BranchType::Alloc); + UltExpr::create( + ConstantExpr::alloc(1U << 31, example->getWidth()), size), + true, BranchType::Alloc); if (hugeSize.first) { klee_message("NOTE: found huge malloc, returning 0"); bindLocal(target, *hugeSize.first, @@ -4061,8 +4316,9 @@ void Executor::executeAlloc(ExecutionState &state, ExprPPrinter::printOne(info, " size expr", size); info << " concretization : " << example << "\n"; info << " unbound example: " << tmp << "\n"; - terminateStateOnError(*hugeSize.second, "concretized symbolic size", - StateTerminationType::Model, info.str()); + terminateStateOnProgramError(*hugeSize.second, + "concretized symbolic size", + StateTerminationType::Model, info.str()); } } } @@ -4091,14 +4347,15 @@ void Executor::executeFree(ExecutionState &state, ie = rl.end(); it != ie; ++it) { const MemoryObject *mo = it->first.first; if (mo->isLocal) { - terminateStateOnError(*it->second, "free of alloca", - StateTerminationType::Free, - getAddressInfo(*it->second, address)); + terminateStateOnProgramError(*it->second, "free of alloca", + StateTerminationType::Free, + getAddressInfo(*it->second, address)); } else if (mo->isGlobal) { - terminateStateOnError(*it->second, "free of global", - StateTerminationType::Free, - getAddressInfo(*it->second, address)); + terminateStateOnProgramError(*it->second, "free of global", + StateTerminationType::Free, + getAddressInfo(*it->second, address)); } else { + it->second->deallocate(mo); it->second->addressSpace.unbindObject(mo); if (target) bindLocal(target, *it->second, Expr::createPointer(0)); @@ -4114,7 +4371,7 @@ void Executor::resolveExact(ExecutionState &state, p = optimizer.optimizeExpr(p, true); // XXX we may want to be capping this? ResolutionList rl; - state.addressSpace.resolve(state, solver, p, rl); + state.addressSpace.resolve(state, solver.get(), p, rl); ExecutionState *unbound = &state; for (ResolutionList::iterator it = rl.begin(), ie = rl.end(); @@ -4133,8 +4390,22 @@ void Executor::resolveExact(ExecutionState &state, } if (unbound) { - terminateStateOnError(*unbound, "memory error: invalid pointer: " + name, - StateTerminationType::Ptr, getAddressInfo(*unbound, p)); + auto CE = dyn_cast(p); + if (MemoryManager::isDeterministic && CE) { + using kdalloc::LocationInfo; + auto ptr = reinterpret_cast(CE->getZExtValue()); + auto li = unbound->heapAllocator.locationInfo(ptr, 1); + if (li == LocationInfo::LI_AllocatedOrQuarantined && + li.getBaseAddress() == ptr && name == "free") { + terminateStateOnProgramError(*unbound, "memory error: double free", + StateTerminationType::Ptr, + getAddressInfo(*unbound, p)); + return; + } + } + terminateStateOnProgramError( + *unbound, "memory error: invalid pointer: " + name, + StateTerminationType::Ptr, getAddressInfo(*unbound, p)); } } @@ -4156,71 +4427,106 @@ void Executor::executeMemoryOperation(ExecutionState &state, address = optimizer.optimizeExpr(address, true); - // fast path: single in-bounds resolution ObjectPair op; bool success; solver->setTimeout(coreSolverTimeout); - if (!state.addressSpace.resolveOne(state, solver, address, op, success)) { - address = toConstant(state, address, "resolveOne failure"); - success = state.addressSpace.resolveOne(cast(address), op); - } - solver->setTimeout(time::Span()); - - if (success) { - const MemoryObject *mo = op.first; - if (MaxSymArraySize && mo->size >= MaxSymArraySize) { - address = toConstant(state, address, "max-sym-array-size"); + bool resolveSingleObject = SingleObjectResolution; + + if (resolveSingleObject && !isa(address)) { + // Address is symbolic + + resolveSingleObject = false; + auto base_it = state.base_addrs.find(address); + if (base_it != state.base_addrs.end()) { + // Concrete address found in the map, now find the associated memory + // object + if (!state.addressSpace.resolveOne(state, solver.get(), base_it->second, op, + success) || + !success) { + klee_warning("Failed to resolve concrete address from the base_addrs " + "map to a memory object"); + } else { + // We have resolved the stored concrete address to a memory object. + // Now let's see if we can prove an overflow - we are only interested in + // two cases: either we overflow and it's a bug or we don't and we carry + // on; in this mode we are not interested in trying out other memory + // objects + resolveSingleObject = true; + } } - - ref offset = mo->getOffsetExpr(address); - ref check = mo->getBoundsCheckOffset(offset, bytes); - check = optimizer.optimizeExpr(check, true); + } else { + resolveSingleObject = false; + } - bool inBounds; - solver->setTimeout(coreSolverTimeout); - bool success = solver->mustBeTrue(state.constraints, check, inBounds, - state.queryMetaData); - solver->setTimeout(time::Span()); - if (!success) { - state.pc = state.prevPC; - terminateStateOnSolverError(state, "Query timed out (bounds check)."); - return; + if (!resolveSingleObject) { + if (!state.addressSpace.resolveOne(state, solver.get(), address, op, success)) { + address = toConstant(state, address, "resolveOne failure"); + success = state.addressSpace.resolveOne(cast(address), op); } + solver->setTimeout(time::Span()); - if (inBounds) { - const ObjectState *os = op.second; - if (isWrite) { - if (os->readOnly) { - terminateStateOnError(state, "memory error: object read only", - StateTerminationType::ReadOnly); - } else { - ObjectState *wos = state.addressSpace.getWriteable(mo, os); - wos->write(offset, value); - } - } else { - ref result = os->read(offset, type); - - if (interpreterOpts.MakeConcreteSymbolic) - result = replaceReadWithSymbolic(state, result); - - bindLocal(target, state, result); + if (success) { + const MemoryObject *mo = op.first; + + if (MaxSymArraySize && mo->size >= MaxSymArraySize) { + address = toConstant(state, address, "max-sym-array-size"); } - return; + ref offset = mo->getOffsetExpr(address); + ref check = mo->getBoundsCheckOffset(offset, bytes); + check = optimizer.optimizeExpr(check, true); + + bool inBounds; + solver->setTimeout(coreSolverTimeout); + bool success = solver->mustBeTrue(state.constraints, check, inBounds, + state.queryMetaData); + solver->setTimeout(time::Span()); + if (!success) { + state.pc = state.prevPC; + terminateStateOnSolverError(state, "Query timed out (bounds check)."); + return; + } + + if (inBounds) { + const ObjectState *os = op.second; + if (isWrite) { + if (os->readOnly) { + terminateStateOnProgramError(state, "memory error: object read only", + StateTerminationType::ReadOnly); + } else { + ObjectState *wos = state.addressSpace.getWriteable(mo, os); + wos->write(offset, value); + } + } else { + ref result = os->read(offset, type); + + if (interpreterOpts.MakeConcreteSymbolic) + result = replaceReadWithSymbolic(state, result); + + bindLocal(target, state, result); + } + + return; + } } - } + } // we are on an error path (no resolution, multiple resolution, one - // resolution with out of bounds) + // resolution with out of bounds), or we do a single object resolution address = optimizer.optimizeExpr(address, true); - ResolutionList rl; - solver->setTimeout(coreSolverTimeout); - bool incomplete = state.addressSpace.resolve(state, solver, address, rl, - 0, coreSolverTimeout); - solver->setTimeout(time::Span()); - + ResolutionList rl; + bool incomplete = false; + + if (!resolveSingleObject) { + solver->setTimeout(coreSolverTimeout); + incomplete = state.addressSpace.resolve(state, solver.get(), address, rl, 0, + coreSolverTimeout); + solver->setTimeout(time::Span()); + } else { + rl.push_back(op); // we already have the object pair, no need to look for it + } // XXX there is some query wasteage here. who cares? ExecutionState *unbound = &state; @@ -4236,8 +4542,8 @@ void Executor::executeMemoryOperation(ExecutionState &state, if (bound) { if (isWrite) { if (os->readOnly) { - terminateStateOnError(*bound, "memory error: object read only", - StateTerminationType::ReadOnly); + terminateStateOnProgramError(*bound, "memory error: object read only", + StateTerminationType::ReadOnly); } else { ObjectState *wos = bound->addressSpace.getWriteable(mo, os); wos->write(mo->getOffsetExpr(address), value); @@ -4252,15 +4558,41 @@ void Executor::executeMemoryOperation(ExecutionState &state, if (!unbound) break; } - + // XXX should we distinguish out of bounds and overlapped cases? if (unbound) { if (incomplete) { terminateStateOnSolverError(*unbound, "Query timed out (resolve)."); } else { - terminateStateOnError(*unbound, "memory error: out of bound pointer", - StateTerminationType::Ptr, - getAddressInfo(*unbound, address)); + if (auto CE = dyn_cast(address)) { + std::uintptr_t ptrval = CE->getZExtValue(); + auto ptr = reinterpret_cast(ptrval); + if (ptrval < MemoryManager::pageSize) { + terminateStateOnProgramError( + *unbound, "memory error: null page access", + StateTerminationType::Ptr, getAddressInfo(*unbound, address)); + return; + } else if (MemoryManager::isDeterministic) { + using kdalloc::LocationInfo; + auto li = unbound->heapAllocator.locationInfo(ptr, bytes); + if (li == LocationInfo::LI_AllocatedOrQuarantined) { + // In case there is no size mismatch (checked by resolving for base + // address), the object is quarantined. + auto base = reinterpret_cast(li.getBaseAddress()); + auto baseExpr = Expr::createPointer(base); + ObjectPair op; + if (!unbound->addressSpace.resolveOne(baseExpr, op)) { + terminateStateOnProgramError( + *unbound, "memory error: use after free", + StateTerminationType::Ptr, getAddressInfo(*unbound, address)); + return; + } + } + } + } + terminateStateOnProgramError( + *unbound, "memory error: out of bound pointer", + StateTerminationType::Ptr, getAddressInfo(*unbound, address)); } } } @@ -4281,44 +4613,40 @@ void Executor::executeMakeSymbolic(ExecutionState &state, bindObjectInState(state, mo, false, array); state.addSymbolic(mo, array); - std::map< ExecutionState*, std::vector >::iterator it = - seedMap.find(&state); - if (it!=seedMap.end()) { // In seed mode we need to add this as a - // binding. - for (std::vector::iterator siit = it->second.begin(), - siie = it->second.end(); siit != siie; ++siit) { - SeedInfo &si = *siit; + auto found = seedMap.find(&state); + if (found != seedMap.end()) { + // In seed mode we need to add this as binding + + for (SeedInfo &si : found->second) { KTestObject *obj = si.getNextInput(mo, NamedSeedMatching); if (!obj) { - if (ZeroSeedExtension) { + if (AllowSeedExtension) { std::vector &values = si.assignment.bindings[array]; values = std::vector(mo->size, '\0'); - } else if (!AllowSeedExtension) { - terminateStateOnUserError(state, "ran out of inputs during seeding"); + } else /*if (!AllowSeedExtension)*/ { + terminateStateOnUserError(state, + "ran out of inputs during seeding"); break; } } else { - if (obj->numBytes != mo->size && - ((!(AllowSeedExtension || ZeroSeedExtension) - && obj->numBytes < mo->size) || - (!AllowSeedTruncation && obj->numBytes > mo->size))) { - std::stringstream msg; + /* The condition below implies obj->numBytes != mo->size */ + if ((obj->numBytes < mo->size && !AllowSeedExtension) || + (obj->numBytes > mo->size && !AllowSeedTruncation)) { + std::stringstream msg; msg << "replace size mismatch: " << mo->name << "[" << mo->size << "]" << " vs " << obj->name << "[" << obj->numBytes << "]" << " in test\n"; - terminateStateOnUserError(state, msg.str()); break; } else { + /* Either sizes are equal or seed extension/trucation is allowed */ std::vector &values = si.assignment.bindings[array]; - values.insert(values.begin(), obj->bytes, + values.insert(values.begin(), obj->bytes, obj->bytes + std::min(obj->numBytes, mo->size)); - if (ZeroSeedExtension) { - for (unsigned i=obj->numBytes; isize; ++i) + for (unsigned i = obj->numBytes; i < mo->size; ++i) values.push_back('\0'); - } } } } @@ -4369,10 +4697,10 @@ void Executor::runFunctionAsMain(Function *f, arguments.push_back(ConstantExpr::alloc(argc, Expr::Int32)); if (++ai!=ae) { Instruction *first = &*(f->begin()->begin()); - argvMO = - memory->allocate((argc + 1 + envc + 1 + 1) * NumPtrBytes, - /*isLocal=*/false, /*isGlobal=*/true, - /*allocSite=*/first, /*alignment=*/8); + argvMO = memory->allocate((argc + 1 + envc + 1 + 1) * NumPtrBytes, + /*isLocal=*/false, /*isGlobal=*/true, + /*state=*/nullptr, /*allocSite=*/first, + /*alignment=*/8); if (!argvMO) klee_error("Could not allocate memory for function arguments"); @@ -4389,7 +4717,8 @@ void Executor::runFunctionAsMain(Function *f, } } - ExecutionState *state = new ExecutionState(kmodule->functionMap[f]); + ExecutionState *state = + new ExecutionState(kmodule->functionMap[f], memory.get()); if (pathWriter) state->pathOS = pathWriter->open(); @@ -4417,7 +4746,8 @@ void Executor::runFunctionAsMain(Function *f, MemoryObject *arg = memory->allocate(len + 1, /*isLocal=*/false, /*isGlobal=*/true, - /*allocSite=*/state->pc->inst, /*alignment=*/8); + state, /*allocSite=*/state->pc->inst, + /*alignment=*/8); if (!arg) klee_error("Could not allocate memory for function arguments"); ObjectState *os = bindObjectInState(*state, arg, false); @@ -4432,13 +4762,13 @@ void Executor::runFunctionAsMain(Function *f, initializeGlobals(*state); - processTree = std::make_unique(state); + executionTree = createExecutionTree( + *state, userSearcherRequiresInMemoryExecutionTree(), *interpreterHandler); run(*state); - processTree = nullptr; + executionTree = nullptr; // hack to clear memory objects - delete memory; - memory = new MemoryManager(NULL); + memory = nullptr; globalObjects.clear(); globalAddresses.clear(); @@ -4463,9 +4793,7 @@ void Executor::getConstraintLog(const ExecutionState &state, std::string &res, switch (logFormat) { case STP: { Query query(state.constraints, ConstantExpr::alloc(0, Expr::Bool)); - char *log = solver->getConstraintLog(query); - res = std::string(log); - free(log); + res = solver->getConstraintLog(query); } break; case KQUERY: { @@ -4596,28 +4924,20 @@ size_t Executor::getAllocationAlignment(const llvm::Value *allocSite) const { alignment = GO->getAlignment(); if (const GlobalVariable *globalVar = dyn_cast(GO)) { // All GlobalVariables's have pointer type - llvm::PointerType *ptrType = - dyn_cast(globalVar->getType()); - assert(ptrType && "globalVar's type is not a pointer"); - type = ptrType->getElementType(); + assert(globalVar->getType()->isPointerTy() && + "globalVar's type is not a pointer"); + type = globalVar->getValueType(); } else { type = GO->getType(); } } else if (const AllocaInst *AI = dyn_cast(allocSite)) { - alignment = AI->getAlignment(); + alignment = AI->getAlign().value(); type = AI->getAllocatedType(); } else if (isa(allocSite) || isa(allocSite)) { // FIXME: Model the semantics of the call to use the right alignment -#if LLVM_VERSION_CODE >= LLVM_VERSION(8, 0) - const CallBase &cs = cast(*allocSite); -#else - llvm::Value *allocSiteNonConst = const_cast(allocSite); - const CallSite cs(isa(allocSiteNonConst) - ? CallSite(cast(allocSiteNonConst)) - : CallSite(cast(allocSiteNonConst))); -#endif + const CallBase &cb = cast(*allocSite); llvm::Function *fn = - klee::getDirectCallTarget(cs, /*moduleIsFullyLinked=*/true); + klee::getDirectCallTarget(cb, /*moduleIsFullyLinked=*/true); if (fn) allocationSiteName = fn->getName().str(); @@ -4634,7 +4954,12 @@ size_t Executor::getAllocationAlignment(const llvm::Value *allocSite) const { assert(type != NULL); // No specified alignment. Get the alignment for the type. if (type->isSized()) { +#if LLVM_VERSION_CODE >= LLVM_VERSION(16, 0) + alignment = kmodule->targetData->getPrefTypeAlign(type).value(); +#else alignment = kmodule->targetData->getPrefTypeAlignment(type); +#endif + } else { klee_warning_once(allocSite, "Cannot determine memory alignment for " "\"%s\". Using alignment of %zu.", @@ -4673,18 +4998,17 @@ int *Executor::getErrnoLocation(const ExecutionState &state) const { #endif } - -void Executor::dumpPTree() { - if (!::dumpPTree) return; +void Executor::dumpExecutionTree() { + if (!::dumpExecutionTree) + return; char name[32]; - snprintf(name, sizeof(name),"ptree%08d.dot", (int) stats::instructions); + snprintf(name, sizeof(name), "exec_tree%08d.dot", (int)stats::instructions); auto os = interpreterHandler->openOutputFile(name); - if (os) { - processTree->dump(*os); - } + if (os) + executionTree->dump(*os); - ::dumpPTree = 0; + ::dumpExecutionTree = 0; } void Executor::dumpStates() { diff --git a/lib/Core/Executor.h b/lib/Core/Executor.h index 7da4f63cba..465751f608 100644 --- a/lib/Core/Executor.h +++ b/lib/Core/Executor.h @@ -57,37 +57,36 @@ namespace llvm { class Value; } -namespace klee { - class Array; - struct Cell; - class ExecutionState; - class ExternalDispatcher; - class Expr; - class InstructionInfoTable; - struct KFunction; - struct KInstruction; - class KInstIterator; - class KModule; - class MemoryManager; - class MemoryObject; - class ObjectState; - class PTree; - class Searcher; - class SeedInfo; - class SpecialFunctionHandler; - struct StackFrame; - class StatsTracker; - class TimingSolver; - class TreeStreamWriter; - class MergeHandler; - class MergingSearcher; - template class ref; - - - - /// \todo Add a context object to keep track of data only live - /// during an instruction step. Should contain addedStates, - /// removedStates, and haltExecution, among others. +namespace klee { +class Array; +struct Cell; +class ExecutionState; +class ExternalDispatcher; +class Expr; +class InstructionInfoTable; +class KCallable; +struct KFunction; +struct KInstruction; +class KInstIterator; +class KModule; +class MemoryManager; +class MemoryObject; +class ObjectState; +class ExecutionTree; +class Searcher; +class SeedInfo; +class SpecialFunctionHandler; +struct StackFrame; +class StatsTracker; +class TimingSolver; +class TreeStreamWriter; +class MergeHandler; +class MergingSearcher; +template class ref; + +/// \todo Add a context object to keep track of data only live +/// during an instruction step. Should contain addedStates, +/// removedStates, and haltExecution, among others. class Executor : public Interpreter { friend class OwningSearcher; @@ -95,6 +94,7 @@ class Executor : public Interpreter { friend class SpecialFunctionHandler; friend class StatsTracker; friend class MergeHandler; + friend class ObjectState; friend klee::Searcher *klee::constructUserSearcher(Executor &executor); public: @@ -109,14 +109,14 @@ class Executor : public Interpreter { Searcher *searcher; ExternalDispatcher *externalDispatcher; - TimingSolver *solver; - MemoryManager *memory; + std::unique_ptr solver; + std::unique_ptr memory; std::set states; StatsTracker *statsTracker; TreeStreamWriter *pathWriter, *symPathWriter; SpecialFunctionHandler *specialFunctionHandler; TimerGroup timers; - std::unique_ptr processTree; + std::unique_ptr executionTree; /// Used to track states that have been added during the current /// instructions step. @@ -137,13 +137,13 @@ class Executor : public Interpreter { /// happens with other states (that don't satisfy the seeds) depends /// on as-yet-to-be-determined flags. std::map > seedMap; - + /// Map of globals to their representative memory object. std::map globalObjects; /// Map of globals to their bound address. This also includes - /// globals that have no representative object (i.e. functions). - std::map > globalAddresses; + /// globals that have no representative object (e.g. aliases). + std::map> globalAddresses; /// Map of legal function addresses to the corresponding Function. /// Used to validate and dereference function pointers. @@ -211,8 +211,7 @@ class Executor : public Interpreter { /// Return the typeid corresponding to a certain `type_info` ref getEhTypeidFor(ref type_info); - llvm::Function* getTargetFunction(llvm::Value *calledVal, - ExecutionState &state); + llvm::Function* getTargetFunction(llvm::Value *calledVal); void executeInstruction(ExecutionState &state, KInstruction *ki); @@ -240,7 +239,7 @@ class Executor : public Interpreter { void callExternalFunction(ExecutionState &state, KInstruction *target, - llvm::Function *function, + KCallable *callable, std::vector< ref > &arguments); ObjectState *bindObjectInState(ExecutionState &state, const MemoryObject *mo, @@ -389,14 +388,21 @@ class Executor : public Interpreter { /// value). Otherwise return the original expression. ref toUnique(const ExecutionState &state, ref &e); - /// Return a constant value for the given expression, forcing it to - /// be constant in the given state by adding a constraint if + /// Return a constant value for the given expression. If \param concretize is + /// true, the expression is forced to be a constant by adding a constraint if /// necessary. Note that this function breaks completeness and /// should generally be avoided. /// - /// \param purpose An identify string to printed in case of concretization. - ref toConstant(ExecutionState &state, ref e, - const char *purpose); + /// \param reason A documentation string stating the reason for concretization + ref toConstant(ExecutionState &state, ref e, + const std::string &reason, + bool concretize = true); + + /// Evaluate the given expression under each seed, and return the + /// first one that results in a constant, if such a seed exist. Otherwise, + /// return the non-constant evaluation of the expression under one of the + /// seeds. + ref getValueFromSeeds(ExecutionState &state, ref e); /// Bind a constant value for e to the given target. NOTE: This /// function may fork state if the state has multiple seeds. @@ -410,8 +416,9 @@ class Executor : public Interpreter { const InstructionInfo & getLastNonKleeInternalInstruction(const ExecutionState &state, llvm::Instruction** lastInstruction); - /// Remove state from queue and delete state - void terminateState(ExecutionState &state); + /// Remove state from queue and delete state. This function should only be + /// used in the termination functions below. + void terminateState(ExecutionState &state, StateTerminationType reason); /// Call exit handler and terminate state normally /// (end of execution path) @@ -420,21 +427,43 @@ class Executor : public Interpreter { /// Call exit handler and terminate state early /// (e.g. due to state merging or memory pressure) void terminateStateEarly(ExecutionState &state, const llvm::Twine &message, - StateTerminationType terminationType); + StateTerminationType reason); + + /// Call exit handler and terminate state early + /// (e.g. caused by the applied algorithm as in state merging or replaying) + void terminateStateEarlyAlgorithm(ExecutionState &state, + const llvm::Twine &message, + StateTerminationType reason); + + /// Call exit handler and terminate state early + /// (e.g. due to klee_silent_exit issued by user) + void terminateStateEarlyUser(ExecutionState &state, + const llvm::Twine &message); + + /// Call error handler and terminate state in case of errors. + /// The underlying function of all error-handling termination functions + /// below. This function should only be used in the termination functions + /// below. + void terminateStateOnError(ExecutionState &state, + const llvm::Twine &message, + StateTerminationType reason, + const llvm::Twine &longMessage = "", + const char *suffix = nullptr); /// Call error handler and terminate state in case of program errors /// (e.g. free()ing globals, out-of-bound accesses) - void terminateStateOnError(ExecutionState &state, const llvm::Twine &message, - StateTerminationType terminationType, - const llvm::Twine &longMessage = "", - const char *suffix = nullptr); + void terminateStateOnProgramError(ExecutionState &state, + const llvm::Twine &message, + StateTerminationType reason, + const llvm::Twine &longMessage = "", + const char *suffix = nullptr); /// Call error handler and terminate state in case of execution errors /// (things that should not be possible, like illegal instruction or /// unlowered intrinsic, or unsupported intrinsics, like inline assembly) - void terminateStateOnExecError(ExecutionState &state, - const llvm::Twine &message, - const llvm::Twine &info = ""); + void terminateStateOnExecError( + ExecutionState &state, const llvm::Twine &message, + StateTerminationType = StateTerminationType::Execution); /// Call error handler and terminate state in case of solver errors /// (solver error or timeout) @@ -444,12 +473,13 @@ class Executor : public Interpreter { /// Call error handler and terminate state for user errors /// (e.g. wrong usage of klee.h API) void terminateStateOnUserError(ExecutionState &state, - const llvm::Twine &message); + const llvm::Twine &message, + bool writeErr = true); /// bindModuleConstants - Initialize the module constant table. void bindModuleConstants(); - template + template void computeOffsetsSeqTy(KGEPInstruction *kgepi, ref &constantOffset, uint64_t index, const TypeIt it); @@ -477,7 +507,7 @@ class Executor : public Interpreter { /// Only for debug purposes; enable via debugger or klee-control void dumpStates(); - void dumpPTree(); + void dumpExecutionTree(); public: Executor(llvm::LLVMContext &ctx, const InterpreterOptions &opts, @@ -552,7 +582,7 @@ class Executor : public Interpreter { MergingSearcher *getMergingSearcher() const { return mergingSearcher; }; void setMergingSearcher(MergingSearcher *ms) { mergingSearcher = ms; }; }; - -} // End klee namespace + +} // namespace klee #endif /* KLEE_EXECUTOR_H */ diff --git a/lib/Core/ExecutorUtil.cpp b/lib/Core/ExecutorUtil.cpp index 1050ba2317..09f58fd3ab 100644 --- a/lib/Core/ExecutorUtil.cpp +++ b/lib/Core/ExecutorUtil.cpp @@ -17,6 +17,9 @@ #include "klee/Solver/Solver.h" #include "klee/Support/ErrorHandling.h" +#include "klee/Support/CompilerWarning.h" +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS #include "llvm/IR/Constants.h" #include "llvm/IR/DataLayout.h" #include "llvm/IR/Function.h" @@ -25,6 +28,7 @@ #include "llvm/IR/Module.h" #include "llvm/IR/Operator.h" #include "llvm/Support/raw_ostream.h" +DISABLE_WARNING_POP #include diff --git a/lib/Core/ExternalDispatcher.cpp b/lib/Core/ExternalDispatcher.cpp index aadb340d8c..7b43218be1 100644 --- a/lib/Core/ExternalDispatcher.cpp +++ b/lib/Core/ExternalDispatcher.cpp @@ -8,14 +8,19 @@ //===----------------------------------------------------------------------===// #include "ExternalDispatcher.h" + +#include "CoreStats.h" #include "klee/Config/Version.h" +#include "klee/Module/KCallable.h" +#include "klee/Module/KModule.h" -#if LLVM_VERSION_CODE < LLVM_VERSION(8, 0) -#include "llvm/IR/CallSite.h" -#endif +#include "klee/Support/CompilerWarning.h" +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS #include "llvm/IR/Constants.h" #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/IRBuilder.h" +#include "llvm/IR/InlineAsm.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" @@ -24,6 +29,7 @@ #include "llvm/Support/DynamicLibrary.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Support/TargetSelect.h" +DISABLE_WARNING_POP #include #include @@ -48,7 +54,7 @@ class ExternalDispatcherImpl { private: typedef std::map dispatchers_ty; dispatchers_ty dispatchers; - llvm::Function *createDispatcher(llvm::Function *f, llvm::Instruction *i, + llvm::Function *createDispatcher(KCallable *target, llvm::Instruction *i, llvm::Module *module); llvm::ExecutionEngine *executionEngine; LLVMContext &ctx; @@ -62,7 +68,7 @@ class ExternalDispatcherImpl { public: ExternalDispatcherImpl(llvm::LLVMContext &ctx); ~ExternalDispatcherImpl(); - bool executeCall(llvm::Function *function, llvm::Instruction *i, + bool executeCall(KCallable *callable, llvm::Instruction *i, uint64_t *args); void *resolveSymbol(const std::string &name); int getLastErrno(); @@ -156,8 +162,9 @@ ExternalDispatcherImpl::~ExternalDispatcherImpl() { // we don't need to delete any of them. } -bool ExternalDispatcherImpl::executeCall(Function *f, Instruction *i, +bool ExternalDispatcherImpl::executeCall(KCallable *callable, Instruction *i, uint64_t *args) { + ++stats::externalCalls; dispatchers_ty::iterator it = dispatchers.find(i); if (it != dispatchers.end()) { // Code already JIT'ed for this @@ -183,7 +190,7 @@ bool ExternalDispatcherImpl::executeCall(Function *f, Instruction *i, // The MCJIT generates whole modules at a time so for every call that we // haven't made before we need to create a new Module. dispatchModule = new Module(getFreshModuleID(), ctx); - dispatcher = createDispatcher(f, i, dispatchModule); + dispatcher = createDispatcher(callable, i, dispatchModule); dispatchers.insert(std::make_pair(i, dispatcher)); // Force the JIT execution engine to go ahead and build the function. This @@ -243,7 +250,7 @@ bool ExternalDispatcherImpl::runProtectedCall(Function *f, uint64_t *args) { } // FIXME: This might have been relevant for the old JIT but the MCJIT -// has a completly different implementation so this comment below is +// has a completely different implementation so this comment below is // likely irrelevant and misleading. // // For performance purposes we construct the stub in such a way that the @@ -252,21 +259,14 @@ bool ExternalDispatcherImpl::runProtectedCall(Function *f, uint64_t *args) { // the special cases that the JIT knows how to directly call. If this is not // done, then the jit will end up generating a nullary stub just to call our // stub, for every single function call. -Function *ExternalDispatcherImpl::createDispatcher(Function *target, +Function *ExternalDispatcherImpl::createDispatcher(KCallable *target, Instruction *inst, Module *module) { - if (!resolveSymbol(target->getName().str())) + if (isa(target) && !resolveSymbol(target->getName().str())) return 0; -#if LLVM_VERSION_CODE >= LLVM_VERSION(8, 0) - const CallBase &cs = cast(*inst); -#else - const CallSite cs(inst->getOpcode() == Instruction::Call - ? CallSite(cast(inst)) - : CallSite(cast(inst))); -#endif - - Value **args = new Value *[cs.arg_size()]; + const CallBase &cb = cast(*inst); + Value **args = new Value *[cb.arg_size()]; std::vector nullary; @@ -283,20 +283,26 @@ Function *ExternalDispatcherImpl::createDispatcher(Function *target, llvm::IRBuilder<> Builder(dBB); // Get a Value* for &gTheArgsP, as an i64**. +#if LLVM_VERSION_CODE >= LLVM_VERSION(15, 0) + auto argI64sp = Builder.CreateIntToPtr( + ConstantInt::get(Type::getInt64Ty(ctx), (uintptr_t)&gTheArgsP), + PointerType::getUnqual(PointerType::getUnqual(Type::getInt64Ty(ctx))), + "argsp"); + auto argI64s = Builder.CreateLoad(Builder.getPtrTy(), argI64sp, "args"); +#else auto argI64sp = Builder.CreateIntToPtr( ConstantInt::get(Type::getInt64Ty(ctx), (uintptr_t)(void *)&gTheArgsP), PointerType::getUnqual(PointerType::getUnqual(Type::getInt64Ty(ctx))), "argsp"); auto argI64s = Builder.CreateLoad( argI64sp->getType()->getPointerElementType(), argI64sp, "args"); - +#endif // Get the target function type. - FunctionType *FTy = cast( - cast(target->getType())->getElementType()); + FunctionType *FTy = target->getFunctionType(); // Each argument will be passed by writing it into gTheArgsP[i]. unsigned i = 0, idx = 2; - for (auto ai = cs.arg_begin(), ae = cs.arg_end(); ai != ae; ++ai, ++i) { + for (auto ai = cb.arg_begin(), ae = cb.arg_end(); ai != ae; ++ai, ++i) { // Determine the type the argument will be passed as. This accommodates for // the corresponding code in Executor.cpp for handling calls to bitcasted // functions. @@ -307,6 +313,14 @@ Function *ExternalDispatcherImpl::createDispatcher(Function *target, if (argTy->isX86_FP80Ty() && idx & 0x01) idx++; +#if LLVM_VERSION_CODE >= LLVM_VERSION(15, 0) + auto argI64p = + Builder.CreateGEP(Builder.getPtrTy(), argI64s, + ConstantInt::get(Type::getInt32Ty(ctx), idx)); + + auto argp = Builder.CreateBitCast(argI64p, PointerType::getUnqual(argTy)); + args[i] = Builder.CreateLoad(argTy, argp); +#else auto argI64p = Builder.CreateGEP(argI64s->getType()->getPointerElementType(), argI64s, ConstantInt::get(Type::getInt32Ty(ctx), idx)); @@ -314,15 +328,24 @@ Function *ExternalDispatcherImpl::createDispatcher(Function *target, auto argp = Builder.CreateBitCast(argI64p, PointerType::getUnqual(argTy)); args[i] = Builder.CreateLoad(argp->getType()->getPointerElementType(), argp); +#endif unsigned argSize = argTy->getPrimitiveSizeInBits(); idx += ((!!argSize ? argSize : 64) + 63) / 64; } - auto dispatchTarget = module->getOrInsertFunction(target->getName(), FTy, - target->getAttributes()); - auto result = Builder.CreateCall(dispatchTarget, - llvm::ArrayRef(args, args + i)); + llvm::CallInst *result; + if (auto* func = dyn_cast(target)) { + auto dispatchTarget = module->getOrInsertFunction(target->getName(), FTy, + func->function->getAttributes()); + result = Builder.CreateCall(dispatchTarget, + llvm::ArrayRef(args, args + i)); + } else if (auto* asmValue = dyn_cast(target)) { + result = Builder.CreateCall(asmValue->getInlineAsm(), + llvm::ArrayRef(args, args + i)); + } else { + assert(0 && "Unhandled KCallable derived class"); + } if (result->getType() != Type::getVoidTy(ctx)) { auto resp = Builder.CreateBitCast( argI64s, PointerType::getUnqual(result->getType())); @@ -346,9 +369,9 @@ ExternalDispatcher::ExternalDispatcher(llvm::LLVMContext &ctx) ExternalDispatcher::~ExternalDispatcher() { delete impl; } -bool ExternalDispatcher::executeCall(llvm::Function *function, +bool ExternalDispatcher::executeCall(KCallable *callable, llvm::Instruction *i, uint64_t *args) { - return impl->executeCall(function, i, args); + return impl->executeCall(callable, i, args); } void *ExternalDispatcher::resolveSymbol(const std::string &name) { diff --git a/lib/Core/ExternalDispatcher.h b/lib/Core/ExternalDispatcher.h index 7730ac4e0f..72e6faaa4b 100644 --- a/lib/Core/ExternalDispatcher.h +++ b/lib/Core/ExternalDispatcher.h @@ -20,11 +20,11 @@ namespace llvm { class Instruction; class LLVMContext; -class Function; } namespace klee { class ExternalDispatcherImpl; +class KCallable; class ExternalDispatcher { private: ExternalDispatcherImpl *impl; @@ -37,7 +37,7 @@ class ExternalDispatcher { * ci with arguments in args[1], args[2], ... and writing the result * into args[0]. */ - bool executeCall(llvm::Function *function, llvm::Instruction *i, + bool executeCall(KCallable *callable, llvm::Instruction *i, uint64_t *args); void *resolveSymbol(const std::string &name); diff --git a/lib/Core/GetElementPtrTypeIterator.h b/lib/Core/GetElementPtrTypeIterator.h index 89606a0a39..e4ca8dc90c 100644 --- a/lib/Core/GetElementPtrTypeIterator.h +++ b/lib/Core/GetElementPtrTypeIterator.h @@ -18,60 +18,61 @@ #ifndef KLEE_GETELEMENTPTRTYPEITERATOR_H #define KLEE_GETELEMENTPTRTYPEITERATOR_H +#include "klee/Support/CompilerWarning.h" +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS #include "llvm/IR/User.h" #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/Constants.h" +DISABLE_WARNING_POP #include "klee/Config/Version.h" namespace klee { template -class generic_gep_type_iterator - : public std::iterator { - typedef std::iterator - super; - - ItTy OpIt; - llvm::Type *CurTy; - generic_gep_type_iterator() {} - - llvm::Value *asValue(llvm::Value *V) const { return V; } - llvm::Value *asValue(unsigned U) const { - return llvm::ConstantInt::get(CurTy->getContext(), llvm::APInt(32, U)); - } +class generic_gep_type_iterator { + using iterator_category = std::forward_iterator_tag; + using value_type = llvm::Type *; + using difference_type = ptrdiff_t; + using pointer = void; + using reference = void; + + ItTy OpIt; + llvm::Type *CurTy; + generic_gep_type_iterator() {} + + llvm::Value *asValue(llvm::Value *V) const { return V; } + llvm::Value *asValue(unsigned U) const { + return llvm::ConstantInt::get(CurTy->getContext(), llvm::APInt(32, U)); + } - public: - static generic_gep_type_iterator begin(llvm::Type *Ty, ItTy It) { - generic_gep_type_iterator I; - I.CurTy = Ty; - I.OpIt = It; - return I; - } - static generic_gep_type_iterator end(ItTy It) { - generic_gep_type_iterator I; - I.CurTy = 0; - I.OpIt = It; - return I; - } +public: + static generic_gep_type_iterator begin(llvm::Type *Ty, ItTy It) { + generic_gep_type_iterator I; + I.CurTy = Ty; + I.OpIt = It; + return I; + } + static generic_gep_type_iterator end(ItTy It) { + generic_gep_type_iterator I; + I.CurTy = 0; + I.OpIt = It; + return I; + } - bool operator==(const generic_gep_type_iterator& x) const { - return OpIt == x.OpIt; - } - bool operator!=(const generic_gep_type_iterator& x) const { - return !operator==(x); - } + bool operator==(const generic_gep_type_iterator &x) const { + return OpIt == x.OpIt; + } + bool operator!=(const generic_gep_type_iterator &x) const { + return !operator==(x); + } - llvm::Type *operator*() const { return CurTy; } + llvm::Type *operator*() const { return CurTy; } - llvm::Type *getIndexedType() const { -#if LLVM_VERSION_CODE >= LLVM_VERSION(11, 0) + llvm::Type *getIndexedType() const { return llvm::GetElementPtrInst::getTypeAtIndex(CurTy, getOperand()); -#else - llvm::CompositeType *CT = cast(CurTy); - return CT->getTypeAtIndex(getOperand()); -#endif - } + } // This is a non-standard operator->. It allows you to call methods on the // current type directly. @@ -80,16 +81,11 @@ class generic_gep_type_iterator llvm::Value *getOperand() const { return asValue(*OpIt); } generic_gep_type_iterator& operator++() { // Preincrement -#if LLVM_VERSION_CODE >= LLVM_VERSION(11, 0) if (isa(CurTy) || isa(CurTy) || isa(CurTy)) { CurTy = llvm::GetElementPtrInst::getTypeAtIndex(CurTy, getOperand()); -#else - if (llvm::CompositeType *CT = dyn_cast(CurTy)) { - CurTy = CT->getTypeAtIndex(getOperand()); -#endif - } else if (auto ptr = dyn_cast(CurTy)) { - CurTy = ptr->getElementType(); + } else if (CurTy->isPointerTy()) { + CurTy = CurTy->getPointerElementType(); } else { CurTy = 0; } @@ -100,7 +96,7 @@ class generic_gep_type_iterator generic_gep_type_iterator operator++(int) { // Postincrement generic_gep_type_iterator tmp = *this; ++*this; return tmp; } - }; +}; typedef generic_gep_type_iterator<> gep_type_iterator; typedef generic_gep_type_iterator ev_type_iterator; @@ -138,14 +134,6 @@ class generic_gep_type_iterator return iv_type_iterator::end(IV->idx_end()); } - inline vce_type_iterator vce_type_begin(const llvm::ConstantExpr *CE) { - return vce_type_iterator::begin(CE->getOperand(0)->getType(), - CE->getIndices().begin()); - } - inline vce_type_iterator vce_type_end(const llvm::ConstantExpr *CE) { - return vce_type_iterator::end(CE->getIndices().end()); - } - template inline generic_gep_type_iterator gep_type_begin(llvm::Type *Op0, ItTy I, ItTy E) { diff --git a/lib/Core/ImpliedValue.cpp b/lib/Core/ImpliedValue.cpp index 4baec51299..4128a2dc28 100644 --- a/lib/Core/ImpliedValue.cpp +++ b/lib/Core/ImpliedValue.cpp @@ -15,7 +15,6 @@ #include "klee/Expr/Expr.h" #include "klee/Expr/ExprUtil.h" #include "klee/Solver/Solver.h" -#include "klee/Support/IntEvaluation.h" // FIXME: Use APInt #include #include @@ -134,7 +133,7 @@ void ImpliedValue::getImpliedValues(ref e, getImpliedValues(be->right, value, results); } } else { - // FIXME; We can propogate a mask here where we know "some bits". May or + // FIXME; We can propagate a mask here where we know "some bits". May or // may not be useful. } break; diff --git a/lib/Core/Memory.cpp b/lib/Core/Memory.cpp index f2f679adab..d77270f206 100644 --- a/lib/Core/Memory.cpp +++ b/lib/Core/Memory.cpp @@ -11,6 +11,7 @@ #include "Context.h" #include "ExecutionState.h" +#include "Executor.h" #include "MemoryManager.h" #include "klee/ADT/BitArray.h" @@ -20,11 +21,15 @@ #include "klee/Solver/Solver.h" #include "klee/Support/ErrorHandling.h" +#include "klee/Support/CompilerWarning.h" +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS #include "llvm/IR/Function.h" #include "llvm/IR/Instruction.h" #include "llvm/IR/Value.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/raw_ostream.h" +DISABLE_WARNING_POP #include #include @@ -192,20 +197,16 @@ const UpdateList &ObjectState::getUpdates() const { return updates; } -void ObjectState::flushToConcreteStore(TimingSolver *solver, - const ExecutionState &state) const { +void ObjectState::flushToConcreteStore(Executor &executor, + ExecutionState &state, bool concretize) { for (unsigned i = 0; i < size; i++) { - if (isByteKnownSymbolic(i)) { - ref ce; - bool success = solver->getValue(state.constraints, read8(i), ce, - state.queryMetaData); - if (!success) - klee_warning("Solver timed out when getting a value for external call, " - "byte %p+%u will have random value", - (void *)object->address, i); - else - ce->toMemory(concreteStore + i); - } + if (isByteConcrete(i)) + continue; + // Get a concrete value for the symbolic byte and write it to the memory + // object + ref ce = + executor.toConstant(state, read8(i), "external call", concretize); + ce->toMemory(concreteStore + i); } } @@ -375,19 +376,23 @@ ref ObjectState::read8(unsigned offset) const { } ref ObjectState::read8(ref offset) const { - assert(!isa(offset) && "constant offset passed to symbolic read8"); + assert(!isa(offset) && + "constant offset passed to symbolic read8"); unsigned base, size; fastRangeCheckOffset(offset, &base, &size); flushRangeForRead(base, size); - if (size>4096) { + if (size > 4096) { std::string allocInfo; object->getAllocInfo(allocInfo); - klee_warning_once(0, "flushing %d bytes on read, may be slow and/or crash: %s", - size, - allocInfo.c_str()); + klee_warning_once( + nullptr, + "Symbolic memory access will send the following array of %d bytes to " + "the constraint solver -- large symbolic arrays may cause significant " + "performance issues: %s", + size, allocInfo.c_str()); } - + return ReadExpr::create(getUpdates(), ZExtExpr::create(offset, Expr::Int32)); } @@ -413,19 +418,23 @@ void ObjectState::write8(unsigned offset, ref value) { } void ObjectState::write8(ref offset, ref value) { - assert(!isa(offset) && "constant offset passed to symbolic write8"); + assert(!isa(offset) && + "constant offset passed to symbolic write8"); unsigned base, size; fastRangeCheckOffset(offset, &base, &size); flushRangeForWrite(base, size); - if (size>4096) { + if (size > 4096) { std::string allocInfo; object->getAllocInfo(allocInfo); - klee_warning_once(0, "flushing %d bytes on read, may be slow and/or crash: %s", - size, - allocInfo.c_str()); + klee_warning_once( + nullptr, + "Symbolic memory access will send the following array of %d bytes to " + "the constraint solver -- large symbolic arrays may cause significant " + "performance issues: %s", + size, allocInfo.c_str()); } - + updates.extend(ZExtExpr::create(offset, Expr::Int32), value); } diff --git a/lib/Core/Memory.h b/lib/Core/Memory.h index 7e1f097a78..3b365c2081 100644 --- a/lib/Core/Memory.h +++ b/lib/Core/Memory.h @@ -29,6 +29,7 @@ namespace klee { class ArrayCache; class BitArray; class ExecutionState; +class Executor; class MemoryManager; class Solver; @@ -50,6 +51,7 @@ class MemoryObject { /// size in bytes unsigned size; + unsigned alignment; mutable std::string name; bool isLocal; @@ -76,18 +78,20 @@ class MemoryObject { : id(counter++), address(_address), size(0), + alignment(0), isFixed(true), parent(NULL), allocSite(0) { } - MemoryObject(uint64_t _address, unsigned _size, + MemoryObject(uint64_t _address, unsigned _size, unsigned _alignment, bool _isLocal, bool _isGlobal, bool _isFixed, const llvm::Value *_allocSite, MemoryManager *_parent) : id(counter++), address(_address), size(_size), + alignment(_alignment), name("unnamed"), isLocal(_isLocal), isGlobal(_isGlobal), @@ -230,12 +234,15 @@ class ObjectState { void write64(unsigned offset, uint64_t value); void print() const; - /* - Looks at all the symbolic bytes of this object, gets a value for them - from the solver and puts them in the concreteStore. - */ - void flushToConcreteStore(TimingSolver *solver, - const ExecutionState &state) const; + /// Generate concrete values for each symbolic byte of the object and put them + /// in the concrete store. + /// + /// \param executor + /// \param state + /// \param concretize if true, constraints for concretised bytes are added if + /// necessary + void flushToConcreteStore(Executor &executor, ExecutionState &state, + bool concretize); private: const UpdateList &getUpdates() const; diff --git a/lib/Core/MemoryManager.cpp b/lib/Core/MemoryManager.cpp index f15c0db9d7..9d29157855 100644 --- a/lib/Core/MemoryManager.cpp +++ b/lib/Core/MemoryManager.cpp @@ -10,76 +10,250 @@ #include "MemoryManager.h" #include "CoreStats.h" +#include "ExecutionState.h" #include "Memory.h" #include "klee/Expr/Expr.h" #include "klee/Support/ErrorHandling.h" +#include "klee/Support/CompilerWarning.h" +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS +#include "llvm/IR/GlobalVariable.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/MathExtras.h" +#include "llvm/Support/Alignment.h" +DISABLE_WARNING_POP -#include +#include +#include #include +#include +#include using namespace klee; -namespace { +namespace klee { +std::uint32_t MemoryManager::quarantine; + +std::size_t MemoryManager::pageSize = sysconf(_SC_PAGE_SIZE); + +bool MemoryManager::isDeterministic; llvm::cl::OptionCategory MemoryCat("Memory management options", "These options control memory management."); -llvm::cl::opt DeterministicAllocation( - "allocate-determ", - llvm::cl::desc("Allocate memory deterministically (default=false)"), - llvm::cl::init(false), llvm::cl::cat(MemoryCat)); +llvm::cl::opt DeterministicAllocation( + "kdalloc", + llvm::cl::desc("Allocate memory deterministically (default=true)"), + llvm::cl::location(MemoryManager::isDeterministic), llvm::cl::init(true), + llvm::cl::cat(MemoryCat)); + +llvm::cl::opt DeterministicAllocationMarkAsUnneeded( + "kdalloc-mark-as-unneeded", + llvm::cl::desc("Mark allocations as unneeded after external function calls " + "(default=true)"), + llvm::cl::init(true), llvm::cl::cat(MemoryCat)); + +llvm::cl::opt DeterministicAllocationGlobalsSize( + "kdalloc-globals-size", + llvm::cl::desc("Reserved memory for globals in GiB (default=10)"), + llvm::cl::init(10), llvm::cl::cat(MemoryCat)); + +llvm::cl::opt DeterministicAllocationConstantsSize( + "kdalloc-constants-size", + llvm::cl::desc("Reserved memory for constant globals in GiB (default=10)"), + llvm::cl::init(10), llvm::cl::cat(MemoryCat)); + +llvm::cl::opt DeterministicAllocationHeapSize( + "kdalloc-heap-size", + llvm::cl::desc("Reserved memory for heap in GiB (default=1024)"), + llvm::cl::init(1024), llvm::cl::cat(MemoryCat)); + +llvm::cl::opt DeterministicAllocationStackSize( + "kdalloc-stack-size", + llvm::cl::desc("Reserved memory for stack in GiB (default=100)"), + llvm::cl::init(128), llvm::cl::cat(MemoryCat)); + +llvm::cl::opt DeterministicAllocationGlobalsStartAddress( + "kdalloc-globals-start-address", + llvm::cl::desc( + "Start address for globals segment (has to be page aligned)"), + llvm::cl::cat(MemoryCat)); -llvm::cl::opt DeterministicAllocationSize( - "allocate-determ-size", +llvm::cl::opt DeterministicAllocationConstantsStartAddress( + "kdalloc-constants-start-address", llvm::cl::desc( - "Preallocated memory for deterministic allocation in MB (default=100)"), - llvm::cl::init(100), llvm::cl::cat(MemoryCat)); + "Start address for constant globals segment (has to be page aligned)"), + llvm::cl::cat(MemoryCat)); + +llvm::cl::opt DeterministicAllocationHeapStartAddress( + "kdalloc-heap-start-address", + llvm::cl::desc("Start address for heap segment (has to be page aligned)"), + llvm::cl::cat(MemoryCat)); + +llvm::cl::opt DeterministicAllocationStackStartAddress( + "kdalloc-stack-start-address", + llvm::cl::desc("Start address for stack segment (has to be page aligned)"), + llvm::cl::cat(MemoryCat)); + +struct QuarantineSizeParser : public llvm::cl::parser { + explicit QuarantineSizeParser(llvm::cl::Option &O) + : llvm::cl::parser(O) {} + + bool parse(llvm::cl::Option &O, llvm::StringRef ArgName, llvm::StringRef Arg, + std::uint32_t &Val) { + if (Arg == "-1") { + Val = kdalloc::Allocator::unlimitedQuarantine; + } else if (Arg.getAsInteger(0, Val)) { + return O.error("'" + Arg + "' value invalid!"); + } + + return false; + } +}; + +llvm::cl::opt + DeterministicAllocationQuarantineSize( + "kdalloc-quarantine", + llvm::cl::desc("Size of quarantine queues in allocator (default=8, " + "disabled=0, unlimited=-1)"), + llvm::cl::location(klee::MemoryManager::quarantine), + llvm::cl::value_desc("size"), llvm::cl::init(8), + llvm::cl::cat(MemoryCat)); llvm::cl::opt NullOnZeroMalloc( "return-null-on-zero-malloc", llvm::cl::desc("Returns NULL if malloc(0) is called (default=false)"), llvm::cl::init(false), llvm::cl::cat(MemoryCat)); - -llvm::cl::opt RedzoneSize( - "redzone-size", - llvm::cl::desc("Set the size of the redzones to be added after each " - "allocation (in bytes). This is important to detect " - "out-of-bounds accesses (default=10)"), - llvm::cl::init(10), llvm::cl::cat(MemoryCat)); - -llvm::cl::opt DeterministicStartAddress( - "allocate-determ-start-address", - llvm::cl::desc("Start address for deterministic allocation. Has to be page " - "aligned (default=0x7ff30000000)"), - llvm::cl::init(0x7ff30000000), llvm::cl::cat(MemoryCat)); } // namespace /***/ MemoryManager::MemoryManager(ArrayCache *_arrayCache) - : arrayCache(_arrayCache), deterministicSpace(0), nextFreeSlot(0), - spaceSize(DeterministicAllocationSize.getValue() * 1024 * 1024) { + : arrayCache(_arrayCache) { if (DeterministicAllocation) { - // Page boundary - void *expectedAddress = (void *)DeterministicStartAddress.getValue(); + if (DeterministicAllocationQuarantineSize == + kdalloc::Allocator::unlimitedQuarantine) { + klee_message("Deterministic allocator: Using unlimited quarantine"); + } else if (DeterministicAllocationQuarantineSize != 0) { + klee_message("Deterministic allocator: Using quarantine queue size %u", + DeterministicAllocationQuarantineSize.getValue()); + } - char *newSpace = - (char *)mmap(expectedAddress, spaceSize, PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + std::vector, + kdalloc::Allocator *>> + requestedSegments; + requestedSegments.emplace_back( + "globals", + DeterministicAllocationGlobalsStartAddress + ? DeterministicAllocationGlobalsStartAddress.getValue() + : 0, + static_cast( + DeterministicAllocationGlobalsSize.getValue()) * + 1024 * 1024 * 1024, + globalsFactory, &globalsAllocator); + requestedSegments.emplace_back( + "constants", + DeterministicAllocationConstantsStartAddress + ? DeterministicAllocationConstantsStartAddress.getValue() + : 0, + static_cast( + DeterministicAllocationConstantsSize.getValue()) * + 1024 * 1024 * 1024, + constantsFactory, &constantsAllocator); + requestedSegments.emplace_back( + "heap", + DeterministicAllocationHeapStartAddress + ? DeterministicAllocationHeapStartAddress.getValue() + : 0, + static_cast(DeterministicAllocationHeapSize.getValue()) * + 1024 * 1024 * 1024, + heapFactory, nullptr); + requestedSegments.emplace_back( + "stack", + DeterministicAllocationStackStartAddress + ? DeterministicAllocationStackStartAddress.getValue() + : 0, + static_cast(DeterministicAllocationStackSize.getValue()) * + 1024 * 1024 * 1024, + stackFactory, nullptr); - if (newSpace == MAP_FAILED) { - klee_error("Couldn't mmap() memory for deterministic allocations"); - } - if (expectedAddress != newSpace && expectedAddress != 0) { - klee_error("Could not allocate memory deterministically"); + // check invariants + llvm::Align pageAlignment(pageSize); + for (auto &requestedSegment : requestedSegments) { + auto &segment1 = std::get<0>(requestedSegment); + auto &start1 = std::get<1>(requestedSegment); + auto &size1 = std::get<2>(requestedSegment); + // check for page alignment + // NOTE: sizes are assumed to be page aligned due to multiplication + if (start1 != 0 && !llvm::isAligned(pageAlignment, start1)) { + klee_error("Deterministic allocator: Requested start address for %s " + "is not page aligned (page size: %" PRIu64 " B)", + segment1.c_str(), pageAlignment.value()); + } + + // check for overlap of segments + std::uintptr_t end1 = start1 + size1; + for (auto &requestedSegment : requestedSegments) { + auto &segment2 = std::get<0>(requestedSegment); + auto &start2 = std::get<1>(requestedSegment); + auto &size2 = std::get<2>(requestedSegment); + if (start1 != 0 && start2 != 0 && segment1 != segment2) { + std::uintptr_t end2 = start2 + size2; + if (!(end1 <= start2 || start1 >= end2)) { + klee_error("Deterministic allocator: Requested mapping for %s " + "(start-address=0x%" PRIxPTR " size=%zu GiB) " + "overlaps with that for %s " + "(start-address=0x%" PRIxPTR " size=%zu GiB)", + segment1.c_str(), start1, size1 / (1024 * 1024 * 1024), + segment2.c_str(), start2, size2 / (1024 * 1024 * 1024)); + } + } + } } - klee_message("Deterministic memory allocation starting from %p", newSpace); - deterministicSpace = newSpace; - nextFreeSlot = newSpace; + // initialize factories and allocators + for (auto &requestedSegment : requestedSegments) { + auto &segment = std::get<0>(requestedSegment); + auto &start = std::get<1>(requestedSegment); + auto &size = std::get<2>(requestedSegment); + auto &factory = std::get<3>(requestedSegment); + auto &allocator = std::get<4>(requestedSegment); + factory.get() = kdalloc::AllocatorFactory( + start, size, DeterministicAllocationQuarantineSize); + + if (!factory.get()) { + klee_error("Deterministic allocator: Could not allocate mapping for %s " + "(start-address=0x%" PRIxPTR " size=%zu GiB): %s", + segment.c_str(), start, size / (1024 * 1024 * 1024), + strerror(errno)); + } + if (start && factory.get().getMapping().getBaseAddress() != + reinterpret_cast(start)) { + klee_error("Deterministic allocator: Could not allocate mapping for %s " + "at requested address", + segment.c_str()); + } + if (factory.get().getMapping().getSize() != size) { + klee_error("Deterministic allocator: Could not allocate mapping for %s " + "with the requested size", + segment.c_str()); + } + + klee_message("Deterministic allocator: %s " + "(start-address=0x%" PRIxPTR " size=%zu GiB)", + segment.c_str(), + reinterpret_cast( + factory.get().getMapping().getBaseAddress()), + size / (1024 * 1024 * 1024)); + if (allocator) { + *allocator = factory.get().makeAllocator(); + } + } } } @@ -91,13 +265,10 @@ MemoryManager::~MemoryManager() { objects.erase(mo); delete mo; } - - if (DeterministicAllocation) - munmap(deterministicSpace, spaceSize); } MemoryObject *MemoryManager::allocate(uint64_t size, bool isLocal, - bool isGlobal, + bool isGlobal, ExecutionState *state, const llvm::Value *allocSite, size_t alignment) { if (size > 10 * 1024 * 1024) @@ -116,19 +287,29 @@ MemoryObject *MemoryManager::allocate(uint64_t size, bool isLocal, uint64_t address = 0; if (DeterministicAllocation) { - address = llvm::alignTo((uint64_t)nextFreeSlot + alignment - 1, alignment); + void *allocAddress; - // Handle the case of 0-sized allocations as 1-byte allocations. - // This way, we make sure we have this allocation between its own red zones - size_t alloc_size = std::max(size, (uint64_t)1); - if ((char *)address + alloc_size < deterministicSpace + spaceSize) { - nextFreeSlot = (char *)address + alloc_size + RedzoneSize; + if (isGlobal) { + const llvm::GlobalVariable *gv = + dyn_cast(allocSite); + if (isa(allocSite) || (gv && gv->isConstant())) { + allocAddress = constantsAllocator.allocate( + std::max(size, static_cast(alignment))); + } else { + allocAddress = globalsAllocator.allocate( + std::max(size, static_cast(alignment))); + } } else { - klee_warning_once(0, "Couldn't allocate %" PRIu64 - " bytes. Not enough deterministic space left.", - size); - address = 0; + if (isLocal) { + allocAddress = state->stackAllocator.allocate( + std::max(size, static_cast(alignment))); + } else { + allocAddress = state->heapAllocator.allocate( + std::max(size, static_cast(alignment))); + } } + + address = reinterpret_cast(allocAddress); } else { // Use malloc for the standard case if (alignment <= 8) @@ -146,8 +327,8 @@ MemoryObject *MemoryManager::allocate(uint64_t size, bool isLocal, return 0; ++stats::allocations; - MemoryObject *res = new MemoryObject(address, size, isLocal, isGlobal, false, - allocSite, this); + MemoryObject *res = new MemoryObject(address, size, alignment, isLocal, + isGlobal, false, allocSite, this); objects.insert(res); return res; } @@ -165,13 +346,11 @@ MemoryObject *MemoryManager::allocateFixed(uint64_t address, uint64_t size, ++stats::allocations; MemoryObject *res = - new MemoryObject(address, size, false, true, true, allocSite, this); + new MemoryObject(address, size, 0, false, true, true, allocSite, this); objects.insert(res); return res; } -void MemoryManager::deallocate(const MemoryObject *mo) { assert(0); } - void MemoryManager::markFreed(MemoryObject *mo) { if (objects.find(mo) != objects.end()) { if (!mo->isFixed && !DeterministicAllocation) @@ -180,6 +359,21 @@ void MemoryManager::markFreed(MemoryObject *mo) { } } +bool MemoryManager::markMappingsAsUnneeded() { + if (!DeterministicAllocation) + return false; + + if (!DeterministicAllocationMarkAsUnneeded) + return false; + + globalsFactory.getMapping().clear(); + heapFactory.getMapping().clear(); + stackFactory.getMapping().clear(); + + return true; +} + size_t MemoryManager::getUsedDeterministicSize() { - return nextFreeSlot - deterministicSpace; + // TODO: implement + return 0; } diff --git a/lib/Core/MemoryManager.h b/lib/Core/MemoryManager.h index f75c82fb1d..c8ef8016c0 100644 --- a/lib/Core/MemoryManager.h +++ b/lib/Core/MemoryManager.h @@ -10,6 +10,8 @@ #ifndef KLEE_MEMORYMANAGER_H #define KLEE_MEMORYMANAGER_H +#include "klee/KDAlloc/kdalloc.h" + #include #include #include @@ -19,8 +21,9 @@ class Value; } namespace klee { -class MemoryObject; class ArrayCache; +class ExecutionState; +class MemoryObject; class MemoryManager { private: @@ -28,24 +31,36 @@ class MemoryManager { objects_ty objects; ArrayCache *const arrayCache; - char *deterministicSpace; - char *nextFreeSlot; - size_t spaceSize; + kdalloc::AllocatorFactory globalsFactory; + kdalloc::Allocator globalsAllocator; + + kdalloc::AllocatorFactory constantsFactory; + kdalloc::Allocator constantsAllocator; public: - MemoryManager(ArrayCache *arrayCache); + explicit MemoryManager(ArrayCache *arrayCache); ~MemoryManager(); + kdalloc::AllocatorFactory heapFactory; + kdalloc::StackAllocatorFactory stackFactory; + + static std::uint32_t quarantine; + + static std::size_t pageSize; + + static bool isDeterministic; + /** * Returns memory object which contains a handle to real virtual process * memory. */ MemoryObject *allocate(uint64_t size, bool isLocal, bool isGlobal, - const llvm::Value *allocSite, size_t alignment); + ExecutionState *state, const llvm::Value *allocSite, + size_t alignment); MemoryObject *allocateFixed(uint64_t address, uint64_t size, const llvm::Value *allocSite); - void deallocate(const MemoryObject *mo); void markFreed(MemoryObject *mo); + bool markMappingsAsUnneeded(); ArrayCache *getArrayCache() const { return arrayCache; } /* diff --git a/lib/Core/MergeHandler.cpp b/lib/Core/MergeHandler.cpp index 0067754137..67b2e1eacf 100644 --- a/lib/Core/MergeHandler.cpp +++ b/lib/Core/MergeHandler.cpp @@ -23,8 +23,8 @@ llvm::cl::OptionCategory MergeCat("Path merging options", llvm::cl::opt UseMerge( "use-merge", llvm::cl::init(false), - llvm::cl::desc("Enable support for path merging via klee_open_merge() and " - "klee_close_merge() (default=false)"), + llvm::cl::desc("Enable support for path merging via klee_open_merge and " + "klee_close_merge (default=false)"), llvm::cl::cat(klee::MergeCat)); llvm::cl::opt DebugLogMerge( @@ -106,7 +106,7 @@ void MergeHandler::addClosedState(ExecutionState *es, for (auto& mState: cpv) { if (mState->merge(*es)) { - executor->terminateStateEarly(*es, "merged state.", StateTerminationType::Merge); + executor->terminateStateEarlyAlgorithm(*es, "merged state.", StateTerminationType::Merge); executor->mergingSearcher->inCloseMerge.erase(es); mergedSuccessful = true; break; diff --git a/lib/Core/MergeHandler.h b/lib/Core/MergeHandler.h index f7380415df..cc65a546be 100644 --- a/lib/Core/MergeHandler.h +++ b/lib/Core/MergeHandler.h @@ -71,7 +71,11 @@ #include "klee/ADT/Ref.h" +#include "klee/Support/CompilerWarning.h" +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS #include "llvm/Support/CommandLine.h" +DISABLE_WARNING_POP #include #include diff --git a/lib/Core/PTree.cpp b/lib/Core/PTree.cpp deleted file mode 100644 index 6c17e29698..0000000000 --- a/lib/Core/PTree.cpp +++ /dev/null @@ -1,135 +0,0 @@ -//===-- PTree.cpp ---------------------------------------------------------===// -// -// The KLEE Symbolic Virtual Machine -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "PTree.h" - -#include "ExecutionState.h" - -#include "klee/Expr/Expr.h" -#include "klee/Expr/ExprPPrinter.h" -#include "klee/Support/OptionCategories.h" - -#include -#include - -using namespace klee; -using namespace llvm; - -namespace { - -cl::opt - CompressProcessTree("compress-process-tree", - cl::desc("Remove intermediate nodes in the process " - "tree whenever possible (default=false)"), - cl::init(false), cl::cat(MiscCat)); - -} // namespace - -PTree::PTree(ExecutionState *initialState) - : root(PTreeNodePtr(new PTreeNode(nullptr, initialState))) { - initialState->ptreeNode = root.getPointer(); -} - -void PTree::attach(PTreeNode *node, ExecutionState *leftState, - ExecutionState *rightState, BranchType reason) { - assert(node && !node->left.getPointer() && !node->right.getPointer()); - assert(node == rightState->ptreeNode && - "Attach assumes the right state is the current state"); - node->state = nullptr; - node->left = PTreeNodePtr(new PTreeNode(node, leftState)); - // The current node inherits the tag - uint8_t currentNodeTag = root.getInt(); - if (node->parent) - currentNodeTag = node->parent->left.getPointer() == node - ? node->parent->left.getInt() - : node->parent->right.getInt(); - node->right = PTreeNodePtr(new PTreeNode(node, rightState), currentNodeTag); -} - -void PTree::remove(PTreeNode *n) { - assert(!n->left.getPointer() && !n->right.getPointer()); - do { - PTreeNode *p = n->parent; - if (p) { - if (n == p->left.getPointer()) { - p->left = PTreeNodePtr(nullptr); - } else { - assert(n == p->right.getPointer()); - p->right = PTreeNodePtr(nullptr); - } - } - delete n; - n = p; - } while (n && !n->left.getPointer() && !n->right.getPointer()); - - if (n && CompressProcessTree) { - // We're now at a node that has exactly one child; we've just deleted the - // other one. Eliminate the node and connect its child to the parent - // directly (if it's not the root). - PTreeNodePtr child = n->left.getPointer() ? n->left : n->right; - PTreeNode *parent = n->parent; - - child.getPointer()->parent = parent; - if (!parent) { - // We're at the root. - root = child; - } else { - if (n == parent->left.getPointer()) { - parent->left = child; - } else { - assert(n == parent->right.getPointer()); - parent->right = child; - } - } - - delete n; - } -} - -void PTree::dump(llvm::raw_ostream &os) { - ExprPPrinter *pp = ExprPPrinter::create(os); - pp->setNewline("\\l"); - os << "digraph G {\n"; - os << "\tsize=\"10,7.5\";\n"; - os << "\tratio=fill;\n"; - os << "\trotate=90;\n"; - os << "\tcenter = \"true\";\n"; - os << "\tnode [style=\"filled\",width=.1,height=.1,fontname=\"Terminus\"]\n"; - os << "\tedge [arrowsize=.3]\n"; - std::vector stack; - stack.push_back(root.getPointer()); - while (!stack.empty()) { - const PTreeNode *n = stack.back(); - stack.pop_back(); - os << "\tn" << n << " [shape=diamond"; - if (n->state) - os << ",fillcolor=green"; - os << "];\n"; - if (n->left.getPointer()) { - os << "\tn" << n << " -> n" << n->left.getPointer(); - os << " [label=0b" - << std::bitset(n->left.getInt()).to_string() << "];\n"; - stack.push_back(n->left.getPointer()); - } - if (n->right.getPointer()) { - os << "\tn" << n << " -> n" << n->right.getPointer(); - os << " [label=0b" - << std::bitset(n->right.getInt()).to_string() << "];\n"; - stack.push_back(n->right.getPointer()); - } - } - os << "}\n"; - delete pp; -} - -PTreeNode::PTreeNode(PTreeNode *parent, ExecutionState *state) : parent{parent}, state{state} { - state->ptreeNode = this; - left = PTreeNodePtr(nullptr); - right = PTreeNodePtr(nullptr); -} diff --git a/lib/Core/PTree.h b/lib/Core/PTree.h deleted file mode 100644 index dbee70dda9..0000000000 --- a/lib/Core/PTree.h +++ /dev/null @@ -1,66 +0,0 @@ -//===-- PTree.h -------------------------------------------------*- C++ -*-===// -// -// The KLEE Symbolic Virtual Machine -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#ifndef KLEE_PTREE_H -#define KLEE_PTREE_H - -#include "klee/Core/BranchTypes.h" -#include "klee/Expr/Expr.h" -#include "klee/Support/ErrorHandling.h" -#include "llvm/ADT/PointerIntPair.h" - -namespace klee { - class ExecutionState; - class PTreeNode; - /* PTreeNodePtr is used by the Random Path Searcher object to efficiently - record which PTreeNode belongs to it. PTree is a global structure that - captures all states, whereas a Random Path Searcher might only care about - a subset. The integer part of PTreeNodePtr is a bitmask (a "tag") of which - Random Path Searchers PTreeNode belongs to. */ - constexpr int PtrBitCount = 3; - using PTreeNodePtr = llvm::PointerIntPair; - - class PTreeNode { - public: - PTreeNode *parent = nullptr; - - PTreeNodePtr left; - PTreeNodePtr right; - ExecutionState *state = nullptr; - - PTreeNode(const PTreeNode&) = delete; - PTreeNode(PTreeNode *parent, ExecutionState *state); - ~PTreeNode() = default; - }; - - class PTree { - // Number of registered ID - int registeredIds = 0; - - public: - PTreeNodePtr root; - explicit PTree(ExecutionState *initialState); - ~PTree() = default; - - void attach(PTreeNode *node, ExecutionState *leftState, - ExecutionState *rightState, BranchType reason); - void remove(PTreeNode *node); - void dump(llvm::raw_ostream &os); - std::uint8_t getNextId() { - std::uint8_t id = 1 << registeredIds++; - if (registeredIds > PtrBitCount) { - klee_error("PTree cannot support more than %d RandomPathSearchers", - PtrBitCount); - } - return id; - } - }; -} - -#endif /* KLEE_PTREE_H */ diff --git a/lib/Core/Searcher.cpp b/lib/Core/Searcher.cpp index 047a1e4fd8..e94511eaa4 100644 --- a/lib/Core/Searcher.cpp +++ b/lib/Core/Searcher.cpp @@ -11,9 +11,9 @@ #include "CoreStats.h" #include "ExecutionState.h" +#include "ExecutionTree.h" #include "Executor.h" #include "MergeHandler.h" -#include "PTree.h" #include "StatsTracker.h" #include "klee/ADT/DiscretePDF.h" @@ -25,10 +25,14 @@ #include "klee/Support/ErrorHandling.h" #include "klee/System/Time.h" +#include "klee/Support/CompilerWarning.h" +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS #include "llvm/IR/Constants.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/Module.h" #include "llvm/Support/CommandLine.h" +DISABLE_WARNING_POP #include #include @@ -257,15 +261,17 @@ void WeightedRandomSearcher::printName(llvm::raw_ostream &os) { #define IS_OUR_NODE_VALID(n) \ (((n).getPointer() != nullptr) && (((n).getInt() & idBitMask) != 0)) -RandomPathSearcher::RandomPathSearcher(PTree &processTree, RNG &rng) - : processTree{processTree}, - theRNG{rng}, - idBitMask{processTree.getNextId()} {}; +RandomPathSearcher::RandomPathSearcher(InMemoryExecutionTree *executionTree, RNG &rng) + : executionTree{executionTree}, theRNG{rng}, + idBitMask{static_cast(executionTree ? executionTree->getNextId() : 0)} { + assert(executionTree); +}; ExecutionState &RandomPathSearcher::selectState() { unsigned flips=0, bits=0; - assert(processTree.root.getInt() & idBitMask && "Root should belong to the searcher"); - PTreeNode *n = processTree.root.getPointer(); + assert(executionTree->root.getInt() & idBitMask && + "Root should belong to the searcher"); + ExecutionTreeNode *n = executionTree->root.getPointer(); while (!n->state) { if (!IS_OUR_NODE_VALID(n->left)) { assert(IS_OUR_NODE_VALID(n->right) && "Both left and right nodes invalid"); @@ -293,46 +299,47 @@ void RandomPathSearcher::update(ExecutionState *current, const std::vector &removedStates) { // insert states for (auto es : addedStates) { - PTreeNode *pnode = es->ptreeNode, *parent = pnode->parent; - PTreeNodePtr *childPtr; + ExecutionTreeNode *etnode = es->executionTreeNode, *parent = etnode->parent; + ExecutionTreeNodePtr *childPtr; - childPtr = parent ? ((parent->left.getPointer() == pnode) ? &parent->left - : &parent->right) - : &processTree.root; - while (pnode && !IS_OUR_NODE_VALID(*childPtr)) { + childPtr = parent ? ((parent->left.getPointer() == etnode) ? &parent->left + : &parent->right) + : &executionTree->root; + while (etnode && !IS_OUR_NODE_VALID(*childPtr)) { childPtr->setInt(childPtr->getInt() | idBitMask); - pnode = parent; - if (pnode) - parent = pnode->parent; + etnode = parent; + if (etnode) + parent = etnode->parent; childPtr = parent - ? ((parent->left.getPointer() == pnode) ? &parent->left - : &parent->right) - : &processTree.root; + ? ((parent->left.getPointer() == etnode) ? &parent->left + : &parent->right) + : &executionTree->root; } } // remove states for (auto es : removedStates) { - PTreeNode *pnode = es->ptreeNode, *parent = pnode->parent; + ExecutionTreeNode *etnode = es->executionTreeNode, *parent = etnode->parent; - while (pnode && !IS_OUR_NODE_VALID(pnode->left) && - !IS_OUR_NODE_VALID(pnode->right)) { + while (etnode && !IS_OUR_NODE_VALID(etnode->left) && + !IS_OUR_NODE_VALID(etnode->right)) { auto childPtr = - parent ? ((parent->left.getPointer() == pnode) ? &parent->left - : &parent->right) - : &processTree.root; - assert(IS_OUR_NODE_VALID(*childPtr) && "Removing pTree child not ours"); + parent ? ((parent->left.getPointer() == etnode) ? &parent->left + : &parent->right) + : &executionTree->root; + assert(IS_OUR_NODE_VALID(*childPtr) && + "Removing executionTree child not ours"); childPtr->setInt(childPtr->getInt() & ~idBitMask); - pnode = parent; - if (pnode) - parent = pnode->parent; + etnode = parent; + if (etnode) + parent = etnode->parent; } } } bool RandomPathSearcher::empty() { - return !IS_OUR_NODE_VALID(processTree.root); + return !IS_OUR_NODE_VALID(executionTree->root); } void RandomPathSearcher::printName(llvm::raw_ostream &os) { @@ -408,33 +415,50 @@ void MergingSearcher::printName(llvm::raw_ostream &os) { /// -BatchingSearcher::BatchingSearcher(Searcher *baseSearcher, time::Span timeBudget, unsigned instructionBudget) - : baseSearcher{baseSearcher}, - timeBudget{timeBudget}, - instructionBudget{instructionBudget} {}; +BatchingSearcher::BatchingSearcher(Searcher *baseSearcher, + time::Span timeBudget, + unsigned instructionBudget) + : baseSearcher{baseSearcher}, timeBudgetEnabled{timeBudget}, + timeBudget{timeBudget}, instructionBudgetEnabled{instructionBudget > 0}, + instructionBudget{instructionBudget} {}; + +bool BatchingSearcher::withinTimeBudget() const { + return !timeBudgetEnabled || + (time::getWallTime() - lastStartTime) <= timeBudget; +} + +bool BatchingSearcher::withinInstructionBudget() const { + return !instructionBudgetEnabled || + (stats::instructions - lastStartInstructions) <= instructionBudget; +} ExecutionState &BatchingSearcher::selectState() { - if (!lastState || - (((timeBudget.toSeconds() > 0) && - (time::getWallTime() - lastStartTime) > timeBudget)) || - ((instructionBudget > 0) && - (stats::instructions - lastStartInstructions) > instructionBudget)) { - if (lastState) { - time::Span delta = time::getWallTime() - lastStartTime; - auto t = timeBudget; - t *= 1.1; - if (delta > t) { - klee_message("increased time budget from %f to %f\n", timeBudget.toSeconds(), delta.toSeconds()); - timeBudget = delta; - } + if (lastState && withinTimeBudget() && withinInstructionBudget()) { + // return same state for as long as possible + return *lastState; + } + + // ensure time budget is larger than time between two calls (for same state) + if (lastState && timeBudgetEnabled) { + time::Span delta = time::getWallTime() - lastStartTime; + auto t = timeBudget; + t *= 1.1; + if (delta > t) { + klee_message("increased time budget from %f to %f\n", + timeBudget.toSeconds(), delta.toSeconds()); + timeBudget = delta; } - lastState = &baseSearcher->selectState(); + } + + // pick a new state + lastState = &baseSearcher->selectState(); + if (timeBudgetEnabled) { lastStartTime = time::getWallTime(); + } + if (instructionBudgetEnabled) { lastStartInstructions = stats::instructions; - return *lastState; - } else { - return *lastState; } + return *lastState; } void BatchingSearcher::update(ExecutionState *current, diff --git a/lib/Core/Searcher.h b/lib/Core/Searcher.h index 4eda838d64..36efe67a84 100644 --- a/lib/Core/Searcher.h +++ b/lib/Core/Searcher.h @@ -11,7 +11,7 @@ #define KLEE_SEARCHER_H #include "ExecutionState.h" -#include "PTree.h" +#include "ExecutionTree.h" #include "klee/ADT/RNG.h" #include "klee/System/Time.h" @@ -89,10 +89,11 @@ namespace klee { void printName(llvm::raw_ostream &os) override; }; - /// BFSSearcher implements breadth-first exploration. When KLEE branches multiple - /// times for a single instruction, all new states have the same depth. Keep in - /// mind that the process tree (PTree) is a binary tree and hence the depth of - /// a state in that tree and its branch depth during BFS are different. + /// BFSSearcher implements breadth-first exploration. When KLEE branches + /// multiple times for a single instruction, all new states have the same + /// depth. Keep in mind that the execution tree (ExecutionTree) is a binary + /// tree and hence the depth of a state in that tree and its branch depth + /// during BFS are different. class BFSSearcher final : public Searcher { std::deque states; @@ -156,32 +157,35 @@ namespace klee { void printName(llvm::raw_ostream &os) override; }; - /// RandomPathSearcher performs a random walk of the PTree to select a state. - /// PTree is a global data structure, however, a searcher can sometimes only - /// select from a subset of all states (depending on the update calls). + /// RandomPathSearcher performs a random walk of the ExecutionTree to select a + /// state. ExecutionTree is a global data structure, however, a searcher can + /// sometimes only select from a subset of all states (depending on the update + /// calls). /// - /// To support this, RandomPathSearcher has a subgraph view of PTree, in that it - /// only walks the PTreeNodes that it "owns". Ownership is stored in the - /// getInt method of the PTreeNodePtr class (which hides it in the pointer itself). + /// To support this, RandomPathSearcher has a subgraph view of ExecutionTree, + /// in that it only walks the ExecutionTreeNodes that it "owns". Ownership is + /// stored in the getInt method of the ExecutionTreeNodePtr class (which hides + /// it in the pointer itself). /// - /// The current implementation of PTreeNodePtr supports only 3 instances of the - /// RandomPathSearcher. This is because the current PTreeNodePtr implementation - /// conforms to C++ and only steals the last 3 alignment bits. This restriction - /// could be relaxed slightly by an architecture-specific implementation of - /// PTreeNodePtr that also steals the top bits of the pointer. + /// The current implementation of ExecutionTreeNodePtr supports only 3 + /// instances of the RandomPathSearcher. This is because the current + /// ExecutionTreeNodePtr implementation conforms to C++ and only steals the + /// last 3 alignment bits. This restriction could be relaxed slightly by an + /// architecture-specific implementation of ExecutionTreeNodePtr that also + /// steals the top bits of the pointer. /// /// The ownership bits are maintained in the update method. class RandomPathSearcher final : public Searcher { - PTree &processTree; + InMemoryExecutionTree *executionTree; RNG &theRNG; // Unique bitmask of this searcher const uint8_t idBitMask; public: - /// \param processTree The process tree. + /// \param executionTree The execution tree. /// \param RNG A random number generator. - RandomPathSearcher(PTree &processTree, RNG &rng); + RandomPathSearcher(InMemoryExecutionTree *executionTree, RNG &rng); ~RandomPathSearcher() override = default; ExecutionState &selectState() override; @@ -243,13 +247,18 @@ namespace klee { /// of instructions. class BatchingSearcher final : public Searcher { std::unique_ptr baseSearcher; + bool timeBudgetEnabled; time::Span timeBudget; + bool instructionBudgetEnabled; unsigned instructionBudget; ExecutionState *lastState {nullptr}; time::Point lastStartTime; unsigned lastStartInstructions; + bool withinTimeBudget() const; + bool withinInstructionBudget() const; + public: /// \param baseSearcher The underlying searcher (takes ownership). /// \param timeBudget Time span a state gets selected before choosing a different one. diff --git a/lib/Core/SeedInfo.cpp b/lib/Core/SeedInfo.cpp index 55f4ed48c0..ddc40b26a4 100644 --- a/lib/Core/SeedInfo.cpp +++ b/lib/Core/SeedInfo.cpp @@ -74,27 +74,22 @@ void SeedInfo::patchSeed(const ExecutionState &state, std::set< std::pair > directReads; std::vector< ref > reads; findReads(condition, false, reads); - for (std::vector< ref >::iterator it = reads.begin(), - ie = reads.end(); it != ie; ++it) { - ReadExpr *re = it->get(); + for (auto const &re : reads) { if (ConstantExpr *CE = dyn_cast(re->index)) { directReads.insert(std::make_pair(re->updates.root, (unsigned) CE->getZExtValue(32))); } } - - for (std::set< std::pair >::iterator - it = directReads.begin(), ie = directReads.end(); it != ie; ++it) { - const Array *array = it->first; - unsigned i = it->second; + + for (auto const &[array, i] : directReads) { ref read = ReadExpr::create(UpdateList(array, 0), ConstantExpr::alloc(i, Expr::Int32)); - // If not in bindings then this can't be a violation? - Assignment::bindings_ty::iterator it2 = assignment.bindings.find(array); - if (it2 != assignment.bindings.end()) { + // If not in bindings, then this can't be a violation? + auto a = assignment.bindings.find(array); + if (a != assignment.bindings.end()) { ref isSeed = EqExpr::create(read, - ConstantExpr::alloc(it2->second[i], + ConstantExpr::alloc(a->second[i], Expr::Int8)); bool res; bool success = @@ -107,9 +102,9 @@ void SeedInfo::patchSeed(const ExecutionState &state, solver->getValue(required, read, value, state.queryMetaData); assert(success && "FIXME: Unhandled solver failure"); (void) success; - it2->second[i] = value->getZExtValue(8); + a->second[i] = value->getZExtValue(8); cm.addConstraint(EqExpr::create( - read, ConstantExpr::alloc(it2->second[i], Expr::Int8))); + read, ConstantExpr::alloc(a->second[i], Expr::Int8))); } else { cm.addConstraint(isSeed); } diff --git a/lib/Core/SpecialFunctionHandler.cpp b/lib/Core/SpecialFunctionHandler.cpp index e2ff9cb203..d239bcdca4 100644 --- a/lib/Core/SpecialFunctionHandler.cpp +++ b/lib/Core/SpecialFunctionHandler.cpp @@ -27,12 +27,17 @@ #include "klee/Support/ErrorHandling.h" #include "klee/Support/OptionCategories.h" +#include "klee/Support/CompilerWarning.h" +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS #include "llvm/ADT/Twine.h" #include "llvm/IR/DataLayout.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/Module.h" +DISABLE_WARNING_POP -#include +#include +#include #include using namespace llvm; @@ -50,7 +55,7 @@ cl::opt cl::opt SilentKleeAssume("silent-klee-assume", cl::init(false), cl::desc("Silently terminate paths with an infeasible " - "condition given to klee_assume() rather than " + "condition given to klee_assume rather than " "emitting an error (default=false)"), cl::cat(TerminationCat)); } // namespace @@ -65,11 +70,11 @@ cl::opt // especially things like realloc which have complicated semantics // w.r.t. forking. Among other things this makes delayed query // dispatch easier to implement. -static SpecialFunctionHandler::HandlerInfo handlerInfo[] = { -#define add(name, handler, ret) { name, \ +static constexpr std::array handlerInfo = { +#define add(name, handler, ret) SpecialFunctionHandler::HandlerInfo{ name, \ &SpecialFunctionHandler::handler, \ false, ret, false } -#define addDNR(name, handler) { name, \ +#define addDNR(name, handler) SpecialFunctionHandler::HandlerInfo{ name, \ &SpecialFunctionHandler::handler, \ true, false, false } addDNR("__assert_rtn", handleAssertFail), @@ -78,10 +83,12 @@ static SpecialFunctionHandler::HandlerInfo handlerInfo[] = { addDNR("_assert", handleAssert), addDNR("abort", handleAbort), addDNR("_exit", handleExit), - { "exit", &SpecialFunctionHandler::handleExit, true, false, true }, + addDNR("_Exit", handleExit), + SpecialFunctionHandler::HandlerInfo{ "exit", &SpecialFunctionHandler::handleExit, true, false, true }, addDNR("klee_abort", handleAbort), addDNR("klee_silent_exit", handleSilentExit), addDNR("klee_report_error", handleReportError), + add("aligned_alloc", handleMemalign, true), add("calloc", handleCalloc, true), add("free", handleFree, false), add("klee_assume", handleAssume, false), @@ -139,51 +146,16 @@ static SpecialFunctionHandler::HandlerInfo handlerInfo[] = { // operator new(unsigned long) add("_Znwm", handleNew, true), - // Run clang with -fsanitize=signed-integer-overflow and/or - // -fsanitize=unsigned-integer-overflow - add("__ubsan_handle_add_overflow", handleAddOverflow, false), - add("__ubsan_handle_sub_overflow", handleSubOverflow, false), - add("__ubsan_handle_mul_overflow", handleMulOverflow, false), - add("__ubsan_handle_divrem_overflow", handleDivRemOverflow, false), - #undef addDNR #undef add }; -SpecialFunctionHandler::const_iterator SpecialFunctionHandler::begin() { - return SpecialFunctionHandler::const_iterator(handlerInfo); -} - -SpecialFunctionHandler::const_iterator SpecialFunctionHandler::end() { - // NULL pointer is sentinel - return SpecialFunctionHandler::const_iterator(0); -} - -SpecialFunctionHandler::const_iterator& SpecialFunctionHandler::const_iterator::operator++() { - ++index; - if ( index >= SpecialFunctionHandler::size()) - { - // Out of range, return .end() - base=0; // Sentinel - index=0; - } - - return *this; -} - -int SpecialFunctionHandler::size() { - return sizeof(handlerInfo)/sizeof(handlerInfo[0]); -} - SpecialFunctionHandler::SpecialFunctionHandler(Executor &_executor) : executor(_executor) {} void SpecialFunctionHandler::prepare( std::vector &preservedFunctions) { - unsigned N = size(); - - for (unsigned i=0; imodule->getFunction(hi.name); // No need to create if the function doesn't exist, since it cannot @@ -204,12 +176,9 @@ void SpecialFunctionHandler::prepare( } void SpecialFunctionHandler::bind() { - unsigned N = sizeof(handlerInfo)/sizeof(handlerInfo[0]); - - for (unsigned i=0; imodule->getFunction(hi.name); - + if (f && (!hi.doNotOverride || f->isDeclaration())) handlers[f] = std::make_pair(hi.handler, hi.hasReturnValue); } @@ -293,8 +262,8 @@ void SpecialFunctionHandler::handleAbort(ExecutionState &state, KInstruction *target, std::vector> &arguments) { assert(arguments.size() == 0 && "invalid number of arguments to abort"); - executor.terminateStateOnError(state, "abort failure", - StateTerminationType::Abort); + executor.terminateStateOnProgramError(state, "abort failure", + StateTerminationType::Abort); } void SpecialFunctionHandler::handleExit(ExecutionState &state, @@ -308,14 +277,14 @@ void SpecialFunctionHandler::handleSilentExit( ExecutionState &state, KInstruction *target, std::vector> &arguments) { assert(arguments.size() == 1 && "invalid number of arguments to exit"); - executor.terminateStateEarly(state, "", StateTerminationType::SilentExit); + executor.terminateStateEarlyUser(state, ""); } void SpecialFunctionHandler::handleAssert(ExecutionState &state, KInstruction *target, std::vector> &arguments) { assert(arguments.size() == 3 && "invalid number of arguments to _assert"); - executor.terminateStateOnError( + executor.terminateStateOnProgramError( state, "ASSERTION FAIL: " + readStringAtAddress(state, arguments[0]), StateTerminationType::Assert); } @@ -325,7 +294,7 @@ void SpecialFunctionHandler::handleAssertFail( std::vector> &arguments) { assert(arguments.size() == 4 && "invalid number of arguments to __assert_fail"); - executor.terminateStateOnError( + executor.terminateStateOnProgramError( state, "ASSERTION FAIL: " + readStringAtAddress(state, arguments[0]), StateTerminationType::Assert); } @@ -337,7 +306,7 @@ void SpecialFunctionHandler::handleReportError( "invalid number of arguments to klee_report_error"); // arguments[0,1,2,3] are file, line, message, suffix - executor.terminateStateOnError( + executor.terminateStateOnProgramError( state, readStringAtAddress(state, arguments[2]), StateTerminationType::ReportError, "", readStringAtAddress(state, arguments[3]).c_str()); @@ -513,12 +482,8 @@ void SpecialFunctionHandler::handleAssume(ExecutionState &state, state.constraints, e, res, state.queryMetaData); assert(success && "FIXME: Unhandled solver failure"); if (res) { - if (SilentKleeAssume) { - executor.terminateState(state); - } else { - executor.terminateStateOnUserError( - state, "invalid klee_assume call (provably false)"); - } + executor.terminateStateOnUserError( + state, "invalid klee_assume call (provably false)", !SilentKleeAssume); } else { executor.addConstraint(state, e); } @@ -766,19 +731,17 @@ void SpecialFunctionHandler::handleCheckMemoryAccess(ExecutionState &state, ObjectPair op; if (!state.addressSpace.resolveOne(cast(address), op)) { - executor.terminateStateOnError(state, - "check_memory_access: memory error", - StateTerminationType::Ptr, - executor.getAddressInfo(state, address)); + executor.terminateStateOnProgramError( + state, "check_memory_access: memory error", StateTerminationType::Ptr, + executor.getAddressInfo(state, address)); } else { ref chk = op.first->getBoundsCheckPointer(address, cast(size)->getZExtValue()); if (!chk->isTrue()) { - executor.terminateStateOnError(state, - "check_memory_access: memory error", - StateTerminationType::Ptr, - executor.getAddressInfo(state, address)); + executor.terminateStateOnProgramError( + state, "check_memory_access: memory error", + StateTerminationType::Ptr, executor.getAddressInfo(state, address)); } } } @@ -878,31 +841,3 @@ void SpecialFunctionHandler::handleMarkGlobal(ExecutionState &state, mo->isGlobal = true; } } - -void SpecialFunctionHandler::handleAddOverflow( - ExecutionState &state, KInstruction *target, - std::vector> &arguments) { - executor.terminateStateOnError(state, "overflow on addition", - StateTerminationType::Overflow); -} - -void SpecialFunctionHandler::handleSubOverflow( - ExecutionState &state, KInstruction *target, - std::vector> &arguments) { - executor.terminateStateOnError(state, "overflow on subtraction", - StateTerminationType::Overflow); -} - -void SpecialFunctionHandler::handleMulOverflow( - ExecutionState &state, KInstruction *target, - std::vector> &arguments) { - executor.terminateStateOnError(state, "overflow on multiplication", - StateTerminationType::Overflow); -} - -void SpecialFunctionHandler::handleDivRemOverflow( - ExecutionState &state, KInstruction *target, - std::vector> &arguments) { - executor.terminateStateOnError(state, "overflow on division or remainder", - StateTerminationType::Overflow); -} diff --git a/lib/Core/SpecialFunctionHandler.h b/lib/Core/SpecialFunctionHandler.h index a9f7100d8c..3fdbf8f82a 100644 --- a/lib/Core/SpecialFunctionHandler.h +++ b/lib/Core/SpecialFunctionHandler.h @@ -12,7 +12,6 @@ #include "klee/Config/config.h" -#include #include #include #include @@ -34,7 +33,7 @@ namespace klee { KInstruction *target, std::vector > &arguments); - typedef std::map > handlers_ty; handlers_ty handlers; @@ -48,30 +47,6 @@ namespace klee { bool doNotOverride; /// Intrinsic should not be used if already defined }; - // const_iterator to iterate over stored HandlerInfo - // FIXME: Implement >, >=, <=, < operators - class const_iterator : public std::iterator - { - private: - value_type* base; - int index; - public: - const_iterator(value_type* hi) : base(hi), index(0) {}; - const_iterator& operator++(); // pre-fix - const_iterator operator++(int); // post-fix - const value_type& operator*() { return base[index];} - const value_type* operator->() { return &(base[index]);} - const value_type& operator[](int i) { return base[i];} - bool operator==(const_iterator& rhs) { return (rhs.base + rhs.index) == (this->base + this->index);} - bool operator!=(const_iterator& rhs) { return !(*this == rhs);} - }; - - static const_iterator begin(); - static const_iterator end(); - static int size(); - - - public: SpecialFunctionHandler(Executor &_executor); @@ -144,10 +119,6 @@ namespace klee { HANDLER(handleUnderConstrained); HANDLER(handleWarning); HANDLER(handleWarningOnce); - HANDLER(handleAddOverflow); - HANDLER(handleMulOverflow); - HANDLER(handleSubOverflow); - HANDLER(handleDivRemOverflow); #undef HANDLER }; } // End klee namespace diff --git a/lib/Core/StatsTracker.cpp b/lib/Core/StatsTracker.cpp index 28c52b7fbf..6cb14cf350 100644 --- a/lib/Core/StatsTracker.cpp +++ b/lib/Core/StatsTracker.cpp @@ -12,6 +12,7 @@ #include "ExecutionState.h" #include "klee/Config/Version.h" +#include "klee/Core/TerminationTypes.h" #include "klee/Module/InstructionInfoTable.h" #include "klee/Module/KInstruction.h" #include "klee/Module/KModule.h" @@ -27,11 +28,11 @@ #include "MemoryManager.h" #include "UserSearcher.h" +#include "klee/Support/CompilerWarning.h" +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS #include "llvm/ADT/SmallBitVector.h" #include "llvm/IR/BasicBlock.h" -#if LLVM_VERSION_CODE < LLVM_VERSION(8, 0) -#include "llvm/IR/CallSite.h" -#endif #include "llvm/IR/CFG.h" #include "llvm/IR/Function.h" #include "llvm/IR/InlineAsm.h" @@ -43,6 +44,7 @@ #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" #include "llvm/Support/Process.h" +DISABLE_WARNING_POP #include #include @@ -52,7 +54,7 @@ using namespace llvm; /// -namespace { +namespace klee { cl::OptionCategory StatsCat("Statistics options", "These options control the statistics generated by KLEE."); @@ -114,7 +116,7 @@ cl::opt UseCallPaths("use-call-paths", cl::init(true), "level statistics (default=true)"), cl::cat(StatsCat)); -} // namespace +} // namespace klee /// @@ -139,13 +141,8 @@ static bool instructionIsCoverable(Instruction *i) { } else { Instruction *prev = &*(--it); if (isa(prev) || isa(prev)) { - Function *target = getDirectCallTarget( -#if LLVM_VERSION_CODE >= LLVM_VERSION(8, 0) - cast(*prev), -#else - CallSite(prev), -#endif - /*moduleIsFullyLinked=*/true); + Function *target = getDirectCallTarget(cast(*prev), + /*moduleIsFullyLinked=*/true); if (target && target->doesNotReturn()) return false; } @@ -438,28 +435,41 @@ void StatsTracker::markBranchVisited(ExecutionState *visitedTrue, } void StatsTracker::writeStatsHeader() { + #undef BTYPE + #define BTYPE(Name,I) << "Branches" #Name " INTEGER," + #undef TCLASS + #define TCLASS(Name,I) << "Termination" #Name " INTEGER," std::ostringstream create, insert; create << "CREATE TABLE stats (" - << "Instructions INTEGER," - << "FullBranches INTEGER," - << "PartialBranches INTEGER," - << "NumBranches INTEGER," - << "UserTime REAL," - << "NumStates INTEGER," - << "MallocUsage INTEGER," - << "NumQueries INTEGER," - << "NumQueryConstructs INTEGER," - << "WallTime REAL," - << "CoveredInstructions INTEGER," - << "UncoveredInstructions INTEGER," - << "QueryTime INTEGER," - << "SolverTime INTEGER," - << "CexCacheTime INTEGER," - << "ForkTime INTEGER," - << "ResolveTime INTEGER," - << "QueryCexCacheMisses INTEGER," - << "QueryCexCacheHits INTEGER," - << "ArrayHashTime INTEGER" + << "Instructions INTEGER," + << "FullBranches INTEGER," + << "PartialBranches INTEGER," + << "NumBranches INTEGER," + << "UserTime REAL," + << "NumStates INTEGER," + << "MallocUsage INTEGER," + << "Queries INTEGER," + << "SolverQueries INTEGER," + << "NumQueryConstructs INTEGER," + << "WallTime REAL," + << "CoveredInstructions INTEGER," + << "UncoveredInstructions INTEGER," + << "QueryTime INTEGER," + << "SolverTime INTEGER," + << "CexCacheTime INTEGER," + << "ForkTime INTEGER," + << "ResolveTime INTEGER," + << "QueryCacheMisses INTEGER," + << "QueryCacheHits INTEGER," + << "QueryCexCacheMisses INTEGER," + << "QueryCexCacheHits INTEGER," + << "InhibitedForks INTEGER," + << "ExternalCalls INTEGER," + << "Allocations INTEGER," + << "States INTEGER," + BRANCH_TYPES + TERMINATION_CLASSES + << "ArrayHashTime INTEGER" << ')'; char *zErrMsg = nullptr; if(sqlite3_exec(statsFile, create.str().c_str(), nullptr, nullptr, &zErrMsg)) { @@ -472,48 +482,75 @@ void StatsTracker::writeStatsHeader() { * happen, but if it does this statement will fail with SQLITE_CONSTRAINT error. If this happens you should either * remove the constraints or consider using `IGNORE` mode. */ + #undef BTYPE + #define BTYPE(Name, I) << "Branches" #Name "," + #undef TCLASS + #define TCLASS(Name, I) << "Termination" #Name "," insert << "INSERT OR FAIL INTO stats (" - << "Instructions," - << "FullBranches," - << "PartialBranches," - << "NumBranches," - << "UserTime," - << "NumStates," - << "MallocUsage," - << "NumQueries," - << "NumQueryConstructs," - << "WallTime," - << "CoveredInstructions," - << "UncoveredInstructions," - << "QueryTime," - << "SolverTime," - << "CexCacheTime," - << "ForkTime," - << "ResolveTime," - << "QueryCexCacheMisses," - << "QueryCexCacheHits," - << "ArrayHashTime" - << ") VALUES (" - << "?," - << "?," - << "?," - << "?," - << "?," - << "?," - << "?," - << "?," - << "?," - << "?," - << "?," - << "?," - << "?," - << "?," - << "?," - << "?," - << "?," - << "?," - << "?," - << "? " + << "Instructions," + << "FullBranches," + << "PartialBranches," + << "NumBranches," + << "UserTime," + << "NumStates," + << "MallocUsage," + << "Queries," + << "SolverQueries," + << "NumQueryConstructs," + << "WallTime," + << "CoveredInstructions," + << "UncoveredInstructions," + << "QueryTime," + << "SolverTime," + << "CexCacheTime," + << "ForkTime," + << "ResolveTime," + << "QueryCacheMisses," + << "QueryCacheHits," + << "QueryCexCacheMisses," + << "QueryCexCacheHits," + << "InhibitedForks," + << "ExternalCalls," + << "Allocations," + << "States," + BRANCH_TYPES + TERMINATION_CLASSES + << "ArrayHashTime" + << ')'; + #undef BTYPE + #define BTYPE(Name, I) << "?," + #undef TCLASS + #define TCLASS(Name, I) << "?," + insert << " VALUES (" + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + BRANCH_TYPES + TERMINATION_CLASSES + << "? " << ')'; if(sqlite3_prepare_v2(statsFile, insert.str().c_str(), -1, &insertStmt, nullptr) != SQLITE_OK) { @@ -526,29 +563,43 @@ time::Span StatsTracker::elapsed() { } void StatsTracker::writeStatsLine() { - sqlite3_bind_int64(insertStmt, 1, stats::instructions); - sqlite3_bind_int64(insertStmt, 2, fullBranches); - sqlite3_bind_int64(insertStmt, 3, partialBranches); - sqlite3_bind_int64(insertStmt, 4, numBranches); - sqlite3_bind_int64(insertStmt, 5, time::getUserTime().toMicroseconds()); - sqlite3_bind_int64(insertStmt, 6, executor.states.size()); - sqlite3_bind_int64(insertStmt, 7, util::GetTotalMallocUsage() + executor.memory->getUsedDeterministicSize()); - sqlite3_bind_int64(insertStmt, 8, stats::queries); - sqlite3_bind_int64(insertStmt, 9, stats::queryConstructs); - sqlite3_bind_int64(insertStmt, 10, elapsed().toMicroseconds()); - sqlite3_bind_int64(insertStmt, 11, stats::coveredInstructions); - sqlite3_bind_int64(insertStmt, 12, stats::uncoveredInstructions); - sqlite3_bind_int64(insertStmt, 13, stats::queryTime); - sqlite3_bind_int64(insertStmt, 14, stats::solverTime); - sqlite3_bind_int64(insertStmt, 15, stats::cexCacheTime); - sqlite3_bind_int64(insertStmt, 16, stats::forkTime); - sqlite3_bind_int64(insertStmt, 17, stats::resolveTime); - sqlite3_bind_int64(insertStmt, 18, stats::queryCexCacheMisses); - sqlite3_bind_int64(insertStmt, 19, stats::queryCexCacheHits); + #undef BTYPE + #define BTYPE(Name,I) sqlite3_bind_int64(insertStmt, arg++, stats::branches ## Name); + #undef TCLASS + #define TCLASS(Name,I) sqlite3_bind_int64(insertStmt, arg++, stats::termination ## Name); + int arg = 1; + sqlite3_bind_int64(insertStmt, arg++, stats::instructions); + sqlite3_bind_int64(insertStmt, arg++, fullBranches); + sqlite3_bind_int64(insertStmt, arg++, partialBranches); + sqlite3_bind_int64(insertStmt, arg++, numBranches); + sqlite3_bind_int64(insertStmt, arg++, time::getUserTime().toMicroseconds()); + sqlite3_bind_int64(insertStmt, arg++, executor.states.size()); + sqlite3_bind_int64(insertStmt, arg++, util::GetTotalMallocUsage() + executor.memory->getUsedDeterministicSize()); + sqlite3_bind_int64(insertStmt, arg++, stats::queries); + sqlite3_bind_int64(insertStmt, arg++, stats::solverQueries); + sqlite3_bind_int64(insertStmt, arg++, stats::queryConstructs); + sqlite3_bind_int64(insertStmt, arg++, elapsed().toMicroseconds()); + sqlite3_bind_int64(insertStmt, arg++, stats::coveredInstructions); + sqlite3_bind_int64(insertStmt, arg++, stats::uncoveredInstructions); + sqlite3_bind_int64(insertStmt, arg++, stats::queryTime); + sqlite3_bind_int64(insertStmt, arg++, stats::solverTime); + sqlite3_bind_int64(insertStmt, arg++, stats::cexCacheTime); + sqlite3_bind_int64(insertStmt, arg++, stats::forkTime); + sqlite3_bind_int64(insertStmt, arg++, stats::resolveTime); + sqlite3_bind_int64(insertStmt, arg++, stats::queryCacheMisses); + sqlite3_bind_int64(insertStmt, arg++, stats::queryCacheHits); + sqlite3_bind_int64(insertStmt, arg++, stats::queryCexCacheMisses); + sqlite3_bind_int64(insertStmt, arg++, stats::queryCexCacheHits); + sqlite3_bind_int64(insertStmt, arg++, stats::inhibitedForks); + sqlite3_bind_int64(insertStmt, arg++, stats::externalCalls); + sqlite3_bind_int64(insertStmt, arg++, stats::allocations); + sqlite3_bind_int64(insertStmt, arg++, ExecutionState::getLastID()); + BRANCH_TYPES + TERMINATION_CLASSES #ifdef KLEE_ARRAY_DEBUG - sqlite3_bind_int64(insertStmt, 20, stats::arrayHashTime); + sqlite3_bind_int64(insertStmt, arg++, stats::arrayHashTime); #else - sqlite3_bind_int64(insertStmt, 20, -1LL); + sqlite3_bind_int64(insertStmt, arg++, -1LL); #endif int errCode = sqlite3_step(insertStmt); if(errCode != SQLITE_DONE) klee_error("Error writing stats data: %s", sqlite3_errmsg(statsFile)); @@ -794,19 +845,14 @@ void StatsTracker::computeReachableUncovered() { it != ie; ++it) { Instruction *inst = &*it; if (isa(inst) || isa(inst)) { -#if LLVM_VERSION_CODE >= LLVM_VERSION(8, 0) - const CallBase &cs = cast(*inst); - if (isa(cs.getCalledOperand())) { -#else - const CallSite cs(inst); - if (isa(cs.getCalledValue())) { -#endif + const CallBase &cb = cast(*inst); + if (isa(cb.getCalledOperand())) { // We can never call through here so assume no targets // (which should be correct anyhow). callTargets.insert(std::make_pair(inst, std::vector())); } else if (Function *target = getDirectCallTarget( - cs, /*moduleIsFullyLinked=*/true)) { + cb, /*moduleIsFullyLinked=*/true)) { callTargets[inst].push_back(target); } else { callTargets[inst] = diff --git a/lib/Core/TimingSolver.cpp b/lib/Core/TimingSolver.cpp index fc31e72d8e..812357ce55 100644 --- a/lib/Core/TimingSolver.cpp +++ b/lib/Core/TimingSolver.cpp @@ -15,6 +15,7 @@ #include "klee/Statistics/Statistics.h" #include "klee/Statistics/TimerStatIncrementer.h" #include "klee/Solver/Solver.h" +#include "klee/Solver/SolverStats.h" #include "CoreStats.h" @@ -26,6 +27,7 @@ using namespace llvm; bool TimingSolver::evaluate(const ConstraintSet &constraints, ref expr, Solver::Validity &result, SolverQueryMetaData &metaData) { + ++stats::queries; // Fast path, to avoid timer and OS overhead. if (ConstantExpr *CE = dyn_cast(expr)) { result = CE->isTrue() ? Solver::True : Solver::False; @@ -46,6 +48,7 @@ bool TimingSolver::evaluate(const ConstraintSet &constraints, ref expr, bool TimingSolver::mustBeTrue(const ConstraintSet &constraints, ref expr, bool &result, SolverQueryMetaData &metaData) { + ++stats::queries; // Fast path, to avoid timer and OS overhead. if (ConstantExpr *CE = dyn_cast(expr)) { result = CE->isTrue() ? true : false; @@ -90,6 +93,7 @@ bool TimingSolver::mayBeFalse(const ConstraintSet &constraints, ref expr, bool TimingSolver::getValue(const ConstraintSet &constraints, ref expr, ref &result, SolverQueryMetaData &metaData) { + ++stats::queries; // Fast path, to avoid timer and OS overhead. if (ConstantExpr *CE = dyn_cast(expr)) { result = CE; @@ -112,6 +116,7 @@ bool TimingSolver::getInitialValues( const ConstraintSet &constraints, const std::vector &objects, std::vector> &result, SolverQueryMetaData &metaData) { + ++stats::queries; if (objects.empty()) return true; @@ -128,6 +133,7 @@ bool TimingSolver::getInitialValues( std::pair, ref> TimingSolver::getRange(const ConstraintSet &constraints, ref expr, SolverQueryMetaData &metaData) { + ++stats::queries; TimerStatIncrementer timer(stats::solverTime); auto result = solver->getRange(Query(constraints, expr)); metaData.queryCost += timer.delta(); diff --git a/lib/Core/TimingSolver.h b/lib/Core/TimingSolver.h index 1f179e542e..4042c72415 100644 --- a/lib/Core/TimingSolver.h +++ b/lib/Core/TimingSolver.h @@ -16,6 +16,8 @@ #include "klee/System/Time.h" #include +#include +#include #include namespace klee { @@ -35,12 +37,12 @@ class TimingSolver { /// \param _simplifyExprs - Whether expressions should be /// simplified (via the constraint manager interface) prior to /// querying. - TimingSolver(Solver *_solver, bool _simplifyExprs = true) - : solver(_solver), simplifyExprs(_simplifyExprs) {} + TimingSolver(std::unique_ptr solver, bool simplifyExprs = true) + : solver(std::move(solver)), simplifyExprs(simplifyExprs) {} void setTimeout(time::Span t) { solver->setCoreSolverTimeout(t); } - char *getConstraintLog(const Query &query) { + std::string getConstraintLog(const Query &query) { return solver->getConstraintLog(query); } diff --git a/lib/Core/UserSearcher.cpp b/lib/Core/UserSearcher.cpp index 398c44a98c..7e0fd31f9f 100644 --- a/lib/Core/UserSearcher.cpp +++ b/lib/Core/UserSearcher.cpp @@ -20,7 +20,7 @@ using namespace llvm; using namespace klee; -namespace { +namespace klee { llvm::cl::OptionCategory SearchCat("Search options", "These options control the search heuristic."); @@ -79,12 +79,10 @@ cl::opt BatchTime( cl::init("5s"), cl::cat(SearchCat)); -} // namespace - -void klee::initializeSearchOptions() { +void initializeSearchOptions() { // default values if (CoreSearch.empty()) { - if (UseMerge){ + if (UseMerge) { CoreSearch.push_back(Searcher::NURS_CovNew); klee_warning("--use-merge enabled. Using NURS_CovNew as default searcher."); } else { @@ -94,7 +92,7 @@ void klee::initializeSearchOptions() { } } -bool klee::userSearcherRequiresMD2U() { +bool userSearcherRequiresMD2U() { return (std::find(CoreSearch.begin(), CoreSearch.end(), Searcher::NURS_MD2U) != CoreSearch.end() || std::find(CoreSearch.begin(), CoreSearch.end(), Searcher::NURS_CovNew) != CoreSearch.end() || std::find(CoreSearch.begin(), CoreSearch.end(), Searcher::NURS_ICnt) != CoreSearch.end() || @@ -102,14 +100,20 @@ bool klee::userSearcherRequiresMD2U() { std::find(CoreSearch.begin(), CoreSearch.end(), Searcher::NURS_QC) != CoreSearch.end()); } +bool userSearcherRequiresInMemoryExecutionTree() { + return std::find(CoreSearch.begin(), CoreSearch.end(), Searcher::RandomPath) != CoreSearch.end(); +} + +} // namespace klee -Searcher *getNewSearcher(Searcher::CoreSearchType type, RNG &rng, PTree &processTree) { +Searcher *getNewSearcher(Searcher::CoreSearchType type, RNG &rng, + InMemoryExecutionTree *executionTree) { Searcher *searcher = nullptr; switch (type) { case Searcher::DFS: searcher = new DFSSearcher(); break; case Searcher::BFS: searcher = new BFSSearcher(); break; case Searcher::RandomState: searcher = new RandomSearcher(rng); break; - case Searcher::RandomPath: searcher = new RandomPathSearcher(processTree, rng); break; + case Searcher::RandomPath: searcher = new RandomPathSearcher(executionTree, rng); break; case Searcher::NURS_CovNew: searcher = new WeightedRandomSearcher(WeightedRandomSearcher::CoveringNew, rng); break; case Searcher::NURS_MD2U: searcher = new WeightedRandomSearcher(WeightedRandomSearcher::MinDistToUncovered, rng); break; case Searcher::NURS_Depth: searcher = new WeightedRandomSearcher(WeightedRandomSearcher::Depth, rng); break; @@ -123,15 +127,16 @@ Searcher *getNewSearcher(Searcher::CoreSearchType type, RNG &rng, PTree &process } Searcher *klee::constructUserSearcher(Executor &executor) { - - Searcher *searcher = getNewSearcher(CoreSearch[0], executor.theRNG, *executor.processTree); + auto *etree = + llvm::dyn_cast(executor.executionTree.get()); + Searcher *searcher = getNewSearcher(CoreSearch[0], executor.theRNG, etree); if (CoreSearch.size() > 1) { std::vector s; s.push_back(searcher); for (unsigned i = 1; i < CoreSearch.size(); i++) - s.push_back(getNewSearcher(CoreSearch[i], executor.theRNG, *executor.processTree)); + s.push_back(getNewSearcher(CoreSearch[i], executor.theRNG, etree)); searcher = new InterleavedSearcher(s); } diff --git a/lib/Core/UserSearcher.h b/lib/Core/UserSearcher.h index b0df8239ed..af5824558c 100644 --- a/lib/Core/UserSearcher.h +++ b/lib/Core/UserSearcher.h @@ -16,6 +16,7 @@ namespace klee { // XXX gross, should be on demand? bool userSearcherRequiresMD2U(); + bool userSearcherRequiresInMemoryExecutionTree(); void initializeSearchOptions(); diff --git a/lib/Expr/ArrayExprVisitor.cpp b/lib/Expr/ArrayExprVisitor.cpp index c12689b30c..cf0da7f62f 100644 --- a/lib/Expr/ArrayExprVisitor.cpp +++ b/lib/Expr/ArrayExprVisitor.cpp @@ -58,41 +58,9 @@ ReadExpr *ArrayExprHelper::hasOrderedReads(const ConcatExpr &ce) { ExprVisitor::Action ConstantArrayExprVisitor::visitConcat(const ConcatExpr &ce) { ReadExpr *base = ArrayExprHelper::hasOrderedReads(ce); - if (base) { - // It is an interesting ReadExpr if it contains a concrete array - // that is read at a symbolic index - if (base->updates.root->isConstantArray() && - !isa(base->index)) { - for (const auto *un = base->updates.head.get(); un; un = un->next.get()) { - if (!isa(un->index) || !isa(un->value)) { - incompatible = true; - return Action::skipChildren(); - } - } - IndexCompatibilityExprVisitor compatible; - compatible.visit(base->index); - if (compatible.isCompatible() && - addedIndexes.find(base->index.get()->hash()) == addedIndexes.end()) { - if (arrays.find(base->updates.root) == arrays.end()) { - arrays.insert( - std::make_pair(base->updates.root, std::vector >())); - } else { - // Another possible index to resolve, currently unsupported - incompatible = true; - return Action::skipChildren(); - } - arrays.find(base->updates.root)->second.push_back(base->index); - addedIndexes.insert(base->index.get()->hash()); - } else if (compatible.hasInnerReads()) { - // This Read has an inner Read, we want to optimize the inner one - // to create a cascading effect during assignment evaluation - return Action::doChildren(); - } - return Action::skipChildren(); - } - } - return Action::doChildren(); + return base ? visitRead(*base) : Action::doChildren(); } + ExprVisitor::Action ConstantArrayExprVisitor::visitRead(const ReadExpr &re) { // It is an interesting ReadExpr if it contains a concrete array // that is read at a symbolic index @@ -105,18 +73,16 @@ ExprVisitor::Action ConstantArrayExprVisitor::visitRead(const ReadExpr &re) { } IndexCompatibilityExprVisitor compatible; compatible.visit(re.index); - if (compatible.isCompatible() && - addedIndexes.find(re.index.get()->hash()) == addedIndexes.end()) { - if (arrays.find(re.updates.root) == arrays.end()) { - arrays.insert( - std::make_pair(re.updates.root, std::vector >())); - } else { - // Another possible index to resolve, currently unsupported - incompatible = true; - return Action::skipChildren(); + if (compatible.isCompatible()) { + if (arrays.count(re.updates.root) > 0) { + const auto &indices = arrays[re.updates.root]; + if (!indices.empty() && indices.front() != re.index) { + // Another possible index to resolve, currently unsupported + incompatible = true; + return Action::skipChildren(); + } } - arrays.find(re.updates.root)->second.push_back(re.index); - addedIndexes.insert(re.index.get()->hash()); + arrays[re.updates.root].push_back(re.index); } else if (compatible.hasInnerReads()) { // This Read has an inner Read, we want to optimize the inner one // to create a cascading effect during assignment evaluation diff --git a/lib/Expr/CMakeLists.txt b/lib/Expr/CMakeLists.txt index f469a1dede..f9a5a83bc5 100644 --- a/lib/Expr/CMakeLists.txt +++ b/lib/Expr/CMakeLists.txt @@ -6,7 +6,7 @@ # License. See LICENSE.TXT for details. # #===------------------------------------------------------------------------===# -klee_add_component(kleaverExpr +add_library(kleaverExpr ArrayCache.cpp ArrayExprOptimizer.cpp ArrayExprRewriter.cpp @@ -26,8 +26,7 @@ klee_add_component(kleaverExpr Updates.cpp ) -set(LLVM_COMPONENTS - support -) -klee_get_llvm_libs(LLVM_LIBS ${LLVM_COMPONENTS}) -target_link_libraries(kleaverExpr PUBLIC ${LLVM_LIBS}) +llvm_config(kleaverExpr "${USE_LLVM_SHARED}" support) +target_include_directories(kleaverExpr PRIVATE ${KLEE_INCLUDE_DIRS} ${LLVM_INCLUDE_DIRS}) +target_compile_options(kleaverExpr PRIVATE ${KLEE_COMPONENT_CXX_FLAGS}) +target_compile_definitions(kleaverExpr PRIVATE ${KLEE_COMPONENT_CXX_DEFINES}) diff --git a/lib/Expr/Expr.cpp b/lib/Expr/Expr.cpp index 50020fb193..7feba8ab4a 100644 --- a/lib/Expr/Expr.cpp +++ b/lib/Expr/Expr.cpp @@ -12,10 +12,8 @@ #include "klee/Config/Version.h" #include "klee/Expr/ExprPPrinter.h" #include "klee/Support/OptionCategories.h" -// FIXME: We shouldn't need this once fast constant support moves into -// Core. If we need to do arithmetic, we probably want to use APInt. -#include "klee/Support/IntEvaluation.h" +#include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/Hashing.h" #if LLVM_VERSION_CODE >= LLVM_VERSION(13, 0) #include "llvm/ADT/StringExtras.h" @@ -23,6 +21,7 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/raw_ostream.h" +#include #include using namespace klee; @@ -311,6 +310,9 @@ void Expr::printWidth(llvm::raw_ostream &os, Width width) { case Expr::Int32: os << "Expr::Int32"; break; case Expr::Int64: os << "Expr::Int64"; break; case Expr::Fl80: os << "Expr::Fl80"; break; + case Expr::Int128: os << "Expr::Int128"; break; + case Expr::Int256: os << "Expr::Int256"; break; + case Expr::Int512: os << "Expr::Int512"; break; default: os << ""; } } @@ -336,34 +338,32 @@ void Expr::dump() const { ref ConstantExpr::fromMemory(void *address, Width width) { switch (width) { + default: assert(0 && "invalid width"); case Expr::Bool: return ConstantExpr::create(*(( uint8_t*) address), width); case Expr::Int8: return ConstantExpr::create(*(( uint8_t*) address), width); case Expr::Int16: return ConstantExpr::create(*((uint16_t*) address), width); case Expr::Int32: return ConstantExpr::create(*((uint32_t*) address), width); case Expr::Int64: return ConstantExpr::create(*((uint64_t*) address), width); // FIXME: what about machines without x87 support? - default: - return ConstantExpr::alloc( - llvm::APInt(width, - (width + llvm::APFloatBase::integerPartWidth - 1) / - llvm::APFloatBase::integerPartWidth, - (const uint64_t *)address)); + case Expr::Fl80: { + size_t numWords = (width + llvm::APFloatBase::integerPartWidth - 1) / + llvm::APFloatBase::integerPartWidth; + return ConstantExpr::alloc(llvm::APInt( + width, llvm::ArrayRef((const uint64_t *)address, numWords))); + } + case Expr::Int128: + case Expr::Int256: + case Expr::Int512: { + size_t numWords = width / APInt::APINT_BITS_PER_WORD; + return ConstantExpr::alloc(llvm::APInt( + width, llvm::ArrayRef((const uint64_t *)address, numWords))); + } } } void ConstantExpr::toMemory(void *address) { - switch (getWidth()) { - default: assert(0 && "invalid type"); - case Expr::Bool: *(( uint8_t*) address) = getZExtValue(1); break; - case Expr::Int8: *(( uint8_t*) address) = getZExtValue(8); break; - case Expr::Int16: *((uint16_t*) address) = getZExtValue(16); break; - case Expr::Int32: *((uint32_t*) address) = getZExtValue(32); break; - case Expr::Int64: *((uint64_t*) address) = getZExtValue(64); break; - // FIXME: what about machines without x87 support? - case Expr::Fl80: - *((long double*) address) = *(const long double*) value.getRawData(); - break; - } + auto width = getWidth(); + std::memcpy(address, value.getRawData(), (width + 7) / 8); } void ConstantExpr::toString(std::string &Res, unsigned radix) const { diff --git a/lib/Expr/Parser.cpp b/lib/Expr/Parser.cpp index 7ef56849e7..937abdec31 100644 --- a/lib/Expr/Parser.cpp +++ b/lib/Expr/Parser.cpp @@ -21,6 +21,7 @@ #include "llvm/Support/raw_ostream.h" #include +#include #include #include @@ -999,11 +1000,12 @@ ExprResult ParserImpl::ParseParenExpr(TypeResult FIXME_UNUSED) { if (ExprKind == Expr::Select) { return ParseSelectParenExpr(Name, ResTy); } else { - assert(0 && "Invalid ternary expression kind."); + assert(false && "Invalid ternary expression kind."); + std::abort(); } default: - assert(0 && "Invalid argument kind (number of args)."); - return ExprResult(); + assert(false && "Invalid argument kind (number of args)."); + std::abort(); } } diff --git a/lib/Module/CMakeLists.txt b/lib/Module/CMakeLists.txt index f78575fb3e..71e1d40c09 100644 --- a/lib/Module/CMakeLists.txt +++ b/lib/Module/CMakeLists.txt @@ -16,21 +16,29 @@ set(KLEE_MODULE_COMPONENT_SRCS KModule.cpp LowerSwitch.cpp ModuleUtil.cpp - Optimize.cpp OptNone.cpp PhiCleaner.cpp RaiseAsm.cpp ) -if (USE_WORKAROUND_LLVM_PR39177) - list(APPEND KLEE_MODULE_COMPONENT_SRCS WorkaroundLLVMPR39177.cpp) -endif() +if ("${LLVM_VERSION_MAJOR}" LESS 17) + LIST(APPEND KLEE_MODULE_COMPONENT_SRCS + InstrumentLegacy.cpp + OptimizeLegacy.cpp + ) +else () + LIST(APPEND KLEE_MODULE_COMPONENT_SRCS + Instrument.cpp + Optimize.cpp + ) +endif () -klee_add_component(kleeModule + +add_library(kleeModule ${KLEE_MODULE_COMPONENT_SRCS} ) -set(LLVM_COMPONENTS +llvm_config(kleeModule "${USE_LLVM_SHARED}" bitreader bitwriter codegen @@ -38,10 +46,18 @@ set(LLVM_COMPONENTS irreader linker support -) + scalaropts + instcombine + transformutils + analysis + object + mc + binaryformat + ) -klee_get_llvm_libs(LLVM_LIBS ${LLVM_COMPONENTS}) -target_link_libraries(kleeModule PUBLIC ${LLVM_LIBS}) target_link_libraries(kleeModule PRIVATE kleeSupport ) +target_include_directories(kleeModule PRIVATE ${KLEE_INCLUDE_DIRS} ${LLVM_INCLUDE_DIRS}) +target_compile_options(kleeModule PRIVATE ${KLEE_COMPONENT_CXX_FLAGS}) +target_compile_definitions(kleeModule PRIVATE ${KLEE_COMPONENT_CXX_DEFINES}) diff --git a/lib/Module/Checks.cpp b/lib/Module/Checks.cpp index 1107c2ca95..f2a933e46b 100644 --- a/lib/Module/Checks.cpp +++ b/lib/Module/Checks.cpp @@ -13,6 +13,9 @@ #include "KLEEIRMetaData.h" +#include "klee/Support/CompilerWarning.h" +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS #include "llvm/IR/Constants.h" #include "llvm/IR/DataLayout.h" #include "llvm/IR/DerivedTypes.h" @@ -28,6 +31,7 @@ #include "llvm/Pass.h" #include "llvm/Transforms/Scalar.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h" +DISABLE_WARNING_POP using namespace llvm; using namespace klee; diff --git a/lib/Module/FunctionAlias.cpp b/lib/Module/FunctionAlias.cpp index a98b74fb60..c00bde58c6 100644 --- a/lib/Module/FunctionAlias.cpp +++ b/lib/Module/FunctionAlias.cpp @@ -134,12 +134,16 @@ bool FunctionAliasPass::runOnModule(Module &M) { } const FunctionType *FunctionAliasPass::getFunctionType(const GlobalValue *gv) { +#if LLVM_VERSION_CODE >= LLVM_VERSION(15, 0) + if (auto *ft = dyn_cast(gv->getType())) + return ft; + return dyn_cast(gv->getValueType()); +#else const Type *type = gv->getType(); - while (type->isPointerTy()) { - const PointerType *ptr = cast(type); - type = ptr->getElementType(); - } - return cast(type); + while (type->isPointerTy()) + type = type->getPointerElementType(); + return dyn_cast(type); +#endif } bool FunctionAliasPass::checkType(const GlobalValue *match, diff --git a/lib/Module/InstructionInfoTable.cpp b/lib/Module/InstructionInfoTable.cpp index 3c972edcec..9b00db813e 100644 --- a/lib/Module/InstructionInfoTable.cpp +++ b/lib/Module/InstructionInfoTable.cpp @@ -10,6 +10,9 @@ #include "klee/Module/InstructionInfoTable.h" #include "klee/Config/Version.h" +#include "klee/Support/CompilerWarning.h" +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS #include "llvm/Analysis/ValueTracking.h" #include "llvm/IR/AssemblyAnnotationWriter.h" #include "llvm/IR/DebugInfo.h" @@ -25,6 +28,7 @@ #include "llvm/Support/FormattedStream.h" #include "llvm/Support/Path.h" #include "llvm/Support/raw_ostream.h" +DISABLE_WARNING_POP #include #include diff --git a/lib/Module/InstructionOperandTypeCheckPass.cpp b/lib/Module/InstructionOperandTypeCheckPass.cpp index 5f428471c1..e67f051c15 100644 --- a/lib/Module/InstructionOperandTypeCheckPass.cpp +++ b/lib/Module/InstructionOperandTypeCheckPass.cpp @@ -94,7 +94,7 @@ bool checkInstruction(const Instruction *i) { // scalarizer pass might not remove these. This could be selecting which // vector operand to feed to another instruction. The Executor can handle // this so case so this is not a problem - return checkOperandTypeIsScalarInt(i, 0) & + return checkOperandTypeIsScalarInt(i, 0) && checkOperandsHaveSameType(i, 1, 2); } // Integer arithmetic, logical and shifting @@ -111,12 +111,12 @@ bool checkInstruction(const Instruction *i) { case Instruction::Shl: case Instruction::LShr: case Instruction::AShr: { - return checkOperandTypeIsScalarInt(i, 0) & + return checkOperandTypeIsScalarInt(i, 0) && checkOperandTypeIsScalarInt(i, 1); } // Integer comparison case Instruction::ICmp: { - return checkOperandTypeIsScalarIntOrPointer(i, 0) & + return checkOperandTypeIsScalarIntOrPointer(i, 0) && checkOperandTypeIsScalarIntOrPointer(i, 1); } // Integer Conversion @@ -136,7 +136,7 @@ bool checkInstruction(const Instruction *i) { case Instruction::FMul: case Instruction::FDiv: case Instruction::FRem: { - return checkOperandTypeIsScalarFloat(i, 0) & + return checkOperandTypeIsScalarFloat(i, 0) && checkOperandTypeIsScalarFloat(i, 1); } // Floating point conversion @@ -152,7 +152,7 @@ bool checkInstruction(const Instruction *i) { } // Floating point comparison case Instruction::FCmp: { - return checkOperandTypeIsScalarFloat(i, 0) & + return checkOperandTypeIsScalarFloat(i, 0) && checkOperandTypeIsScalarFloat(i, 1); } default: diff --git a/lib/Module/Instrument.cpp b/lib/Module/Instrument.cpp new file mode 100644 index 0000000000..bbb5df7c10 --- /dev/null +++ b/lib/Module/Instrument.cpp @@ -0,0 +1,19 @@ +//===-- Instrument.cpp ------------------------------------------*- C++ -*-===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "ModuleHelper.h" + +using namespace klee; + +void klee::checkModule(bool DontVerfify, llvm::Module *module) { assert(0); } + +void klee::instrument(bool CheckDivZero, bool CheckOvershift, + llvm::Module *module) { + assert(0); +} \ No newline at end of file diff --git a/lib/Module/InstrumentLegacy.cpp b/lib/Module/InstrumentLegacy.cpp new file mode 100644 index 0000000000..daae80431d --- /dev/null +++ b/lib/Module/InstrumentLegacy.cpp @@ -0,0 +1,125 @@ +//===-- InstrumentLegacy.cpp ------------------------------------*- C++ -*-===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +#include "ModuleHelper.h" + +#include "Passes.h" +#include "klee/Support/CompilerWarning.h" +#include "klee/Support/ErrorHandling.h" + +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS +#include "llvm/Bitcode/BitcodeWriter.h" +#include "llvm/IR/DataLayout.h" +#include "llvm/IR/IRBuilder.h" +#include "llvm/IR/LLVMContext.h" +#include "llvm/IR/LegacyPassManager.h" +#include "llvm/IR/Module.h" +#include "llvm/IR/ValueSymbolTable.h" +#include "llvm/IR/Verifier.h" +#include "llvm/Support/CommandLine.h" +#include "llvm/Transforms/Scalar.h" +#include "llvm/Transforms/Scalar/Scalarizer.h" +#include "llvm/Transforms/Utils.h" +#include "llvm/Transforms/Utils/Cloning.h" +DISABLE_WARNING_POP + +using namespace llvm; +using namespace klee; + +void klee::instrument(bool CheckDivZero, bool CheckOvershift, + llvm::Module *module) { + // Inject checks prior to optimization... we also perform the + // invariant transformations that we will end up doing later so that + // optimize is seeing what is as close as possible to the final + // module. + legacy::PassManager pm; + pm.add(new RaiseAsmPass()); + + // This pass will scalarize as much code as possible so that the Executor + // does not need to handle operands of vector type for most instructions + // other than InsertElementInst and ExtractElementInst. + // + // NOTE: Must come before division/overshift checks because those passes + // don't know how to handle vector instructions. + pm.add(createScalarizerPass()); + + // This pass will replace atomic instructions with non-atomic operations + pm.add(createLowerAtomicPass()); + if (CheckDivZero) + pm.add(new DivCheckPass()); + if (CheckOvershift) + pm.add(new OvershiftCheckPass()); + + llvm::DataLayout targetData(module); + pm.add(new IntrinsicCleanerPass(targetData)); + pm.run(*module); +} + +void klee::checkModule(bool DontVerify, llvm::Module *module) { + InstructionOperandTypeCheckPass *operandTypeCheckPass = + new InstructionOperandTypeCheckPass(); + + legacy::PassManager pm; + if (!DontVerify) + pm.add(createVerifierPass()); + pm.add(operandTypeCheckPass); + pm.run(*module); + + // Enforce the operand type invariants that the Executor expects. This + // implicitly depends on the "Scalarizer" pass to be run in order to succeed + // in the presence of vector instructions. + if (!operandTypeCheckPass->checkPassed()) { + klee_error("Unexpected instruction operand types detected"); + } +} + +void klee::optimiseAndPrepare(bool OptimiseKLEECall, bool Optimize, + SwitchImplType SwitchType, std::string EntryPoint, + llvm::ArrayRef preservedFunctions, + llvm::Module *module) { + // Preserve all functions containing klee-related function calls from being + // optimised around + if (!OptimiseKLEECall) { + legacy::PassManager pm; + pm.add(new OptNonePass()); + pm.run(*module); + } + + if (Optimize) + optimizeModule(module, preservedFunctions); + + // Needs to happen after linking (since ctors/dtors can be modified) + // and optimization (since global optimization can rewrite lists). + injectStaticConstructorsAndDestructors(module, EntryPoint); + + // Finally, run the passes that maintain invariants we expect during + // interpretation. We run the intrinsic cleaner just in case we + // linked in something with intrinsics but any external calls are + // going to be unresolved. We really need to handle the intrinsics + // directly I think? + legacy::PassManager pm3; + pm3.add(createCFGSimplificationPass()); + switch (SwitchType) { + case SwitchImplType::eSwitchTypeInternal: + break; + case SwitchImplType::eSwitchTypeSimple: + pm3.add(new LowerSwitchPass()); + break; + case SwitchImplType::eSwitchTypeLLVM: + pm3.add(createLowerSwitchPass()); + break; + } + + llvm::DataLayout targetData(module); + pm3.add(new IntrinsicCleanerPass(targetData)); + pm3.add(createScalarizerPass()); + pm3.add(new PhiCleanerPass()); + pm3.add(new FunctionAliasPass()); + pm3.run(*module); +} \ No newline at end of file diff --git a/lib/Module/IntrinsicCleaner.cpp b/lib/Module/IntrinsicCleaner.cpp index 7836c2028d..8d50775422 100644 --- a/lib/Module/IntrinsicCleaner.cpp +++ b/lib/Module/IntrinsicCleaner.cpp @@ -11,6 +11,10 @@ #include "klee/Config/Version.h" #include "klee/Support/ErrorHandling.h" + +#include "klee/Support/CompilerWarning.h" +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS #include "llvm/Analysis/MemoryBuiltins.h" #include "llvm/Analysis/ConstantFolding.h" #include "llvm/IR/Constants.h" @@ -21,15 +25,13 @@ #include "llvm/IR/Instruction.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/IntrinsicInst.h" -#if LLVM_VERSION_CODE >= LLVM_VERSION(10, 0) #include "llvm/IR/IntrinsicsX86.h" -#endif #include "llvm/IR/Module.h" #include "llvm/IR/Type.h" #include "llvm/Pass.h" #include "llvm/Transforms/Scalar.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h" - +DISABLE_WARNING_POP using namespace llvm; namespace klee { @@ -66,10 +68,10 @@ bool IntrinsicCleanerPass::runOnBasicBlock(BasicBlock &b, Module &M) { case Intrinsic::vastart: case Intrinsic::vaend: case Intrinsic::fabs: -#if LLVM_VERSION_CODE >= LLVM_VERSION(7, 0) + case Intrinsic::fma: + case Intrinsic::fmuladd: case Intrinsic::fshr: case Intrinsic::fshl: -#endif #if LLVM_VERSION_CODE >= LLVM_VERSION(12, 0) case Intrinsic::abs: case Intrinsic::smax: @@ -96,9 +98,14 @@ bool IntrinsicCleanerPass::runOnBasicBlock(BasicBlock &b, Module &M) { Builder.CreatePointerCast(dst, i8pp, "vacopy.cast.dst"); auto castedSrc = Builder.CreatePointerCast(src, i8pp, "vacopy.cast.src"); +#if LLVM_VERSION_CODE >= LLVM_VERSION(15, 0) + auto load = Builder.CreateLoad(Builder.getInt8PtrTy(), castedSrc, + "vacopy.read"); +#else auto load = Builder.CreateLoad(castedSrc->getType()->getPointerElementType(), castedSrc, "vacopy.read"); +#endif Builder.CreateStore(load, castedDst, false /* isVolatile */); } else { assert(WordSize == 8 && "Invalid word size!"); @@ -106,9 +113,13 @@ bool IntrinsicCleanerPass::runOnBasicBlock(BasicBlock &b, Module &M) { auto pDst = Builder.CreatePointerCast(dst, i64p, "vacopy.cast.dst"); auto pSrc = Builder.CreatePointerCast(src, i64p, "vacopy.cast.src"); +#if LLVM_VERSION_CODE >= LLVM_VERSION(15, 0) + auto pSrcType = Builder.getPtrTy(); + auto pDstType = Builder.getPtrTy(); +#else auto pSrcType = pSrc->getType()->getPointerElementType(); auto pDstType = pDst->getType()->getPointerElementType(); - +#endif auto val = Builder.CreateLoad(pSrcType, pSrc); Builder.CreateStore(val, pDst, ii); @@ -214,7 +225,6 @@ bool IntrinsicCleanerPass::runOnBasicBlock(BasicBlock &b, Module &M) { dirty = true; break; } -#if LLVM_VERSION_CODE >= LLVM_VERSION(8, 0) case Intrinsic::sadd_sat: case Intrinsic::ssub_sat: case Intrinsic::uadd_sat: @@ -282,17 +292,12 @@ bool IntrinsicCleanerPass::runOnBasicBlock(BasicBlock &b, Module &M) { dirty = true; break; } -#endif case Intrinsic::trap: { // Intrinsic instruction "llvm.trap" found. Directly lower it to // a call of the abort() function. auto C = M.getOrInsertFunction("abort", Type::getVoidTy(ctx)); -#if LLVM_VERSION_CODE >= LLVM_VERSION(9, 0) if (auto *F = dyn_cast(C.getCallee())) { -#else - if (auto *F = dyn_cast(C)) { -#endif F->setDoesNotReturn(); F->setDoesNotThrow(); } @@ -324,7 +329,6 @@ bool IntrinsicCleanerPass::runOnBasicBlock(BasicBlock &b, Module &M) { dirty = true; break; } -#if LLVM_VERSION_CODE >= LLVM_VERSION(8, 0) case Intrinsic::is_constant: { if(auto* constant = llvm::ConstantFoldInstruction(ii, ii->getModule()->getDataLayout())) ii->replaceAllUsesWith(constant); @@ -334,7 +338,6 @@ bool IntrinsicCleanerPass::runOnBasicBlock(BasicBlock &b, Module &M) { dirty = true; break; } -#endif // The following intrinsics are currently handled by LowerIntrinsicCall // (Invoking LowerIntrinsicCall with any intrinsics not on this @@ -350,17 +353,22 @@ bool IntrinsicCleanerPass::runOnBasicBlock(BasicBlock &b, Module &M) { case Intrinsic::ctpop: case Intrinsic::cttz: case Intrinsic::dbg_declare: -#if LLVM_VERSION_CODE >= LLVM_VERSION(7, 0) case Intrinsic::dbg_label: -#endif #ifndef SUPPORT_KLEE_EH_CXX case Intrinsic::eh_typeid_for: #endif case Intrinsic::exp2: case Intrinsic::exp: case Intrinsic::expect: +#if LLVM_VERSION_CODE >= LLVM_VERSION(12, 0) + case Intrinsic::experimental_noalias_scope_decl: +#endif case Intrinsic::floor: +#if LLVM_VERSION_CODE < LLVM_VERSION(16, 0) case Intrinsic::flt_rounds: +#else + case Intrinsic::get_rounding: +#endif case Intrinsic::frameaddress: case Intrinsic::get_dynamic_area_offset: case Intrinsic::invariant_end: @@ -381,9 +389,7 @@ bool IntrinsicCleanerPass::runOnBasicBlock(BasicBlock &b, Module &M) { case Intrinsic::readcyclecounter: case Intrinsic::returnaddress: case Intrinsic::round: -#if LLVM_VERSION_CODE >= LLVM_VERSION(11, 0) case Intrinsic::roundeven: -#endif case Intrinsic::sin: case Intrinsic::sqrt: case Intrinsic::stackrestore: diff --git a/lib/Module/KModule.cpp b/lib/Module/KModule.cpp index 06b6e2f925..cb8b4539dc 100644 --- a/lib/Module/KModule.cpp +++ b/lib/Module/KModule.cpp @@ -9,44 +9,28 @@ #define DEBUG_TYPE "KModule" +#include "klee/Module/KModule.h" + +#include "ModuleHelper.h" #include "Passes.h" #include "klee/Config/Version.h" #include "klee/Core/Interpreter.h" -#include "klee/Support/OptionCategories.h" #include "klee/Module/Cell.h" #include "klee/Module/InstructionInfoTable.h" #include "klee/Module/KInstruction.h" -#include "klee/Module/KModule.h" #include "klee/Support/Debug.h" #include "klee/Support/ErrorHandling.h" #include "klee/Support/ModuleUtil.h" +#include "klee/Support/OptionCategories.h" +#include "klee/Support/CompilerWarning.h" + +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS #include "llvm/Bitcode/BitcodeWriter.h" -#if LLVM_VERSION_CODE < LLVM_VERSION(8, 0) -#include "llvm/IR/CallSite.h" -#endif -#include "llvm/IR/DataLayout.h" #include "llvm/IR/IRBuilder.h" -#include "llvm/IR/Instructions.h" -#include "llvm/IR/LegacyPassManager.h" -#include "llvm/IR/LLVMContext.h" -#include "llvm/IR/Module.h" -#include "llvm/IR/ValueSymbolTable.h" -#include "llvm/IR/Verifier.h" -#include "llvm/Linker/Linker.h" -#include "llvm/Support/CommandLine.h" -#include "llvm/Support/Path.h" -#include "llvm/Support/raw_ostream.h" -#include "llvm/Support/raw_os_ostream.h" -#include "llvm/Transforms/Scalar.h" -#if LLVM_VERSION_CODE >= LLVM_VERSION(8, 0) -#include "llvm/Transforms/Scalar/Scalarizer.h" -#endif -#include "llvm/Transforms/Utils/Cloning.h" -#if LLVM_VERSION_CODE >= LLVM_VERSION(7, 0) -#include "llvm/Transforms/Utils.h" -#endif +DISABLE_WARNING_POP #include @@ -60,12 +44,6 @@ cl::OptionCategory } namespace { - enum SwitchImplType { - eSwitchTypeSimple, - eSwitchTypeLLVM, - eSwitchTypeInternal - }; - cl::opt OutputSource("output-source", cl::desc("Write the assembly for the final transformed source (default=true)"), @@ -74,20 +52,10 @@ namespace { cl::opt OutputModule("output-module", - cl::desc("Write the bitcode for the final transformed module"), + cl::desc("Write the bitcode for the final transformed module (default=false)"), cl::init(false), cl::cat(ModuleCat)); - cl::opt - SwitchType("switch-type", cl::desc("Select the implementation of switch (default=internal)"), - cl::values(clEnumValN(eSwitchTypeSimple, "simple", - "lower to ordered branches"), - clEnumValN(eSwitchTypeLLVM, "llvm", - "lower using LLVM"), - clEnumValN(eSwitchTypeInternal, "internal", - "execute switch internally")), - cl::init(eSwitchTypeInternal), - cl::cat(ModuleCat)); cl::opt DebugPrintEscapingFunctions("debug-print-escaping-functions", @@ -105,14 +73,21 @@ namespace { cl::desc("Allow optimization of functions that " "contain KLEE calls (default=true)"), cl::init(true), cl::cat(ModuleCat)); -} +cl::opt SwitchType( + "switch-type", + cl::desc("Select the implementation of switch (default=internal)"), + cl::values(clEnumValN(SwitchImplType::eSwitchTypeSimple, "simple", + "lower to ordered branches"), + clEnumValN(SwitchImplType::eSwitchTypeLLVM, "llvm", + "lower using LLVM"), + clEnumValN(SwitchImplType::eSwitchTypeInternal, "internal", + "execute switch internally")), + cl::init(SwitchImplType::eSwitchTypeInternal), cl::cat(ModuleCat)); + +} // namespace /***/ -namespace llvm { -extern void Optimize(Module *, llvm::ArrayRef preservedFunctions); -} - // what a hack static Function *getStubFunctionForCtorList(Module *m, GlobalVariable *gv, @@ -138,14 +113,8 @@ static Function *getStubFunctionForCtorList(Module *m, for (unsigned i=0; igetNumOperands(); i++) { auto cs = cast(arr->getOperand(i)); // There is a third element in global_ctor elements (``i8 @data``). -#if LLVM_VERSION_CODE >= LLVM_VERSION(9, 0) assert(cs->getNumOperands() == 3 && "unexpected element in ctor initializer list"); -#else - // before LLVM 9.0, the third operand was optional - assert((cs->getNumOperands() == 2 || cs->getNumOperands() == 3) && - "unexpected element in ctor initializer list"); -#endif auto fp = cs->getOperand(1); if (!fp->isNullValue()) { if (auto ce = dyn_cast(fp)) @@ -165,9 +134,8 @@ static Function *getStubFunctionForCtorList(Module *m, return fn; } -static void -injectStaticConstructorsAndDestructors(Module *m, - llvm::StringRef entryFunction) { +void klee::injectStaticConstructorsAndDestructors( + Module *m, llvm::StringRef entryFunction) { GlobalVariable *ctors = m->getNamedGlobal("llvm.global_ctors"); GlobalVariable *dtors = m->getNamedGlobal("llvm.global_dtors"); @@ -225,44 +193,12 @@ bool KModule::link(std::vector> &modules, } void KModule::instrument(const Interpreter::ModuleOptions &opts) { - // Inject checks prior to optimization... we also perform the - // invariant transformations that we will end up doing later so that - // optimize is seeing what is as close as possible to the final - // module. - legacy::PassManager pm; - pm.add(new RaiseAsmPass()); - - // This pass will scalarize as much code as possible so that the Executor - // does not need to handle operands of vector type for most instructions - // other than InsertElementInst and ExtractElementInst. - // - // NOTE: Must come before division/overshift checks because those passes - // don't know how to handle vector instructions. - pm.add(createScalarizerPass()); - - // This pass will replace atomic instructions with non-atomic operations - pm.add(createLowerAtomicPass()); - if (opts.CheckDivZero) pm.add(new DivCheckPass()); - if (opts.CheckOvershift) pm.add(new OvershiftCheckPass()); - - pm.add(new IntrinsicCleanerPass(*targetData)); - pm.run(*module); + klee::instrument(opts.CheckDivZero, opts.CheckOvershift, module.get()); } void KModule::optimiseAndPrepare( const Interpreter::ModuleOptions &opts, llvm::ArrayRef preservedFunctions) { - // Preserve all functions containing klee-related function calls from being - // optimised around - if (!OptimiseKLEECall) { - legacy::PassManager pm; - pm.add(new OptNonePass()); - pm.run(*module); - } - - if (opts.Optimize) - Optimize(module.get(), preservedFunctions); - // Add internal functions which are not used to check if instructions // have been already visited if (opts.CheckDivZero) @@ -270,28 +206,8 @@ void KModule::optimiseAndPrepare( if (opts.CheckOvershift) addInternalFunction("klee_overshift_check"); - // Needs to happen after linking (since ctors/dtors can be modified) - // and optimization (since global optimization can rewrite lists). - injectStaticConstructorsAndDestructors(module.get(), opts.EntryPoint); - - // Finally, run the passes that maintain invariants we expect during - // interpretation. We run the intrinsic cleaner just in case we - // linked in something with intrinsics but any external calls are - // going to be unresolved. We really need to handle the intrinsics - // directly I think? - legacy::PassManager pm3; - pm3.add(createCFGSimplificationPass()); - switch(SwitchType) { - case eSwitchTypeInternal: break; - case eSwitchTypeSimple: pm3.add(new LowerSwitchPass()); break; - case eSwitchTypeLLVM: pm3.add(createLowerSwitchPass()); break; - default: klee_error("invalid --switch-type"); - } - pm3.add(new IntrinsicCleanerPass(*targetData)); - pm3.add(createScalarizerPass()); - pm3.add(new PhiCleanerPass()); - pm3.add(new FunctionAliasPass()); - pm3.run(*module); + klee::optimiseAndPrepare(OptimiseKLEECall, opts.Optimize, SwitchType, + opts.EntryPoint, preservedFunctions, module.get()); } void KModule::manifest(InterpreterHandler *ih, bool forceSourceOutput) { @@ -303,11 +219,7 @@ void KModule::manifest(InterpreterHandler *ih, bool forceSourceOutput) { if (OutputModule) { std::unique_ptr f(ih->openOutputFile("final.bc")); -#if LLVM_VERSION_CODE >= LLVM_VERSION(7, 0) - WriteBitcodeToFile(*module, *f); -#else - WriteBitcodeToFile(module.get(), *f); -#endif + llvm::WriteBitcodeToFile(*module, *f); } /* Build shadow structures */ @@ -320,7 +232,6 @@ void KModule::manifest(InterpreterHandler *ih, bool forceSourceOutput) { for (auto &Function : *module) { if (Function.isDeclaration()) { declarations.push_back(&Function); - continue; } auto kf = std::unique_ptr(new KFunction(&Function, this)); @@ -357,23 +268,7 @@ void KModule::manifest(InterpreterHandler *ih, bool forceSourceOutput) { } } -void KModule::checkModule() { - InstructionOperandTypeCheckPass *operandTypeCheckPass = - new InstructionOperandTypeCheckPass(); - - legacy::PassManager pm; - if (!DontVerify) - pm.add(createVerifierPass()); - pm.add(operandTypeCheckPass); - pm.run(*module); - - // Enforce the operand type invariants that the Executor expects. This - // implicitly depends on the "Scalarizer" pass to be run in order to succeed - // in the presence of vector instructions. - if (!operandTypeCheckPass->checkPassed()) { - klee_error("Unexpected instruction operand types detected"); - } -} +void KModule::checkModule() { klee::checkModule(DontVerify, module.get()); } KConstant* KModule::getKConstant(const Constant *c) { auto it = constantMap.find(c); @@ -423,7 +318,8 @@ static int getOperandNum(Value *v, KFunction::KFunction(llvm::Function *_function, KModule *km) - : function(_function), + : KCallable(CK_Function), + function(_function), numArgs(function->arg_size()), numInstructions(0), trackCoverage(true) { @@ -468,18 +364,13 @@ KFunction::KFunction(llvm::Function *_function, ki->dest = registerMap[inst]; if (isa(it) || isa(it)) { -#if LLVM_VERSION_CODE >= LLVM_VERSION(8, 0) - const CallBase &cs = cast(*inst); - Value *val = cs.getCalledOperand(); -#else - const CallSite cs(inst); - Value *val = cs.getCalledValue(); -#endif - unsigned numArgs = cs.arg_size(); + const CallBase &cb = cast(*inst); + Value *val = cb.getCalledOperand(); + unsigned numArgs = cb.arg_size(); ki->operands = new int[numArgs+1]; ki->operands[0] = getOperandNum(val, registerMap, km, ki); for (unsigned j=0; joperands[j+1] = getOperandNum(v, registerMap, km, ki); } } else { diff --git a/lib/Module/LowerSwitch.cpp b/lib/Module/LowerSwitch.cpp index b23278f702..f84731568e 100644 --- a/lib/Module/LowerSwitch.cpp +++ b/lib/Module/LowerSwitch.cpp @@ -16,8 +16,13 @@ #include "Passes.h" #include "klee/Config/Version.h" +#include "klee/Support/CompilerWarning.h" +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS #include "llvm/IR/IRBuilder.h" #include "llvm/IR/LLVMContext.h" +DISABLE_WARNING_POP + #include using namespace llvm; @@ -65,9 +70,8 @@ void LowerSwitchPass::switchConvert(CaseItr begin, CaseItr end, // iterate through all the cases, creating a new BasicBlock for each for (CaseItr it = begin; it < end; ++it) { - BasicBlock *newBlock = BasicBlock::Create(F->getContext(), "NodeBlock"); - Function::iterator FI = origBlock->getIterator(); - F->getBasicBlockList().insert(++FI, newBlock); + BasicBlock *newBlock = BasicBlock::Create(F->getContext(), "NodeBlock", F); + Builder.SetInsertPoint(newBlock); auto cmpValue = Builder.CreateICmpEQ(value, it->value, "case.cmp"); Builder.CreateCondBr(cmpValue, it->block, curHead); @@ -101,10 +105,10 @@ void LowerSwitchPass::processSwitchInst(SwitchInst *SI) { // Create a new, empty default block so that the new hierarchy of // if-then statements go to this and the PHI nodes are happy. - BasicBlock* newDefault = BasicBlock::Create(F->getContext(), "newDefault"); + BasicBlock *newDefault = + BasicBlock::Create(F->getContext(), "newDefault", F, defaultBlock); llvm::IRBuilder<> Builder(newDefault); - F->getBasicBlockList().insert(defaultBlock->getIterator(), newDefault); Builder.CreateBr(defaultBlock); // If there is an entry in any PHI nodes for the default edge, make sure @@ -127,11 +131,10 @@ void LowerSwitchPass::processSwitchInst(SwitchInst *SI) { // the if comparisons will happen in the same order // as the cases appear in the switch std::reverse(cases.begin(), cases.end()); - - switchConvert(cases.begin(), cases.end(), switchValue, origBlock, newDefault); + switchConvert(cases.begin(), cases.end(), switchValue, origBlock, newDefault); // We are now done with the switch instruction, so delete it - origBlock->getInstList().erase(SI); + SI->eraseFromParent(); } } diff --git a/lib/Module/ModuleHelper.h b/lib/Module/ModuleHelper.h new file mode 100644 index 0000000000..1b279edd14 --- /dev/null +++ b/lib/Module/ModuleHelper.h @@ -0,0 +1,37 @@ +//===-- ModuleHelper.h ------------------------------------------*- C++ -*-===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef KLEE_MODULEHELPER_H +#define KLEE_MODULEHELPER_H + +#include "llvm/ADT/ArrayRef.h" +#include "llvm/IR/Module.h" + +namespace klee { +enum class SwitchImplType { + eSwitchTypeSimple, + eSwitchTypeLLVM, + eSwitchTypeInternal +}; + +void optimiseAndPrepare(bool OptimiseKLEECall, bool Optimize, + SwitchImplType SwitchType, std::string EntryPoint, + llvm::ArrayRef preservedFunctions, + llvm::Module *module); +void checkModule(bool DontVerfify, llvm::Module *module); +void instrument(bool CheckDivZero, bool CheckOvershift, llvm::Module *module); + +void injectStaticConstructorsAndDestructors(llvm::Module *m, + llvm::StringRef entryFunction); + +void optimizeModule(llvm::Module *M, + llvm::ArrayRef preservedFunctions); +} // namespace klee + +#endif // KLEE_MODULEHELPER_H diff --git a/lib/Module/ModuleUtil.cpp b/lib/Module/ModuleUtil.cpp index 87a9c917ec..76e580c522 100644 --- a/lib/Module/ModuleUtil.cpp +++ b/lib/Module/ModuleUtil.cpp @@ -13,6 +13,9 @@ #include "klee/Support/Debug.h" #include "klee/Support/ErrorHandling.h" +#include "klee/Support/CompilerWarning.h" +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS #include "llvm/Analysis/ValueTracking.h" #include "llvm/BinaryFormat/Magic.h" #include "llvm/Bitcode/BitcodeReader.h" @@ -35,7 +38,7 @@ #include "llvm/Support/Path.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Support/SourceMgr.h" - +DISABLE_WARNING_POP #include #include @@ -270,17 +273,9 @@ klee::linkModules(std::vector> &modules, } Function *klee::getDirectCallTarget( -#if LLVM_VERSION_CODE >= LLVM_VERSION(8, 0) - const CallBase &cs, -#else - const CallSite &cs, -#endif + const CallBase &cb, bool moduleIsFullyLinked) { -#if LLVM_VERSION_CODE >= LLVM_VERSION(8, 0) - Value *v = cs.getCalledOperand(); -#else - Value *v = cs.getCalledValue(); -#endif + Value *v = cb.getCalledOperand(); bool viaConstantExpr = false; // Walk through aliases and bitcasts to try to find // the function being called. @@ -318,19 +313,13 @@ Function *klee::getDirectCallTarget( static bool valueIsOnlyCalled(const Value *v) { for (auto user : v->users()) { -#if LLVM_VERSION_CODE >= LLVM_VERSION(8, 0) // Make sure the instruction is a call or invoke. - if (const auto *cs_ptr = dyn_cast(user)) { - const CallBase &cs = *cs_ptr; -#else - if (const auto *instr = dyn_cast(user)) { - // Make sure the instruction is a call or invoke. - const CallSite cs(const_cast(instr)); - if (!cs) return false; -#endif + if (const auto *cb_ptr = dyn_cast(user)) { + const CallBase &cb = *cb_ptr; + // Make sure that the value is only the target of this call and // not an argument. - if (cs.hasArgument(v)) + if (cb.hasArgument(v)) return false; } else if (const auto *ce = dyn_cast(user)) { if (ce->getOpcode() == Instruction::BitCast) diff --git a/lib/Module/Optimize.cpp b/lib/Module/Optimize.cpp index a58d245999..654279f413 100644 --- a/lib/Module/Optimize.cpp +++ b/lib/Module/Optimize.cpp @@ -15,254 +15,14 @@ // //===----------------------------------------------------------------------===// -#include "klee/Config/Version.h" -#include "klee/Support/OptionCategories.h" +#include "ModuleHelper.h" -#ifdef USE_WORKAROUND_LLVM_PR39177 -#include "Passes.h" -#endif - -#include "llvm/Analysis/GlobalsModRef.h" -#include "llvm/Analysis/Passes.h" -#include "llvm/Analysis/LoopPass.h" #include "llvm/IR/Module.h" -#include "llvm/IR/DataLayout.h" -#include "llvm/IR/LegacyPassManager.h" -#include "llvm/IR/Verifier.h" -#include "llvm/Support/CommandLine.h" -#include "llvm/Support/DynamicLibrary.h" -#include "llvm/Support/PluginLoader.h" -#include "llvm/Target/TargetMachine.h" -#include "llvm/Transforms/IPO.h" -#include "llvm/Transforms/IPO/FunctionAttrs.h" -#include "llvm/Transforms/Scalar.h" -#include "llvm/Transforms/Scalar/GVN.h" - -#if LLVM_VERSION_CODE >= LLVM_VERSION(7, 0) -#include "llvm/Transforms/Utils.h" -#include "llvm/Transforms/InstCombine/InstCombine.h" -#endif - -using namespace llvm; - -static cl::opt - DisableInline("disable-inlining", - cl::desc("Do not run the inliner pass (default=false)"), - cl::init(false), cl::cat(klee::ModuleCat)); - -static cl::opt DisableInternalize( - "disable-internalize", - cl::desc("Do not mark all symbols as internal (default=false)"), - cl::init(false), cl::cat(klee::ModuleCat)); - -static cl::opt VerifyEach( - "verify-each", - cl::desc("Verify intermediate results of all optimization passes (default=false)"), - cl::init(false), - cl::cat(klee::ModuleCat)); - -static cl::alias ExportDynamic("export-dynamic", - cl::aliasopt(DisableInternalize), - cl::desc("Alias for -disable-internalize")); - -static cl::opt - Strip("strip-all", cl::desc("Strip all symbol information from executable"), - cl::init(false), cl::cat(klee::ModuleCat)); - -static cl::alias A0("s", cl::desc("Alias for --strip-all"), - cl::aliasopt(Strip)); - -static cl::opt - StripDebug("strip-debug", - cl::desc("Strip debugger symbol info from executable"), - cl::init(false), cl::cat(klee::ModuleCat)); - -static cl::alias A1("S", cl::desc("Alias for --strip-debug"), - cl::aliasopt(StripDebug)); - -// A utility function that adds a pass to the pass manager but will also add -// a verifier pass after if we're supposed to verify. -static inline void addPass(legacy::PassManager &PM, Pass *P) { - // Add the pass to the pass manager... - PM.add(P); - - // If we are verifying all of the intermediate steps, add the verifier... - if (VerifyEach) - PM.add(createVerifierPass()); -} - -namespace llvm { - - -static void AddStandardCompilePasses(legacy::PassManager &PM) { - PM.add(createVerifierPass()); // Verify that input is correct - - // If the -strip-debug command line option was specified, do it. - if (StripDebug) - addPass(PM, createStripSymbolsPass(true)); - - addPass(PM, createCFGSimplificationPass()); // Clean up disgusting code - addPass(PM, createPromoteMemoryToRegisterPass());// Kill useless allocas - addPass(PM, createGlobalOptimizerPass()); // Optimize out global vars - addPass(PM, createGlobalDCEPass()); // Remove unused fns and globs -#if LLVM_VERSION_CODE >= LLVM_VERSION(11, 0) - addPass(PM, createSCCPPass()); // Constant prop with SCCP -#else - addPass(PM, createIPConstantPropagationPass());// IP Constant Propagation -#endif - addPass(PM, createDeadArgEliminationPass()); // Dead argument elimination - addPass(PM, createInstructionCombiningPass()); // Clean up after IPCP & DAE - addPass(PM, createCFGSimplificationPass()); // Clean up after IPCP & DAE - - addPass(PM, createPruneEHPass()); // Remove dead EH info - addPass(PM, createPostOrderFunctionAttrsLegacyPass()); - addPass(PM, createReversePostOrderFunctionAttrsPass()); // Deduce function attrs - - if (!DisableInline) - addPass(PM, createFunctionInliningPass()); // Inline small functions - addPass(PM, createArgumentPromotionPass()); // Scalarize uninlined fn args - - addPass(PM, createInstructionCombiningPass()); // Cleanup for scalarrepl. - addPass(PM, createJumpThreadingPass()); // Thread jumps. - addPass(PM, createCFGSimplificationPass()); // Merge & remove BBs - addPass(PM, createSROAPass()); // Break up aggregate allocas - addPass(PM, createInstructionCombiningPass()); // Combine silly seq's - - addPass(PM, createTailCallEliminationPass()); // Eliminate tail calls - addPass(PM, createCFGSimplificationPass()); // Merge & remove BBs - addPass(PM, createReassociatePass()); // Reassociate expressions - addPass(PM, createLoopRotatePass()); - addPass(PM, createLICMPass()); // Hoist loop invariants - addPass(PM, createLoopUnswitchPass()); // Unswitch loops. - // FIXME : Removing instcombine causes nestedloop regression. - addPass(PM, createInstructionCombiningPass()); - addPass(PM, createIndVarSimplifyPass()); // Canonicalize indvars - addPass(PM, createLoopDeletionPass()); // Delete dead loops - addPass(PM, createLoopUnrollPass()); // Unroll small loops - addPass(PM, createInstructionCombiningPass()); // Clean up after the unroller - addPass(PM, createGVNPass()); // Remove redundancies - addPass(PM, createMemCpyOptPass()); // Remove memcpy / form memset - addPass(PM, createSCCPPass()); // Constant prop with SCCP - - // Run instcombine after redundancy elimination to exploit opportunities - // opened up by them. - addPass(PM, createInstructionCombiningPass()); - - addPass(PM, createDeadStoreEliminationPass()); // Delete dead stores - addPass(PM, createAggressiveDCEPass()); // Delete dead instructions - addPass(PM, createCFGSimplificationPass()); // Merge & remove BBs - addPass(PM, createStripDeadPrototypesPass()); // Get rid of dead prototypes - addPass(PM, createConstantMergePass()); // Merge dup global constants -} -/// Optimize - Perform link time optimizations. This will run the scalar -/// optimizations, any loaded plugin-optimization modules, and then the -/// inter-procedural optimizations if applicable. -void Optimize(Module *M, llvm::ArrayRef preservedFunctions) { - - // Instantiate the pass manager to organize the passes. - legacy::PassManager Passes; - - // If we're verifying, start off with a verification pass. - if (VerifyEach) - Passes.add(createVerifierPass()); - -#ifdef USE_WORKAROUND_LLVM_PR39177 - addPass(Passes, new klee::WorkaroundLLVMPR39177Pass()); -#endif - - // DWD - Run the opt standard pass list as well. - AddStandardCompilePasses(Passes); - - // Now that composite has been compiled, scan through the module, looking - // for a main function. If main is defined, mark all other functions - // internal. - if (!DisableInternalize) { - auto PreserveFunctions = [=](const GlobalValue &GV) { - StringRef GVName = GV.getName(); - - for (const char *fun : preservedFunctions) - if (GVName.equals(fun)) - return true; - - return false; - }; - ModulePass *pass = createInternalizePass(PreserveFunctions); - addPass(Passes, pass); - } - - // Propagate constants at call sites into the functions they call. This - // opens opportunities for globalopt (and inlining) by substituting function - // pointers passed as arguments to direct uses of functions. - addPass(Passes, createIPSCCPPass()); - - // Now that we internalized some globals, see if we can hack on them! - addPass(Passes, createGlobalOptimizerPass()); - - // Linking modules together can lead to duplicated global constants, only - // keep one copy of each constant... - addPass(Passes, createConstantMergePass()); - - // Remove unused arguments from functions... - addPass(Passes, createDeadArgEliminationPass()); - - // Reduce the code after globalopt and ipsccp. Both can open up significant - // simplification opportunities, and both can propagate functions through - // function pointers. When this happens, we often have to resolve varargs - // calls, etc, so let instcombine do this. - addPass(Passes, createInstructionCombiningPass()); - - if (!DisableInline) - addPass(Passes, createFunctionInliningPass()); // Inline small functions - - addPass(Passes, createPruneEHPass()); // Remove dead EH info - addPass(Passes, createGlobalOptimizerPass()); // Optimize globals again. - addPass(Passes, createGlobalDCEPass()); // Remove dead functions - - // If we didn't decide to inline a function, check to see if we can - // transform it to pass arguments by value instead of by reference. - addPass(Passes, createArgumentPromotionPass()); - - // The IPO passes may leave cruft around. Clean up after them. - addPass(Passes, createInstructionCombiningPass()); - addPass(Passes, createJumpThreadingPass()); // Thread jumps. - addPass(Passes, createSROAPass()); // Break up allocas - - // Run a few AA driven optimizations here and now, to cleanup the code. - addPass(Passes, createPostOrderFunctionAttrsLegacyPass()); - addPass(Passes, createReversePostOrderFunctionAttrsPass()); // Add nocapture - addPass(Passes, createGlobalsAAWrapperPass()); // IP alias analysis - - addPass(Passes, createLICMPass()); // Hoist loop invariants - addPass(Passes, createGVNPass()); // Remove redundancies - addPass(Passes, createMemCpyOptPass()); // Remove dead memcpy's - addPass(Passes, createDeadStoreEliminationPass()); // Nuke dead stores - - // Cleanup and simplify the code after the scalar optimizations. - addPass(Passes, createInstructionCombiningPass()); - - addPass(Passes, createJumpThreadingPass()); // Thread jumps. - addPass(Passes, createPromoteMemoryToRegisterPass()); // Cleanup jumpthread. - - // Delete basic blocks, which optimization passes may have killed... - addPass(Passes, createCFGSimplificationPass()); - - // Now that we have optimized the program, discard unreachable functions... - addPass(Passes, createGlobalDCEPass()); - - // If the -s or -S command line options were specified, strip the symbols out - // of the resulting program to make it smaller. -s and -S are GNU ld options - // that we are supporting; they alias -strip-all and -strip-debug. - if (Strip || StripDebug) - addPass(Passes, createStripSymbolsPass(StripDebug && !Strip)); - - // The user's passes may leave cruft around; clean up after them. - addPass(Passes, createInstructionCombiningPass()); - addPass(Passes, createCFGSimplificationPass()); - addPass(Passes, createAggressiveDCEPass()); - addPass(Passes, createGlobalDCEPass()); - - // Run our queue of passes all at once now, efficiently. - Passes.run(*M); -} +using namespace klee; +void klee::optimiseAndPrepare(bool OptimiseKLEECall, bool Optimize, + SwitchImplType SwitchType, std::string EntryPoint, + llvm::ArrayRef preservedFunctions, + llvm::Module *module) { + assert(0); } diff --git a/lib/Module/OptimizeLegacy.cpp b/lib/Module/OptimizeLegacy.cpp new file mode 100644 index 0000000000..ee2b7ba4d7 --- /dev/null +++ b/lib/Module/OptimizeLegacy.cpp @@ -0,0 +1,255 @@ +// FIXME: This file is a bastard child of opt.cpp and llvm-ld's +// Optimize.cpp. This stuff should live in common code. + +//===- Optimize.cpp - Optimize a complete program -------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file implements all optimization of the linked module for llvm-ld. +// +//===----------------------------------------------------------------------===// + +#include "klee/Config/Version.h" +#include "klee/Support/OptionCategories.h" + +#include "klee/Support/CompilerWarning.h" + +#include "ModuleHelper.h" + +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS +#include "llvm/Analysis/GlobalsModRef.h" +#include "llvm/Analysis/LoopPass.h" +#include "llvm/IR/LegacyPassManager.h" +#include "llvm/IR/Module.h" +#include "llvm/IR/Verifier.h" +#include "llvm/Support/CommandLine.h" +#include "llvm/Target/TargetMachine.h" +#include "llvm/Transforms/IPO.h" +#include "llvm/Transforms/IPO/FunctionAttrs.h" +#include "llvm/Transforms/InstCombine/InstCombine.h" +#include "llvm/Transforms/Scalar.h" +#include "llvm/Transforms/Scalar/GVN.h" +#include "llvm/Transforms/Utils.h" +DISABLE_WARNING_POP + +using namespace llvm; +using namespace klee; + +namespace { +static cl::opt + DisableInline("disable-inlining", + cl::desc("Do not run the inliner pass (default=false)"), + cl::init(false), cl::cat(klee::ModuleCat)); + +static cl::opt DisableInternalize( + "disable-internalize", + cl::desc("Do not mark all symbols as internal (default=false)"), + cl::init(false), cl::cat(klee::ModuleCat)); + +static cl::opt VerifyEach("verify-each", + cl::desc("Verify intermediate results of all " + "optimization passes (default=false)"), + cl::init(false), cl::cat(klee::ModuleCat)); + +static cl::opt + Strip("strip-all", cl::desc("Strip all symbol information from executable (default=false)"), + cl::init(false), cl::cat(klee::ModuleCat)); + +static cl::opt + StripDebug("strip-debug", + cl::desc("Strip debugger symbol info from executable (default=false)"), + cl::init(false), cl::cat(klee::ModuleCat)); + +// A utility function that adds a pass to the pass manager but will also add +// a verifier pass after if we're supposed to verify. +static inline void addPass(legacy::PassManager &PM, Pass *P) { + // Add the pass to the pass manager... + PM.add(P); + + // If we are verifying all of the intermediate steps, add the verifier... + if (VerifyEach) + PM.add(createVerifierPass()); +} +} // namespace + +static void AddStandardCompilePasses(legacy::PassManager &PM) { + PM.add(createVerifierPass()); // Verify that input is correct + + // If the -strip-debug command line option was specified, do it. + if (StripDebug) + addPass(PM, createStripSymbolsPass(true)); + + addPass(PM, createCFGSimplificationPass()); // Clean up disgusting code + addPass(PM, createPromoteMemoryToRegisterPass()); // Kill useless allocas + addPass(PM, createGlobalOptimizerPass()); // Optimize out global vars + addPass(PM, createGlobalDCEPass()); // Remove unused fns and globs + addPass(PM, createSCCPPass()); // Constant prop with SCCP + addPass(PM, createDeadArgEliminationPass()); // Dead argument elimination + addPass(PM, createInstructionCombiningPass()); // Clean up after IPCP & DAE + addPass(PM, createCFGSimplificationPass()); // Clean up after IPCP & DAE + +#if LLVM_VERSION_CODE <= LLVM_VERSION(15, 0) + addPass(PM, createPruneEHPass()); // Remove dead EH info +#endif + addPass(PM, createPostOrderFunctionAttrsLegacyPass()); + addPass(PM, + createReversePostOrderFunctionAttrsPass()); // Deduce function attrs + + if (!DisableInline) + addPass(PM, createFunctionInliningPass()); // Inline small functions +#if LLVM_VERSION_CODE <= LLVM_VERSION(14, 0) + addPass(PM, createArgumentPromotionPass()); // Scalarize uninlined fn args +#endif + + addPass(PM, createInstructionCombiningPass()); // Cleanup for scalarrepl. + addPass(PM, createJumpThreadingPass()); // Thread jumps. + addPass(PM, createCFGSimplificationPass()); // Merge & remove BBs + addPass(PM, createSROAPass()); // Break up aggregate allocas + addPass(PM, createInstructionCombiningPass()); // Combine silly seq's + + addPass(PM, createTailCallEliminationPass()); // Eliminate tail calls + addPass(PM, createCFGSimplificationPass()); // Merge & remove BBs + addPass(PM, createReassociatePass()); // Reassociate expressions + addPass(PM, createLoopRotatePass()); + addPass(PM, createLICMPass()); // Hoist loop invariants +#if LLVM_VERSION_CODE <= LLVM_VERSION(14, 0) + addPass(PM, createLoopUnswitchPass()); // Unswitch loops. +#endif + // FIXME : Removing instcombine causes nestedloop regression. + addPass(PM, createInstructionCombiningPass()); + addPass(PM, createIndVarSimplifyPass()); // Canonicalize indvars + addPass(PM, createLoopDeletionPass()); // Delete dead loops + addPass(PM, createLoopUnrollPass()); // Unroll small loops + addPass(PM, createInstructionCombiningPass()); // Clean up after the unroller + addPass(PM, createGVNPass()); // Remove redundancies + addPass(PM, createMemCpyOptPass()); // Remove memcpy / form memset + addPass(PM, createSCCPPass()); // Constant prop with SCCP + + // Run instcombine after redundancy elimination to exploit opportunities + // opened up by them. + addPass(PM, createInstructionCombiningPass()); + + addPass(PM, createDeadStoreEliminationPass()); // Delete dead stores + addPass(PM, createAggressiveDCEPass()); // Delete dead instructions + addPass(PM, createCFGSimplificationPass()); // Merge & remove BBs + addPass(PM, createStripDeadPrototypesPass()); // Get rid of dead prototypes + addPass(PM, createConstantMergePass()); // Merge dup global constants +} + +/// Optimize - Perform link time optimizations. This will run the scalar +/// optimizations, any loaded plugin-optimization modules, and then the +/// inter-procedural optimizations if applicable. +void klee::optimizeModule(llvm::Module *M, + llvm::ArrayRef preservedFunctions) { + + // Instantiate the pass manager to organize the passes. + legacy::PassManager Passes; + + // If we're verifying, start off with a verification pass. + if (VerifyEach) + Passes.add(createVerifierPass()); + + // DWD - Run the opt standard pass list as well. + AddStandardCompilePasses(Passes); + + // Now that composite has been compiled, scan through the module, looking + // for a main function. If main is defined, mark all other functions + // internal. + if (!DisableInternalize) { + auto PreserveFunctions = [=](const llvm::GlobalValue &GV) { + StringRef GVName = GV.getName(); + + for (const char *fun : preservedFunctions) + if (GVName.equals(fun)) + return true; + + return false; + }; + ModulePass *pass = createInternalizePass(PreserveFunctions); + addPass(Passes, pass); + } + + // Propagate constants at call sites into the functions they call. This + // opens opportunities for globalopt (and inlining) by substituting function + // pointers passed as arguments to direct uses of functions. + addPass(Passes, createIPSCCPPass()); + + // Now that we internalized some globals, see if we can hack on them! + addPass(Passes, createGlobalOptimizerPass()); + + // Linking modules together can lead to duplicated global constants, only + // keep one copy of each constant... + addPass(Passes, createConstantMergePass()); + + // Remove unused arguments from functions... + addPass(Passes, createDeadArgEliminationPass()); + + // Reduce the code after globalopt and ipsccp. Both can open up significant + // simplification opportunities, and both can propagate functions through + // function pointers. When this happens, we often have to resolve varargs + // calls, etc, so let instcombine do this. + addPass(Passes, createInstructionCombiningPass()); + + if (!DisableInline) + addPass(Passes, createFunctionInliningPass()); // Inline small functions + +#if LLVM_VERSION_CODE <= LLVM_VERSION(15, 0) + addPass(Passes, createPruneEHPass()); // Remove dead EH info +#endif + addPass(Passes, createGlobalOptimizerPass()); // Optimize globals again. + addPass(Passes, createGlobalDCEPass()); // Remove dead functions + +#if LLVM_VERSION_CODE <= LLVM_VERSION(14, 0) + // If we didn't decide to inline a function, check to see if we can + // transform it to pass arguments by value instead of by reference. + addPass(Passes, createArgumentPromotionPass()); +#endif + + // The IPO passes may leave cruft around. Clean up after them. + addPass(Passes, createInstructionCombiningPass()); + addPass(Passes, createJumpThreadingPass()); // Thread jumps. + addPass(Passes, createSROAPass()); // Break up allocas + + // Run a few AA driven optimizations here and now, to cleanup the code. + addPass(Passes, createPostOrderFunctionAttrsLegacyPass()); + addPass(Passes, createReversePostOrderFunctionAttrsPass()); // Add nocapture + addPass(Passes, createGlobalsAAWrapperPass()); // IP alias analysis + + addPass(Passes, createLICMPass()); // Hoist loop invariants + addPass(Passes, createGVNPass()); // Remove redundancies + addPass(Passes, createMemCpyOptPass()); // Remove dead memcpy's + addPass(Passes, createDeadStoreEliminationPass()); // Nuke dead stores + + // Cleanup and simplify the code after the scalar optimizations. + addPass(Passes, createInstructionCombiningPass()); + + addPass(Passes, createJumpThreadingPass()); // Thread jumps. + addPass(Passes, createPromoteMemoryToRegisterPass()); // Cleanup jumpthread. + + // Delete basic blocks, which optimization passes may have killed... + addPass(Passes, createCFGSimplificationPass()); + + // Now that we have optimized the program, discard unreachable functions... + addPass(Passes, createGlobalDCEPass()); + + // If the -s or -S command line options were specified, strip the symbols out + // of the resulting program to make it smaller. -s and -S are GNU ld options + // that we are supporting; they alias -strip-all and -strip-debug. + if (Strip || StripDebug) + addPass(Passes, createStripSymbolsPass(StripDebug && !Strip)); + + // The user's passes may leave cruft around; clean up after them. + addPass(Passes, createInstructionCombiningPass()); + addPass(Passes, createCFGSimplificationPass()); + addPass(Passes, createAggressiveDCEPass()); + addPass(Passes, createGlobalDCEPass()); + + // Run our queue of passes all at once now, efficiently. + Passes.run(*M); +} diff --git a/lib/Module/Passes.h b/lib/Module/Passes.h index ae1ce6fd8a..c8570b34eb 100644 --- a/lib/Module/Passes.h +++ b/lib/Module/Passes.h @@ -12,12 +12,16 @@ #include "klee/Config/Version.h" +#include "klee/Support/CompilerWarning.h" +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS #include "llvm/ADT/Triple.h" #include "llvm/CodeGen/IntrinsicLowering.h" #include "llvm/IR/Constants.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/Module.h" #include "llvm/Pass.h" +DISABLE_WARNING_POP namespace llvm { class Function; @@ -185,18 +189,6 @@ class FunctionAliasPass : public llvm::ModulePass { }; -#ifdef USE_WORKAROUND_LLVM_PR39177 -/// WorkaroundLLVMPR39177Pass - Workaround for LLVM PR39177 within KLEE repo. -/// For more information on this, please refer to the comments in -/// cmake/workaround_llvm_pr39177.cmake -class WorkaroundLLVMPR39177Pass : public llvm::ModulePass { -public: - static char ID; - WorkaroundLLVMPR39177Pass() : llvm::ModulePass(ID) {} - bool runOnModule(llvm::Module &M) override; -}; -#endif - /// Instruments every function that contains a KLEE function call as nonopt class OptNonePass : public llvm::ModulePass { public: diff --git a/lib/Module/RaiseAsm.cpp b/lib/Module/RaiseAsm.cpp index 248b434460..799218c9dc 100644 --- a/lib/Module/RaiseAsm.cpp +++ b/lib/Module/RaiseAsm.cpp @@ -11,6 +11,9 @@ #include "klee/Config/Version.h" #include "klee/Support/ErrorHandling.h" +#include "klee/Support/CompilerWarning.h" +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS #include "llvm/CodeGen/TargetLowering.h" #include "llvm/CodeGen/TargetSubtargetInfo.h" #include "llvm/IR/Function.h" @@ -19,9 +22,13 @@ #include "llvm/IR/Instructions.h" #include "llvm/IR/LLVMContext.h" #include "llvm/Support/Host.h" +#if LLVM_VERSION_CODE >= LLVM_VERSION(14, 0) +#include "llvm/MC/TargetRegistry.h" +#else #include "llvm/Support/TargetRegistry.h" +#endif #include "llvm/Target/TargetMachine.h" - +DISABLE_WARNING_POP using namespace llvm; using namespace klee; @@ -42,11 +49,7 @@ bool RaiseAsmPass::runOnInstruction(Module &M, Instruction *I) { if (!ci) return false; -#if LLVM_VERSION_CODE >= LLVM_VERSION(8, 0) InlineAsm *ia = dyn_cast(ci->getCalledOperand()); -#else - InlineAsm *ia = dyn_cast(ci->getCalledValue()); -#endif if (!ia) return false; @@ -88,8 +91,14 @@ bool RaiseAsmPass::runOnModule(Module &M) { klee_warning("Warning: unable to select target: %s", Err.c_str()); TLI = 0; } else { +#if LLVM_VERSION_CODE >= LLVM_VERSION(16, 0) + TM = Target->createTargetMachine(TargetTriple, "", "", TargetOptions(), + std::nullopt); +#else TM = Target->createTargetMachine(TargetTriple, "", "", TargetOptions(), None); +#endif + TLI = TM->getSubtargetImpl(*(M.begin()))->getTargetLowering(); triple = llvm::Triple(TargetTriple); diff --git a/lib/Module/WorkaroundLLVMPR39177.cpp b/lib/Module/WorkaroundLLVMPR39177.cpp deleted file mode 100644 index 9245884798..0000000000 --- a/lib/Module/WorkaroundLLVMPR39177.cpp +++ /dev/null @@ -1,92 +0,0 @@ -//===-- WorkaroundLLVMPR39177.cpp -------------------------------*- C++ -*-===// -// -// The KLEE Symbolic Virtual Machine -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -// This pass provides a workaround for LLVM bug PR39177 within the KLEE repo. -// For more information on this, please refer to the comments in -// cmake/workaround_llvm_pr39177.cmake - -#include "Passes.h" -#include "klee/Support/ErrorHandling.h" - -#include "llvm/Transforms/Utils/Cloning.h" - -using namespace llvm; - -namespace klee { - -bool WorkaroundLLVMPR39177Pass::runOnModule(Module &M) { - bool modified = false; - - const char *libfunctions[] = { - "strlen", - "strchr", - "strncmp", - "strcpy", - "strncpy", - "__memcpy_chk", - "memchr", - "memcmp", - "putchar", - "puts", - "fputc", - "fputc_unlocked", - "fputs", - "fputs_unlocked", - "fwrite", - "malloc", - "calloc", - "fwrite_unlocked", - "fgetc_unlocked", - "fgets_unlocked", - "fread_unlocked", - "memset_pattern16", - "fopen" - }; - - for (auto *funcname : libfunctions) { - if (M.getFunction(funcname) != nullptr) - continue; - - GlobalValue *gv = M.getNamedValue(funcname); - auto *alias = dyn_cast_or_null(gv); - if (alias == nullptr) - continue; - - // get aliasee function if exists - while (auto *ga = dyn_cast(alias->getAliasee())) { - assert(ga != alias && "alias pointing to itself"); - alias = ga; - } - Function *f = dyn_cast(alias->getAliasee()); - if (f == nullptr) - continue; - - std::string aliasName = alias->getName().str(); - - // clone function - ValueToValueMapTy VMap; - Function *g = CloneFunction(f, VMap); - - // replace alias with cloned function - alias->replaceAllUsesWith(g); - g->takeName(alias); - alias->eraseFromParent(); - - klee_message( - "WorkaroundLLVMPR39177: replaced alias @%s with clone of function @%s", - aliasName.c_str(), f->getName().str().c_str()); - modified = true; - } - - return modified; -} - -char WorkaroundLLVMPR39177Pass::ID = 0; - -} // namespace klee diff --git a/lib/Solver/AssignmentValidatingSolver.cpp b/lib/Solver/AssignmentValidatingSolver.cpp index 54d6ec8ccb..f3c1a41759 100644 --- a/lib/Solver/AssignmentValidatingSolver.cpp +++ b/lib/Solver/AssignmentValidatingSolver.cpp @@ -12,29 +12,31 @@ #include "klee/Solver/Solver.h" #include "klee/Solver/SolverImpl.h" +#include +#include #include namespace klee { class AssignmentValidatingSolver : public SolverImpl { private: - Solver *solver; + std::unique_ptr solver; void dumpAssignmentQuery(const Query &query, const Assignment &assignment); public: - AssignmentValidatingSolver(Solver *_solver) : solver(_solver) {} - ~AssignmentValidatingSolver() { delete solver; } + AssignmentValidatingSolver(std::unique_ptr solver) + : solver(std::move(solver)) {} - bool computeValidity(const Query &, Solver::Validity &result); - bool computeTruth(const Query &, bool &isValid); - bool computeValue(const Query &, ref &result); + bool computeValidity(const Query &, Solver::Validity &result) override; + bool computeTruth(const Query &, bool &isValid) override; + bool computeValue(const Query &, ref &result) override; bool computeInitialValues(const Query &, const std::vector &objects, - std::vector > &values, - bool &hasSolution); - SolverRunStatus getOperationStatusCode(); - char *getConstraintLog(const Query &); - void setCoreSolverTimeout(time::Span timeout); + std::vector> &values, + bool &hasSolution) override; + SolverRunStatus getOperationStatusCode() override; + std::string getConstraintLog(const Query &) override; + void setCoreSolverTimeout(time::Span timeout) override; }; // TODO: use computeInitialValues for all queries for more stress testing @@ -130,9 +132,8 @@ void AssignmentValidatingSolver::dumpAssignmentQuery( Query augmentedQuery(constraints, query.expr); // Ask the solver for the log for this query. - char *logText = solver->getConstraintLog(augmentedQuery); - llvm::errs() << "Query with assignment as constraints:\n" << logText << "\n"; - free(logText); + llvm::errs() << "Query with assignment as constraints:\n" + << solver->getConstraintLog(augmentedQuery) << "\n"; } SolverImpl::SolverRunStatus @@ -140,7 +141,7 @@ AssignmentValidatingSolver::getOperationStatusCode() { return solver->impl->getOperationStatusCode(); } -char *AssignmentValidatingSolver::getConstraintLog(const Query &query) { +std::string AssignmentValidatingSolver::getConstraintLog(const Query &query) { return solver->impl->getConstraintLog(query); } @@ -148,7 +149,9 @@ void AssignmentValidatingSolver::setCoreSolverTimeout(time::Span timeout) { return solver->impl->setCoreSolverTimeout(timeout); } -Solver *createAssignmentValidatingSolver(Solver *s) { - return new Solver(new AssignmentValidatingSolver(s)); +std::unique_ptr +createAssignmentValidatingSolver(std::unique_ptr s) { + return std::make_unique( + std::make_unique(std::move(s))); } } diff --git a/lib/Solver/CMakeLists.txt b/lib/Solver/CMakeLists.txt index 31c8302a0b..dbebe14588 100644 --- a/lib/Solver/CMakeLists.txt +++ b/lib/Solver/CMakeLists.txt @@ -6,7 +6,7 @@ # License. See LICENSE.TXT for details. # #===------------------------------------------------------------------------===# -klee_add_component(kleaverSolver +add_library(kleaverSolver AssignmentValidatingSolver.cpp CachingSolver.cpp CexCachingSolver.cpp @@ -32,15 +32,14 @@ klee_add_component(kleaverSolver Z3Solver.cpp ) -set(LLVM_COMPONENTS - support -) -klee_get_llvm_libs(LLVM_LIBS ${LLVM_COMPONENTS}) -target_link_libraries(kleaverSolver PUBLIC ${LLVM_LIBS}) - +llvm_config(kleaverSolver "${USE_LLVM_SHARED}" support) target_link_libraries(kleaverSolver PRIVATE kleeBasic kleaverExpr kleeSupport ${KLEE_SOLVER_LIBRARIES}) +target_include_directories(kleaverSolver PRIVATE ${KLEE_INCLUDE_DIRS} ${LLVM_INCLUDE_DIRS} ${KLEE_SOLVER_INCLUDE_DIRS}) +target_compile_options(kleaverSolver PRIVATE ${KLEE_COMPONENT_CXX_FLAGS}) +target_compile_definitions(kleaverSolver PRIVATE ${KLEE_COMPONENT_CXX_DEFINES}) + diff --git a/lib/Solver/CachingSolver.cpp b/lib/Solver/CachingSolver.cpp index 4a4c8e280f..1f13f03b45 100644 --- a/lib/Solver/CachingSolver.cpp +++ b/lib/Solver/CachingSolver.cpp @@ -16,7 +16,9 @@ #include "klee/Solver/SolverImpl.h" #include "klee/Solver/SolverStats.h" +#include #include +#include using namespace klee; @@ -62,30 +64,29 @@ class CachingSolver : public SolverImpl { CacheEntryHash> cache_map; - Solver *solver; + std::unique_ptr solver; cache_map cache; public: - CachingSolver(Solver *s) : solver(s) {} - ~CachingSolver() { cache.clear(); delete solver; } + CachingSolver(std::unique_ptr solver) : solver(std::move(solver)) {} - bool computeValidity(const Query&, Solver::Validity &result); - bool computeTruth(const Query&, bool &isValid); - bool computeValue(const Query& query, ref &result) { + bool computeValidity(const Query &, Solver::Validity &result) override; + bool computeTruth(const Query &, bool &isValid) override; + bool computeValue(const Query &query, ref &result) override { ++stats::queryCacheMisses; return solver->impl->computeValue(query, result); } - bool computeInitialValues(const Query& query, - const std::vector &objects, - std::vector< std::vector > &values, - bool &hasSolution) { + bool computeInitialValues(const Query &query, + const std::vector &objects, + std::vector> &values, + bool &hasSolution) override { ++stats::queryCacheMisses; - return solver->impl->computeInitialValues(query, objects, values, + return solver->impl->computeInitialValues(query, objects, values, hasSolution); } - SolverRunStatus getOperationStatusCode(); - char *getConstraintLog(const Query&); - void setCoreSolverTimeout(time::Span timeout); + SolverRunStatus getOperationStatusCode() override; + std::string getConstraintLog(const Query &) override; + void setCoreSolverTimeout(time::Span timeout) override; }; /** @returns the canonical version of the given query. The reference @@ -245,7 +246,7 @@ SolverImpl::SolverRunStatus CachingSolver::getOperationStatusCode() { return solver->impl->getOperationStatusCode(); } -char *CachingSolver::getConstraintLog(const Query& query) { +std::string CachingSolver::getConstraintLog(const Query& query) { return solver->impl->getConstraintLog(query); } @@ -255,6 +256,8 @@ void CachingSolver::setCoreSolverTimeout(time::Span timeout) { /// -Solver *klee::createCachingSolver(Solver *_solver) { - return new Solver(new CachingSolver(_solver)); +std::unique_ptr +klee::createCachingSolver(std::unique_ptr solver) { + return std::make_unique( + std::make_unique(std::move(solver))); } diff --git a/lib/Solver/CexCachingSolver.cpp b/lib/Solver/CexCachingSolver.cpp index 45ec554016..30f9356213 100644 --- a/lib/Solver/CexCachingSolver.cpp +++ b/lib/Solver/CexCachingSolver.cpp @@ -23,6 +23,9 @@ #include "llvm/Support/CommandLine.h" +#include +#include + using namespace klee; using namespace llvm; @@ -45,11 +48,6 @@ cl::opt "before asking the SMT solver (default=false)"), cl::cat(SolvingCat)); -cl::opt CexCacheExperimental( - "cex-cache-exp", cl::init(false), - cl::desc("Optimization for validity queries (default=false)"), - cl::cat(SolvingCat)); - } // namespace /// @@ -66,7 +64,7 @@ struct AssignmentLessThan { class CexCachingSolver : public SolverImpl { typedef std::set assignmentsTable_ty; - Solver *solver; + std::unique_ptr solver; MapOfSets, Assignment*> cache; // memo table @@ -85,19 +83,20 @@ class CexCachingSolver : public SolverImpl { bool getAssignment(const Query& query, Assignment *&result); public: - CexCachingSolver(Solver *_solver) : solver(_solver) {} + CexCachingSolver(std::unique_ptr solver) + : solver(std::move(solver)) {} ~CexCachingSolver(); - - bool computeTruth(const Query&, bool &isValid); - bool computeValidity(const Query&, Solver::Validity &result); - bool computeValue(const Query&, ref &result); - bool computeInitialValues(const Query&, - const std::vector &objects, - std::vector< std::vector > &values, - bool &hasSolution); - SolverRunStatus getOperationStatusCode(); - char *getConstraintLog(const Query& query); - void setCoreSolverTimeout(time::Span timeout); + + bool computeTruth(const Query &, bool &isValid) override; + bool computeValidity(const Query &, Solver::Validity &result) override; + bool computeValue(const Query &, ref &result) override; + bool computeInitialValues(const Query &, + const std::vector &objects, + std::vector> &values, + bool &hasSolution) override; + SolverRunStatus getOperationStatusCode() override; + std::string getConstraintLog(const Query &query) override; + void setCoreSolverTimeout(time::Span timeout) override; }; /// @@ -265,7 +264,6 @@ bool CexCachingSolver::getAssignment(const Query& query, Assignment *&result) { CexCachingSolver::~CexCachingSolver() { cache.clear(); - delete solver; for (assignmentsTable_ty::iterator it = assignmentsTable.begin(), ie = assignmentsTable.end(); it != ie; ++it) delete *it; @@ -299,20 +297,6 @@ bool CexCachingSolver::computeTruth(const Query& query, bool &isValid) { TimerStatIncrementer t(stats::cexCacheTime); - // There is a small amount of redundancy here. We only need to know - // truth and do not really need to compute an assignment. This means - // that we could check the cache to see if we already know that - // state ^ query has no assignment. In that case, by the validity of - // state, we know that state ^ !query must have an assignment, and - // so query cannot be true (valid). This does get hits, but doesn't - // really seem to be worth the overhead. - - if (CexCacheExperimental) { - Assignment *a; - if (lookupAssignment(query.negateExpr(), a) && !a) - return false; - } - Assignment *a; if (!getAssignment(query, a)) return false; @@ -373,7 +357,7 @@ SolverImpl::SolverRunStatus CexCachingSolver::getOperationStatusCode() { return solver->impl->getOperationStatusCode(); } -char *CexCachingSolver::getConstraintLog(const Query& query) { +std::string CexCachingSolver::getConstraintLog(const Query& query) { return solver->impl->getConstraintLog(query); } @@ -383,6 +367,8 @@ void CexCachingSolver::setCoreSolverTimeout(time::Span timeout) { /// -Solver *klee::createCexCachingSolver(Solver *_solver) { - return new Solver(new CexCachingSolver(_solver)); +std::unique_ptr +klee::createCexCachingSolver(std::unique_ptr solver) { + return std::make_unique( + std::make_unique(std::move(solver))); } diff --git a/lib/Solver/ConstantDivision.cpp b/lib/Solver/ConstantDivision.cpp index d822de1ad5..57b83e1728 100644 --- a/lib/Solver/ConstantDivision.cpp +++ b/lib/Solver/ConstantDivision.cpp @@ -86,7 +86,7 @@ void ComputeMultConstants64(uint64_t multiplicand, while (x) { // Determine rightmost contiguous region of 1s. - unsigned low = bits64::indexOfRightmostBit(x); + unsigned low = countTrailingZeroes(x); uint64_t lowbit = 1LL << low; uint64_t p = x + lowbit; uint64_t q = bits64::isolateRightmostBit(p); diff --git a/lib/Solver/ConstructSolverChain.cpp b/lib/Solver/ConstructSolverChain.cpp index 3dab0361c5..9109fe1d2e 100644 --- a/lib/Solver/ConstructSolverChain.cpp +++ b/lib/Solver/ConstructSolverChain.cpp @@ -18,62 +18,72 @@ #include "llvm/Support/raw_ostream.h" +#include +#include namespace klee { -Solver *constructSolverChain(Solver *coreSolver, - std::string querySMT2LogPath, - std::string baseSolverQuerySMT2LogPath, - std::string queryKQueryLogPath, - std::string baseSolverQueryKQueryLogPath) { - Solver *solver = coreSolver; +std::unique_ptr constructSolverChain( + std::unique_ptr coreSolver, std::string querySMT2LogPath, + std::string baseSolverQuerySMT2LogPath, std::string queryKQueryLogPath, + std::string baseSolverQueryKQueryLogPath) { + Solver *rawCoreSolver = coreSolver.get(); + std::unique_ptr solver = std::move(coreSolver); const time::Span minQueryTimeToLog(MinQueryTimeToLog); if (QueryLoggingOptions.isSet(SOLVER_KQUERY)) { - solver = createKQueryLoggingSolver(solver, baseSolverQueryKQueryLogPath, minQueryTimeToLog, LogTimedOutQueries); + solver = createKQueryLoggingSolver(std::move(solver), + baseSolverQueryKQueryLogPath, + minQueryTimeToLog, LogTimedOutQueries); klee_message("Logging queries that reach solver in .kquery format to %s\n", baseSolverQueryKQueryLogPath.c_str()); } if (QueryLoggingOptions.isSet(SOLVER_SMTLIB)) { - solver = createSMTLIBLoggingSolver(solver, baseSolverQuerySMT2LogPath, minQueryTimeToLog, LogTimedOutQueries); + solver = + createSMTLIBLoggingSolver(std::move(solver), baseSolverQuerySMT2LogPath, + minQueryTimeToLog, LogTimedOutQueries); klee_message("Logging queries that reach solver in .smt2 format to %s\n", baseSolverQuerySMT2LogPath.c_str()); } if (UseAssignmentValidatingSolver) - solver = createAssignmentValidatingSolver(solver); + solver = createAssignmentValidatingSolver(std::move(solver)); if (UseFastCexSolver) - solver = createFastCexSolver(solver); + solver = createFastCexSolver(std::move(solver)); if (UseCexCache) - solver = createCexCachingSolver(solver); + solver = createCexCachingSolver(std::move(solver)); if (UseBranchCache) - solver = createCachingSolver(solver); + solver = createCachingSolver(std::move(solver)); if (UseIndependentSolver) - solver = createIndependentSolver(solver); + solver = createIndependentSolver(std::move(solver)); if (DebugValidateSolver) - solver = createValidatingSolver(solver, coreSolver); + solver = createValidatingSolver(std::move(solver), rawCoreSolver, false); if (QueryLoggingOptions.isSet(ALL_KQUERY)) { - solver = createKQueryLoggingSolver(solver, queryKQueryLogPath, minQueryTimeToLog, LogTimedOutQueries); + solver = createKQueryLoggingSolver(std::move(solver), queryKQueryLogPath, + minQueryTimeToLog, LogTimedOutQueries); klee_message("Logging all queries in .kquery format to %s\n", queryKQueryLogPath.c_str()); } if (QueryLoggingOptions.isSet(ALL_SMTLIB)) { - solver = createSMTLIBLoggingSolver(solver, querySMT2LogPath, minQueryTimeToLog, LogTimedOutQueries); + solver = createSMTLIBLoggingSolver(std::move(solver), querySMT2LogPath, + minQueryTimeToLog, LogTimedOutQueries); klee_message("Logging all queries in .smt2 format to %s\n", querySMT2LogPath.c_str()); } if (DebugCrossCheckCoreSolverWith != NO_SOLVER) { - Solver *oracleSolver = createCoreSolver(DebugCrossCheckCoreSolverWith); - solver = createValidatingSolver(/*s=*/solver, /*oracle=*/oracleSolver); + std::unique_ptr oracleSolver = + createCoreSolver(DebugCrossCheckCoreSolverWith); + solver = + createValidatingSolver(std::move(solver), oracleSolver.release(), true); } return solver; } -} +} // namespace klee diff --git a/lib/Solver/CoreSolver.cpp b/lib/Solver/CoreSolver.cpp index fbf29747c7..abbccf5bd2 100644 --- a/lib/Solver/CoreSolver.cpp +++ b/lib/Solver/CoreSolver.cpp @@ -19,15 +19,16 @@ #include "llvm/Support/raw_ostream.h" #include +#include namespace klee { -Solver *createCoreSolver(CoreSolverType cst) { +std::unique_ptr createCoreSolver(CoreSolverType cst) { switch (cst) { case STP_SOLVER: #ifdef ENABLE_STP klee_message("Using STP solver backend"); - return new STPSolver(UseForkedCoreSolver, CoreSolverOptimizeDivides); + return std::make_unique(UseForkedCoreSolver, CoreSolverOptimizeDivides); #else klee_message("Not compiled with STP support"); return NULL; @@ -45,7 +46,7 @@ Solver *createCoreSolver(CoreSolverType cst) { case Z3_SOLVER: #ifdef ENABLE_Z3 klee_message("Using Z3 solver backend"); - return new Z3Solver(); + return std::make_unique(); #else klee_message("Not compiled with Z3 support"); return NULL; diff --git a/lib/Solver/DummySolver.cpp b/lib/Solver/DummySolver.cpp index 60a4fb5141..1cf88d64c1 100644 --- a/lib/Solver/DummySolver.cpp +++ b/lib/Solver/DummySolver.cpp @@ -11,6 +11,8 @@ #include "klee/Solver/SolverImpl.h" #include "klee/Solver/SolverStats.h" +#include + namespace klee { class DummySolverImpl : public SolverImpl { @@ -30,19 +32,19 @@ class DummySolverImpl : public SolverImpl { DummySolverImpl::DummySolverImpl() {} bool DummySolverImpl::computeValidity(const Query &, Solver::Validity &result) { - ++stats::queries; + ++stats::solverQueries; // FIXME: We should have stats::queriesFail; return false; } bool DummySolverImpl::computeTruth(const Query &, bool &isValid) { - ++stats::queries; + ++stats::solverQueries; // FIXME: We should have stats::queriesFail; return false; } bool DummySolverImpl::computeValue(const Query &, ref &result) { - ++stats::queries; + ++stats::solverQueries; ++stats::queryCounterexamples; return false; } @@ -50,7 +52,7 @@ bool DummySolverImpl::computeValue(const Query &, ref &result) { bool DummySolverImpl::computeInitialValues( const Query &, const std::vector &objects, std::vector > &values, bool &hasSolution) { - ++stats::queries; + ++stats::solverQueries; ++stats::queryCounterexamples; return false; } @@ -59,5 +61,7 @@ SolverImpl::SolverRunStatus DummySolverImpl::getOperationStatusCode() { return SOLVER_RUN_STATUS_FAILURE; } -Solver *createDummySolver() { return new Solver(new DummySolverImpl()); } +std::unique_ptr createDummySolver() { + return std::make_unique(std::make_unique()); +} } diff --git a/lib/Solver/FastCexSolver.cpp b/lib/Solver/FastCexSolver.cpp index a45a8f17e4..81fd6707ac 100644 --- a/lib/Solver/FastCexSolver.cpp +++ b/lib/Solver/FastCexSolver.cpp @@ -17,13 +17,14 @@ #include "klee/Expr/ExprVisitor.h" #include "klee/Solver/IncompleteSolver.h" #include "klee/Support/Debug.h" -#include "klee/Support/IntEvaluation.h" // FIXME: Use APInt +#include "llvm/ADT/APInt.h" #include "llvm/Support/raw_ostream.h" #include #include #include +#include #include using namespace klee; @@ -260,6 +261,7 @@ class ValueRange { } std::int64_t minSigned(unsigned bits) const { + assert(bits >= 2 && bits <= 64); assert((m_min >> bits) == 0 && (m_max >> bits) == 0 && "range is outside given number of bits"); @@ -269,13 +271,14 @@ class ValueRange { std::uint64_t smallest = (static_cast(1) << (bits - 1)); if (m_max >= smallest) { - return ints::sext(smallest, 64, bits); + return llvm::APInt::getSignedMinValue(bits).getSExtValue(); } else { return m_min; } } std::int64_t maxSigned(unsigned bits) const { + assert(bits >= 2 && bits <= 64); assert((m_min >> bits) == 0 && (m_max >> bits) == 0 && "range is outside given number of bits"); @@ -288,7 +291,7 @@ class ValueRange { if (m_min < smallest && m_max >= smallest) { return smallest - 1; } else { - return ints::sext(m_max, 64, bits); + return llvm::APInt(bits, m_max, true).getSExtValue(); } } }; @@ -440,17 +443,16 @@ class CexData { return *Entry; } - void propogatePossibleValue(ref e, uint64_t value) { - propogatePossibleValues(e, CexValueData(value,value)); + void propagatePossibleValue(ref e, uint64_t value) { + propagatePossibleValues(e, CexValueData(value, value)); } - void propogateExactValue(ref e, uint64_t value) { - propogateExactValues(e, CexValueData(value,value)); + void propagateExactValue(ref e, uint64_t value) { + propagateExactValues(e, CexValueData(value, value)); } - void propogatePossibleValues(ref e, CexValueData range) { - KLEE_DEBUG(llvm::errs() << "propogate: " << range << " for\n" - << e << "\n"); + void propagatePossibleValues(ref e, CexValueData range) { + KLEE_DEBUG(llvm::errs() << "propagate: " << range << " for\n" << e << "\n"); switch (e->getKind()) { case Expr::Constant: @@ -496,9 +498,9 @@ class CexData { ValueRange cond = evalRangeForExpr(se->cond); if (cond.isFixed()) { if (cond.min()) { - propogatePossibleValues(se->trueExpr, range); + propagatePossibleValues(se->trueExpr, range); } else { - propogatePossibleValues(se->falseExpr, range); + propagatePossibleValues(se->falseExpr, range); } } else { // XXX imprecise... we have a choice here. One method is to @@ -523,8 +525,8 @@ class CexData { // one of the ranges happens to already be a subset of the // required range then it may be preferable to force the // condition to that side. - propogatePossibleValues(se->trueExpr, range); - propogatePossibleValues(se->falseExpr, range); + propagatePossibleValues(se->trueExpr, range); + propagatePossibleValues(se->falseExpr, range); } break; } @@ -542,9 +544,9 @@ class CexData { ConcatExpr *ce = cast(e); Expr::Width LSBWidth = ce->getKid(1)->getWidth(); Expr::Width MSBWidth = ce->getKid(1)->getWidth(); - propogatePossibleValues(ce->getKid(0), + propagatePossibleValues(ce->getKid(0), range.extract(LSBWidth, LSBWidth + MSBWidth)); - propogatePossibleValues(ce->getKid(1), range.extract(0, LSBWidth)); + propagatePossibleValues(ce->getKid(1), range.extract(0, LSBWidth)); break; } @@ -565,7 +567,7 @@ class CexData { unsigned inBits = ce->src->getWidth(); ValueRange input = range.set_intersection(ValueRange(0, bits64::maxValueOfNBits(inBits))); - propogatePossibleValues(ce->src, input); + propagatePossibleValues(ce->src, input); break; } // For SExt instead of doing the intersection we just take the output @@ -580,7 +582,7 @@ class CexData { (bits64::maxValueOfNBits(outBits) - bits64::maxValueOfNBits(inBits-1)-1))); ValueRange input = output.binaryAnd(bits64::maxValueOfNBits(inBits)); - propogatePossibleValues(ce->src, input); + propagatePossibleValues(ce->src, input); break; } @@ -591,7 +593,7 @@ class CexData { if (ConstantExpr *CE = dyn_cast(be->left)) { // FIXME: Don't depend on width. if (CE->getWidth() <= 64) { - // FIXME: Why do we ever propogate empty ranges? It doesn't make + // FIXME: Why do we ever propagate empty ranges? It doesn't make // sense. if (range.isEmpty()) break; @@ -601,7 +603,7 @@ class CexData { CexValueData nrange(ConstantExpr::alloc(range.min(), W)->Sub(CE)->getZExtValue(), ConstantExpr::alloc(range.max(), W)->Sub(CE)->getZExtValue()); if (!nrange.isEmpty()) - propogatePossibleValues(be->right, nrange); + propagatePossibleValues(be->right, nrange); } } break; @@ -620,16 +622,18 @@ class CexData { } else { // XXX heuristic, which order - propogatePossibleValue(be->left, 0); + propagatePossibleValue(be->left, 0); left = evalRangeForExpr(be->left); // see if that worked if (!left.mustEqual(1)) - propogatePossibleValue(be->right, 0); + propagatePossibleValue(be->right, 0); } } else { - if (!left.mustEqual(1)) propogatePossibleValue(be->left, 1); - if (!right.mustEqual(1)) propogatePossibleValue(be->right, 1); + if (!left.mustEqual(1)) + propagatePossibleValue(be->left, 1); + if (!right.mustEqual(1)) + propagatePossibleValue(be->right, 1); } } } else { @@ -652,16 +656,18 @@ class CexData { // XXX heuristic, which order? // force left to value we need - propogatePossibleValue(be->left, 1); + propagatePossibleValue(be->left, 1); left = evalRangeForExpr(be->left); // see if that worked if (!left.mustEqual(1)) - propogatePossibleValue(be->right, 1); + propagatePossibleValue(be->right, 1); } } else { - if (!left.mustEqual(0)) propogatePossibleValue(be->left, 0); - if (!right.mustEqual(0)) propogatePossibleValue(be->right, 0); + if (!left.mustEqual(0)) + propagatePossibleValue(be->left, 0); + if (!right.mustEqual(0)) + propagatePossibleValue(be->right, 0); } } } else { @@ -682,7 +688,7 @@ class CexData { if (CE->getWidth() <= 64) { uint64_t value = CE->getZExtValue(); if (range.min()) { - propogatePossibleValue(be->right, value); + propagatePossibleValue(be->right, value); } else { CexValueData range; if (value==0) { @@ -693,7 +699,7 @@ class CexData { // range? range = CexValueData(0, value - 1); } - propogatePossibleValues(be->right, range); + propagatePossibleValues(be->right, range); } } else { // XXX what now @@ -705,7 +711,7 @@ class CexData { case Expr::Not: { if (e->getWidth() == Expr::Bool && range.isFixed()) { - propogatePossibleValue(e->getKid(0), !range.min()); + propagatePossibleValue(e->getKid(0), !range.min()); } break; } @@ -725,17 +731,17 @@ class CexData { if (left.isFixed()) { if (range.min()) { - propogatePossibleValues(be->right, CexValueData(left.min()+1, - maxValue)); + propagatePossibleValues(be->right, + CexValueData(left.min() + 1, maxValue)); } else { - propogatePossibleValues(be->right, CexValueData(0, left.min())); + propagatePossibleValues(be->right, CexValueData(0, left.min())); } } else if (right.isFixed()) { if (range.min()) { - propogatePossibleValues(be->left, CexValueData(0, right.min()-1)); + propagatePossibleValues(be->left, CexValueData(0, right.min() - 1)); } else { - propogatePossibleValues(be->left, CexValueData(right.min(), - maxValue)); + propagatePossibleValues(be->left, + CexValueData(right.min(), maxValue)); } } else { // XXX ??? @@ -757,17 +763,17 @@ class CexData { uint64_t maxValue = bits64::maxValueOfNBits(be->right->getWidth()); if (left.isFixed()) { if (range.min()) { - propogatePossibleValues(be->right, CexValueData(left.min(), - maxValue)); + propagatePossibleValues(be->right, + CexValueData(left.min(), maxValue)); } else { - propogatePossibleValues(be->right, CexValueData(0, left.min()-1)); + propagatePossibleValues(be->right, CexValueData(0, left.min() - 1)); } } else if (right.isFixed()) { if (range.min()) { - propogatePossibleValues(be->left, CexValueData(0, right.min())); + propagatePossibleValues(be->left, CexValueData(0, right.min())); } else { - propogatePossibleValues(be->left, CexValueData(right.min()+1, - maxValue)); + propagatePossibleValues(be->left, + CexValueData(right.min() + 1, maxValue)); } } else { // XXX ??? @@ -788,7 +794,7 @@ class CexData { } } - void propogateExactValues(ref e, CexValueData range) { + void propagateExactValues(ref e, CexValueData range) { switch (e->getKind()) { case Expr::Constant: { // FIXME: Assert that range contains this constant. @@ -808,13 +814,13 @@ class CexData { for (const auto *un = re->updates.head.get(); un; un = un->next.get()) { CexValueData ui = evalRangeForExpr(un->index); - // If these indices can't alias, continue propogation + // If these indices can't alias, continue propagation if (!ui.mayEqual(index)) continue; - // Otherwise if we know they alias, propogate into the write value. + // Otherwise if we know they alias, propagate into the write value. if (ui.mustEqual(index) || re->index == un->index) - propogateExactValues(un->value, range); + propagateExactValues(un->value, range); return; } @@ -822,8 +828,7 @@ class CexData { if (index.isFixed()) { if (array->isConstantArray()) { // Verify the range. - propogateExactValues(array->constantValues[index.min()], - range); + propagateExactValues(array->constantValues[index.min()], range); } else { CexValueData cvd = cod.getExactValues(index.min()); if (range.min() > cvd.min()) { @@ -886,13 +891,13 @@ class CexData { if (CE->getWidth() <= 64) { uint64_t value = CE->getZExtValue(); if (range.min()) { - // If the equality is true, then propogate the value. - propogateExactValue(be->right, value); + // If the equality is true, then propagate the value. + propagateExactValue(be->right, value); } else { // If the equality is false and the comparison is of booleans, - // then we can infer the value to propogate. + // then we can infer the value to propagate. if (be->right->getWidth() == Expr::Bool) - propogateExactValue(be->right, !value); + propagateExactValue(be->right, !value); } } } @@ -903,7 +908,7 @@ class CexData { // If a boolean not, and the result is known, propagate it case Expr::Not: { if (e->getWidth() == Expr::Bool && range.isFixed()) { - propogateExactValue(e->getKid(0), !range.min()); + propagateExactValue(e->getKid(0), !range.min()); } break; } @@ -944,7 +949,7 @@ class CexData { } void dump() { - llvm::errs() << "-- propogated values --\n"; + llvm::errs() << "-- propagated values --\n"; for (std::map::iterator it = objects.begin(), ie = objects.end(); @@ -991,29 +996,29 @@ FastCexSolver::FastCexSolver() { } FastCexSolver::~FastCexSolver() { } -/// propogateValues - Propogate value ranges for the given query and return the -/// propogation results. +/// propagateValues - propagate value ranges for the given query and return the +/// propagation results. /// -/// \param query - The query to propogate values for. +/// \param query - The query to propagate values for. /// -/// \param cd - The initial object values resulting from the propogation. +/// \param cd - The initial object values resulting from the propagation. /// /// \param checkExpr - Include the query expression in the constraints to -/// propogate. +/// propagate. /// -/// \param isValid - If the propogation succeeds (returns true), whether the +/// \param isValid - If the propagation succeeds (returns true), whether the /// constraints were proven valid or invalid. /// -/// \return - True if the propogation was able to prove validity or invalidity. -static bool propogateValues(const Query& query, CexData &cd, - bool checkExpr, bool &isValid) { +/// \return - True if the propagation was able to prove validity or invalidity. +static bool propagateValues(const Query &query, CexData &cd, bool checkExpr, + bool &isValid) { for (const auto &constraint : query.constraints) { - cd.propogatePossibleValue(constraint, 1); - cd.propogateExactValue(constraint, 1); + cd.propagatePossibleValue(constraint, 1); + cd.propagateExactValue(constraint, 1); } if (checkExpr) { - cd.propogatePossibleValue(query.expr, 0); - cd.propogateExactValue(query.expr, 0); + cd.propagatePossibleValue(query.expr, 0); + cd.propagateExactValue(query.expr, 0); } KLEE_DEBUG(cd.dump()); @@ -1056,7 +1061,7 @@ FastCexSolver::computeTruth(const Query& query) { CexData cd; bool isValid; - bool success = propogateValues(query, cd, true, isValid); + bool success = propagateValues(query, cd, true, isValid); if (!success) return IncompleteSolver::None; @@ -1068,17 +1073,17 @@ bool FastCexSolver::computeValue(const Query& query, ref &result) { CexData cd; bool isValid; - bool success = propogateValues(query, cd, false, isValid); + bool success = propagateValues(query, cd, false, isValid); - // Check if propogation wasn't able to determine anything. + // Check if propagation wasn't able to determine anything. if (!success) return false; // FIXME: We don't have a way to communicate valid constraints back. if (isValid) return false; - - // Propogation found a satisfying assignment, evaluate the expression. + + // propagation found a satisfying assignment, evaluate the expression. ref value = cd.evaluatePossible(query.expr); if (isa(value)) { @@ -1100,9 +1105,9 @@ FastCexSolver::computeInitialValues(const Query& query, CexData cd; bool isValid; - bool success = propogateValues(query, cd, true, isValid); + bool success = propagateValues(query, cd, true, isValid); - // Check if propogation wasn't able to determine anything. + // Check if propagation wasn't able to determine anything. if (!success) return false; @@ -1110,7 +1115,7 @@ FastCexSolver::computeInitialValues(const Query& query, if (!hasSolution) return true; - // Propogation found a satisfying assignment, compute the initial values. + // propagation found a satisfying assignment, compute the initial values. for (unsigned i = 0; i != objects.size(); ++i) { const Array *array = objects[i]; assert(array); @@ -1137,7 +1142,7 @@ FastCexSolver::computeInitialValues(const Query& query, return true; } - -Solver *klee::createFastCexSolver(Solver *s) { - return new Solver(new StagedSolverImpl(new FastCexSolver(), s)); +std::unique_ptr klee::createFastCexSolver(std::unique_ptr s) { + return std::make_unique(std::make_unique( + std::make_unique(), std::move(s))); } diff --git a/lib/Solver/IncompleteSolver.cpp b/lib/Solver/IncompleteSolver.cpp index 9b57bc6caf..f8899cde38 100644 --- a/lib/Solver/IncompleteSolver.cpp +++ b/lib/Solver/IncompleteSolver.cpp @@ -11,6 +11,8 @@ #include "klee/Expr/Constraints.h" +#include + using namespace klee; using namespace llvm; @@ -58,16 +60,9 @@ IncompleteSolver::computeValidity(const Query& query) { /***/ -StagedSolverImpl::StagedSolverImpl(IncompleteSolver *_primary, - Solver *_secondary) - : primary(_primary), - secondary(_secondary) { -} - -StagedSolverImpl::~StagedSolverImpl() { - delete primary; - delete secondary; -} +StagedSolverImpl::StagedSolverImpl(std::unique_ptr primary, + std::unique_ptr secondary) + : primary(std::move(primary)), secondary(std::move(secondary)) {} bool StagedSolverImpl::computeTruth(const Query& query, bool &isValid) { IncompleteSolver::PartialValidity trueResult = primary->computeTruth(query); @@ -139,7 +134,7 @@ SolverImpl::SolverRunStatus StagedSolverImpl::getOperationStatusCode() { return secondary->impl->getOperationStatusCode(); } -char *StagedSolverImpl::getConstraintLog(const Query& query) { +std::string StagedSolverImpl::getConstraintLog(const Query& query) { return secondary->impl->getConstraintLog(query); } diff --git a/lib/Solver/IndependentSolver.cpp b/lib/Solver/IndependentSolver.cpp index ed36816c3a..9bafd855c3 100644 --- a/lib/Solver/IndependentSolver.cpp +++ b/lib/Solver/IndependentSolver.cpp @@ -21,7 +21,9 @@ #include #include +#include #include +#include #include using namespace klee; @@ -388,23 +390,22 @@ void calculateArrayReferences(const IndependentElementSet & ie, class IndependentSolver : public SolverImpl { private: - Solver *solver; + std::unique_ptr solver; public: - IndependentSolver(Solver *_solver) - : solver(_solver) {} - ~IndependentSolver() { delete solver; } - - bool computeTruth(const Query&, bool &isValid); - bool computeValidity(const Query&, Solver::Validity &result); - bool computeValue(const Query&, ref &result); - bool computeInitialValues(const Query& query, - const std::vector &objects, - std::vector< std::vector > &values, - bool &hasSolution); - SolverRunStatus getOperationStatusCode(); - char *getConstraintLog(const Query&); - void setCoreSolverTimeout(time::Span timeout); + IndependentSolver(std::unique_ptr solver) + : solver(std::move(solver)) {} + + bool computeTruth(const Query &, bool &isValid) override; + bool computeValidity(const Query &, Solver::Validity &result) override; + bool computeValue(const Query &, ref &result) override; + bool computeInitialValues(const Query &query, + const std::vector &objects, + std::vector> &values, + bool &hasSolution) override; + SolverRunStatus getOperationStatusCode() override; + std::string getConstraintLog(const Query &) override; + void setCoreSolverTimeout(time::Span timeout) override; }; bool IndependentSolver::computeValidity(const Query& query, @@ -442,7 +443,7 @@ bool assertCreatedPointEvaluatesToTrue( std::vector> &values, std::map> &retMap) { // _allowFreeValues is set to true so that if there are missing bytes in the - // assigment we will end up with a non ConstantExpr after evaluating the + // assignment we will end up with a non ConstantExpr after evaluating the // assignment and fail Assignment assign = Assignment(objects, values, /*_allowFreeValues=*/true); @@ -549,7 +550,7 @@ SolverImpl::SolverRunStatus IndependentSolver::getOperationStatusCode() { return solver->impl->getOperationStatusCode(); } -char *IndependentSolver::getConstraintLog(const Query& query) { +std::string IndependentSolver::getConstraintLog(const Query& query) { return solver->impl->getConstraintLog(query); } @@ -557,6 +558,8 @@ void IndependentSolver::setCoreSolverTimeout(time::Span timeout) { solver->impl->setCoreSolverTimeout(timeout); } -Solver *klee::createIndependentSolver(Solver *s) { - return new Solver(new IndependentSolver(s)); +std::unique_ptr +klee::createIndependentSolver(std::unique_ptr s) { + return std::make_unique( + std::make_unique(std::move(s))); } diff --git a/lib/Solver/KQueryLoggingSolver.cpp b/lib/Solver/KQueryLoggingSolver.cpp index fccdd61539..4be24e9c18 100644 --- a/lib/Solver/KQueryLoggingSolver.cpp +++ b/lib/Solver/KQueryLoggingSolver.cpp @@ -13,6 +13,8 @@ #include "klee/Expr/ExprPPrinter.h" #include "klee/System/Time.h" +#include + using namespace klee; class KQueryLoggingSolver : public QueryLoggingSolver { @@ -48,10 +50,11 @@ private : } public: - KQueryLoggingSolver(Solver *_solver, std::string path, time::Span queryTimeToLog, bool logTimedOut) - : QueryLoggingSolver(_solver, path, "#", queryTimeToLog, logTimedOut), - printer(ExprPPrinter::create(logBuffer)) { - } + KQueryLoggingSolver(std::unique_ptr solver, std::string path, + time::Span queryTimeToLog, bool logTimedOut) + : QueryLoggingSolver(std::move(solver), std::move(path), "#", + queryTimeToLog, logTimedOut), + printer(ExprPPrinter::create(logBuffer)) {} virtual ~KQueryLoggingSolver() { delete printer; @@ -60,8 +63,10 @@ private : /// -Solver *klee::createKQueryLoggingSolver(Solver *_solver, std::string path, - time::Span minQueryTimeToLog, bool logTimedOut) { - return new Solver(new KQueryLoggingSolver(_solver, path, minQueryTimeToLog, logTimedOut)); +std::unique_ptr +klee::createKQueryLoggingSolver(std::unique_ptr solver, + std::string path, time::Span minQueryTimeToLog, + bool logTimedOut) { + return std::make_unique(std::make_unique( + std::move(solver), std::move(path), minQueryTimeToLog, logTimedOut)); } - diff --git a/lib/Solver/MetaSMTBuilder.h b/lib/Solver/MetaSMTBuilder.h index 376ffe25d9..7a3d7837c5 100644 --- a/lib/Solver/MetaSMTBuilder.h +++ b/lib/Solver/MetaSMTBuilder.h @@ -20,6 +20,7 @@ #ifdef ENABLE_METASMT +#include "llvm/ADT/iterator_range.h" #include "llvm/Support/CommandLine.h" #include @@ -172,22 +173,32 @@ template typename SolverContext::result_type MetaSMTBuilder::getArrayForUpdate(const Array *root, const UpdateNode *un) { - + // Iterate over the update nodes, until we find a cached version of the node, + // or no more update nodes remain + typename SolverContext::result_type un_expr; + std::vector update_nodes; + for (; un && !_arr_hash.lookupUpdateNodeExpr(un, un_expr); + un = un->next.get()) { + update_nodes.push_back(un); + } if (!un) { - return (getInitialArray(root)); - } else { - typename SolverContext::result_type un_expr; - bool hashed = _arr_hash.lookupUpdateNodeExpr(un, un_expr); - - if (!hashed) { - un_expr = evaluate(_solver, - metaSMT::logic::Array::store( - getArrayForUpdate(root, un->next.get()), - construct(un->index, 0), construct(un->value, 0))); - _arr_hash.hashUpdateNodeExpr(un, un_expr); - } - return (un_expr); + un_expr = getInitialArray(root); + } + // `un_expr` now holds an expression for the array - either from cache or by + // virtue of being the initial array expression + + // Create and cache solver expressions based on the update nodes starting from + // the oldest + for (const auto &un : + llvm::make_range(update_nodes.crbegin(), update_nodes.crend())) { + un_expr = evaluate( + _solver, metaSMT::logic::Array::store(un_expr, construct(un->index, 0), + construct(un->value, 0))); + + _arr_hash.hashUpdateNodeExpr(un, un_expr); } + + return un_expr; } template diff --git a/lib/Solver/MetaSMTSolver.cpp b/lib/Solver/MetaSMTSolver.cpp index 0f78bb5b63..197b89c36b 100644 --- a/lib/Solver/MetaSMTSolver.cpp +++ b/lib/Solver/MetaSMTSolver.cpp @@ -51,6 +51,8 @@ #undef type_t #endif +#include + #include #include #include @@ -85,9 +87,8 @@ template class MetaSMTSolverImpl : public SolverImpl { public: MetaSMTSolverImpl(MetaSMTSolver *solver, bool useForked, bool optimizeDivides); - virtual ~MetaSMTSolverImpl(); - char *getConstraintLog(const Query &); + std::string getConstraintLog(const Query &) override; void setCoreSolverTimeout(time::Span timeout) { _timeout = timeout; } bool computeTruth(const Query &, bool &isValid); @@ -134,14 +135,8 @@ MetaSMTSolverImpl::MetaSMTSolverImpl( } template -MetaSMTSolverImpl::~MetaSMTSolverImpl() {} - -template -char *MetaSMTSolverImpl::getConstraintLog(const Query &) { - const char *msg = "Not supported"; - char *buf = new char[strlen(msg) + 1]; - strcpy(buf, msg); - return buf; +std::string MetaSMTSolverImpl::getConstraintLog(const Query &) { + return {"Not supported"}; } template @@ -194,7 +189,7 @@ bool MetaSMTSolverImpl::computeInitialValues( TimerStatIncrementer t(stats::queryTime); assert(_builder); - ++stats::queries; + ++stats::solverQueries; ++stats::queryCounterexamples; bool success = true; @@ -404,14 +399,14 @@ MetaSMTSolverImpl::getOperationStatusCode() { template MetaSMTSolver::MetaSMTSolver(bool useForked, bool optimizeDivides) - : Solver(new MetaSMTSolverImpl(this, useForked, - optimizeDivides)) {} + : Solver(std::make_unique>( + this, useForked, optimizeDivides)) {} template MetaSMTSolver::~MetaSMTSolver() {} template -char *MetaSMTSolver::getConstraintLog(const Query &query) { +std::string MetaSMTSolver::getConstraintLog(const Query &query) { return impl->getConstraintLog(query); } @@ -420,45 +415,50 @@ void MetaSMTSolver::setCoreSolverTimeout(time::Span timeout) { impl->setCoreSolverTimeout(timeout); } -Solver *createMetaSMTSolver() { +std::unique_ptr createMetaSMTSolver() { using namespace metaSMT; - Solver *coreSolver = NULL; + std::unique_ptr coreSolver; std::string backend; switch (MetaSMTBackend) { #ifdef METASMT_HAVE_STP case METASMT_BACKEND_STP: backend = "STP"; - coreSolver = new MetaSMTSolver >( + coreSolver = std::make_unique< + MetaSMTSolver>>( UseForkedCoreSolver, CoreSolverOptimizeDivides); break; #endif #ifdef METASMT_HAVE_Z3 case METASMT_BACKEND_Z3: backend = "Z3"; - coreSolver = new MetaSMTSolver >( + coreSolver = std::make_unique< + MetaSMTSolver>>( UseForkedCoreSolver, CoreSolverOptimizeDivides); break; #endif #ifdef METASMT_HAVE_BTOR case METASMT_BACKEND_BOOLECTOR: backend = "Boolector"; - coreSolver = new MetaSMTSolver >( + coreSolver = std::make_unique< + MetaSMTSolver>>( UseForkedCoreSolver, CoreSolverOptimizeDivides); break; #endif #ifdef METASMT_HAVE_CVC4 case METASMT_BACKEND_CVC4: backend = "CVC4"; - coreSolver = new MetaSMTSolver >( - UseForkedCoreSolver, CoreSolverOptimizeDivides); + coreSolver = + std::make_unique>>( + UseForkedCoreSolver, CoreSolverOptimizeDivides); break; #endif #ifdef METASMT_HAVE_YICES2 case METASMT_BACKEND_YICES2: backend = "Yices2"; - coreSolver = new MetaSMTSolver >( - UseForkedCoreSolver, CoreSolverOptimizeDivides); + coreSolver = + std::make_unique>>( + UseForkedCoreSolver, CoreSolverOptimizeDivides); break; #endif default: @@ -468,6 +468,5 @@ Solver *createMetaSMTSolver() { klee_message("Starting MetaSMTSolver(%s)", backend.c_str()); return coreSolver; } - } #endif // ENABLE_METASMT diff --git a/lib/Solver/MetaSMTSolver.h b/lib/Solver/MetaSMTSolver.h index 89cb71437d..eab2f7893e 100644 --- a/lib/Solver/MetaSMTSolver.h +++ b/lib/Solver/MetaSMTSolver.h @@ -13,6 +13,8 @@ #include "klee/Solver/Solver.h" +#include + namespace klee { template class MetaSMTSolver : public Solver { @@ -20,13 +22,13 @@ template class MetaSMTSolver : public Solver { MetaSMTSolver(bool useForked, bool optimizeDivides); virtual ~MetaSMTSolver(); - virtual char *getConstraintLog(const Query &); + std::string getConstraintLog(const Query &) override; virtual void setCoreSolverTimeout(time::Span timeout); }; /// createMetaSMTSolver - Create a solver using the metaSMT backend set by /// the option MetaSMTBackend. -Solver *createMetaSMTSolver(); +std::unique_ptr createMetaSMTSolver(); } #endif /* KLEE_METASMTSOLVER_H */ diff --git a/lib/Solver/QueryLoggingSolver.cpp b/lib/Solver/QueryLoggingSolver.cpp index 4c3d9b3045..df57a7db58 100644 --- a/lib/Solver/QueryLoggingSolver.cpp +++ b/lib/Solver/QueryLoggingSolver.cpp @@ -15,6 +15,8 @@ #include "klee/Support/FileHandling.h" #include "klee/System/Time.h" +#include + namespace { llvm::cl::opt DumpPartialQueryiesEarly( "log-partial-queries-early", llvm::cl::init(false), @@ -29,13 +31,14 @@ llvm::cl::opt CreateCompressedQueryLog( #endif } // namespace -QueryLoggingSolver::QueryLoggingSolver(Solver *_solver, std::string path, +QueryLoggingSolver::QueryLoggingSolver(std::unique_ptr solver, + std::string path, const std::string &commentSign, time::Span queryTimeToLog, bool logTimedOut) - : solver(_solver), BufferString(""), logBuffer(BufferString), queryCount(0), - minQueryTimeToLog(queryTimeToLog), logTimedOutQueries(logTimedOut), - queryCommentSign(commentSign) { + : solver(std::move(solver)), BufferString(""), logBuffer(BufferString), + queryCount(0), minQueryTimeToLog(queryTimeToLog), + logTimedOutQueries(logTimedOut), queryCommentSign(commentSign) { std::string error; #ifdef HAVE_ZLIB_H if (!CreateCompressedQueryLog) { @@ -50,11 +53,7 @@ QueryLoggingSolver::QueryLoggingSolver(Solver *_solver, std::string path, if (!os) { klee_error("Could not open file %s : %s", path.c_str(), error.c_str()); } - assert(0 != solver); -} - -QueryLoggingSolver::~QueryLoggingSolver() { - delete solver; + assert(this->solver); } void QueryLoggingSolver::flushBufferConditionally(bool writeToFile) { @@ -209,7 +208,7 @@ SolverImpl::SolverRunStatus QueryLoggingSolver::getOperationStatusCode() { return solver->impl->getOperationStatusCode(); } -char *QueryLoggingSolver::getConstraintLog(const Query &query) { +std::string QueryLoggingSolver::getConstraintLog(const Query &query) { return solver->impl->getConstraintLog(query); } diff --git a/lib/Solver/QueryLoggingSolver.h b/lib/Solver/QueryLoggingSolver.h index 65494498e7..f8f2ccd702 100644 --- a/lib/Solver/QueryLoggingSolver.h +++ b/lib/Solver/QueryLoggingSolver.h @@ -17,6 +17,8 @@ #include "llvm/Support/raw_ostream.h" +#include + using namespace klee; /// This abstract class represents a solver that is capable of logging @@ -26,7 +28,7 @@ using namespace klee; class QueryLoggingSolver : public SolverImpl { protected: - Solver *solver; + std::unique_ptr solver; std::unique_ptr os; // @brief Buffer used by logBuffer std::string BufferString; @@ -56,22 +58,21 @@ class QueryLoggingSolver : public SolverImpl { void flushBufferConditionally(bool writeToFile); public: - QueryLoggingSolver(Solver *_solver, std::string path, const std::string &commentSign, - time::Span queryTimeToLog, bool logTimedOut); - - virtual ~QueryLoggingSolver(); + QueryLoggingSolver(std::unique_ptr solver, std::string path, + const std::string &commentSign, time::Span queryTimeToLog, + bool logTimedOut); /// implementation of the SolverImpl interface - bool computeTruth(const Query &query, bool &isValid); - bool computeValidity(const Query &query, Solver::Validity &result); - bool computeValue(const Query &query, ref &result); + bool computeTruth(const Query &query, bool &isValid) override; + bool computeValidity(const Query &query, Solver::Validity &result) override; + bool computeValue(const Query &query, ref &result) override; bool computeInitialValues(const Query &query, const std::vector &objects, - std::vector > &values, - bool &hasSolution); - SolverRunStatus getOperationStatusCode(); - char *getConstraintLog(const Query &); - void setCoreSolverTimeout(time::Span timeout); + std::vector> &values, + bool &hasSolution) override; + SolverRunStatus getOperationStatusCode() override; + std::string getConstraintLog(const Query &) override; + void setCoreSolverTimeout(time::Span timeout) override; }; #endif /* KLEE_QUERYLOGGINGSOLVER_H */ diff --git a/lib/Solver/SMTLIBLoggingSolver.cpp b/lib/Solver/SMTLIBLoggingSolver.cpp index bfea5c1b6a..c0713b4536 100644 --- a/lib/Solver/SMTLIBLoggingSolver.cpp +++ b/lib/Solver/SMTLIBLoggingSolver.cpp @@ -11,6 +11,9 @@ #include "klee/Expr/ExprSMTLIBPrinter.h" +#include +#include + using namespace klee; /// This QueryLoggingSolver will log queries to a file in the SMTLIBv2 format @@ -18,7 +21,6 @@ using namespace klee; class SMTLIBLoggingSolver : public QueryLoggingSolver { private: - ExprSMTLIBPrinter printer; virtual void printQuery(const Query& query, @@ -41,22 +43,21 @@ class SMTLIBLoggingSolver : public QueryLoggingSolver printer.generateOutput(); } - - public: - SMTLIBLoggingSolver(Solver *_solver, - std::string path, - time::Span queryTimeToLog, - bool logTimedOut) - : QueryLoggingSolver(_solver, path, ";", queryTimeToLog, logTimedOut) - { - //Setup the printer - printer.setOutput(logBuffer); - } -}; +public: + SMTLIBLoggingSolver(std::unique_ptr solver, std::string path, + time::Span queryTimeToLog, bool logTimedOut) + : QueryLoggingSolver(std::move(solver), std::move(path), ";", + queryTimeToLog, logTimedOut) { + // Setup the printer + printer.setOutput(logBuffer); + } +}; -Solver* klee::createSMTLIBLoggingSolver(Solver *_solver, std::string path, - time::Span minQueryTimeToLog, bool logTimedOut) -{ - return new Solver(new SMTLIBLoggingSolver(_solver, path, minQueryTimeToLog, logTimedOut)); +std::unique_ptr +klee::createSMTLIBLoggingSolver(std::unique_ptr solver, + std::string path, time::Span minQueryTimeToLog, + bool logTimedOut) { + return std::make_unique(std::make_unique( + std::move(solver), std::move(path), minQueryTimeToLog, logTimedOut)); } diff --git a/lib/Solver/STPBuilder.cpp b/lib/Solver/STPBuilder.cpp index 13a425135c..69a247c2b3 100644 --- a/lib/Solver/STPBuilder.cpp +++ b/lib/Solver/STPBuilder.cpp @@ -18,6 +18,7 @@ #include "ConstantDivision.h" #include "llvm/ADT/StringExtras.h" +#include "llvm/ADT/iterator_range.h" #include "llvm/Support/CommandLine.h" #include @@ -437,7 +438,9 @@ ::VCExpr STPBuilder::getInitialArray(const Array *root) { // STP uniques arrays by name, so we make sure the name is unique by // using the size of the array hash as a counter. std::string unique_id = llvm::utostr(_arr_hash._array_hash.size()); - std::string unique_name = root->name + unique_id; + // Prefix unique ID with '_' to avoid name collision if name ends with + // number + std::string unique_name = root->name + "_" + unique_id; array_expr = buildArray(unique_name.c_str(), root->getDomain(), root->getRange()); @@ -465,26 +468,33 @@ ExprHandle STPBuilder::getInitialRead(const Array *root, unsigned index) { return vc_readExpr(vc, getInitialArray(root), bvConst32(32, index)); } -::VCExpr STPBuilder::getArrayForUpdate(const Array *root, +::VCExpr STPBuilder::getArrayForUpdate(const Array *root, const UpdateNode *un) { + // Iterate over the update nodes, until we find a cached version of the node, + // or no more update nodes remain + ::VCExpr un_expr; + std::vector update_nodes; + for (; un && !_arr_hash.lookupUpdateNodeExpr(un, un_expr); + un = un->next.get()) { + update_nodes.push_back(un); + } if (!un) { - return getInitialArray(root); + un_expr = getInitialArray(root); } - else { - // FIXME: This really needs to be non-recursive. - ::VCExpr un_expr; - bool hashed = _arr_hash.lookupUpdateNodeExpr(un, un_expr); - - if (!hashed) { - un_expr = - vc_writeExpr(vc, getArrayForUpdate(root, un->next.get()), - construct(un->index, 0), construct(un->value, 0)); + // `un_expr` now holds an expression for the array - either from cache or by + // virtue of being the initial array expression - _arr_hash.hashUpdateNodeExpr(un, un_expr); - } - - return un_expr; + // Create and cache solver expressions based on the update nodes starting from + // the oldest + for (const auto &un : + llvm::make_range(update_nodes.crbegin(), update_nodes.crend())) { + un_expr = vc_writeExpr(vc, un_expr, construct(un->index, 0), + construct(un->value, 0)); + + _arr_hash.hashUpdateNodeExpr(un, un_expr); } + + return un_expr; } /** if *width_out!=1 then result is a bitvector, diff --git a/lib/Solver/STPSolver.cpp b/lib/Solver/STPSolver.cpp index 95728cdec1..7df61834de 100644 --- a/lib/Solver/STPSolver.cpp +++ b/lib/Solver/STPSolver.cpp @@ -16,14 +16,16 @@ #include "klee/Expr/Assignment.h" #include "klee/Expr/Constraints.h" #include "klee/Expr/ExprUtil.h" -#include "klee/Support/OptionCategories.h" #include "klee/Solver/SolverImpl.h" #include "klee/Support/ErrorHandling.h" +#include "klee/Support/OptionCategories.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Errno.h" +#include #include +#include #include #include #include @@ -40,7 +42,24 @@ llvm::cl::opt IgnoreSolverFailures( "ignore-solver-failures", llvm::cl::init(false), llvm::cl::desc("Ignore any STP solver failures (default=false)"), llvm::cl::cat(klee::SolvingCat)); -} + +enum SAT { MINISAT, SIMPLEMINISAT, CRYPTOMINISAT, RISS }; +const std::array SATNames{"MiniSat", "simplifying MiniSat", + "CryptoMiniSat", "RISS"}; + +llvm::cl::opt SATSolver( + "stp-sat-solver", + llvm::cl::desc( + "Set the underlying SAT solver for STP (default=cryptominisat)"), + llvm::cl::values(clEnumValN(SAT::MINISAT, "minisat", + SATNames[SAT::MINISAT]), + clEnumValN(SAT::SIMPLEMINISAT, "simpleminisat", + SATNames[SAT::SIMPLEMINISAT]), + clEnumValN(SAT::CRYPTOMINISAT, "cryptominisat", + SATNames[SAT::CRYPTOMINISAT]), + clEnumValN(SAT::RISS, "riss", SATNames[SAT::RISS])), + llvm::cl::init(CRYPTOMINISAT), llvm::cl::cat(klee::SolvingCat)); +} // namespace #define vc_bvBoolExtract IAMTHESPAWNOFSATAN @@ -67,7 +86,7 @@ namespace klee { class STPSolverImpl : public SolverImpl { private: VC vc; - STPBuilder *builder; + std::unique_ptr builder; time::Span timeout; bool useForkedSTP; SolverRunStatus runStatusCode; @@ -76,7 +95,7 @@ class STPSolverImpl : public SolverImpl { explicit STPSolverImpl(bool useForkedSTP, bool optimizeDivides = true); ~STPSolverImpl() override; - char *getConstraintLog(const Query &) override; + std::string getConstraintLog(const Query &) override; void setCoreSolverTimeout(time::Span timeout) override { this->timeout = timeout; } bool computeTruth(const Query &, bool &isValid) override; @@ -103,6 +122,49 @@ STPSolverImpl::STPSolverImpl(bool useForkedSTP, bool optimizeDivides) // we restore the old behaviour. vc_setInterfaceFlags(vc, EXPRDELETE, 0); + // set SAT solver + bool SATSolverAvailable = false; + bool specifiedOnCommandLine = SATSolver.getNumOccurrences() > 0; + switch (SATSolver) { + case SAT::MINISAT: { + SATSolverAvailable = vc_useMinisat(vc); + break; + } + case SAT::SIMPLEMINISAT: { + SATSolverAvailable = vc_useSimplifyingMinisat(vc); + break; + } + case SAT::CRYPTOMINISAT: { + SATSolverAvailable = vc_useCryptominisat(vc); + break; + } + case SAT::RISS: { + SATSolverAvailable = vc_useRiss(vc); + break; + } + default: + assert(false && "Illegal SAT solver value."); + } + + // print SMT/SAT status + const auto expectedSATName = SATNames[SATSolver.getValue()]; + std::string SATName{"unknown"}; + if (vc_isUsingMinisat(vc)) + SATName = SATNames[SAT::MINISAT]; + else if (vc_isUsingSimplifyingMinisat(vc)) + SATName = SATNames[SAT::SIMPLEMINISAT]; + else if (vc_isUsingCryptominisat(vc)) + SATName = SATNames[SAT::CRYPTOMINISAT]; + else if (vc_isUsingRiss(vc)) + SATName = SATNames[SAT::RISS]; + + if (!specifiedOnCommandLine || SATSolverAvailable) { + klee_message("SAT solver: %s", SATName.c_str()); + } else { + klee_warning("%s not supported by STP", expectedSATName.c_str()); + klee_message("Fallback SAT solver: %s", SATName.c_str()); + } + make_division_total(vc); vc_registerErrorHandler(::stp_error_handler); @@ -126,14 +188,14 @@ STPSolverImpl::~STPSolverImpl() { shared_memory_ptr = nullptr; shared_memory_id = 0; - delete builder; + builder.reset(); vc_Destroy(vc); } /***/ -char *STPSolverImpl::getConstraintLog(const Query &query) { +std::string STPSolverImpl::getConstraintLog(const Query &query) { vc_push(vc); for (const auto &constraint : query.constraints) @@ -146,7 +208,10 @@ char *STPSolverImpl::getConstraintLog(const Query &query) { vc_printQueryStateToBuffer(vc, builder->getFalse(), &buffer, &length, false); vc_pop(vc); - return buffer; + std::string result = buffer; + std::free(buffer); + + return result; } bool STPSolverImpl::computeTruth(const Query &query, bool &isValid) { @@ -326,7 +391,7 @@ bool STPSolverImpl::computeInitialValues( for (const auto &constraint : query.constraints) vc_assertFormula(vc, builder->construct(constraint)); - ++stats::queries; + ++stats::solverQueries; ++stats::queryCounterexamples; ExprHandle stp_e = builder->construct(query.expr); @@ -341,13 +406,13 @@ bool STPSolverImpl::computeInitialValues( bool success; if (useForkedSTP) { - runStatusCode = runAndGetCexForked(vc, builder, stp_e, objects, values, - hasSolution, timeout); + runStatusCode = runAndGetCexForked(vc, builder.get(), stp_e, objects, + values, hasSolution, timeout); success = ((SOLVER_RUN_STATUS_SUCCESS_SOLVABLE == runStatusCode) || (SOLVER_RUN_STATUS_SUCCESS_UNSOLVABLE == runStatusCode)); } else { runStatusCode = - runAndGetCex(vc, builder, stp_e, objects, values, hasSolution); + runAndGetCex(vc, builder.get(), stp_e, objects, values, hasSolution); success = true; } @@ -368,9 +433,9 @@ SolverImpl::SolverRunStatus STPSolverImpl::getOperationStatusCode() { } STPSolver::STPSolver(bool useForkedSTP, bool optimizeDivides) - : Solver(new STPSolverImpl(useForkedSTP, optimizeDivides)) {} + : Solver(std::make_unique(useForkedSTP, optimizeDivides)) {} -char *STPSolver::getConstraintLog(const Query &query) { +std::string STPSolver::getConstraintLog(const Query &query) { return impl->getConstraintLog(query); } diff --git a/lib/Solver/STPSolver.h b/lib/Solver/STPSolver.h index 494a30db45..227dc14991 100644 --- a/lib/Solver/STPSolver.h +++ b/lib/Solver/STPSolver.h @@ -27,12 +27,11 @@ class STPSolver : public Solver { /// getConstraintLog - Return the constraint log for the given state in CVC /// format. - virtual char *getConstraintLog(const Query &); + std::string getConstraintLog(const Query &) override; /// setCoreSolverTimeout - Set constraint solver timeout delay to the given - /// value; 0 - /// is off. - virtual void setCoreSolverTimeout(time::Span timeout); + /// value; 0 is off. + void setCoreSolverTimeout(time::Span timeout) override; }; } diff --git a/lib/Solver/Solver.cpp b/lib/Solver/Solver.cpp index 12cfb180b0..b3c7078820 100644 --- a/lib/Solver/Solver.cpp +++ b/lib/Solver/Solver.cpp @@ -12,6 +12,8 @@ #include "klee/Expr/Constraints.h" #include "klee/Solver/SolverImpl.h" +#include + using namespace klee; const char *Solver::validity_to_str(Validity v) { @@ -22,11 +24,10 @@ const char *Solver::validity_to_str(Validity v) { } } -Solver::~Solver() { - delete impl; -} +Solver::Solver(std::unique_ptr impl) : impl(std::move(impl)) {} +Solver::~Solver() = default; -char *Solver::getConstraintLog(const Query& query) { +std::string Solver::getConstraintLog(const Query& query) { return impl->getConstraintLog(query); } @@ -101,7 +102,7 @@ Solver::getInitialValues(const Query& query, bool hasSolution; bool success = impl->computeInitialValues(query, objects, values, hasSolution); - // FIXME: Propogate this out. + // FIXME: Propagate this out. if (!hasSolution) return false; diff --git a/lib/Solver/SolverCmdLine.cpp b/lib/Solver/SolverCmdLine.cpp index d91261dc07..a371d5e40e 100644 --- a/lib/Solver/SolverCmdLine.cpp +++ b/lib/Solver/SolverCmdLine.cpp @@ -112,21 +112,24 @@ cl::opt UseAssignmentValidatingSolver( cl::desc("Debug the correctness of generated assignments (default=false)"), cl::cat(SolvingCat)); - -void KCommandLine::HideOptions(llvm::cl::OptionCategory &Category) { +void KCommandLine::KeepOnlyCategories( + std::set const &categories) { StringMap &map = cl::getRegisteredOptions(); for (auto &elem : map) { -#if LLVM_VERSION_CODE >= LLVM_VERSION(9, 0) + if (elem.first() == "version" || elem.first() == "color" || + elem.first() == "help" || elem.first() == "help-list") + continue; + + bool keep = false; for (auto &cat : elem.second->Categories) { -#else - { - auto &cat = elem.second->Category; -#endif - if (cat == &Category) { - elem.second->setHiddenFlag(cl::Hidden); + if (categories.find(cat) != categories.end()) { + keep = true; + break; } } + if (!keep) + elem.second->setHiddenFlag(cl::Hidden); } } diff --git a/lib/Solver/SolverStats.cpp b/lib/Solver/SolverStats.cpp index 40f0d53f05..97b8902aa6 100644 --- a/lib/Solver/SolverStats.cpp +++ b/lib/Solver/SolverStats.cpp @@ -12,6 +12,7 @@ using namespace klee; Statistic stats::cexCacheTime("CexCacheTime", "CCtime"); +Statistic stats::solverQueries("SolverQueries", "SQ"); Statistic stats::queries("Queries", "Q"); Statistic stats::queriesInvalid("QueriesInvalid", "Qiv"); Statistic stats::queriesValid("QueriesValid", "Qv"); diff --git a/lib/Solver/ValidatingSolver.cpp b/lib/Solver/ValidatingSolver.cpp index 5d4dab3902..4e37f86d55 100644 --- a/lib/Solver/ValidatingSolver.cpp +++ b/lib/Solver/ValidatingSolver.cpp @@ -11,29 +11,35 @@ #include "klee/Solver/Solver.h" #include "klee/Solver/SolverImpl.h" +#include +#include #include namespace klee { class ValidatingSolver : public SolverImpl { private: - Solver *solver, *oracle; + std::unique_ptr solver; + std::unique_ptr oracle; public: - ValidatingSolver(Solver *_solver, Solver *_oracle) - : solver(_solver), oracle(_oracle) {} - ~ValidatingSolver() { delete solver; } - - bool computeValidity(const Query &, Solver::Validity &result); - bool computeTruth(const Query &, bool &isValid); - bool computeValue(const Query &, ref &result); + ValidatingSolver(std::unique_ptr solver, Solver *oracle, + bool ownsOracle) + : solver(std::move(solver)), + oracle( + oracle, ownsOracle ? [](Solver *solver) { delete solver; } + : [](Solver *) {}) {} + + bool computeValidity(const Query &, Solver::Validity &result) override; + bool computeTruth(const Query &, bool &isValid) override; + bool computeValue(const Query &, ref &result) override; bool computeInitialValues(const Query &, const std::vector &objects, - std::vector > &values, - bool &hasSolution); - SolverRunStatus getOperationStatusCode(); - char *getConstraintLog(const Query &); - void setCoreSolverTimeout(time::Span timeout); + std::vector> &values, + bool &hasSolution) override; + SolverRunStatus getOperationStatusCode() override; + std::string getConstraintLog(const Query &) override; + void setCoreSolverTimeout(time::Span timeout) override; }; bool ValidatingSolver::computeTruth(const Query &query, bool &isValid) { @@ -128,7 +134,7 @@ SolverImpl::SolverRunStatus ValidatingSolver::getOperationStatusCode() { return solver->impl->getOperationStatusCode(); } -char *ValidatingSolver::getConstraintLog(const Query &query) { +std::string ValidatingSolver::getConstraintLog(const Query &query) { return solver->impl->getConstraintLog(query); } @@ -136,7 +142,10 @@ void ValidatingSolver::setCoreSolverTimeout(time::Span timeout) { solver->impl->setCoreSolverTimeout(timeout); } -Solver *createValidatingSolver(Solver *s, Solver *oracle) { - return new Solver(new ValidatingSolver(s, oracle)); +std::unique_ptr createValidatingSolver(std::unique_ptr s, + Solver *oracle, + bool ownsOracle) { + return std::make_unique( + std::make_unique(std::move(s), oracle, ownsOracle)); } } diff --git a/lib/Solver/Z3Builder.cpp b/lib/Solver/Z3Builder.cpp index 950bd87976..0e51967e36 100644 --- a/lib/Solver/Z3Builder.cpp +++ b/lib/Solver/Z3Builder.cpp @@ -17,6 +17,7 @@ #include "klee/Support/ErrorHandling.h" #include "llvm/ADT/StringExtras.h" +#include "llvm/ADT/iterator_range.h" #include "llvm/Support/CommandLine.h" using namespace klee; @@ -393,7 +394,9 @@ Z3ASTHandle Z3Builder::getInitialArray(const Array *root) { // Unique arrays by name, so we make sure the name is unique by // using the size of the array hash as a counter. std::string unique_id = llvm::utostr(_arr_hash._array_hash.size()); - std::string unique_name = root->name + unique_id; + // Prefix unique ID with '_' to avoid name collision if name ends with + // number + std::string unique_name = root->name + "_" + unique_id; array_expr = buildArray(unique_name.c_str(), root->getDomain(), root->getRange()); @@ -427,22 +430,31 @@ Z3ASTHandle Z3Builder::getInitialRead(const Array *root, unsigned index) { Z3ASTHandle Z3Builder::getArrayForUpdate(const Array *root, const UpdateNode *un) { + // Iterate over the update nodes, until we find a cached version of the node, + // or no more update nodes remain + Z3ASTHandle un_expr; + std::vector update_nodes; + for (; un && !_arr_hash.lookupUpdateNodeExpr(un, un_expr); + un = un->next.get()) { + update_nodes.push_back(un); + } if (!un) { - return (getInitialArray(root)); - } else { - // FIXME: This really needs to be non-recursive. - Z3ASTHandle un_expr; - bool hashed = _arr_hash.lookupUpdateNodeExpr(un, un_expr); - - if (!hashed) { - un_expr = writeExpr(getArrayForUpdate(root, un->next.get()), - construct(un->index, 0), construct(un->value, 0)); + un_expr = getInitialArray(root); + } + // `un_expr` now holds an expression for the array - either from cache or by + // virtue of being the initial array expression - _arr_hash.hashUpdateNodeExpr(un, un_expr); - } + // Create and cache solver expressions based on the update nodes starting from + // the oldest + for (const auto &un : + llvm::make_range(update_nodes.crbegin(), update_nodes.crend())) { + un_expr = + writeExpr(un_expr, construct(un->index, 0), construct(un->value, 0)); - return (un_expr); + _arr_hash.hashUpdateNodeExpr(un, un_expr); } + + return un_expr; } /** if *width_out!=1 then result is a bitvector, diff --git a/lib/Solver/Z3Solver.cpp b/lib/Solver/Z3Solver.cpp index 87ffbdf3a4..3e20c2efeb 100644 --- a/lib/Solver/Z3Solver.cpp +++ b/lib/Solver/Z3Solver.cpp @@ -27,6 +27,8 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/raw_ostream.h" +#include + namespace { // NOTE: Very useful for debugging Z3 behaviour. These files can be given to // the z3 binary to replay all Z3 API calls using its `-log` option. @@ -57,7 +59,7 @@ namespace klee { class Z3SolverImpl : public SolverImpl { private: - Z3Builder *builder; + std::unique_ptr builder; time::Span timeout; SolverRunStatus runStatusCode; std::unique_ptr dumpedQueriesFile; @@ -75,8 +77,8 @@ class Z3SolverImpl : public SolverImpl { Z3SolverImpl(); ~Z3SolverImpl(); - char *getConstraintLog(const Query &); - void setCoreSolverTimeout(time::Span _timeout) { + std::string getConstraintLog(const Query &) override; + void setCoreSolverTimeout(time::Span _timeout) override { timeout = _timeout; auto timeoutInMilliSeconds = static_cast((timeout.toMicroseconds() / 1000)); @@ -86,18 +88,18 @@ class Z3SolverImpl : public SolverImpl { timeoutInMilliSeconds); } - bool computeTruth(const Query &, bool &isValid); - bool computeValue(const Query &, ref &result); + bool computeTruth(const Query &, bool &isValid) override; + bool computeValue(const Query &, ref &result) override; bool computeInitialValues(const Query &, const std::vector &objects, - std::vector > &values, - bool &hasSolution); + std::vector> &values, + bool &hasSolution) override; SolverRunStatus handleSolverResponse(::Z3_solver theSolver, ::Z3_lbool satisfiable, const std::vector *objects, - std::vector > *values, + std::vector> *values, bool &hasSolution); - SolverRunStatus getOperationStatusCode(); + SolverRunStatus getOperationStatusCode() override; }; Z3SolverImpl::Z3SolverImpl() @@ -135,12 +137,11 @@ Z3SolverImpl::Z3SolverImpl() Z3SolverImpl::~Z3SolverImpl() { Z3_params_dec_ref(builder->ctx, solverParameters); - delete builder; } -Z3Solver::Z3Solver() : Solver(new Z3SolverImpl()) {} +Z3Solver::Z3Solver() : Solver(std::make_unique()) {} -char *Z3Solver::getConstraintLog(const Query &query) { +std::string Z3Solver::getConstraintLog(const Query &query) { return impl->getConstraintLog(query); } @@ -148,7 +149,7 @@ void Z3Solver::setCoreSolverTimeout(time::Span timeout) { impl->setCoreSolverTimeout(timeout); } -char *Z3SolverImpl::getConstraintLog(const Query &query) { +std::string Z3SolverImpl::getConstraintLog(const Query &query) { std::vector assumptions; // We use a different builder here because we don't want to interfere // with the solver's builder because it may change the solver builder's @@ -182,35 +183,26 @@ char *Z3SolverImpl::getConstraintLog(const Query &query) { } } - ::Z3_ast *assumptionsArray = NULL; - int numAssumptions = assumptions.size(); - if (numAssumptions) { - assumptionsArray = (::Z3_ast *)malloc(sizeof(::Z3_ast) * numAssumptions); - for (int index = 0; index < numAssumptions; ++index) { - assumptionsArray[index] = (::Z3_ast)assumptions[index]; - } - } - + std::vector<::Z3_ast> raw_assumptions{assumptions.cbegin(), + assumptions.cend()}; ::Z3_string result = Z3_benchmark_to_smtlib_string( temp_builder.ctx, /*name=*/"Emited by klee::Z3SolverImpl::getConstraintLog()", /*logic=*/"", /*status=*/"unknown", /*attributes=*/"", - /*num_assumptions=*/numAssumptions, - /*assumptions=*/assumptionsArray, + /*num_assumptions=*/raw_assumptions.size(), + /*assumptions=*/raw_assumptions.size() ? raw_assumptions.data() : nullptr, /*formula=*/formula); - if (numAssumptions) - free(assumptionsArray); - // We need to trigger a dereference before the `temp_builder` gets destroyed. // We do this indirectly by emptying `assumptions` and assigning to // `formula`. + raw_assumptions.clear(); assumptions.clear(); formula = Z3ASTHandle(NULL, temp_builder.ctx); - // Client is responsible for freeing the returned C-string - return strdup(result); + + return {result}; } bool Z3SolverImpl::computeTruth(const Query &query, bool &isValid) { @@ -268,7 +260,7 @@ bool Z3SolverImpl::internalRunSolver( Z3_solver_assert(builder->ctx, theSolver, builder->construct(constraint)); constant_arrays_in_query.visit(constraint); } - ++stats::queries; + ++stats::solverQueries; if (objects) ++stats::queryCounterexamples; @@ -362,7 +354,7 @@ SolverImpl::SolverRunStatus Z3SolverImpl::handleSolverResponse( __attribute__((unused)) bool successfulEval = Z3_model_eval(builder->ctx, theModel, initial_read, - /*model_completion=*/Z3_TRUE, &arrayElementExpr); + /*model_completion=*/true, &arrayElementExpr); assert(successfulEval && "Failed to evaluate model"); Z3_inc_ref(builder->ctx, arrayElementExpr); assert(Z3_get_ast_kind(builder->ctx, arrayElementExpr) == @@ -432,7 +424,7 @@ bool Z3SolverImpl::validateZ3Model(::Z3_solver &theSolver, ::Z3_model &theModel) __attribute__((unused)) bool successfulEval = Z3_model_eval(builder->ctx, theModel, constraint, - /*model_completion=*/Z3_TRUE, &rawEvaluatedExpr); + /*model_completion=*/true, &rawEvaluatedExpr); assert(successfulEval && "Failed to evaluate model"); // Use handle to do ref-counting. diff --git a/lib/Solver/Z3Solver.h b/lib/Solver/Z3Solver.h index 9688ccff48..8e621bf4fb 100644 --- a/lib/Solver/Z3Solver.h +++ b/lib/Solver/Z3Solver.h @@ -22,12 +22,11 @@ class Z3Solver : public Solver { /// Get the query in SMT-LIBv2 format. /// \return A C-style string. The caller is responsible for freeing this. - virtual char *getConstraintLog(const Query &); + std::string getConstraintLog(const Query &) override; /// setCoreSolverTimeout - Set constraint solver timeout delay to the given - /// value; 0 - /// is off. - virtual void setCoreSolverTimeout(time::Span timeout); + /// value; 0 is off. + void setCoreSolverTimeout(time::Span timeout) override; }; } diff --git a/lib/Support/CMakeLists.txt b/lib/Support/CMakeLists.txt index 7145930fc5..a6f13954bb 100644 --- a/lib/Support/CMakeLists.txt +++ b/lib/Support/CMakeLists.txt @@ -6,7 +6,7 @@ # License. See LICENSE.TXT for details. # #===------------------------------------------------------------------------===# -klee_add_component(kleeSupport +add_library(kleeSupport CompressionStream.cpp ErrorHandling.cpp FileHandling.cpp @@ -18,10 +18,9 @@ klee_add_component(kleeSupport TreeStream.cpp ) -target_link_libraries(kleeSupport PRIVATE ${ZLIB_LIBRARIES}) +llvm_config(kleeSupport "${USE_LLVM_SHARED}" support) -set(LLVM_COMPONENTS - support -) -klee_get_llvm_libs(LLVM_LIBS ${LLVM_COMPONENTS}) -target_link_libraries(kleeSupport PUBLIC ${LLVM_LIBS}) +target_link_libraries(kleeSupport PRIVATE ${ZLIB_LIBRARIES} ${TCMALLOC_LIBRARIES}) +target_include_directories(kleeSupport PRIVATE ${KLEE_INCLUDE_DIRS} ${LLVM_INCLUDE_DIRS} ${TCMALLOC_INCLUDE_DIR}) +target_compile_options(kleeSupport PRIVATE ${KLEE_COMPONENT_CXX_FLAGS}) +target_compile_definitions(kleeSupport PRIVATE ${KLEE_COMPONENT_CXX_DEFINES}) diff --git a/lib/Support/CompressionStream.cpp b/lib/Support/CompressionStream.cpp index 95dbe0067e..3dc505580c 100644 --- a/lib/Support/CompressionStream.cpp +++ b/lib/Support/CompressionStream.cpp @@ -26,13 +26,8 @@ compressed_fd_ostream::compressed_fd_ostream(const std::string &Filename, : llvm::raw_ostream(), pos(0) { ErrorInfo = ""; // Open file in binary mode -#if LLVM_VERSION_CODE >= LLVM_VERSION(7, 0) std::error_code EC = llvm::sys::fs::openFileForWrite(Filename, FD); -#else - std::error_code EC = - llvm::sys::fs::openFileForWrite(Filename, FD, llvm::sys::fs::F_None); -#endif if (EC) { ErrorInfo = EC.message(); FD = -1; diff --git a/lib/Support/ErrorHandling.cpp b/lib/Support/ErrorHandling.cpp index 2f4bc5cc14..8c1580a6fb 100644 --- a/lib/Support/ErrorHandling.cpp +++ b/lib/Support/ErrorHandling.cpp @@ -8,9 +8,13 @@ //===----------------------------------------------------------------------===// #include "klee/Support/ErrorHandling.h" +#include "klee/Support/CompilerWarning.h" +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS #include "llvm/ADT/StringRef.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Support/CommandLine.h" +DISABLE_WARNING_POP #include #include diff --git a/lib/Support/FileHandling.cpp b/lib/Support/FileHandling.cpp index 462055210d..8658f46217 100644 --- a/lib/Support/FileHandling.cpp +++ b/lib/Support/FileHandling.cpp @@ -25,14 +25,8 @@ klee_open_output_file(const std::string &path, std::string &error) { error.clear(); std::error_code ec; -#if LLVM_VERSION_CODE >= LLVM_VERSION(7, 0) auto f = std::make_unique(path.c_str(), ec, llvm::sys::fs::OF_None); -#else - auto f = std::make_unique(path.c_str(), ec, - llvm::sys::fs::F_None); -#endif - if (ec) error = ec.message(); if (!error.empty()) { diff --git a/lib/Support/MemoryUsage.cpp b/lib/Support/MemoryUsage.cpp index 6e9f94248e..5878939e4d 100644 --- a/lib/Support/MemoryUsage.cpp +++ b/lib/Support/MemoryUsage.cpp @@ -16,7 +16,7 @@ #include "gperftools/malloc_extension.h" #endif -#ifdef HAVE_MALLINFO +#if defined(HAVE_MALLINFO) || defined(HAVE_MALLINFO2) #include #endif #ifdef HAVE_MALLOC_ZONE_STATISTICS @@ -96,6 +96,10 @@ size_t util::GetTotalMallocUsage() { MallocExtension::instance()->GetNumericProperty( "generic.current_allocated_bytes", &value); return value; +#elif defined(HAVE_MALLINFO2) + // niy in tcmalloc + struct mallinfo2 mi = ::mallinfo2(); + return mi.uordblks + mi.hblkhd; #elif defined(HAVE_MALLINFO) struct mallinfo mi = ::mallinfo(); // The malloc implementation in glibc (pmalloc2) diff --git a/lib/Support/RNG.cpp b/lib/Support/RNG.cpp index a6841c5c1b..c4268890e1 100644 --- a/lib/Support/RNG.cpp +++ b/lib/Support/RNG.cpp @@ -1,46 +1,11 @@ -/* - A C-program for MT19937, with initialization improved 2002/1/26. - Coded by Takuji Nishimura and Makoto Matsumoto. - Modified to be a C++ class by Daniel Dunbar. - - Before using, initialize the state by using init_genrand(seed) - or init_by_array(init_key, key_length). - - Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. The names of its contributors may not be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - Any feedback is very welcome. - http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html - email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space) -*/ +//===-- RNG.cpp -------------------------------------------------*- C++ -*-===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// #include "klee/ADT/RNG.h" #include "klee/Support/OptionCategories.h" @@ -48,79 +13,21 @@ using namespace klee; namespace { -llvm::cl::opt RNGInitialSeed( +llvm::cl::opt RNGInitialSeed( "rng-initial-seed", llvm::cl::init(5489U), llvm::cl::desc("seed value for random number generator (default=5489)"), llvm::cl::cat(klee::MiscCat)); - } -RNG::RNG() { - seed(RNGInitialSeed); -} +RNG::RNG() : std::mt19937(RNGInitialSeed.getValue()) { } -/* initializes mt[N] with a seed */ -RNG::RNG(unsigned int s) { - seed(s); -} - -void RNG::seed(unsigned int s) { - mt[0]= s & 0xffffffffUL; - for (mti=1; mti> 30U)) + mti); - /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */ - /* In the previous versions, MSBs of the seed affect */ - /* only MSBs of the array mt[]. */ - /* 2002/01/09 modified by Makoto Matsumoto */ - mt[mti] &= 0xffffffffUL; - /* for >32 bit machines */ - } -} +RNG::RNG(RNG::result_type seed) : std::mt19937(seed) {} /* generates a random number on [0,0xffffffff]-interval */ unsigned int RNG::getInt32() { - unsigned int y; - static unsigned int mag01[2]={0x0UL, MATRIX_A}; - /* mag01[x] = x * MATRIX_A for x=0,1 */ - - if (mti >= N) { /* generate N words at one time */ - int kk; - - for (kk=0;kk> 1U) ^ mag01[y & 0x1UL]; - } - for (;kk> 1U) ^ mag01[y & 0x1UL]; - } - y = (mt[N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK); - mt[N-1] = mt[M-1] ^ (y >> 1U) ^ mag01[y & 0x1UL]; - - mti = 0; - } - - y = mt[mti++]; - - /* Tempering */ - y ^= (y >> 11U); - y ^= (y << 7U) & 0x9d2c5680UL; - y ^= (y << 15U) & 0xefc60000UL; - y ^= (y >> 18U); - - return y; -} - -/* generates a random number on [0,0x7fffffff]-interval */ -int RNG::getInt31() { - return (int)(getInt32() >> 1U); -} - -/* generates a random number on [0,1]-real-interval */ -double RNG::getDoubleLR() { - return getInt32()*(1.0/4294967295.0); - /* divided by 2^32-1 */ + static_assert((min)() == 0); + static_assert((max)() == -1u); + return (*this)(); } /* generates a random number on [0,1)-real-interval */ @@ -135,19 +42,6 @@ double RNG::getDouble() { /* divided by 2^32 */ } -float RNG::getFloatLR() { - return getInt32()*(1.0f/4294967295.0f); - /* divided by 2^32-1 */ -} -float RNG::getFloatL() { - return getInt32()*(1.0f/4294967296.0f); - /* divided by 2^32 */ -} -float RNG::getFloat() { - return (getInt32() + 0.5f)*(1.0f/4294967296.0f); - /* divided by 2^32 */ -} - bool RNG::getBool() { unsigned bits = getInt32(); bits ^= bits >> 16U; diff --git a/runtime/CMakeLists.txt b/runtime/CMakeLists.txt index 5747672c53..c2f3e4051a 100644 --- a/runtime/CMakeLists.txt +++ b/runtime/CMakeLists.txt @@ -109,6 +109,9 @@ if (ENABLE_POSIX_RUNTIME) add_subdirectory(POSIX) endif () +list(APPEND RUNTIME_LIBRARIES UBSan) +add_subdirectory(Sanitizer) + add_custom_target(BuildKLEERuntimes DEPENDS "${RUNTIME_LIBRARIES}" ) diff --git a/runtime/POSIX/fd.c b/runtime/POSIX/fd.c index 35d0d31519..b41d4e32bb 100644 --- a/runtime/POSIX/fd.c +++ b/runtime/POSIX/fd.c @@ -106,32 +106,18 @@ mode_t umask(mode_t mask) { /* Returns 1 if the process has the access rights specified by 'flags' - to the file with stat 's'. Returns 0 otherwise*/ + to the file with stat 's', and returns 0 otherwise. + We allow access if any user has access to the file, so we ignore + s->st_uid / geteuid() and s->st_gid / getegid(). */ static int has_permission(int flags, struct stat64 *s) { - int write_access, read_access; mode_t mode = s->st_mode; - - if (flags & O_RDONLY || flags & O_RDWR) - read_access = 1; - else read_access = 0; - - if (flags & O_WRONLY || flags & O_RDWR) - write_access = 1; - else write_access = 0; - - /* XXX: We don't worry about process uid and gid for now. - We allow access if any user has access to the file. */ -#if 0 - uid_t uid = s->st_uid; - uid_t euid = geteuid(); - gid_t gid = s->st_gid; - gid_t egid = getegid(); -#endif - - if (read_access && ((mode & S_IRUSR) | (mode & S_IRGRP) | (mode & S_IROTH))) - return 0; + int read_request = ((flags & O_RDONLY) | (flags & O_RDWR)) ? 1 : 0; + int write_request = ((flags & O_WRONLY) | (flags & O_RDWR)) ? 1 : 0; - if (write_access && !((mode & S_IWUSR) | (mode & S_IWGRP) | (mode & S_IWOTH))) + /* It is important to do this check using only bitwise operators so that we + return 0 a single time in symbolic execution mode. */ + if ((read_request & !((mode & S_IRUSR) | (mode & S_IRGRP) | (mode & S_IROTH))) | + (write_request & !((mode & S_IWUSR) | (mode & S_IWGRP) | (mode & S_IWOTH)))) return 0; return 1; @@ -568,16 +554,21 @@ int fstatat(int fd, const char *path, struct stat *buf, int flags) { return 0; } +#ifdef FSTATAT_PATH_ACCEPTS_NULL + #define PATHPARAM (path ? __concretize_string(path) : NULL) +#else + assert(path); + #define PATHPARAM (__concretize_string(path)) +#endif + #if (defined __NR_newfstatat) && (__NR_newfstatat != 0) - return syscall(__NR_newfstatat, (long)fd, - (path ? __concretize_string(path) : NULL), buf, (long)flags); + return syscall(__NR_newfstatat, (long)fd, PATHPARAM, buf, (long)flags); #else - return syscall(__NR_fstatat64, (long)fd, - (path ? __concretize_string(path) : NULL), buf, (long)flags); + return syscall(__NR_fstatat64, (long)fd, PATHPARAM, buf, (long)flags); #endif +#undef PATHPARAM } - int __fd_lstat(const char *path, struct stat64 *buf) { exe_disk_file_t *dfile = __get_sym_file(path); if (dfile) { @@ -825,8 +816,6 @@ int __fd_getdents(unsigned int fd, struct dirent64 *dirp, unsigned int count) { return bytes; } else { off64_t os_pos = f->off - 4096; - int res; - off64_t s = 0; /* For reasons which I really don't understand, if I don't memset this then sometimes the kernel returns d_ino==0 for @@ -836,9 +825,10 @@ int __fd_getdents(unsigned int fd, struct dirent64 *dirp, unsigned int count) { Even more bizarre, interchanging the memset and the seek also case strange behavior. Really should be debugged properly. */ memset(dirp, 0, count); - s = syscall(__NR_lseek, f->fd, os_pos, SEEK_SET); + off64_t s = syscall(__NR_lseek, f->fd, os_pos, SEEK_SET); + (void)s; assert(s != (off64_t) -1); - res = syscall(__NR_getdents64, f->fd, dirp, count); + int res = syscall(__NR_getdents64, f->fd, dirp, count); if (res > -1) { int pos = 0; f->off = syscall(__NR_lseek, f->fd, 0, SEEK_CUR); diff --git a/runtime/POSIX/fd.h b/runtime/POSIX/fd.h index a5e15c9bcf..87d967ee3a 100644 --- a/runtime/POSIX/fd.h +++ b/runtime/POSIX/fd.h @@ -16,6 +16,13 @@ #error "_LARGEFILE64_SOURCE should be defined" #endif +#if defined(__APPLE__) || defined(__FreeBSD__) +#else +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif +#endif + #include #include @@ -23,7 +30,12 @@ #include #endif +#include + #ifdef __APPLE__ +#ifndef stat64 +#define stat64 stat +#endif #include #endif #ifdef __FreeBSD__ @@ -81,7 +93,6 @@ typedef struct { typedef struct { exe_file_t fds[MAX_FDS]; mode_t umask; /* process umask */ - unsigned version; /* If set, writes execute as expected. Otherwise, writes extending the file size only change the contents up to the initial size. The file offset is always incremented correctly. */ diff --git a/runtime/POSIX/fd_init.c b/runtime/POSIX/fd_init.c index a8d557e7f2..adb1d9f653 100644 --- a/runtime/POSIX/fd_init.c +++ b/runtime/POSIX/fd_init.c @@ -36,7 +36,6 @@ exe_sym_env_t __exe_env = { { 1, eOpen | eWriteable, 0, 0}, { 2, eOpen | eWriteable, 0, 0}}, 022, - 0, 0 }; @@ -50,7 +49,7 @@ static void __create_new_dfile(exe_disk_file_t *dfile, unsigned size, char sname[64]; for (sp=name; *sp; ++sp) sname[sp-name] = *sp; - memcpy(&sname[sp-name], "-stat", 6); + memcpy(&sname[sp-name], "_stat", 6); assert(size); @@ -96,12 +95,6 @@ static void __create_new_dfile(exe_disk_file_t *dfile, unsigned size, dfile->stat = s; } -static unsigned __sym_uint32(const char *name) { - unsigned x; - klee_make_symbolic(&x, sizeof x, name); - return x; -} - /* n_files: number of symbolic input files, excluding stdin file_length: size in bytes of each symbolic file, including stdin sym_stdout_flag: 1 if stdout should be symbolic, 0 otherwise @@ -113,7 +106,7 @@ void klee_init_fds(unsigned n_files, unsigned file_length, unsigned stdin_length, int sym_stdout_flag, int save_all_writes_flag, unsigned max_failures) { unsigned k; - char name[7] = "?-data"; + char name[7] = "?_data"; struct stat64 s; stat64(".", &s); @@ -168,6 +161,4 @@ void klee_init_fds(unsigned n_files, unsigned file_length, else __exe_fs.sym_stdout = NULL; __exe_env.save_all_writes = save_all_writes_flag; - __exe_env.version = __sym_uint32("model_version"); - klee_assume(__exe_env.version == 1); } diff --git a/runtime/Runtest/CMakeLists.txt b/runtime/Runtest/CMakeLists.txt index 9ae185ee84..df5f2c23be 100644 --- a/runtime/Runtest/CMakeLists.txt +++ b/runtime/Runtest/CMakeLists.txt @@ -20,6 +20,6 @@ set_target_properties(kleeRuntest VERSION ${KLEE_RUNTEST_VERSION} SOVERSION ${KLEE_RUNTEST_VERSION} ) +target_include_directories(kleeRuntest PRIVATE ${KLEE_INCLUDE_DIRS}) -install(TARGETS kleeRuntest - DESTINATION "${CMAKE_INSTALL_FULL_LIBDIR}") +install(TARGETS kleeRuntest DESTINATION "${CMAKE_INSTALL_FULL_LIBDIR}") diff --git a/runtime/Runtest/intrinsics.c b/runtime/Runtest/intrinsics.c index 2442db0cb2..18eb3cff1a 100644 --- a/runtime/Runtest/intrinsics.c +++ b/runtime/Runtest/intrinsics.c @@ -109,13 +109,6 @@ void klee_make_symbolic(void *array, size_t nbytes, const char *name) { break; } else { KTestObject *o = &testData->objects[testPosition]; - if (strcmp("model_version", o->name) == 0 && - strcmp("model_version", name) != 0) { - // Skip over this KTestObject because we've hit - // `model_version` which is from the POSIX runtime - // and the caller didn't ask for it. - continue; - } if (strcmp(name, o->name) != 0) { report_internal_error( "object name mismatch. Requesting \"%s\" but returning \"%s\"", diff --git a/cmake/string_to_list.cmake b/runtime/Sanitizer/CMakeLists.txt similarity index 51% rename from cmake/string_to_list.cmake rename to runtime/Sanitizer/CMakeLists.txt index 65c04413fa..39031dfbab 100644 --- a/cmake/string_to_list.cmake +++ b/runtime/Sanitizer/CMakeLists.txt @@ -6,8 +6,13 @@ # License. See LICENSE.TXT for details. # #===------------------------------------------------------------------------===# +# Set up +set(LIB_PREFIX "UBSan") +set(SRC_FILES + ubsan/ubsan_handlers.cpp + ) -function(string_to_list s output_var) - string(REPLACE " " ";" _output "${s}") - set(${output_var} ${_output} PARENT_SCOPE) -endfunction() +# Build it +include("${CMAKE_SOURCE_DIR}/cmake/compile_bitcode_library.cmake") +prefix_with_path("${SRC_FILES}" "${CMAKE_CURRENT_SOURCE_DIR}/" prefixed_files) +add_bitcode_library_targets("${LIB_PREFIX}" "${prefixed_files}" "" "") \ No newline at end of file diff --git a/runtime/Sanitizer/README.md b/runtime/Sanitizer/README.md new file mode 100644 index 0000000000..3071ba71db --- /dev/null +++ b/runtime/Sanitizer/README.md @@ -0,0 +1,74 @@ +# KLEE UBSan runtime + +## Introduction + +KLEE UBSan runtime is a tailored runtime +of [UndefinedBehaviorSanitizer](https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html) to meet KLEE needs. For +certain reasons, not all [checks](https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html#available-checks) and +diagnostics are supported in there. + +## Usage + +Use `clang++` to compile and link your program with sanitizer flags. Make sure to use `clang++` (not `ld`) as a +linker, so that your executable is linked with proper UBSan runtime libraries. You can use `clang` instead of `clang++` +if you’re compiling/linking C code. + +For compiling/linking with **all** available checks to catch **both** undefined behaviour and unintentional issues, just +add one of the following options: + +* Short exclusive form + * `-fsanitize=undefined,float-divide-by-zero,unsigned-integer-overflow,implicit-conversion,nullability -fno-sanitize=local-bounds,function,vptr` +* Verbose inclusive form + * LLVM 11 and lower + * `-fsanitize=alignment,bool,builtin,array-bounds,enum,float-cast-overflow,float-divide-by-zero,implicit-unsigned-integer-truncation,implicit-signed-integer-truncation,implicit-integer-sign-change,integer-divide-by-zero,nonnull-attribute,null,nullability-arg,nullability-assign,nullability-return,object-size,pointer-overflow,return,returns-nonnull-attribute,shift,signed-integer-overflow,unreachable,unsigned-integer-overflow,vla-bound` + * LLVM 12 and higher + * `-fsanitize=alignment,bool,builtin,array-bounds,enum,float-cast-overflow,float-divide-by-zero,implicit-unsigned-integer-truncation,implicit-signed-integer-truncation,implicit-integer-sign-change,integer-divide-by-zero,nonnull-attribute,null,nullability-arg,nullability-assign,nullability-return,object-size,pointer-overflow,return,returns-nonnull-attribute,shift,unsigned-shift-base,signed-integer-overflow,unreachable,unsigned-integer-overflow,vla-bound` + +For compiling/linking with **all** available checks to catch **only** undefined behaviour, just add +the following option: + +* `-fsanitize=undefined -fno-sanitize=local-bounds,function,vptr` + +## Available checks + +Available checks for KLEE as are: + +* `-fsanitize=alignment` +* `-fsanitize=bool` +* `-fsanitize=builtin` +* `-fsanitize=array-bounds` +* `-fsanitize=enum` +* `-fsanitize=float-cast-overflow` +* `-fsanitize=float-divide-by-zero` +* `-fsanitize=implicit-unsigned-integer-truncation` +* `-fsanitize=implicit-signed-integer-truncation` +* `-fsanitize=implicit-integer-sign-change` +* `-fsanitize=integer-divide-by-zero` +* `-fsanitize=nonnull-attribute` +* `-fsanitize=null` +* `-fsanitize=nullability-arg` +* `-fsanitize=nullability-assign` +* `-fsanitize=nullability-return` +* `-fsanitize=object-size` +* `-fsanitize=pointer-overflow` +* `-fsanitize=return` +* `-fsanitize=returns-nonnull-attribute` +* `-fsanitize=shift` +* `-fsanitize=unsigned-shift-base` +* `-fsanitize=signed-integer-overflow` +* `-fsanitize=unreachable` +* `-fsanitize=unsigned-integer-overflow` +* `-fsanitize=vla-bound` + +## Unavailable checks + +Also, note some unavailable checks as are: + +* `-fsanitize=local-bounds` +* `-fsanitize=function` +* `-fsanitize=objc-cast` +* `-fsanitize=vptr` + +## Additional Configuration + +Additional configuration via UBSan options and environment variables may not work as expected, so use with care. \ No newline at end of file diff --git a/runtime/Sanitizer/sanitizer_common/sanitizer_common.h b/runtime/Sanitizer/sanitizer_common/sanitizer_common.h new file mode 100644 index 0000000000..7c1161f75e --- /dev/null +++ b/runtime/Sanitizer/sanitizer_common/sanitizer_common.h @@ -0,0 +1,26 @@ +//===-- sanitizer_common.h --------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file is shared between run-time libraries of sanitizers. +// +// It declares common functions and classes that are used in both runtimes. +// Implementation of some functions are provided in sanitizer_common, while +// others must be defined by run-time library itself. +//===----------------------------------------------------------------------===// + +// NOTE: Needs to be kept in sync with +// compiler-rt/lib/sanitizer_common/sanitizer_common.h from LLVM project. +// But in fact, nothing was used form that header, so leave it as a wrapper for +// used internal headers. + +#ifndef SANITIZER_COMMON_H +#define SANITIZER_COMMON_H + +#include "sanitizer_internal_defs.h" + +#endif // SANITIZER_COMMON_H diff --git a/runtime/Sanitizer/sanitizer_common/sanitizer_internal_defs.h b/runtime/Sanitizer/sanitizer_common/sanitizer_internal_defs.h new file mode 100644 index 0000000000..a8ba685a1c --- /dev/null +++ b/runtime/Sanitizer/sanitizer_common/sanitizer_internal_defs.h @@ -0,0 +1,56 @@ +//===-- sanitizer_internal_defs.h -------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file is shared between AddressSanitizer and ThreadSanitizer. +// It contains macro used in run-time libraries code. +//===----------------------------------------------------------------------===// + +// NOTE: Needs to be kept in sync with +// compiler-rt/lib/sanitizer_common/sanitizer_internal_defs.h from LLVM project. +// But in fact, only typedefs for basic types were used, this is how it is. + +#ifndef SANITIZER_DEFS_H +#define SANITIZER_DEFS_H + +#include "sanitizer_platform.h" + +// For portability reasons we do not include stddef.h, stdint.h or any other +// system header, but we do need some basic types that are not defined +// in a portable way by the language itself. +namespace __sanitizer { + +#if defined(_WIN64) +// 64-bit Windows uses LLP64 data model. +typedef unsigned long long uptr; +typedef signed long long sptr; +#else +#if (SANITIZER_WORDSIZE == 64) || defined(__APPLE__) || defined(_WIN32) +typedef unsigned long uptr; +typedef signed long sptr; +#else +typedef unsigned int uptr; +typedef signed int sptr; +#endif +#endif // defined(_WIN64) + +typedef unsigned char u8; +typedef unsigned short u16; +typedef unsigned int u32; +typedef unsigned long long u64; +typedef signed char s8; +typedef signed short s16; +typedef signed int s32; +typedef signed long long s64; + +} // namespace __sanitizer + +namespace __ubsan { +using namespace __sanitizer; +} + +#endif // SANITIZER_DEFS_H diff --git a/runtime/Sanitizer/sanitizer_common/sanitizer_platform.h b/runtime/Sanitizer/sanitizer_common/sanitizer_platform.h new file mode 100644 index 0000000000..d912a0f051 --- /dev/null +++ b/runtime/Sanitizer/sanitizer_common/sanitizer_platform.h @@ -0,0 +1,25 @@ +//===-- sanitizer_platform.h ------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// Common platform macros. +//===----------------------------------------------------------------------===// + +// NOTE: Needs to be kept in sync with +// compiler-rt/lib/sanitizer_common/sanitizer_platform.h from LLVM project. +// But in fact, only SANITIZER_WORDSIZE macro was used, so how it is. + +#ifndef SANITIZER_PLATFORM_H +#define SANITIZER_PLATFORM_H + +#if __LP64__ || defined(_WIN64) +#define SANITIZER_WORDSIZE 64 +#else +#define SANITIZER_WORDSIZE 32 +#endif + +#endif // SANITIZER_PLATFORM_H diff --git a/runtime/Sanitizer/ubsan/ubsan_checks.inc b/runtime/Sanitizer/ubsan/ubsan_checks.inc new file mode 100644 index 0000000000..4edc09921d --- /dev/null +++ b/runtime/Sanitizer/ubsan/ubsan_checks.inc @@ -0,0 +1,79 @@ +//===-- ubsan_checks.inc ----------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// List of checks handled by UBSan runtime. +// +//===----------------------------------------------------------------------===// + +// NOTE: Needs to be kept in sync with compiler-rt/lib/ubsan/ubsan_checks.inc +// from LLVM project. +// Especially new ErrorType to `get_suffix` function from ubsan_handlers.cpp and +// corresponding tests to test\Feature\ubsan directory should be added. + +#include "klee/Config/Version.h" + +#ifndef UBSAN_CHECK +# error "Define UBSAN_CHECK prior to including this file!" +#endif + +// UBSAN_CHECK(Name, SummaryKind, FSanitizeFlagName) +// SummaryKind and FSanitizeFlagName should be string literals. + +UBSAN_CHECK(GenericUB, "undefined-behavior", "undefined") +UBSAN_CHECK(NullPointerUse, "null-pointer-use", "null") +UBSAN_CHECK(NullPointerUseWithNullability, "null-pointer-use", + "nullability-assign") +UBSAN_CHECK(NullptrWithOffset, "nullptr-with-offset", "pointer-overflow") +UBSAN_CHECK(NullptrWithNonZeroOffset, "nullptr-with-nonzero-offset", + "pointer-overflow") +UBSAN_CHECK(NullptrAfterNonZeroOffset, "nullptr-after-nonzero-offset", + "pointer-overflow") +UBSAN_CHECK(PointerOverflow, "pointer-overflow", "pointer-overflow") +UBSAN_CHECK(MisalignedPointerUse, "misaligned-pointer-use", "alignment") +UBSAN_CHECK(AlignmentAssumption, "alignment-assumption", "alignment") +UBSAN_CHECK(InsufficientObjectSize, "insufficient-object-size", "object-size") +UBSAN_CHECK(SignedIntegerOverflow, "signed-integer-overflow", + "signed-integer-overflow") +UBSAN_CHECK(UnsignedIntegerOverflow, "unsigned-integer-overflow", + "unsigned-integer-overflow") +UBSAN_CHECK(IntegerDivideByZero, "integer-divide-by-zero", + "integer-divide-by-zero") +UBSAN_CHECK(FloatDivideByZero, "float-divide-by-zero", "float-divide-by-zero") +UBSAN_CHECK(InvalidBuiltin, "invalid-builtin-use", "invalid-builtin-use") +UBSAN_CHECK(InvalidObjCCast, "invalid-objc-cast", "invalid-objc-cast") +UBSAN_CHECK(ImplicitUnsignedIntegerTruncation, + "implicit-unsigned-integer-truncation", + "implicit-unsigned-integer-truncation") +UBSAN_CHECK(ImplicitSignedIntegerTruncation, + "implicit-signed-integer-truncation", + "implicit-signed-integer-truncation") +UBSAN_CHECK(ImplicitIntegerSignChange, + "implicit-integer-sign-change", + "implicit-integer-sign-change") +UBSAN_CHECK(ImplicitSignedIntegerTruncationOrSignChange, + "implicit-signed-integer-truncation-or-sign-change", + "implicit-signed-integer-truncation,implicit-integer-sign-change") +UBSAN_CHECK(InvalidShiftBase, "invalid-shift-base", "shift-base") +UBSAN_CHECK(InvalidShiftExponent, "invalid-shift-exponent", "shift-exponent") +UBSAN_CHECK(OutOfBoundsIndex, "out-of-bounds-index", "bounds") +UBSAN_CHECK(UnreachableCall, "unreachable-call", "unreachable") +UBSAN_CHECK(MissingReturn, "missing-return", "return") +UBSAN_CHECK(NonPositiveVLAIndex, "non-positive-vla-index", "vla-bound") +UBSAN_CHECK(FloatCastOverflow, "float-cast-overflow", "float-cast-overflow") +UBSAN_CHECK(InvalidBoolLoad, "invalid-bool-load", "bool") +UBSAN_CHECK(InvalidEnumLoad, "invalid-enum-load", "enum") +UBSAN_CHECK(FunctionTypeMismatch, "function-type-mismatch", "function") +UBSAN_CHECK(InvalidNullReturn, "invalid-null-return", + "returns-nonnull-attribute") +UBSAN_CHECK(InvalidNullReturnWithNullability, "invalid-null-return", + "nullability-return") +UBSAN_CHECK(InvalidNullArgument, "invalid-null-argument", "nonnull-attribute") +UBSAN_CHECK(InvalidNullArgumentWithNullability, "invalid-null-argument", + "nullability-arg") +UBSAN_CHECK(DynamicTypeMismatch, "dynamic-type-mismatch", "vptr") +UBSAN_CHECK(CFIBadType, "cfi-bad-type", "cfi") diff --git a/runtime/Sanitizer/ubsan/ubsan_diag.h b/runtime/Sanitizer/ubsan/ubsan_diag.h new file mode 100644 index 0000000000..29e92ea19e --- /dev/null +++ b/runtime/Sanitizer/ubsan/ubsan_diag.h @@ -0,0 +1,42 @@ +//===-- ubsan_diag.h --------------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// Diagnostics emission for Clang's undefined behavior sanitizer. +// +//===----------------------------------------------------------------------===// + +// NOTE: Needs to be kept in sync with compiler-rt/lib/ubsan/ubsan_diag.h +// from LLVM project. +// But in fact, only TypeName in TypeDescriptor and ErrorType commonly were used, +// so how it is. + +#ifndef UBSAN_DIAG_H +#define UBSAN_DIAG_H + +#include "ubsan_value.h" + +namespace __ubsan { + +/// \brief A C++ type name. Really just a strong typedef for 'const char*'. +class TypeName { + const char *Name; + +public: + TypeName(const char *Name) : Name(Name) {} + const char *getName() const { return Name; } +}; + +enum class ErrorType { +#define UBSAN_CHECK(Name, SummaryKind, FSanitizeFlagName) Name, +#include "ubsan_checks.inc" +#undef UBSAN_CHECK +}; + +} // namespace __ubsan + +#endif // UBSAN_DIAG_H diff --git a/runtime/Sanitizer/ubsan/ubsan_handlers.cpp b/runtime/Sanitizer/ubsan/ubsan_handlers.cpp new file mode 100644 index 0000000000..c1f94bebc2 --- /dev/null +++ b/runtime/Sanitizer/ubsan/ubsan_handlers.cpp @@ -0,0 +1,504 @@ +//===-- ubsan_handlers.cpp ------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// Error logging entry points for the UBSan runtime. +// +//===----------------------------------------------------------------------===// + +// NOTE: Needs to be kept in sync with compiler-rt/lib/ubsan/ubsan_handlers.cpp +// from LLVM project. + +#include "ubsan_handlers.h" +#include "ubsan_diag.h" + +extern "C" __attribute__((noreturn)) void klee_report_error(const char *file, + int line, + const char *message, + const char *suffix); + +namespace __ubsan { +static const char *ConvertTypeToString(ErrorType Type) { + switch (Type) { +#define UBSAN_CHECK(Name, SummaryKind, FSanitizeFlagName) \ + case ErrorType::Name: \ + return SummaryKind; +#include "ubsan_checks.inc" +#undef UBSAN_CHECK + } +} + +__attribute__((noreturn)) static void report_error(const char *msg, + const char *suffix) { + klee_report_error(__FILE__, __LINE__, msg, suffix); +} + +static const char *get_suffix(ErrorType ET) { + switch (ET) { + case ErrorType::GenericUB: + // This ErrorType is only used in actual LLVM runtime + // when `report_error_type` environment option is set to false. + // It should never happen in KLEE runtime. + return "exec.err"; + case ErrorType::NullPointerUse: + case ErrorType::NullPointerUseWithNullability: + case ErrorType::NullptrWithOffset: + case ErrorType::NullptrWithNonZeroOffset: + case ErrorType::NullptrAfterNonZeroOffset: + case ErrorType::PointerOverflow: + case ErrorType::MisalignedPointerUse: + case ErrorType::AlignmentAssumption: + return "ptr.err"; + case ErrorType::InsufficientObjectSize: + // Convenient test has not been found in LLVM sources and therefore not been + // added. + return "ptr.err"; + case ErrorType::SignedIntegerOverflow: + case ErrorType::UnsignedIntegerOverflow: + return "overflow.err"; + case ErrorType::IntegerDivideByZero: + case ErrorType::FloatDivideByZero: + return "div.err"; + case ErrorType::InvalidBuiltin: + return "invalid_builtin_use.err"; + case ErrorType::InvalidObjCCast: + // Option `fsanitize=objc-cast` is not supported due to the requirement for + // Darwin system. + return "exec.err"; + case ErrorType::ImplicitUnsignedIntegerTruncation: + case ErrorType::ImplicitSignedIntegerTruncation: + return "implicit_truncation.err"; + case ErrorType::ImplicitIntegerSignChange: + case ErrorType::ImplicitSignedIntegerTruncationOrSignChange: + return "implicit_conversion.err"; + case ErrorType::InvalidShiftBase: + case ErrorType::InvalidShiftExponent: + return "overflow.err"; + case ErrorType::OutOfBoundsIndex: + return "ptr.err"; + case ErrorType::UnreachableCall: + return "unreachable_call.err"; + case ErrorType::MissingReturn: + return "missing_return.err"; + case ErrorType::NonPositiveVLAIndex: + return "ptr.err"; + case ErrorType::FloatCastOverflow: + return "overflow.err"; + case ErrorType::InvalidBoolLoad: + case ErrorType::InvalidEnumLoad: + return "invalid_load.err"; + case ErrorType::FunctionTypeMismatch: + // This check is unsupported + return "exec.err"; + case ErrorType::InvalidNullReturn: + case ErrorType::InvalidNullReturnWithNullability: + case ErrorType::InvalidNullArgument: + case ErrorType::InvalidNullArgumentWithNullability: + return "nullable_attribute.err"; + case ErrorType::DynamicTypeMismatch: + case ErrorType::CFIBadType: + // These checks are unsupported + return "exec.err"; + default: + // In case something is not modelled + return "exec.err"; + } +} +__attribute__((noreturn)) static void report_error_type(ErrorType ET) { + report_error(ConvertTypeToString(ET), get_suffix(ET)); +} + +/// Situations in which we might emit a check for the suitability of a +/// pointer or glvalue. Needs to be kept in sync with CodeGenFunction.h in +/// clang. +enum TypeCheckKind { + /// Checking the operand of a load. Must be suitably sized and aligned. + TCK_Load, + /// Checking the destination of a store. Must be suitably sized and aligned. + TCK_Store, + /// Checking the bound value in a reference binding. Must be suitably sized + /// and aligned, but is not required to refer to an object (until the + /// reference is used), per core issue 453. + TCK_ReferenceBinding, + /// Checking the object expression in a non-static data member access. Must + /// be an object within its lifetime. + TCK_MemberAccess, + /// Checking the 'this' pointer for a call to a non-static member function. + /// Must be an object within its lifetime. + TCK_MemberCall, + /// Checking the 'this' pointer for a constructor call. + TCK_ConstructorCall, + /// Checking the operand of a static_cast to a derived pointer type. Must be + /// null or an object within its lifetime. + TCK_DowncastPointer, + /// Checking the operand of a static_cast to a derived reference type. Must + /// be an object within its lifetime. + TCK_DowncastReference, + /// Checking the operand of a cast to a base object. Must be suitably sized + /// and aligned. + TCK_Upcast, + /// Checking the operand of a cast to a virtual base object. Must be an + /// object within its lifetime. + TCK_UpcastToVirtualBase, + /// Checking the value assigned to a _Nonnull pointer. Must not be null. + TCK_NonnullAssign, + /// Checking the operand of a dynamic_cast or a typeid expression. Must be + /// null or an object within its lifetime. + TCK_DynamicOperation +}; + +static void handleTypeMismatchImpl(TypeMismatchData *Data, + ValueHandle Pointer) { + uptr Alignment = (uptr)1 << Data->LogAlignment; + ErrorType ET; + if (!Pointer) + ET = (Data->TypeCheckKind == TCK_NonnullAssign) + ? ErrorType::NullPointerUseWithNullability + : ErrorType::NullPointerUse; + else if (Pointer & (Alignment - 1)) + ET = ErrorType::MisalignedPointerUse; + else + ET = ErrorType::InsufficientObjectSize; + + report_error_type(ET); +} + +extern "C" void __ubsan_handle_type_mismatch_v1(TypeMismatchData *Data, + ValueHandle Pointer) { + + handleTypeMismatchImpl(Data, Pointer); +} + +extern "C" void __ubsan_handle_type_mismatch_v1_abort(TypeMismatchData *Data, + ValueHandle Pointer) { + + handleTypeMismatchImpl(Data, Pointer); +} + +static void handleAlignmentAssumptionImpl(AlignmentAssumptionData * /*Data*/, + ValueHandle /*Pointer*/, + ValueHandle /*Alignment*/, + ValueHandle /*Offset*/) { + ErrorType ET = ErrorType::AlignmentAssumption; + report_error_type(ET); +} + +extern "C" void +__ubsan_handle_alignment_assumption(AlignmentAssumptionData *Data, + ValueHandle Pointer, ValueHandle Alignment, + ValueHandle Offset) { + handleAlignmentAssumptionImpl(Data, Pointer, Alignment, Offset); +} + +extern "C" void __ubsan_handle_alignment_assumption_abort( + AlignmentAssumptionData *Data, ValueHandle Pointer, ValueHandle Alignment, + ValueHandle Offset) { + handleAlignmentAssumptionImpl(Data, Pointer, Alignment, Offset); +} + +/// \brief Common diagnostic emission for various forms of integer overflow. +static void handleIntegerOverflowImpl(OverflowData *Data, ValueHandle /*LHS*/, + const char * /*Operator*/) { + bool IsSigned = Data->Type.isSignedIntegerTy(); + ErrorType ET = IsSigned ? ErrorType::SignedIntegerOverflow + : ErrorType::UnsignedIntegerOverflow; + report_error_type(ET); +} + +#define UBSAN_OVERFLOW_HANDLER(handler_name, op, unrecoverable) \ + extern "C" void handler_name(OverflowData *Data, ValueHandle LHS, \ + ValueHandle RHS) { \ + handleIntegerOverflowImpl(Data, LHS, op); \ + } + +UBSAN_OVERFLOW_HANDLER(__ubsan_handle_add_overflow, "+", false) +UBSAN_OVERFLOW_HANDLER(__ubsan_handle_add_overflow_abort, "+", true) +UBSAN_OVERFLOW_HANDLER(__ubsan_handle_sub_overflow, "-", false) +UBSAN_OVERFLOW_HANDLER(__ubsan_handle_sub_overflow_abort, "-", true) +UBSAN_OVERFLOW_HANDLER(__ubsan_handle_mul_overflow, "*", false) +UBSAN_OVERFLOW_HANDLER(__ubsan_handle_mul_overflow_abort, "*", true) + +static void handleNegateOverflowImpl(OverflowData *Data, + ValueHandle /*OldVal*/) { + bool IsSigned = Data->Type.isSignedIntegerTy(); + ErrorType ET = IsSigned ? ErrorType::SignedIntegerOverflow + : ErrorType::UnsignedIntegerOverflow; + report_error_type(ET); +} + +extern "C" void __ubsan_handle_negate_overflow(OverflowData *Data, + ValueHandle OldVal) { + handleNegateOverflowImpl(Data, OldVal); +} + +extern "C" void __ubsan_handle_negate_overflow_abort(OverflowData *Data, + ValueHandle OldVal) { + handleNegateOverflowImpl(Data, OldVal); +} + +static void handleDivremOverflowImpl(OverflowData *Data, ValueHandle /*LHS*/, + ValueHandle /*RHS*/) { + if (Data->Type.isIntegerTy()) + report_error("integer division overflow", "overflow.err"); + else { + ErrorType ET = ErrorType::FloatDivideByZero; + report_error_type(ET); + } +} + +extern "C" void __ubsan_handle_divrem_overflow(OverflowData *Data, + ValueHandle LHS, + ValueHandle RHS) { + handleDivremOverflowImpl(Data, LHS, RHS); +} + +extern "C" void __ubsan_handle_divrem_overflow_abort(OverflowData *Data, + ValueHandle LHS, + ValueHandle RHS) { + handleDivremOverflowImpl(Data, LHS, RHS); +} + +static void handleShiftOutOfBoundsImpl(ShiftOutOfBoundsData * /*Data*/, + ValueHandle /*LHS*/, + ValueHandle /*RHS*/) { + report_error("shift out of bounds", "overflow.err"); +} + +extern "C" void __ubsan_handle_shift_out_of_bounds(ShiftOutOfBoundsData *Data, + ValueHandle LHS, + ValueHandle RHS) { + handleShiftOutOfBoundsImpl(Data, LHS, RHS); +} + +extern "C" void +__ubsan_handle_shift_out_of_bounds_abort(ShiftOutOfBoundsData *Data, + ValueHandle LHS, ValueHandle RHS) { + handleShiftOutOfBoundsImpl(Data, LHS, RHS); +} + +static void handleOutOfBoundsImpl(OutOfBoundsData * /*Data*/, + ValueHandle /*Index*/) { + ErrorType ET = ErrorType::OutOfBoundsIndex; + report_error_type(ET); +} + +extern "C" void __ubsan_handle_out_of_bounds(OutOfBoundsData *Data, + ValueHandle Index) { + handleOutOfBoundsImpl(Data, Index); +} + +extern "C" void __ubsan_handle_out_of_bounds_abort(OutOfBoundsData *Data, + ValueHandle Index) { + handleOutOfBoundsImpl(Data, Index); +} + +static void handleBuiltinUnreachableImpl(UnreachableData * /*Data*/) { + ErrorType ET = ErrorType::UnreachableCall; + report_error_type(ET); +} + +extern "C" void __ubsan_handle_builtin_unreachable(UnreachableData *Data) { + handleBuiltinUnreachableImpl(Data); +} + +static void handleMissingReturnImpl(UnreachableData * /*Data*/) { + ErrorType ET = ErrorType::MissingReturn; + report_error_type(ET); +} + +extern "C" void __ubsan_handle_missing_return(UnreachableData *Data) { + handleMissingReturnImpl(Data); +} + +static void handleVLABoundNotPositive(VLABoundData * /*Data*/, + ValueHandle /*Bound*/) { + ErrorType ET = ErrorType::NonPositiveVLAIndex; + report_error_type(ET); +} + +extern "C" void __ubsan_handle_vla_bound_not_positive(VLABoundData *Data, + ValueHandle Bound) { + handleVLABoundNotPositive(Data, Bound); +} + +extern "C" void __ubsan_handle_vla_bound_not_positive_abort(VLABoundData *Data, + ValueHandle Bound) { + handleVLABoundNotPositive(Data, Bound); +} + +static void handleFloatCastOverflow(void * /*DataPtr*/, ValueHandle /*From*/) { + ErrorType ET = ErrorType::FloatCastOverflow; + report_error_type(ET); +} + +extern "C" void __ubsan_handle_float_cast_overflow(void *Data, + ValueHandle From) { + handleFloatCastOverflow(Data, From); +} + +extern "C" void __ubsan_handle_float_cast_overflow_abort(void *Data, + ValueHandle From) { + handleFloatCastOverflow(Data, From); +} + +static void handleLoadInvalidValue(InvalidValueData * /*Data*/, + ValueHandle /*Val*/) { + report_error("load invalid value", "invalid_load.err"); +} + +extern "C" void __ubsan_handle_load_invalid_value(InvalidValueData *Data, + ValueHandle Val) { + handleLoadInvalidValue(Data, Val); +} +extern "C" void __ubsan_handle_load_invalid_value_abort(InvalidValueData *Data, + ValueHandle Val) { + handleLoadInvalidValue(Data, Val); +} + +static void handleImplicitConversion(ImplicitConversionData *Data, + ValueHandle /*Src*/, ValueHandle /*Dst*/) { + ErrorType ET = ErrorType::GenericUB; + + const TypeDescriptor &SrcTy = Data->FromType; + const TypeDescriptor &DstTy = Data->ToType; + + bool SrcSigned = SrcTy.isSignedIntegerTy(); + bool DstSigned = DstTy.isSignedIntegerTy(); + + switch (Data->Kind) { + case ICCK_IntegerTruncation: { // Legacy, no longer used. + // Let's figure out what it should be as per the new types, and upgrade. + // If both types are unsigned, then it's an unsigned truncation. + // Else, it is a signed truncation. + if (!SrcSigned && !DstSigned) { + ET = ErrorType::ImplicitUnsignedIntegerTruncation; + } else { + ET = ErrorType::ImplicitSignedIntegerTruncation; + } + break; + } + case ICCK_UnsignedIntegerTruncation: + ET = ErrorType::ImplicitUnsignedIntegerTruncation; + break; + case ICCK_SignedIntegerTruncation: + ET = ErrorType::ImplicitSignedIntegerTruncation; + break; + case ICCK_IntegerSignChange: + ET = ErrorType::ImplicitIntegerSignChange; + break; + case ICCK_SignedIntegerTruncationOrSignChange: + ET = ErrorType::ImplicitSignedIntegerTruncationOrSignChange; + break; + } + report_error_type(ET); +} + +extern "C" void __ubsan_handle_implicit_conversion(ImplicitConversionData *Data, + ValueHandle Src, + ValueHandle Dst) { + handleImplicitConversion(Data, Src, Dst); +} + +extern "C" void +__ubsan_handle_implicit_conversion_abort(ImplicitConversionData *Data, + ValueHandle Src, ValueHandle Dst) { + handleImplicitConversion(Data, Src, Dst); +} + +static void handleInvalidBuiltin(InvalidBuiltinData * /*Data*/) { + ErrorType ET = ErrorType::InvalidBuiltin; + report_error_type(ET); +} + +extern "C" void __ubsan_handle_invalid_builtin(InvalidBuiltinData *Data) { + handleInvalidBuiltin(Data); +} + +extern "C" void __ubsan_handle_invalid_builtin_abort(InvalidBuiltinData *Data) { + handleInvalidBuiltin(Data); +} + +static void handleNonNullReturn(NonNullReturnData * /*Data*/, + SourceLocation * /*LocPtr*/, bool IsAttr) { + ErrorType ET = IsAttr ? ErrorType::InvalidNullReturn + : ErrorType::InvalidNullReturnWithNullability; + report_error_type(ET); +} + +extern "C" void __ubsan_handle_nonnull_return_v1(NonNullReturnData *Data, + SourceLocation *LocPtr) { + handleNonNullReturn(Data, LocPtr, true); +} + +extern "C" void __ubsan_handle_nonnull_return_v1_abort(NonNullReturnData *Data, + SourceLocation *LocPtr) { + handleNonNullReturn(Data, LocPtr, true); +} + +extern "C" void __ubsan_handle_nullability_return_v1(NonNullReturnData *Data, + SourceLocation *LocPtr) { + handleNonNullReturn(Data, LocPtr, false); +} + +extern "C" void +__ubsan_handle_nullability_return_v1_abort(NonNullReturnData *Data, + SourceLocation *LocPtr) { + handleNonNullReturn(Data, LocPtr, false); +} + +static void handleNonNullArg(NonNullArgData * /*Data*/, bool IsAttr) { + ErrorType ET = IsAttr ? ErrorType::InvalidNullArgument + : ErrorType::InvalidNullArgumentWithNullability; + report_error_type(ET); +} + +extern "C" void __ubsan_handle_nonnull_arg(NonNullArgData *Data) { + handleNonNullArg(Data, true); +} + +extern "C" void __ubsan_handle_nonnull_arg_abort(NonNullArgData *Data) { + handleNonNullArg(Data, true); +} + +extern "C" void __ubsan_handle_nullability_arg(NonNullArgData *Data) { + handleNonNullArg(Data, false); +} + +extern "C" void __ubsan_handle_nullability_arg_abort(NonNullArgData *Data) { + + handleNonNullArg(Data, false); +} + +static void handlePointerOverflowImpl(PointerOverflowData * /*Data*/, + ValueHandle Base, ValueHandle Result) { + ErrorType ET; + if (Base == 0 && Result == 0) + ET = ErrorType::NullptrWithOffset; + else if (Base == 0 && Result != 0) + ET = ErrorType::NullptrWithNonZeroOffset; + else if (Base != 0 && Result == 0) + ET = ErrorType::NullptrAfterNonZeroOffset; + else + ET = ErrorType::PointerOverflow; + report_error_type(ET); +} + +extern "C" void __ubsan_handle_pointer_overflow(PointerOverflowData *Data, + ValueHandle Base, + ValueHandle Result) { + + handlePointerOverflowImpl(Data, Base, Result); +} + +extern "C" void __ubsan_handle_pointer_overflow_abort(PointerOverflowData *Data, + ValueHandle Base, + ValueHandle Result) { + + handlePointerOverflowImpl(Data, Base, Result); +} + +} // namespace __ubsan \ No newline at end of file diff --git a/runtime/Sanitizer/ubsan/ubsan_handlers.h b/runtime/Sanitizer/ubsan/ubsan_handlers.h new file mode 100644 index 0000000000..93d6326559 --- /dev/null +++ b/runtime/Sanitizer/ubsan/ubsan_handlers.h @@ -0,0 +1,105 @@ +//===-- ubsan_handlers.h ----------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// Entry points to the runtime library for Clang's undefined behavior sanitizer. +// +//===----------------------------------------------------------------------===// + +// NOTE: Needs to be kept in sync with compiler-rt/lib/ubsan/ubsan_handlers.h +// from LLVM project. + +#ifndef UBSAN_HANDLERS_H +#define UBSAN_HANDLERS_H + +#include "ubsan_value.h" + +#include "klee/Config/Version.h" + +using namespace __ubsan; + +struct TypeMismatchData { + SourceLocation Loc; + const TypeDescriptor &Type; + unsigned char LogAlignment; + unsigned char TypeCheckKind; +}; + +struct AlignmentAssumptionData { + SourceLocation Loc; + SourceLocation AssumptionLoc; + const TypeDescriptor &Type; +}; + +struct OverflowData { + SourceLocation Loc; + const TypeDescriptor &Type; +}; + +struct ShiftOutOfBoundsData { + SourceLocation Loc; + const TypeDescriptor &LHSType; + const TypeDescriptor &RHSType; +}; + +struct OutOfBoundsData { + SourceLocation Loc; + const TypeDescriptor &ArrayType; + const TypeDescriptor &IndexType; +}; + +struct UnreachableData { + SourceLocation Loc; +}; + +struct VLABoundData { + SourceLocation Loc; + const TypeDescriptor &Type; +}; + +struct InvalidValueData { + SourceLocation Loc; + const TypeDescriptor &Type; +}; + +/// Known implicit conversion check kinds. +/// Keep in sync with the enum of the same name in CGExprScalar.cpp +enum ImplicitConversionCheckKind : unsigned char { + ICCK_IntegerTruncation = 0, // Legacy, was only used by clang 7. + ICCK_UnsignedIntegerTruncation = 1, + ICCK_SignedIntegerTruncation = 2, + ICCK_IntegerSignChange = 3, + ICCK_SignedIntegerTruncationOrSignChange = 4, +}; + +struct ImplicitConversionData { + SourceLocation Loc; + const TypeDescriptor &FromType; + const TypeDescriptor &ToType; + /* ImplicitConversionCheckKind */ unsigned char Kind; +}; + +struct InvalidBuiltinData { + SourceLocation Loc; + unsigned char Kind; +}; + +struct NonNullReturnData { + SourceLocation AttrLoc; +}; + +struct NonNullArgData { + SourceLocation Loc; + SourceLocation AttrLoc; + int ArgIndex; +}; + +struct PointerOverflowData { + SourceLocation Loc; +}; + +#endif // UBSAN_HANDLERS_H diff --git a/runtime/Sanitizer/ubsan/ubsan_value.h b/runtime/Sanitizer/ubsan/ubsan_value.h new file mode 100644 index 0000000000..02f1adf64f --- /dev/null +++ b/runtime/Sanitizer/ubsan/ubsan_value.h @@ -0,0 +1,82 @@ +//===-- ubsan_value.h -------------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// Representation of data which is passed from the compiler-generated calls into +// the ubsan runtime. +// +//===----------------------------------------------------------------------===// + +// NOTE: Needs to be kept in sync with compiler-rt/lib/ubsan/ubsan_value.h +// from LLVM project. +// But in fact, only subset of TypeDescriptor was used and SourceLocation left +// for later work on specifying location in ubsan_handlers.cpp, so how it is. + +#ifndef UBSAN_VALUE_H +#define UBSAN_VALUE_H + +#include "../sanitizer_common/sanitizer_common.h" + +namespace __ubsan { + +/// \brief A description of a source location. This corresponds to Clang's +/// \c PresumedLoc type. +class SourceLocation { + __attribute__((unused)) const char *Filename; + __attribute__((unused)) u32 Line; + __attribute__((unused)) u32 Column; + +public: + SourceLocation() : Filename(), Line(), Column() {} + SourceLocation(const char *Filename, unsigned Line, unsigned Column) + : Filename(Filename), Line(Line), Column(Column) {} +}; + +/// \brief A description of a type. +class TypeDescriptor { + /// A value from the \c Kind enumeration, specifying what flavor of type we + /// have. + u16 TypeKind; + + /// A \c Type-specific value providing information which allows us to + /// interpret the meaning of a ValueHandle of this type. + u16 TypeInfo; + + /// The name of the type follows, in a format suitable for including in + /// diagnostics. + char TypeName[1]; + +public: + enum Kind { + /// An integer type. Lowest bit is 1 for a signed value, 0 for an unsigned + /// value. Remaining bits are log_2(bit width). The value representation is + /// the integer itself if it fits into a ValueHandle, and a pointer to the + /// integer otherwise. + TK_Integer = 0x0000, + /// A floating-point type. Low 16 bits are bit width. The value + /// representation is that of bitcasting the floating-point value to an + /// integer type. + TK_Float = 0x0001, + /// Any other type. The value representation is unspecified. + TK_Unknown = 0xffff + }; + + const char *getTypeName() const { return TypeName; } + + Kind getKind() const { return static_cast(TypeKind); } + + bool isIntegerTy() const { return getKind() == TK_Integer; } + bool isSignedIntegerTy() const { return isIntegerTy() && (TypeInfo & 1); } + bool isUnsignedIntegerTy() const { return isIntegerTy() && !(TypeInfo & 1); } +}; + +/// \brief An opaque handle to a value. +typedef uptr ValueHandle; + +} // namespace __ubsan + +#endif // UBSAN_VALUE_H diff --git a/runtime/klee-eh-cxx/CMakeLists.txt b/runtime/klee-eh-cxx/CMakeLists.txt index e016757b11..b51b854437 100644 --- a/runtime/klee-eh-cxx/CMakeLists.txt +++ b/runtime/klee-eh-cxx/CMakeLists.txt @@ -16,8 +16,15 @@ set(ADDITIONAL_CXX_FLAGS -nostdinc++ -I "${KLEE_LIBCXXABI_SRC_DIR}/src" -I "${KLEE_LIBCXXABI_SRC_DIR}/include" - -I "${KLEE_LIBCXX_INCLUDE_DIR}" + -I "${KLEE_LIBCXX_INCLUDE_PATH}" + -std=c++11 +) + +if (KLEE_LIBCXX_PLATFORM_INCLUDE_PATH) + list(APPEND ADDITIONAL_CXX_FLAGS + -I "${KLEE_LIBCXX_PLATFORM_INCLUDE_PATH}" ) +endif () # Build it include("${CMAKE_SOURCE_DIR}/cmake/compile_bitcode_library.cmake") prefix_with_path("${SRC_FILES}" "${CMAKE_CURRENT_SOURCE_DIR}/" prefixed_files) diff --git a/runtime/klee-eh-cxx/klee_eh_cxx.cpp b/runtime/klee-eh-cxx/klee_eh_cxx.cpp index 9d86bef40e..cb5e0c7c0a 100644 --- a/runtime/klee-eh-cxx/klee_eh_cxx.cpp +++ b/runtime/klee-eh-cxx/klee_eh_cxx.cpp @@ -90,7 +90,7 @@ get_thrown_object_ptr(_Unwind_Exception* unwind_exception) // Our implementation of a personality function for handling // libcxxabi-exceptions. Follows how libcxxabi's __gxx_personality_v0 handles // exceptions. -[[gnu::used]] extern "C" std::int32_t +extern "C" std::int32_t _klee_eh_cxx_personality(_Unwind_Exception *exceptionPointer, const std::size_t num_bytes, const unsigned char *lp_clauses) { diff --git a/runtime/klee-libc/__cxa_atexit.c b/runtime/klee-libc/__cxa_atexit.c index 027c2d0af0..589399254d 100644 --- a/runtime/klee-libc/__cxa_atexit.c +++ b/runtime/klee-libc/__cxa_atexit.c @@ -38,7 +38,7 @@ int __cxa_atexit(void (*fn)(void*), klee_report_error(__FILE__, __LINE__, "__cxa_atexit: no room in array!", - "exec"); + "exec.err"); AtExit[NumAtExit].fn = fn; AtExit[NumAtExit].arg = arg; diff --git a/runtime/klee-libc/memchr.c b/runtime/klee-libc/memchr.c index fe0670a7a0..3cd47cdf1c 100644 --- a/runtime/klee-libc/memchr.c +++ b/runtime/klee-libc/memchr.c @@ -36,19 +36,14 @@ #include -void * -memchr(s, c, n) - const void *s; - int c; - size_t n; -{ - if (n != 0) { - const unsigned char *p = s; +void *memchr(const void *s, int c, size_t n) { + if (n != 0) { + const unsigned char *p = s; - do { - if (*p++ == c) - return ((void *)(p - 1)); - } while (--n != 0); - } - return (NULL); + do { + if (*p++ == c) + return ((void *)(p - 1)); + } while (--n != 0); + } + return (NULL); } diff --git a/runtime/klee-libc/strcmp.c b/runtime/klee-libc/strcmp.c index cdb002c739..e95df928cb 100644 --- a/runtime/klee-libc/strcmp.c +++ b/runtime/klee-libc/strcmp.c @@ -10,5 +10,5 @@ int strcmp(const char *a, const char *b) { while (*a && *a == *b) ++a, ++b; - return *a - *b; + return *(const unsigned char*)a - *(const unsigned char*)b; } diff --git a/scripts/build/build-ci-container.py b/scripts/build/build-ci-container.py index c92646742f..3f478b54dc 100755 --- a/scripts/build/build-ci-container.py +++ b/scripts/build/build-ci-container.py @@ -3,6 +3,7 @@ import yaml import subprocess import os +import sys (abs_path, _) = os.path.split(os.path.abspath(__file__)) @@ -10,7 +11,6 @@ try: ci_config = yaml.safe_load(stream) global_env = ci_config['env'] - print(ci_config['jobs']['Linux']['strategy']['matrix']['include']) for job in ci_config['jobs']['Linux']['strategy']['matrix']['include']: if job['name'] in ["Docker", "macOS"]: print("Skip: {}".format(job['name'])) @@ -21,11 +21,12 @@ build_env = os.environ.copy() # Copy current global build configurations - build_vars = dict(global_env) + for k,v in global_env.items(): + build_env[k] = str(v) # Override with job specific values for k,v in job['env'].items(): - build_vars[k] = v + build_env[k] = str(v) cmd = [os.path.join(abs_path, 'build.sh'), 'klee', # build KLEE and all its dependencies @@ -35,8 +36,6 @@ '--create-final-image', # assume KLEE is the final image ] - env_str = ["{}={}".format(k,v) for k,v in build_vars.items()] - print("{} {}".format(" ".join(env_str)," ".join(cmd)) ) process = subprocess.Popen(cmd, # Assume KLEE is the final image stdout=subprocess.PIPE, @@ -47,11 +46,13 @@ output = process.stdout.readline() print(output.strip()) return_code = process.poll() - if return_code is not None: - print('Building image failed: {}'.format(return_code)) - for output in process.stdout.readlines(): - print(output.strip()) + if return_code != None: break + if return_code != 0: + print('Building image failed: {}'.format(return_code)) + for output in process.stdout.readlines(): + print(output.strip()) + sys.exit(1) except yaml.YAMLError as exc: print(exc) \ No newline at end of file diff --git a/scripts/build/build.sh b/scripts/build/build.sh index 2ddb7bd64c..65fe4ee0d3 100755 --- a/scripts/build/build.sh +++ b/scripts/build/build.sh @@ -328,6 +328,11 @@ build_docker() { for f in "${DIR}/patches/${v}"*.patch; do cp -r "$f" "${temp_dir}/patches/" done + + mkdir -p "${temp_dir}/sanitizer" + for f in "${DIR}/sanitizer/${v}"*.txt; do + cp -r "$f" "${temp_dir}/sanitizer/" + done done shopt -u nullglob # disallow nullglobing diff --git a/scripts/build/d-klee-linux-ubuntu.inc b/scripts/build/d-klee-linux-ubuntu.inc index 16db5cdf22..30526bb5e6 100644 --- a/scripts/build/d-klee-linux-ubuntu.inc +++ b/scripts/build/d-klee-linux-ubuntu.inc @@ -1,7 +1,7 @@ # TODO remove adding sudo package # Create ``klee`` user for container with password ``klee``. # and give it password-less sudo access (temporarily so we can use the CI scripts) -RUN apt update && DEBIAN_FRONTEND=noninteractive apt -y --no-install-recommends install sudo emacs-nox vim-nox file python3-dateutil && \ +RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get -y --no-install-recommends install sudo emacs-nox vim-nox file python3-dateutil && \ rm -rf /var/lib/apt/lists/* && \ useradd -m klee && \ echo klee:klee | chpasswd && \ @@ -11,19 +11,23 @@ RUN apt update && DEBIAN_FRONTEND=noninteractive apt -y --no-install-recommends # Copy across source files needed for build COPY --chown=klee:klee . /tmp/klee_src/ +USER klee +WORKDIR /home/klee # Build and set klee user to be owner -RUN /tmp/klee_src/scripts/build/build.sh --debug --install-system-deps klee && chown -R klee:klee /tmp/klee_build* && pip3 install flask wllvm && \ - rm -rf /var/lib/apt/lists/* +RUN /tmp/klee_src/scripts/build/build.sh --debug --install-system-deps klee && pip3 install flask wllvm && \ + sudo rm -rf /var/lib/apt/lists/* + -ENV PATH="$PATH:/tmp/llvm-60-install_O_D_A/bin:/home/klee/klee_build/bin" +ENV PATH="$PATH:/tmp/llvm-110-install_O_D_A/bin:/home/klee/klee_build/bin:/home/klee/.local/bin" ENV BASE=/tmp -USER klee -WORKDIR /home/klee +# Add KLEE header files to system standard include folder +RUN sudo /bin/bash -c 'ln -s /tmp/klee_src/include/klee /usr/include/' + ENV LD_LIBRARY_PATH /home/klee/klee_build/lib/ # Add KLEE binary directory to PATH RUN /bin/bash -c 'ln -s ${BASE}/klee_src /home/klee/ && ln -s ${BASE}/klee_build* /home/klee/klee_build' # TODO Remove when STP is fixed -RUN /bin/bash -c 'echo "export LD_LIBRARY_PATH=$(cd ${BASE}/metaSMT-*-deps/stp-git-basic/lib/ && pwd):$LD_LIBRARY_PATH" >> /home/klee/.bashrc' +RUN /bin/bash -c 'echo "export LD_LIBRARY_PATH=$(cd ${BASE}/metaSMT-*-deps/stp-git-basic/lib/ && pwd):$LD_LIBRARY_PATH" >> /home/klee/.bashrc' \ No newline at end of file diff --git a/scripts/build/p-clang-linux-arch.inc b/scripts/build/p-clang-linux-arch.inc new file mode 100644 index 0000000000..bd83d7c463 --- /dev/null +++ b/scripts/build/p-clang-linux-arch.inc @@ -0,0 +1,34 @@ +install_binary_artifact_clang() { + local LLVM_VERSION_MAJOR="${LLVM_VERSION/.*/}" + local version="-${LLVM_VERSION_MAJOR}" + + source "${DIR}/common-functions" + + dependencies=( + "llvm${version}" + "clang${version}" + ) + + #Install essential dependencies + with_sudo pacman --no-confirm -S "${dependencies[@]}" || return 1 +} + +setup_artifact_variables_clang() { + local LLVM_VERSION_MAJOR="${LLVM_VERSION/.*/}" + local version="-${LLVM_VERSION_MAJOR}" + + # Only set LLVM_CONFIG if not set yet + if [[ -z "${LLVM_CONFIG:-}" ]]; then + LLVM_CONFIG=$(which "llvm-config${version}") + fi + + local bin_path="" + bin_path=$(which "clang${version}") + [[ -z "${bin_path}" ]] && return 1 + + bin_path="$(dirname "$(readlink -f "${bin_path}")")" + [[ -z "${bin_path}" ]] && return 1 + + BITCODE_CC="${bin_path}/clang" + BITCODE_CXX="${bin_path}/clang++" +} diff --git a/scripts/build/p-clang-linux-debian.inc b/scripts/build/p-clang-linux-debian.inc new file mode 100644 index 0000000000..85f02c1432 --- /dev/null +++ b/scripts/build/p-clang-linux-debian.inc @@ -0,0 +1,61 @@ +install_binary_artifact_clang() { + local LLVM_VERSION_MAJOR="${LLVM_VERSION/.*/}" + local version="-${LLVM_VERSION_MAJOR}" + + source "${DIR}/common-functions" + with_sudo apt-get update -y + + # Check if package in standard repository otherwise use upstream + if ! apt-cache show "llvm${version}"; then + if [[ -z "$(which wget)" ]]; then + # Add certificate + with_sudo apt-get update -y + dependencies=( + ca-certificates + wget + lsb-release + gnupg + ) + with_sudo apt-get -y --no-install-recommends install "${dependencies[@]}" + fi + + # Add LLVM upstream repository if available + codename="$(lsb_release --codename --short)" + if wget -q "https://apt.llvm.org/${codename}/dists/llvm-toolchain-${codename}${version}/"; then + apt_entry="deb http://apt.llvm.org/${codename}/ llvm-toolchain-${codename}${version} main" + if ! grep -rq "${apt_entry}" /etc/apt; then + wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key| with_sudo apt-key add - + echo "${apt_entry}" | with_sudo tee -a /etc/apt/sources.list + with_sudo apt-get update -y + fi + fi + fi + + dependencies=( + "llvm${version}" + "clang${version}" + ) + + #Install essential dependencies + with_sudo apt-get -y --no-install-recommends install "${dependencies[@]}" || return 1 +} + +setup_artifact_variables_clang() { + local LLVM_VERSION_MAJOR="${LLVM_VERSION/.*/}" + local version="-${LLVM_VERSION_MAJOR}" + + # Only set LLVM_CONFIG if not set yet + if [[ -z "${LLVM_CONFIG:-}" ]]; then + LLVM_CONFIG=$(which "llvm-config${version}") + fi + + local bin_path="" + bin_path=$(which "clang${version}") + [[ -z "${bin_path}" ]] && return 1 + + bin_path="$(dirname "$(readlink -f "${bin_path}")")" + [[ -z "${bin_path}" ]] && return 1 + + BITCODE_CC="${bin_path}/clang" + BITCODE_CXX="${bin_path}/clang++" +} \ No newline at end of file diff --git a/scripts/build/p-clang-linux-ubuntu-22.04.inc b/scripts/build/p-clang-linux-ubuntu-22.04.inc new file mode 100644 index 0000000000..8220b1f823 --- /dev/null +++ b/scripts/build/p-clang-linux-ubuntu-22.04.inc @@ -0,0 +1,4 @@ +get_docker_config_id_clang() { + echo "" + return 0; +} diff --git a/scripts/build/p-clang-linux-ubuntu.inc b/scripts/build/p-clang-linux-ubuntu.inc index 9dac1352e8..85f02c1432 100644 --- a/scripts/build/p-clang-linux-ubuntu.inc +++ b/scripts/build/p-clang-linux-ubuntu.inc @@ -1,46 +1,61 @@ install_binary_artifact_clang() { local LLVM_VERSION_MAJOR="${LLVM_VERSION/.*/}" - local LLVM_VERSION_MINOR="${LLVM_VERSION/*./}" - - local version="" - [[ "${LLVM_VERSION_MAJOR}" -le 6 ]] && version="-${LLVM_VERSION}" - [[ "${LLVM_VERSION_MAJOR}" -ge 7 ]] && version="-${LLVM_VERSION_MAJOR}" + local version="-${LLVM_VERSION_MAJOR}" source "${DIR}/common-functions" + with_sudo apt-get update -y + + # Check if package in standard repository otherwise use upstream + if ! apt-cache show "llvm${version}"; then + if [[ -z "$(which wget)" ]]; then + # Add certificate + with_sudo apt-get update -y + dependencies=( + ca-certificates + wget + lsb-release + gnupg + ) + with_sudo apt-get -y --no-install-recommends install "${dependencies[@]}" + fi - # Add certificate - with_sudo apt update -y - dependencies=( - ca-certificates - wget - lsb-release - gnupg - ) - with_sudo apt -y --no-install-recommends install "${dependencies[@]}" - - # Add LLVM upstream repository if available - codename="$(lsb_release --codename --short)" - if wget -q "https://apt.llvm.org/${codename}/dists/llvm-toolchain-${codename}${version}/"; then - wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key| with_sudo apt-key add - - - apt_entry="deb http://apt.llvm.org/${codename}/ llvm-toolchain-${codename}${version} main" - if ! grep -rq "${apt_entry}" /etc/apt; then - echo "${apt_entry}" | with_sudo tee -a /etc/apt/sources.list - with_sudo apt update -y + # Add LLVM upstream repository if available + codename="$(lsb_release --codename --short)" + if wget -q "https://apt.llvm.org/${codename}/dists/llvm-toolchain-${codename}${version}/"; then + apt_entry="deb http://apt.llvm.org/${codename}/ llvm-toolchain-${codename}${version} main" + if ! grep -rq "${apt_entry}" /etc/apt; then + wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key| with_sudo apt-key add - + echo "${apt_entry}" | with_sudo tee -a /etc/apt/sources.list + with_sudo apt-get update -y + fi fi fi - - with_sudo apt update -y dependencies=( "llvm${version}" "clang${version}" ) #Install essential dependencies - with_sudo apt -y --no-install-recommends install "${dependencies[@]}" || return 1 + with_sudo apt-get -y --no-install-recommends install "${dependencies[@]}" || return 1 } -get_docker_config_id_clang() { - return 0 -} +setup_artifact_variables_clang() { + local LLVM_VERSION_MAJOR="${LLVM_VERSION/.*/}" + local version="-${LLVM_VERSION_MAJOR}" + + # Only set LLVM_CONFIG if not set yet + if [[ -z "${LLVM_CONFIG:-}" ]]; then + LLVM_CONFIG=$(which "llvm-config${version}") + fi + + local bin_path="" + bin_path=$(which "clang${version}") + [[ -z "${bin_path}" ]] && return 1 + + bin_path="$(dirname "$(readlink -f "${bin_path}")")" + [[ -z "${bin_path}" ]] && return 1 + + BITCODE_CC="${bin_path}/clang" + BITCODE_CXX="${bin_path}/clang++" +} \ No newline at end of file diff --git a/scripts/build/p-clang-linux.inc b/scripts/build/p-clang-linux.inc index 25f468fa41..519333c65f 100644 --- a/scripts/build/p-clang-linux.inc +++ b/scripts/build/p-clang-linux.inc @@ -1,18 +1,18 @@ setup_artifact_variables_clang() { local LLVM_VERSION_MAJOR="${LLVM_VERSION/.*/}" - local LLVM_VERSION_MINOR="${LLVM_VERSION/*./}" - local version="" - [[ "${LLVM_VERSION_MAJOR}" -le 6 ]] && version="-${LLVM_VERSION}" - [[ "${LLVM_VERSION_MAJOR}" -ge 7 ]] && version="-${LLVM_VERSION_MAJOR}" + local version="-${LLVM_VERSION_MAJOR}" # Only set LLVM_CONFIG if not set yet if [[ -z "${LLVM_CONFIG:-}" ]]; then LLVM_CONFIG=$(which "llvm-config${version}") fi - local bin_path="" - bin_path="$(dirname "$(readlink -f "$(which "clang${version}")")")" + bin_path=$(which "clang${version}") + [[ -z "${bin_path}" ]] && return 1 + + bin_path="$(dirname "$(readlink -f "${bin_path}")")" + [[ -z "${bin_path}" ]] && return 1 BITCODE_CC="${bin_path}/clang" BITCODE_CXX="${bin_path}/clang++" @@ -21,10 +21,7 @@ setup_artifact_variables_clang() { # Check if the binary artifact is installed is_installed_clang() { local LLVM_VERSION_MAJOR="${LLVM_VERSION/.*/}" - local LLVM_VERSION_MINOR="${LLVM_VERSION/*./}" - local version="" - [[ "${LLVM_VERSION_MAJOR}" -le 6 ]] && version="${LLVM_VERSION}" - [[ "${LLVM_VERSION_MAJOR}" -ge 7 ]] && version="${LLVM_VERSION_MAJOR}" + local version="${LLVM_VERSION_MAJOR}" # Check if clang with the right version exists which "clang-${version}" diff --git a/scripts/build/p-clang-osx.inc b/scripts/build/p-clang-osx.inc index a0ef5a9def..10621f1d84 100644 --- a/scripts/build/p-clang-osx.inc +++ b/scripts/build/p-clang-osx.inc @@ -2,7 +2,7 @@ install_binary_artifact_clang () { # Use the brew provided package LLVM_VERSION_MAJOR="${LLVM_VERSION/.*/}" - brew install "llvm\@${LLVM_VERSION_MAJOR}" + brew install "llvm@${LLVM_VERSION_MAJOR}" } # Check if the binary artifact is installed diff --git a/scripts/build/p-clang.inc b/scripts/build/p-clang.inc new file mode 100644 index 0000000000..1b4593c94c --- /dev/null +++ b/scripts/build/p-clang.inc @@ -0,0 +1,62 @@ +local_setup_build_variables_clang() { + source "${DIR}/common-functions" + LLVM_SUFFIX="" + + LLVM_SUFFIX+="_O" + LLVM_SUFFIX+="_ND" + LLVM_SUFFIX+="_NA" + LLVM_SUFFIX+="_RTTI" + + LLVM_SRC_BASE="${BASE}/llvm-${LLVM_VERSION_SHORT}" + LLVM_BUILD="${LLVM_SRC_BASE}-build${LLVM_SUFFIX}" + LLVM_INSTALL="${LLVM_SRC_BASE}-install${LLVM_SUFFIX}" + LLVM_BIN="${LLVM_INSTALL}/bin" + LLVM_BUILD_BIN="${LLVM_BUILD}/bin" + + LLVM_CONFIG="${LLVM_BIN}/llvm-config" + BITCODE_CC="${LLVM_BIN}/clang" + BITCODE_CXX="${LLVM_BIN}/clang++" +} + +get_docker_config_id_clang() { + ( + local_setup_build_variables_clang + echo "${LLVM_VERSION_SHORT}${LLVM_SUFFIX}" + ) +} + +get_build_artifacts_clang() { + ( + local_setup_build_variables_clang + echo "${LLVM_INSTALL}" + ) +} + +# Check if the binary artifact is installed +is_installed_clang() { + local LLVM_VERSION_MAJOR="${LLVM_VERSION/.*/}" + local version="${LLVM_VERSION_MAJOR}" + + ( + local_setup_build_variables_clang + # Check if clang is installed at a potential location + [[ -f "${LLVM_BIN}/clang" ]] + ) +} + +setup_artifact_variables_clang() { + is_installed_clang || return 1 + + local LLVM_VERSION_MAJOR="${LLVM_VERSION/.*/}" + local version="${LLVM_VERSION_MAJOR}" + local_setup_build_variables_clang + echo "${LLVM_INSTALL}" +} + +install_build_dependencies_clang() { + return 0 +} + +setup_build_variables_clang() { + return 0 +} \ No newline at end of file diff --git a/scripts/build/p-klee-linux-ubuntu.inc b/scripts/build/p-klee-linux-ubuntu.inc index c2a0808c3c..8bf39a199b 100644 --- a/scripts/build/p-klee-linux-ubuntu.inc +++ b/scripts/build/p-klee-linux-ubuntu.inc @@ -12,6 +12,12 @@ install_build_dependencies_klee() { python3-wheel ) + if [[ "${SOLVERS:-}" == "metaSMT" ]]; then + dependencies+=( + libboost-dev + libgmp-dev + ) + fi if [[ $(to_bool "${COVERAGE}") -eq 1 ]]; then dependencies+=(lcov curl git) fi @@ -20,7 +26,7 @@ install_build_dependencies_klee() { dependencies+=(doxygen graphviz) fi - with_sudo apt -y --no-install-recommends install "${dependencies[@]}" + with_sudo apt-get -y --no-install-recommends install "${dependencies[@]}" pip3 install --user lit pip3 install --user tabulate diff --git a/scripts/build/p-klee-osx.inc b/scripts/build/p-klee-osx.inc index 0561e28f68..4cc0b3e8aa 100644 --- a/scripts/build/p-klee-osx.inc +++ b/scripts/build/p-klee-osx.inc @@ -7,7 +7,7 @@ install_build_dependencies_klee() { brew install doxygen graphviz fi - pip3 install --user --upgrade lit tabulate + brew install python-tabulate lit # Get path of package location base_path=$(python3 -m site --user-base) diff --git a/scripts/build/p-klee.inc b/scripts/build/p-klee.inc index 4137cac027..b7384b91bd 100644 --- a/scripts/build/p-klee.inc +++ b/scripts/build/p-klee.inc @@ -17,9 +17,7 @@ build_klee() { CMAKE_PREFIX_PATH=("") local CMAKE_ARGUMENTS=( - "-DLLVM_CONFIG_BINARY=${LLVM_CONFIG}" - "-DLLVMCC=${BITCODE_CC}" - "-DLLVMCXX=${BITCODE_CXX}" + "-DLLVM_DIR=${LLVM_INSTALL}" "-DGTEST_SRC_DIR=${GTEST_INSTALL_PATH}" "-DENABLE_UNIT_TESTS=TRUE" "-DENABLE_SYSTEM_TESTS=TRUE" @@ -34,13 +32,11 @@ build_klee() { if [ "${UCLIBC_VERSION}" != "0" ]; then CMAKE_ARGUMENTS+=( - "-DENABLE_KLEE_UCLIBC=TRUE" "-DKLEE_UCLIBC_PATH=${BASE}/klee-uclibc-${LLVM_VERSION_SHORT}" "-DENABLE_POSIX_RUNTIME=TRUE" ) else CMAKE_ARGUMENTS+=( - "-DENABLE_KLEE_UCLIBC=FALSE" "-DENABLE_POSIX_RUNTIME=FALSE" ) fi @@ -53,10 +49,7 @@ if [ "${USE_LIBCXX}" -eq 1 ]; then CMAKE_ARGUMENTS+=( "-DENABLE_KLEE_LIBCXX=TRUE" "-DKLEE_LIBCXX_DIR=${LIBCXX_INSTALL}" - "-DKLEE_LIBCXX_INCLUDE_DIR=${LIBCXX_INSTALL}/include/c++/v1" - ) - local LLVM_VERSION_MAJOR="${LLVM_VERSION/.*/}" - [[ "${LLVM_VERSION_MAJOR}" -ge 8 ]] && CMAKE_ARGUMENTS+=( + "-DKLEE_LIBCXX_INCLUDE_DIR=${LIBCXX_INSTALL}/include/" "-DENABLE_KLEE_EH_CXX=TRUE" "-DKLEE_LIBCXXABI_SRC_DIR=${LIBCXX_SRC}/libcxxabi" ) @@ -165,12 +158,18 @@ fi CXX_FLAGS+=("${SANITIZER_CXX_FLAGS[@]}") LD_FLAGS+=("${SANITIZER_LD_FLAGS[@]}") + SANITIZER_DIR="$(cd "$(dirname "${SANITIZER_BITCODE_CC}")" && pwd)" + CMAKE_ARGUMENTS+=( "-DCMAKE_C_COMPILER=${SANITIZER_C_COMPILER}" "-DCMAKE_CXX_COMPILER=${SANITIZER_CXX_COMPILER}" ) fi + CMAKE_ARGUMENTS+=( + "-DLLVMCC=${BITCODE_CC}" + "-DLLVMCXX=${BITCODE_CXX}" + ) mkdir -p "${KLEE_BUILD_DIR}" || return 1 diff --git a/scripts/build/p-libcxx-linux-arch.inc b/scripts/build/p-libcxx-linux-arch.inc new file mode 100644 index 0000000000..826de2a3bd --- /dev/null +++ b/scripts/build/p-libcxx-linux-arch.inc @@ -0,0 +1,20 @@ +install_build_dependencies_libcxx() { + source "${DIR}/common-functions" + + with_sudo apt-get update -y + dependencies=( + ca-certificates + base-devel + git + python + python-pip + curl + file # Needed for wllvm + ) + + with_sudo pacman --no-confirm -S "${dependencies[@]}" + + pip install --user wllvm + base_path="$(python -m site --user-base)" + export PATH="$PATH:${base_path}/bin" +} diff --git a/scripts/build/p-libcxx-linux-debian.inc b/scripts/build/p-libcxx-linux-debian.inc new file mode 100644 index 0000000000..623ec1f237 --- /dev/null +++ b/scripts/build/p-libcxx-linux-debian.inc @@ -0,0 +1,20 @@ +install_build_dependencies_libcxx() { + source "${DIR}/common-functions" + + with_sudo apt-get update -y + dependencies=( + build-essential + ca-certificates + git + python3 + python3-pip + curl + file # Needed for wllvm + ) + + with_sudo apt -y --no-install-recommends install "${dependencies[@]}" + + pip3 install --user wllvm + base_path="$(python3 -m site --user-base)" + export PATH="$PATH:${base_path}/bin" +} \ No newline at end of file diff --git a/scripts/build/p-libcxx.inc b/scripts/build/p-libcxx.inc index 3ee4166092..42d556c906 100644 --- a/scripts/build/p-libcxx.inc +++ b/scripts/build/p-libcxx.inc @@ -30,7 +30,6 @@ build_libcxx() { local LLVM_VERSION_MAJOR="${LLVM_VERSION/.*/}" local cmake_flags=( - "-DLLVM_ENABLE_PROJECTS=libcxx;libcxxabi" "-DLLVM_ENABLE_THREADS:BOOL=OFF" "-DLIBCXX_ENABLE_THREADS:BOOL=OFF" "-DLIBCXX_ENABLE_SHARED:BOOL=ON" @@ -39,6 +38,13 @@ build_libcxx() { "-DCMAKE_INSTALL_PREFIX=${LIBCXX_INSTALL}" ) + if [[ "${LLVM_VERSION_SHORT}" -ge "140" ]]; then + cmake_flags+=("-DLLVM_ENABLE_RUNTIMES=libcxx;libcxxabi") + cmake_flags+=("-DLLVM_ENABLE_PROJECTS=") + cmake_flags+=("-DLLVM_ENABLE_PROJECTS_USED:BOOL=ON") + else + cmake_flags+=("-DLLVM_ENABLE_PROJECTS=libcxx;libcxxabi") + fi # Static ABI libraries are not supported under OS X if [[ "${OS}" == "osx" ]]; then cmake_flags+=("-DLIBCXX_ENABLE_STATIC_ABI_LIBRARY:BOOL=OFF") @@ -53,7 +59,11 @@ build_libcxx() { export LLVM_COMPILER_PATH="$(dirname "${BITCODE_CC}")" cmake "${cmake_flags[@]}" "${LIBCXX_SRC}/llvm" - make cxx -j$(nproc) || make cxx + if [[ "${LLVM_VERSION_SHORT}" -ge "140" ]]; then + make runtimes "-j$(nproc)" || make runtimes || return 1 + else + make cxx "-j$(nproc)" || make cxx || return 1 + fi ) } @@ -65,21 +75,29 @@ install_libcxx() { export LLVM_COMPILER=clang export LLVM_COMPILER_PATH="$(dirname "${BITCODE_CC}")" - cd "${LIBCXX_BUILD}/projects" - make install - + local LLVM_VERSION_MAJOR="${LLVM_VERSION/.*/}" local libraries - if [[ "${OS}" == "osx" ]]; then - libraries=("${LIBCXX_INSTALL}"/lib/lib*.dylib) + if [[ "${LLVM_VERSION_SHORT}" -ge "140" ]]; then + cd "${LIBCXX_BUILD}/runtimes" || return 1 + make install || return 1 + if [[ "${OS}" == "osx" ]]; then + libraries=("${LIBCXX_INSTALL}"/lib/*/lib*.dylib) + else + libraries=("${LIBCXX_INSTALL}"/lib/*/lib*.so) + fi + libraries+=("${LIBCXX_INSTALL}"/lib/*/lib*.a) else - libraries=("${LIBCXX_INSTALL}"/lib/lib*.so) + cd "${LIBCXX_BUILD}/projects" || return 1 + make install || return 1 + if [[ "${OS}" == "osx" ]]; then + libraries=("${LIBCXX_INSTALL}"/lib/lib*.dylib) + else + libraries=("${LIBCXX_INSTALL}"/lib/lib*.so) + fi + libraries+=("${LIBCXX_INSTALL}"/lib/lib*.a) fi - local LLVM_VERSION_MAJOR="${LLVM_VERSION/.*/}" - libraries+=("${LIBCXX_INSTALL}"/lib/lib*.a) - - for p in "${libraries[@]}" ; do extract-bc "$p" done @@ -107,9 +125,10 @@ get_build_artifacts_libcxx() { ( setup_build_variables_libcxx echo "${LIBCXX_INSTALL}" + echo "${LIBCXX_SRC}" ) } setup_artifact_variables_libcxx() { setup_build_variables_libcxx -} \ No newline at end of file +} diff --git a/scripts/build/p-llvm-linux-arch.inc b/scripts/build/p-llvm-linux-arch.inc new file mode 100644 index 0000000000..e0e3cd9f3f --- /dev/null +++ b/scripts/build/p-llvm-linux-arch.inc @@ -0,0 +1,144 @@ +# Build dependencies +install_build_dependencies_llvm() { + source "${DIR}/common-functions" + + dependencies=( + ca-certificates + base-devel + autoconf + automake + groff + gcc + g++ + python-distutils-extra + make + git # To check out code + zlib1g-dev + git + ninja + ) + + #Install essential dependencies + with_sudo pacman --no-confirm -S "${dependencies[@]}" +} + +install_binary_artifact_llvm() { + # No need to check for optimised, we can build against LLVM with optimised and non-optimised versions + # local enable_optimized=$(to_bool "${ENABLE_OPTIMIZED}") + local enable_debug + enable_debug=$(to_bool "${ENABLE_DEBUG}") + local disable_assertions + disable_assertions=$(to_bool "${DISABLE_ASSERTIONS}") + local requires_rtti + requires_rtti=$(to_bool "${REQUIRES_RTTI}") + local LLVM_VERSION_MAJOR="${LLVM_VERSION/.*/}" + local version="${LLVM_VERSION_MAJOR}" + + # No support for LLVM packages with debug information, incompatible if requested otherwise + [[ "${enable_debug}" -eq 1 ]] && return 1 + + # Packages are build with assertions disabled, incompatible if requested otherwise + [[ "${disable_assertions}" -eq 0 ]] && return 1 + + # Packages are build with RTTI enabled, incompatible if requested otherwise + [[ "${requires_rtti}" -eq 0 ]] && return 1 + + # Enable/Disable optimized does not matter + source "${DIR}/common-functions" + + dependencies=( + "llvm-${version}" + "llvm-${version}-dev" + "llvm-${version}-runtime" + "clang-${version}" + ) + + # Install essential dependencies + with_sudo pacman --no-confirm -S "${dependencies[@]}" || return 1 +} + +check_llvm_config_version() { + local check_mode=1 + strict_mode="$1" # if llvm-config should be checked strictly + local lc="" + lc="$2" # path to llvm-config + + # If not set return error + [[ -n "${lc}" ]] || return 1 + + # First check, if the provided llvm-config is a full path + if [[ ! -f "${lc}" ]]; then + # Nothing found, assume it's just the name of the binary in path, find the path + lc=$(which "${lc}") + + # If path not found return error + [[ -z "${lc}" ]] && return 1 + fi + + local LLVM_VERSION_MAJOR="${LLVM_VERSION/.*/}" + local version="${LLVM_VERSION_MAJOR}" + + # Check for llvm-config without suffix but correct version number + [[ $($lc --version) == "${LLVM_VERSION}"* ]] || return 1 + + # In case correct version numbers are required, return already + [[ "${check_mode}" == "0" ]] && return 0; + + local rtti + rtti="$(${lc} --has-rtti)" + local assertion + assertion="$(${lc} --assertion-mode)" + local build_mode + build_mode="$(${lc} --build-mode)" + + # Check requested mode with mode of the found item + [[ $(to_bool "${REQUIRES_RTTI}") -eq $(to_bool "${rtti}") ]] || return 1 + [[ $(to_bool "${DISABLE_ASSERTIONS}") -ne $(to_bool "${assertion}") ]] || return 1 + + local shared_mode + shared_mode="$(${lc} --shared-mode)" || return 1 +} + +# Check if the binary artifact is installed +is_installed_llvm() { + # Check for variables set and not empty + local LLVM_VERSION_MAJOR="${LLVM_VERSION/.*/}" + local version="${LLVM_VERSION_MAJOR}" + + # Check for llvm-config without suffix but correct version number + local lc + + # First check with the version-specific number + lc=$(which "llvm-config-${LLVM_VERSION_MAJOR}") + check_llvm_config_version 1 "${lc}" && return 0 + + return 1 +} + +setup_artifact_variables_llvm() { + # Check for variables set and not empty + local LLVM_VERSION_MAJOR="${LLVM_VERSION/.*/}" + local version="${LLVM_VERSION_MAJOR}" + + local lc="" + # Check for llvm-config without suffix but correct version number + lc=$(which "llvm-config") + local is_ins + is_ins=$(check_llvm_config_version 1 "${lc}") + if [[ ! "${is_ins}" ]]; then + # Check if llvm-config with the right version exists + lc=$(which "llvm-config-${version}") || return 1 + is_ins=$(check_llvm_config_version 1 "${lc}") || return 1 + fi + + LLVM_CONFIG="${lc}" + LLVM_INSTALL="$(${lc} --prefix)" + LLVM_BIN="$(${lc} --bindir)" + BITCODE_CC="${LLVM_BIN}/clang" + BITCODE_CXX="${LLVM_BIN}/clang++" +} + +get_build_artifacts_llvm() { + is_installed_llvm || return 1 + return 0 +} diff --git a/scripts/build/p-llvm-linux-debian.inc b/scripts/build/p-llvm-linux-debian.inc new file mode 100644 index 0000000000..440afbd4c3 --- /dev/null +++ b/scripts/build/p-llvm-linux-debian.inc @@ -0,0 +1,180 @@ +# Build dependencies +install_build_dependencies_llvm() { + source "${DIR}/common-functions" + + with_sudo apt update -y + + dependencies=( + ca-certificates + build-essential + autoconf + automake + groff + gcc + g++ + python3-distutils + make + git # To check out code + zlib1g-dev + git + ninja-build + ) + + if [[ "${SANITIZERS[*]}" == "memory" ]]; then + dependencies+=(ninja-build) + fi + + #Install essential dependencies + with_sudo apt -y --no-install-recommends install "${dependencies[@]}" +} + +install_binary_artifact_llvm() { + # No need to check for optimised, we can build against LLVM with optimised and non-optimised versions + # local enable_optimized=$(to_bool "${ENABLE_OPTIMIZED}") + local enable_debug + enable_debug=$(to_bool "${ENABLE_DEBUG}") + local disable_assertions + disable_assertions=$(to_bool "${DISABLE_ASSERTIONS}") + local requires_rtti + requires_rtti=$(to_bool "${REQUIRES_RTTI}") + local LLVM_VERSION_MAJOR="${LLVM_VERSION/.*/}" + local version="${LLVM_VERSION_MAJOR}" + + + + # No support for LLVM packages with debug information, incompatible if requested otherwise + [[ "${enable_debug}" -eq 1 ]] && return 1 + + # Packages are build with assertions disabled, incompatible if requested otherwise + [[ "${disable_assertions}" -eq 0 ]] && return 1 + + # Packages are build with RTTI enabled, incompatible if requested otherwise + [[ "${requires_rtti}" -eq 0 ]] && return 1 + + # Enable/Disable optimized does not matter + source "${DIR}/common-functions" + + # Check if package in standard repository otherwise use upstream + with_sudo apt-get update -y + if ! apt-cache show "llvm-${version}"; then + if [[ -z "$(which wget)" ]]; then + # Add certificate + with_sudo apt-get update -y + dependencies=( + ca-certificates + wget + lsb-release + gnupg + ) + with_sudo apt-get -y --no-install-recommends install "${dependencies[@]}" + fi + + # Add LLVM upstream repository if available + codename="$(lsb_release --codename --short)" + if wget -q "https://apt.llvm.org/${codename}/dists/llvm-toolchain-${codename}${version}/"; then + apt_entry="deb http://apt.llvm.org/${codename}/ llvm-toolchain-${codename}${version} main" + if ! grep -rq "${apt_entry}" /etc/apt; then + wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key| with_sudo apt-key add - + echo "${apt_entry}" | with_sudo tee -a /etc/apt/sources.list + with_sudo apt-get update -y + fi + fi + fi + + dependencies=( + "llvm-${version}" + "llvm-${version}-dev" + "llvm-${version}-runtime" + "clang-${version}" + ) + + #Install essential dependencies + with_sudo apt-get -y --no-install-recommends install "${dependencies[@]}" || return 1 +} + +check_llvm_config_version() { + local check_mode=1 + strict_mode="$1" # if llvm-config should be checked strictly + local lc="" + lc="$2" # path to llvm-config + + # If not set return error + [[ -n "${lc}" ]] || return 1 + + # First check, if the provided llvm-config is a full path + if [[ ! -f "${lc}" ]]; then + # Nothing found, assume it's just the name of the binary in path, find the path + lc=$(which "${lc}") + + # If path not found return error + [[ -z "${lc}" ]] && return 1 + fi + + local LLVM_VERSION_MAJOR="${LLVM_VERSION/.*/}" + local version="${LLVM_VERSION_MAJOR}" + + # Check for llvm-config without suffix but correct version number + [[ $($lc --version) == "${LLVM_VERSION}"* ]] || return 1 + + # In case correct version numbers are required, return already + [[ "${check_mode}" == "0" ]] && return 0; + + local rtti + rtti="$(${lc} --has-rtti)" + local assertion + assertion="$(${lc} --assertion-mode)" + local build_mode + build_mode="$(${lc} --build-mode)" + + # Check requested mode with mode of the found item + [[ $(to_bool "${REQUIRES_RTTI}") -eq $(to_bool "${rtti}") ]] || return 1 + [[ $(to_bool "${DISABLE_ASSERTIONS}") -ne $(to_bool "${assertion}") ]] || return 1 + + local shared_mode + shared_mode="$(${lc} --shared-mode)" || return 1 +} + +# Check if the binary artifact is installed +is_installed_llvm() { + # Check for variables set and not empty + local LLVM_VERSION_MAJOR="${LLVM_VERSION/.*/}" + local version="${LLVM_VERSION_MAJOR}" + + # Check for llvm-config without suffix but correct version number + local lc + + # First check with the version-specific number + lc=$(which "llvm-config-${LLVM_VERSION_MAJOR}") + check_llvm_config_version 1 "${lc}" && return 0 + + + return 1 +} + +setup_artifact_variables_llvm() { + # Check for variables set and not empty + local LLVM_VERSION_MAJOR="${LLVM_VERSION/.*/}" + local version="${LLVM_VERSION_MAJOR}" + + local lc="" + # Check for llvm-config without suffix but correct version number + lc=$(which "llvm-config") + local is_ins + is_ins=$(check_llvm_config_version 1 "${lc}") + if [[ ! "${is_ins}" ]]; then + # Check if llvm-config with the right version exists + lc=$(which "llvm-config-${version}") || return 1 + is_ins=$(check_llvm_config_version 1 "${lc}") || return 1 + fi + + LLVM_CONFIG="${lc}" + LLVM_INSTALL="$(${lc} --prefix)" + LLVM_BIN="$(${lc} --bindir)" + BITCODE_CC="${LLVM_BIN}/clang" + BITCODE_CXX="${LLVM_BIN}/clang++" +} + +get_build_artifacts_llvm() { + is_installed_llvm || return 1 + return 0 +} \ No newline at end of file diff --git a/scripts/build/p-llvm-linux-ubuntu.inc b/scripts/build/p-llvm-linux-ubuntu.inc index 421fe8cdd5..440afbd4c3 100644 --- a/scripts/build/p-llvm-linux-ubuntu.inc +++ b/scripts/build/p-llvm-linux-ubuntu.inc @@ -12,12 +12,12 @@ install_build_dependencies_llvm() { groff gcc g++ - python-dev python3-distutils make git # To check out code zlib1g-dev git + ninja-build ) if [[ "${SANITIZERS[*]}" == "memory" ]]; then @@ -31,11 +31,15 @@ install_build_dependencies_llvm() { install_binary_artifact_llvm() { # No need to check for optimised, we can build against LLVM with optimised and non-optimised versions # local enable_optimized=$(to_bool "${ENABLE_OPTIMIZED}") - local enable_debug=$(to_bool "${ENABLE_DEBUG}") - local disable_assertions=$(to_bool "${DISABLE_ASSERTIONS}") - local requires_rtti=$(to_bool "${REQUIRES_RTTI}") + local enable_debug + enable_debug=$(to_bool "${ENABLE_DEBUG}") + local disable_assertions + disable_assertions=$(to_bool "${DISABLE_ASSERTIONS}") + local requires_rtti + requires_rtti=$(to_bool "${REQUIRES_RTTI}") local LLVM_VERSION_MAJOR="${LLVM_VERSION/.*/}" - local LLVM_VERSION_MINOR="${LLVM_VERSION/*./}" + local version="${LLVM_VERSION_MAJOR}" + # No support for LLVM packages with debug information, incompatible if requested otherwise @@ -50,41 +54,42 @@ install_binary_artifact_llvm() { # Enable/Disable optimized does not matter source "${DIR}/common-functions" - # Add certificate - with_sudo apt update -y - dependencies=( - ca-certificates - wget - lsb-release - gnupg - ) - with_sudo apt -y --no-install-recommends install "${dependencies[@]}" - - local version="" - [[ "${LLVM_VERSION_MAJOR}" -le 6 ]] && version="-${LLVM_VERSION}" - [[ "${LLVM_VERSION_MAJOR}" -ge 7 ]] && version="-${LLVM_VERSION_MAJOR}" - - # Add LLVM upstream repository if available - codename="$(lsb_release --codename --short)" - if wget -q "https://apt.llvm.org/${codename}/dists/llvm-toolchain-${codename}${version}/"; then - wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key| with_sudo apt-key add - + # Check if package in standard repository otherwise use upstream + with_sudo apt-get update -y + if ! apt-cache show "llvm-${version}"; then + if [[ -z "$(which wget)" ]]; then + # Add certificate + with_sudo apt-get update -y + dependencies=( + ca-certificates + wget + lsb-release + gnupg + ) + with_sudo apt-get -y --no-install-recommends install "${dependencies[@]}" + fi - apt_entry="deb http://apt.llvm.org/${codename}/ llvm-toolchain-${codename}${version} main" - if ! grep -rq "${apt_entry}" /etc/apt; then - echo "${apt_entry}" | with_sudo tee -a /etc/apt/sources.list - with_sudo apt update -y + # Add LLVM upstream repository if available + codename="$(lsb_release --codename --short)" + if wget -q "https://apt.llvm.org/${codename}/dists/llvm-toolchain-${codename}${version}/"; then + apt_entry="deb http://apt.llvm.org/${codename}/ llvm-toolchain-${codename}${version} main" + if ! grep -rq "${apt_entry}" /etc/apt; then + wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key| with_sudo apt-key add - + echo "${apt_entry}" | with_sudo tee -a /etc/apt/sources.list + with_sudo apt-get update -y + fi fi fi dependencies=( - "llvm${version}" - "llvm${version}-dev" - "llvm${version}-runtime" - "clang${version}" + "llvm-${version}" + "llvm-${version}-dev" + "llvm-${version}-runtime" + "clang-${version}" ) #Install essential dependencies - with_sudo apt -y --no-install-recommends install "${dependencies[@]}" || return 1 + with_sudo apt-get -y --no-install-recommends install "${dependencies[@]}" || return 1 } check_llvm_config_version() { @@ -94,7 +99,7 @@ check_llvm_config_version() { lc="$2" # path to llvm-config # If not set return error - [[ -z "${lc}" ]] && return 1 + [[ -n "${lc}" ]] || return 1 # First check, if the provided llvm-config is a full path if [[ ! -f "${lc}" ]]; then @@ -105,12 +110,8 @@ check_llvm_config_version() { [[ -z "${lc}" ]] && return 1 fi - local version="" local LLVM_VERSION_MAJOR="${LLVM_VERSION/.*/}" - local LLVM_VERSION_MINOR="${LLVM_VERSION/*./}" - [[ "${LLVM_VERSION_MAJOR}" -le 6 ]] && version="${LLVM_VERSION}" - [[ "${LLVM_VERSION_MAJOR}" -ge 7 ]] && version="${LLVM_VERSION_MAJOR}" - + local version="${LLVM_VERSION_MAJOR}" # Check for llvm-config without suffix but correct version number [[ $($lc --version) == "${LLVM_VERSION}"* ]] || return 1 @@ -136,11 +137,8 @@ check_llvm_config_version() { # Check if the binary artifact is installed is_installed_llvm() { # Check for variables set and not empty - local version="" local LLVM_VERSION_MAJOR="${LLVM_VERSION/.*/}" - local LLVM_VERSION_MINOR="${LLVM_VERSION/*./}" - [[ "${LLVM_VERSION_MAJOR}" -le 6 ]] && version="${LLVM_VERSION}" - [[ "${LLVM_VERSION_MAJOR}" -ge 7 ]] && version="${LLVM_VERSION_MAJOR}" + local version="${LLVM_VERSION_MAJOR}" # Check for llvm-config without suffix but correct version number local lc @@ -149,40 +147,34 @@ is_installed_llvm() { lc=$(which "llvm-config-${LLVM_VERSION_MAJOR}") check_llvm_config_version 1 "${lc}" && return 0 - # As alternative, try the version-less number - lc=$(which "llvm-config") - check_llvm_config_version 1 "${lc}" && return 0 return 1 } setup_artifact_variables_llvm() { # Check for variables set and not empty - local version="" local LLVM_VERSION_MAJOR="${LLVM_VERSION/.*/}" - local LLVM_VERSION_MINOR="${LLVM_VERSION/*./}" - [[ "${LLVM_VERSION_MAJOR}" -le 6 ]] && version="${LLVM_VERSION}" - [[ "${LLVM_VERSION_MAJOR}" -ge 7 ]] && version="${LLVM_VERSION_MAJOR}" + local version="${LLVM_VERSION_MAJOR}" local lc="" # Check for llvm-config without suffix but correct version number lc=$(which "llvm-config") - local is_ins=$(check_llvm_config_version 1 "${lc}") + local is_ins + is_ins=$(check_llvm_config_version 1 "${lc}") if [[ ! "${is_ins}" ]]; then # Check if llvm-config with the right version exists - lc=$(which "llvm-config-${version}") + lc=$(which "llvm-config-${version}") || return 1 is_ins=$(check_llvm_config_version 1 "${lc}") || return 1 fi LLVM_CONFIG="${lc}" - LLVM_INSTALL="$(${lc} --bindir)" - BITCODE_CC="${LLVM_INSTALL}/clang" - BITCODE_CXX="${LLVM_INSTALL}/clang++" - LLVM_BIN="${LLVM_INSTALL}/bin" + LLVM_INSTALL="$(${lc} --prefix)" + LLVM_BIN="$(${lc} --bindir)" + BITCODE_CC="${LLVM_BIN}/clang" + BITCODE_CXX="${LLVM_BIN}/clang++" } get_build_artifacts_llvm() { - is_installed_llvm - [[ $? -ne 0 ]] && return 1 + is_installed_llvm || return 1 return 0 -} +} \ No newline at end of file diff --git a/scripts/build/p-llvm-osx.inc b/scripts/build/p-llvm-osx.inc index 05e423f3d1..020c52a18a 100644 --- a/scripts/build/p-llvm-osx.inc +++ b/scripts/build/p-llvm-osx.inc @@ -2,20 +2,20 @@ install_binary_artifact_llvm () { # Use the brew provided package LLVM_VERSION_MAJOR="${LLVM_VERSION/.*/}" - brew install "llvm\@${LLVM_VERSION_MAJOR}" + brew install "llvm@${LLVM_VERSION_MAJOR}" } # Check if the binary artifact is installed is_installed_llvm() { # Check if llvm-config with the right version exists LLVM_VERSION_MAJOR="${LLVM_VERSION/.*/}" - [[ -f "/usr/local/opt/llvm@${LLVM_VERSION_MAJOR}/bin/llvm-config" ]] + [[ -f "/opt/homebrew/opt/llvm@${LLVM_VERSION_MAJOR}/bin/llvm-config" ]] } setup_artifact_variables_llvm() { LLVM_VERSION_MAJOR="${LLVM_VERSION/.*/}" - LLVM_CONFIG="/usr/local/opt/llvm@${LLVM_VERSION_MAJOR}/bin/llvm-config" - BITCODE_CC="/usr/local/opt/llvm@${LLVM_VERSION_MAJOR}/bin/clang" - BITCODE_CXX="/usr/local/opt/llvm@${LLVM_VERSION_MAJOR}/bin/clang++" - LLVM_INSTALL="/usr/local/opt/llvm@${LLVM_VERSION_MAJOR}/" + LLVM_CONFIG="/opt/homebrew/opt/llvm@${LLVM_VERSION_MAJOR}/bin/llvm-config" + BITCODE_CC="/opt/homebrew/opt/llvm@${LLVM_VERSION_MAJOR}/bin/clang" + BITCODE_CXX="/opt/homebrew/opt/llvm@${LLVM_VERSION_MAJOR}/bin/clang++" + LLVM_INSTALL="/opt/homebrew/opt/llvm@${LLVM_VERSION_MAJOR}/" } diff --git a/scripts/build/p-llvm.inc b/scripts/build/p-llvm.inc index d1b9374e04..107878da36 100644 --- a/scripts/build/p-llvm.inc +++ b/scripts/build/p-llvm.inc @@ -55,38 +55,14 @@ setup_build_variables_llvm() { LLVM_BIN="${LLVM_INSTALL}/bin" LLVM_BUILD_BIN="${LLVM_BUILD}/bin" + if [[ "${SANITIZER_BUILD:-}" == "memory" ]]; then + LLVM_BUILD_LIBCXX="${LLVM_INSTALL}-libcxx" + fi + + LLVM_CONFIG="${LLVM_BIN}/llvm-config" BITCODE_CC="${LLVM_BIN}/clang" BITCODE_CXX="${LLVM_BIN}/clang++" - - for sanitizer in "${SANITIZERS[@]}"; do - [[ -z "${sanitizer}" ]] && continue - # Undefined Behaviour Sanitizer - if [ "${sanitizer}" == "memory" ]; then - SANITIZER_LLVM_UNINSTRUMENTED="${LLVM_BUILD}_uninstrumented" - SANITIZER_LLVM_LIBCXX="${LLVM_BUILD}_libcxx" - - MSAN_LINK_FLAGS=("-lc++abi" "-Wl,--rpath=${SANITIZER_LLVM_LIBCXX}/lib" "-L${SANITIZER_LLVM_LIBCXX}/lib") - MSAN_FLAGS=("${MSAN_LINK_FLAGS[@]}" -nostdinc++ - -isystem "${SANITIZER_LLVM_LIBCXX}/include" - -isystem "${SANITIZER_LLVM_LIBCXX}/include/c++/v1" - "-fsanitize=memory" - "-fsanitize-memory-track-origins" - -w -fno-omit-frame-pointer -g) - SANITIZER_CXX_FLAGS+=("${MSAN_FLAGS[@]}" "-stdlib=libc++") - SANITIZER_C_FLAGS+=("${MSAN_FLAGS[@]}") - SANITIZER_LD_FLAGS+=("${MSAN_LINK_FLAGS[@]}") - SANITIZER_C_COMPILER="${SANITIZER_LLVM_UNINSTRUMENTED}/bin/clang" - SANITIZER_CXX_COMPILER="${SANITIZER_LLVM_UNINSTRUMENTED}/bin/clang++" - - # Use the uninstrumented compiler - BITCODE_CC="${SANITIZER_C_COMPILER}" - BITCODE_CXX="${SANITIZER_CXX_COMPILER}" - # But point to the instrumented llvm-config - LLVM_CONFIG="${LLVM_BIN}/llvm-config" - continue - fi - done } download_llvm() { @@ -117,71 +93,44 @@ configure_llvm() { local disable_assertions=$(to_bool "${DISABLE_ASSERTIONS}") local requires_rtti=$(to_bool "${REQUIRES_RTTI}") - # For memory sanitizer, we have a multi-stage build process - if [[ "${SANITIZER_BUILD}" == "memory" ]]; then - # Build uninstrumented compiler - mkdir -p "${SANITIZER_LLVM_UNINSTRUMENTED}" - cd "${SANITIZER_LLVM_UNINSTRUMENTED}" - cmake -GNinja -DCMAKE_BUILD_TYPE=Release \ - "-DLLVM_OPTIMIZED_TABLEGEN=ON" \ - "-DLLVM_ENABLE_PROJECTS=clang;compiler-rt;libcxx;libcxxabi" \ - "-DLLVM_TARGETS_TO_BUILD=X86" \ - "${LLVM_SRC_BASE}/llvm" - ninja compiler-rt cxx cxxabi clang || return 1 - - # Build instrumented libc/libc++ - mkdir -p "${SANITIZER_LLVM_LIBCXX}" - cd "${SANITIZER_LLVM_LIBCXX}" - cmake -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo \ - "-DLLVM_ENABLE_PROJECTS=clang;compiler-rt;libcxx;libcxxabi" \ - -DLLVM_USE_SANITIZER=MemoryWithOrigins \ - "-DCMAKE_C_COMPILER=${SANITIZER_C_COMPILER}" \ - "-DCMAKE_CXX_COMPILER=${SANITIZER_CXX_COMPILER}" \ - "-DLLVM_OPTIMIZED_TABLEGEN=ON" \ - "-DLLVM_TARGETS_TO_BUILD=X86" \ - "${LLVM_SRC_BASE}/llvm" - ninja compiler-rt cxx cxxabi || return 1 - - # Build instrumented clang - mkdir -p "${LLVM_BUILD}" - cd "${LLVM_BUILD}" - C_F="${SANITIZER_C_FLAGS[*]}" - CXX_F="${SANITIZER_CXX_FLAGS[*]}" - LD_F="${SANITIZER_LD_FLAGS[*]}" - cmake -GNinja \ - "-DCMAKE_C_COMPILER=${SANITIZER_C_COMPILER}" \ - "-DCMAKE_CXX_COMPILER=${SANITIZER_CXX_COMPILER}" \ - -DCMAKE_C_FLAGS="$C_F" \ - -DCMAKE_CXX_FLAGS="${CXX_F}" \ - -DCMAKE_BUILD_TYPE=RelWithDebInfo \ - "-DLLVM_ENABLE_PROJECTS=clang;compiler-rt;libcxx;libcxxabi" \ - -DLLVM_ENABLE_ASSERTIONS=On \ - -DLLVM_USE_SANITIZER=MemoryWithOrigins \ - -DLLVM_ENABLE_LIBCXX=ON \ - -DCMAKE_EXE_LINKER_FLAGS="${LD_F}" \ - -DCMAKE_INSTALL_PREFIX="${LLVM_INSTALL}" \ - -DBUILD_SHARED_LIBS=ON \ - -DLLVM_OPTIMIZED_TABLEGEN=ON \ - -DLLVM_TARGETS_TO_BUILD=X86 \ - "${LLVM_SRC_BASE}/llvm" - return 0 - fi - # Configure; build; and install mkdir -p "${LLVM_BUILD}" - cd "${LLVM_BUILD}" - - # Skip building if already finished - [[ -e "${LLVM_BUILD}/.build_finished" ]] && return 0 # Configure LLVM CONFIG=( "-DCMAKE_INSTALL_PREFIX=${LLVM_INSTALL}" - "-DLLVM_BUILD_LLVM_DYLIB=TRUE" ) + + if [[ "${SANITIZER_BUILD:-}" == "memory" ]]; then + # Two stage process, build libcxx and libcxxabi + + # Skip building if already finished + if [[ ! -f "${LLVM_BUILD_LIBCXX}/.build_finished" ]]; then + mkdir -p "${LLVM_BUILD_LIBCXX}" + cd "${LLVM_BUILD_LIBCXX}" + cmake -GNinja "${LLVM_SRC_BASE}/llvm" \ + -DCMAKE_BUILD_TYPE=Release \ + -DLLVM_ENABLE_PROJECTS="libcxx;libcxxabi" \ + -DCMAKE_C_COMPILER="${SANITIZER_C_COMPILER}" \ + -DCMAKE_CXX_COMPILER="${SANITIZER_CXX_COMPILER}" \ + -DLLVM_USE_SANITIZER=MemoryWithOrigins + cmake --build . -- cxx cxxabi || return 1 + touch "${LLVM_BUILD_LIBCXX}/.build_finished" + fi + + CONFIG+=( + -DCMAKE_CXX_FLAGS="-fsanitize=memory -stdlib=libc++ -isystem ${LLVM_BUILD_LIBCXX}/include -isystem ${LLVM_BUILD_LIBCXX}/include/c++/v1" + ) + + LLVM_LINKER_FLAGS="-lc++abi -Wl,--rpath=${LLVM_BUILD_LIBCXX}/lib -L${LLVM_BUILD_LIBCXX}/lib -fsanitize=memory -nostdinc++" + fi + + cd "${LLVM_BUILD}" + # Select components to build - CONFIG+=("-DLLVM_ENABLE_PROJECTS=clang;compiler-rt;libcxx;libcxxabi") + local ENABLED_LLVM_PROJECTS + ENABLED_LLVM_PROJECTS="clang" # cmake build if [[ "${enable_optimized}" == "1" && "${enable_debug}" != "1" ]]; then @@ -214,17 +163,51 @@ configure_llvm() { # Remove unneeded targets CONFIG+=( - "-DLLVM_INCLUDE_EXAMPLES=OFF" - "-DCLANG_INCLUDE_TESTS=OFF" - "-DLLVM_INCLUDE_BENCHMARKS=OFF" - "-DBUILD_SHARED_LIBS=ON" - "-DLLVM_OPTIMIZED_TABLEGEN=ON" - "-DLLVM_TARGETS_TO_BUILD=X86" + "-DLLVM_INCLUDE_BENCHMARKS:BOOL=OFF" + "-DLLVM_INCLUDE_EXAMPLES:BOOL=OFF" + "-DLLVM_INCLUDE_TESTS:BOOL=OFF" + "-DLLVM_OPTIMIZED_TABLEGEN:BOOL=TRUE" + "-DLLVM_TARGETS_TO_BUILD:STRING=X86" + "-DLLVM_INSTALL_UTILS:BOOL=TRUE" # Install FileCheck and Not + "-DLLVM_PARALLEL_LINK_JOBS=1" + "-DCLANG_INCLUDE_TESTS:BOOL=OFF" ) + if [[ "${SANITIZER_BUILD:-}" == "memory" ]]; then + # We have to build without libunwind if RTTI is disabled + CONFIG+=("-DLLVM_ENABLE_PROJECTS=${ENABLED_LLVM_PROJECTS}") + else + CONFIG+=( + "-DLLVM_BUILD_LLVM_DYLIB:BOOL=ON" + "-DLLVM_LINK_LLVM_DYLIB:BOOL=ON" + "-DLLVM_BUILD_STATIC:BOOL=OFF" + "-DLIBCLANG_BUILD_STATIC:BOOL=OFF" + ) + if [[ "${LLVM_VERSION_SHORT}" -ge "140" ]]; then + CONFIG+=("-DLLVM_ENABLE_PROJECTS=${ENABLED_LLVM_PROJECTS}") + CONFIG+=("-DLLVM_ENABLE_RUNTIMES=libcxx;libcxxabi") + else + CONFIG+=("-DLLVM_ENABLE_PROJECTS=${ENABLED_LLVM_PROJECTS};libcxx;libcxxabi") + fi + fi + if [[ -n ${SANITIZER_BUILD} ]]; then - CC="${SANITIZER_C_COMPILER}" - CXX="${SANITIZER_CXX_COMPILER}" + if [[ -n "${SANITIZER_C_COMPILER:-}" ]]; then + CC="${SANITIZER_C_COMPILER}" + fi + if [[ -n "${SANITIZER_CXX_COMPILER:-}" ]]; then + CXX="${SANITIZER_CXX_COMPILER}" + fi + + if [[ "${SANITIZER_BUILD}" == "address" ]] ; then + CONFIG+=("-DLLVM_USE_SANITIZER=Address") + fi + if [[ "${SANITIZER_BUILD}" == "undefined" ]] ; then + CONFIG+=("-DLLVM_USE_SANITIZER=Undefined") + fi + if [[ "${SANITIZER_BUILD}" == "memory" ]] ; then + CONFIG+=("-DLLVM_USE_SANITIZER=MemoryWithOrigins") + fi fi ( @@ -236,21 +219,19 @@ configure_llvm() { export "CXX=${CXX}" fi - if [[ -n "${LDFLAGS:-}" ]]; then - export "LDFLAGS=${LLVM_LDFLAGS}" + if [[ -n "${LLVM_LINKER_FLAGS:-}" ]]; then + export "LDFLAGS=${LLVM_LINKER_FLAGS}" fi - cmake "${CONFIG[@]}" "${LLVM_SRC_BASE}/llvm" + cmake -G Ninja "${CONFIG[@]}" "${LLVM_SRC_BASE}/llvm" ) } build_llvm() { - configure_llvm - ( - if [[ "${SANITIZER_BUILD}" == "memory" ]]; then - ninja clang|| return 1 - return 0 - fi + # Skip building if already finished + [[ -f "${LLVM_BUILD}/.build_finished" ]] && return 0 + configure_llvm || return 1 + ( if [[ -n "${CC:-}" ]]; then export "CC=${CC}" fi @@ -259,45 +240,23 @@ build_llvm() { export "CXX=${CXX}" fi - if [[ -n "${LDFLAGS:-}" ]]; then - export "LDFLAGS=${LLVM_LDFLAGS}" + if [[ "${SANITIZER_BUILD:-}" == "memory" ]]; then + ninja clang || return 1 + else + ninja || return 1 fi - - # Linking LLVM can require a lot of memory. - # First try multicore - if that doesn't work, try single core - (make "-j$(nproc)") || (make) || return 1 ) || return 1 touch "${LLVM_BUILD}/.build_finished" + } install_llvm() { - if [[ "${SANITIZER_BUILD}" != "memory" ]]; then - cd "${LLVM_BUILD}" - make "-j$(nproc)" install - cp "${LLVM_BUILD_BIN}/FileCheck" "${LLVM_INSTALL}/bin/" - cp "${LLVM_BUILD_BIN}/not" "${LLVM_INSTALL}/bin/" - - # Remove debug information from binaries - strip "${LLVM_INSTALL}/bin/"* || /bin/true - strip "${LLVM_INSTALL}/lib/libclang"* || /bin/true - strip "${LLVM_INSTALL}/lib/libLTO"* || /bin/true - else - # Handle memory sanitizer install - LLVM_PACKAGES=( - install-clang install-llvm-config install-llvm-objdump - install-llvm-link install-llvm-ar install-llvm-nm install-llvm-dis - install-clang-headers install-llvm-as - install-llvm-symbolizer install-LLVMSupport install-lli not FileCheck - install-llvm-headers - ) - - ninja "${LLVM_PACKAGES[@]}" - - for i in $(ninja -t targets | grep install-LLVM | cut -d : -f 1); do ninja "$i"; done - - cp "${LLVM_BUILD}/bin/FileCheck" "${LLVM_INSTALL}/bin/" - cp "${LLVM_BUILD}/bin/not" "${LLVM_INSTALL}/bin/" - fi + cd "${LLVM_BUILD}" + ninja install + # Remove debug information from binaries + strip "${LLVM_INSTALL}/bin/"* || /bin/true + strip "${LLVM_INSTALL}/lib/libclang"* || /bin/true + strip "${LLVM_INSTALL}/lib/libLTO"* || /bin/true touch "${LLVM_INSTALL}/.install_finished" } @@ -307,7 +266,7 @@ is_installed_llvm() { ( setup_build_variables_llvm # Check if the specific llvm-config exists - [[ -f "${LLVM_BUILD_BIN}/llvm-config" ]] + [[ -f "${LLVM_INSTALL}/bin/llvm-config" ]] [[ -f "${LLVM_INSTALL}/.install_finished" ]] ) || return 1 } @@ -327,9 +286,9 @@ setup_artifact_variables_llvm() { get_build_artifacts_llvm() { ( setup_build_variables_llvm + if [[ "${SANITIZER_BUILD:-}" == "memory" ]]; then + echo "${LLVM_BUILD_LIBCXX}" + fi echo "${LLVM_INSTALL}" - echo "${LLVM_SRC_BASE}" - [[ "${sanitizer}" == "memory" ]] && echo "${SANITIZER_LLVM_UNINSTRUMENTED}" - [[ "${sanitizer}" == "memory" ]] && echo "${SANITIZER_LLVM_LIBCXX}" ) } diff --git a/scripts/build/p-metasmt-linux-ubuntu.inc b/scripts/build/p-metasmt-linux-ubuntu.inc index 8bc03ceb8e..f0bc3f79f9 100644 --- a/scripts/build/p-metasmt-linux-ubuntu.inc +++ b/scripts/build/p-metasmt-linux-ubuntu.inc @@ -1,7 +1,3 @@ -setup_build_variables_metasmt() { - return 0 -} - install_build_dependencies_metasmt() { source "${DIR}/common-functions" with_sudo apt update -y @@ -21,10 +17,14 @@ install_build_dependencies_metasmt() { bison flex unzip - python autoconf python3 curl + python-is-python3 # Need for old Z3 + python3-distutils + python3-pip + python3-toml + default-jre # Needed for ANTLR ) #Install essential dependencies diff --git a/scripts/build/p-metasmt.inc b/scripts/build/p-metasmt.inc index 95a7f6a765..5aca84b467 100644 --- a/scripts/build/p-metasmt.inc +++ b/scripts/build/p-metasmt.inc @@ -13,6 +13,12 @@ download_metasmt() { git submodule update --init # Bootstrap git_clone_or_update https://github.com/agra-uni-bremen/dependencies.git "${METASMT_SRC_PATH}/dependencies" "development" + + # Apply existing patches if needed + if [ -f "${DIR}/patches/metasmt.patch" ]; then + cd "${METASMT_SRC_PATH}/dependencies" || (echo "Directory does not exist"; exit 1) + patch -p1 --follow-symlinks -i "${DIR}/patches/metasmt.patch" || return 1 + fi } build_metasmt() { @@ -24,8 +30,8 @@ build_metasmt() { cd "${METASMT_SRC_PATH}" ./bootstrap.sh -d deps -m RELEASE build -DmetaSMT_ENABLE_TESTS=off \ --build stp-git-basic --build boolector-git --build minisat-git \ - --build lingeling-bbc-9230380-161217 --build yices-2.6.1 --build Z3-4.8.4 \ - --build cvc4-1.6 \ + --build lingeling-bbc-9230380-161217 --build yices-2.6.2 --build Z3-4.8.6 \ + --build cvc4-1.8 \ --deps "${METASMT_DEPS_PATH}/" \ --install "${METASMT_INSTALL_PATH}/" \ -j "$(nproc)" \ @@ -51,7 +57,11 @@ is_installed_metasmt() { ( setup_build_variables_metasmt [[ -f "${METASMT_INSTALL_PATH}"/.is_installed ]] - ) + ) || return 1 +} + +setup_artifact_variables_metasmt() { + setup_build_variables_metasmt } get_docker_config_id_metasmt() { diff --git a/scripts/build/p-sanitizer-linux-ubuntu.inc b/scripts/build/p-sanitizer-linux-ubuntu.inc index bb6187ea11..5aa6480a81 100644 --- a/scripts/build/p-sanitizer-linux-ubuntu.inc +++ b/scripts/build/p-sanitizer-linux-ubuntu.inc @@ -1,44 +1,52 @@ install_binary_artifact_sanitizer() { - if [[ -z "${SANITIZER_BUILD:=}" ]]; then + if [[ -z "${SANITIZER_BUILD:-}" ]]; then return 1 fi source "${DIR}/common-functions" local SANITIZER_LLVM_VERSION_MAJOR="${SANITIZER_LLVM_VERSION/.*/}" - local SANITIZER_LLVM_VERSION_MINOR="${SANITIZER_LLVM_VERSION/*./}" - - local version="" - [[ "${SANITIZER_LLVM_VERSION_MAJOR}" -le 6 ]] && version="-${SANITIZER_LLVM_VERSION}" - [[ "${SANITIZER_LLVM_VERSION_MAJOR}" -ge 7 ]] && version="-${SANITIZER_LLVM_VERSION_MAJOR}" - - # Add certificate - with_sudo apt update -y - dependencies=( - ca-certificates - wget - lsb-release - gnupg - ) - - with_sudo apt -y --no-install-recommends install "${dependencies[@]}" - wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | with_sudo apt-key add - - - # Add repository - codename="$(lsb_release --codename --short)" - apt_entry="deb http://apt.llvm.org/${codename}/ llvm-toolchain-${codename}${version} main" - if [[ ! $(grep -rq "${apt_entry}" /etc/apt) ]]; then - echo "${apt_entry}" | with_sudo tee -a /etc/apt/sources.list - with_sudo apt update -y + local version="-${SANITIZER_LLVM_VERSION_MAJOR}" + + local LLVM_UPSTREAM_USED=0 + # Check if package in standard repository otherwise use upstream + with_sudo apt-get update -y + if ! apt-cache show "llvm${version}"; then + if [[ -z "$(which wget)" ]]; then + # Add certificate + with_sudo apt-get update -y + dependencies=( + ca-certificates + wget + lsb-release + gnupg + ) + with_sudo apt-get -y --no-install-recommends install "${dependencies[@]}" + fi + + # Add LLVM upstream repository if available + codename="$(lsb_release --codename --short)" + if wget -q "https://apt.llvm.org/${codename}/dists/llvm-toolchain-${codename}${version}/"; then + LLVM_UPSTREAM_USED=1 + apt_entry="deb http://apt.llvm.org/${codename}/ llvm-toolchain-${codename}${version} main" + if ! grep -rq "${apt_entry}" /etc/apt; then + wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key| with_sudo apt-key add - + echo "${apt_entry}" | with_sudo tee -a /etc/apt/sources.list + with_sudo apt-get update -y + fi + fi fi - with_sudo apt update -y dependencies=( "llvm${version}" "clang${version}" ) + if [[ "${SANITIZER_LLVM_VERSION_MAJOR}" -ge 14 && "${LLVM_UPSTREAM_USED}" -eq 1 ]]; then + dependencies+=("libclang-rt${version}-dev") + fi + #Install essential dependencies - with_sudo apt -y --no-install-recommends install "${dependencies[@]}" || return 1 + with_sudo apt-get -y --no-install-recommends install "${dependencies[@]}" || return 1 } get_docker_config_id_sanitizer() { diff --git a/scripts/build/p-sanitizer-linux.inc b/scripts/build/p-sanitizer-linux.inc index b7a7718e2e..6cfd5920ec 100644 --- a/scripts/build/p-sanitizer-linux.inc +++ b/scripts/build/p-sanitizer-linux.inc @@ -1,9 +1,7 @@ setup_artifact_variables_sanitizer() { local SANITIZER_LLVM_VERSION_MAJOR="${SANITIZER_LLVM_VERSION/.*/}" local SANITIZER_LLVM_VERSION_MINOR="${SANITIZER_LLVM_VERSION/*./}" - local version="" - [[ "${SANITIZER_LLVM_VERSION_MAJOR}" -le 6 ]] && version="-${SANITIZER_LLVM_VERSION}" - [[ "${SANITIZER_LLVM_VERSION_MAJOR}" -ge 7 ]] && version="-${SANITIZER_LLVM_VERSION_MAJOR}" + local version="-${SANITIZER_LLVM_VERSION_MAJOR}" # Only set LLVM_CONFIG if not set yet if [[ -z "${SANITIZER_LLVM_CONFIG-}" ]]; then @@ -17,25 +15,23 @@ setup_artifact_variables_sanitizer() { SANITIZER_BITCODE_CC="${bin_path}/clang" SANITIZER_BITCODE_CXX="${bin_path}/clang++" - if [[ -z ${SANITIZER_C_COMPILER:=} ]]; then + if [[ -z "${SANITIZER_C_COMPILER:-}" ]]; then SANITIZER_C_COMPILER="${SANITIZER_BITCODE_CC}" fi - if [[ -z ${SANITIZER_CXX_COMPILER:=} ]]; then + if [[ -z "${SANITIZER_CXX_COMPILER:-}" ]]; then SANITIZER_CXX_COMPILER="${SANITIZER_BITCODE_CXX}" fi } # Check if the binary artifact is installed is_installed_sanitizer() { - if [[ -z ${SANITIZER_BUILD:-} ]]; then + if [[ -z "${SANITIZER_BUILD:-}" ]]; then return 1 fi local SANITIZER_LLVM_VERSION_MAJOR="${SANITIZER_LLVM_VERSION/.*/}" local SANITIZER_LLVM_VERSION_MINOR="${SANITIZER_LLVM_VERSION/*./}" - local version="" - [[ "${SANITIZER_LLVM_VERSION_MAJOR}" -le 6 ]] && version="${SANITIZER_LLVM_VERSION}" - [[ "${SANITIZER_LLVM_VERSION_MAJOR}" -ge 7 ]] && version="${SANITIZER_LLVM_VERSION_MAJOR}" + local version="${SANITIZER_LLVM_VERSION_MAJOR}" # Check if clang with the right version exists which "clang-${version}" diff --git a/scripts/build/p-sqlite-linux-ubuntu.inc b/scripts/build/p-sqlite-linux-ubuntu.inc index e0f317cb7a..e23da9ad44 100644 --- a/scripts/build/p-sqlite-linux-ubuntu.inc +++ b/scripts/build/p-sqlite-linux-ubuntu.inc @@ -13,6 +13,7 @@ install_build_dependencies_sqlite() { } install_binary_artifact_sqlite() { [[ "${SANITIZER_SUFFIX}x" == "x" ]] || return 1 + [[ "${SQLITE_VERSION}" == "322" ]] || return 1 source "${DIR}/common-functions" with_sudo apt update -y @@ -24,14 +25,7 @@ install_binary_artifact_sqlite() { # Check if the binary artifact is installed is_installed_sqlite() { + [[ -z "${SANITIZER_SUFFIX:-}" ]] || return 1 [[ -f /usr/lib/x86_64-linux-gnu/libsqlite3.so ]] || return 1 [[ -f /usr/include/sqlite3.h ]] || return 1 -} - -get_docker_config_id_sqlite() { - return 0 -} - -get_build_artifacts_sqlite() { - return 0 } \ No newline at end of file diff --git a/scripts/build/p-sqlite.inc b/scripts/build/p-sqlite.inc index 3c41ccc6fc..1182e590c3 100644 --- a/scripts/build/p-sqlite.inc +++ b/scripts/build/p-sqlite.inc @@ -1,8 +1,7 @@ setup_build_variables_sqlite() { - SQLITE_VERSION="3370200" SQLITE_SRC_PATH="${BASE}/sqlite-amalgamation-${SQLITE_VERSION}" - SQLITE_INSTALL_PATH=${SQLITE_SRC_PATH} SQLITE_SUFFIX="${SANITIZER_SUFFIX}" + SQLITE_INSTALL_PATH="${SQLITE_SRC_PATH}${SANITIZER_SUFFIX}" } download_sqlite() { @@ -20,11 +19,14 @@ build_sqlite() { CFLAGS=("${SANITIZER_C_FLAGS[@]}") COMP="${SANITIZER_C_COMPILER}" else - COMP="${BITCODE_CC}" - [[ -z "${COMP}" ]] && COMP="$(which gcc)" + [[ -z "${COMP:-}" ]] && COMP="$(which gcc)" fi - "${COMP}" "${CFLAGS[@]}" -fPIC -o libsqlite3.so -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION -shared sqlite3.c + mkdir -p "${SQLITE_INSTALL_PATH}" + "${COMP}" "${CFLAGS[@]}" -fPIC -o "${SQLITE_INSTALL_PATH}"/libsqlite3.so -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION -shared sqlite3.c + if [[ -n "${SANITIZER_SUFFIX:-}" ]]; then + cp "${SQLITE_SRC_PATH}/"sqlite3.h "${SQLITE_INSTALL_PATH}/" + fi } install_sqlite() { @@ -45,7 +47,7 @@ setup_artifact_variables_sqlite() { get_docker_config_id_sqlite() { ( setup_build_variables_sqlite - echo "${SQLITE_SUFFIX}" + echo "${SQLITE_VERSION}${SQLITE_SUFFIX}" ) } @@ -53,5 +55,6 @@ get_build_artifacts_sqlite() { ( setup_build_variables_sqlite echo "${SQLITE_SRC_PATH}" + echo "${SQLITE_INSTALL_PATH}" ) } diff --git a/scripts/build/p-uclibc-linux-ubuntu.inc b/scripts/build/p-uclibc-linux-ubuntu.inc index e10304aa71..936593cc9e 100644 --- a/scripts/build/p-uclibc-linux-ubuntu.inc +++ b/scripts/build/p-uclibc-linux-ubuntu.inc @@ -7,7 +7,7 @@ install_build_dependencies_uclibc() { build-essential ca-certificates git - python + python3 libncurses5-dev wget ) diff --git a/scripts/build/p-z3-linux-ubuntu.inc b/scripts/build/p-z3-linux-ubuntu.inc index 411302325d..9e3b7b7e66 100644 --- a/scripts/build/p-z3-linux-ubuntu.inc +++ b/scripts/build/p-z3-linux-ubuntu.inc @@ -5,7 +5,7 @@ install_build_dependencies_z3() { dependencies=( build-essential - python + python3 git wget ca-certificates diff --git a/scripts/build/p-z3.inc b/scripts/build/p-z3.inc index f6db455b13..8050679407 100644 --- a/scripts/build/p-z3.inc +++ b/scripts/build/p-z3.inc @@ -31,7 +31,7 @@ build_z3() { LDFLAGS="${LDFLAGS}" \ CC="${CC}" \ CXX="${CXX}" \ - python scripts/mk_make.py --prefix "${Z3_INSTALL_PATH}" -b "build${Z3_SUFFIX}" + python3 scripts/mk_make.py --prefix "${Z3_INSTALL_PATH}" -b "build${Z3_SUFFIX}" cd "build${Z3_SUFFIX}" make -j$(nproc) || make } diff --git a/scripts/build/patches/libcxx110.patch b/scripts/build/patches/libcxx110.patch new file mode 100644 index 0000000000..03e7dbb7de --- /dev/null +++ b/scripts/build/patches/libcxx110.patch @@ -0,0 +1,13 @@ +--- a/libcxx/include/__config ++++ b/libcxx/include/__config +@@ -1167,10 +1167,6 @@ _LIBCPP_FUNC_VIS extern "C" void __sanitizer_annotate_contiguous_container( + _LIBCPP_HAS_NO_THREADS is defined. + #endif + +-#if defined(__STDCPP_THREADS__) && defined(_LIBCPP_HAS_NO_THREADS) +-#error _LIBCPP_HAS_NO_THREADS cannot be set when __STDCPP_THREADS__ is set. +-#endif +- + #if !defined(_LIBCPP_HAS_NO_THREADS) && !defined(__STDCPP_THREADS__) + #define __STDCPP_THREADS__ 1 + #endif \ No newline at end of file diff --git a/scripts/build/patches/llvm110.patch b/scripts/build/patches/llvm110.patch index a764f9bc3f..83014b5299 100644 --- a/scripts/build/patches/llvm110.patch +++ b/scripts/build/patches/llvm110.patch @@ -49,4 +49,74 @@ - _(CYSETTIMEOUT, NONE, 0); _(EQL_EMANCIPATE, WRITE, struct_ifreq_sz); _(EQL_ENSLAVE, WRITE, struct_ifreq_sz); - _(EQL_GETMASTRCFG, WRITE, struct_ifreq_sz); \ No newline at end of file + _(EQL_GETMASTRCFG, WRITE, struct_ifreq_sz); +--- a/compiler-rt/lib/sanitizer_common/sanitizer_posix_libcdep.cpp ++++ b/compiler-rt/lib/sanitizer_common/sanitizer_posix_libcdep.cpp +@@ -169,7 +169,11 @@ bool SupportsColoredOutput(fd_t fd) { + + #if !SANITIZER_GO + // TODO(glider): different tools may require different altstack size. +-static const uptr kAltStackSize = SIGSTKSZ * 4; // SIGSTKSZ is not enough. ++static uptr GetAltStackSize() { ++ // SIGSTKSZ is not enough. ++ static const uptr kAltStackSize = SIGSTKSZ * 4; ++ return kAltStackSize; ++} + + void SetAlternateSignalStack() { + stack_t altstack, oldstack; +@@ -180,10 +184,10 @@ void SetAlternateSignalStack() { + // TODO(glider): the mapped stack should have the MAP_STACK flag in the + // future. It is not required by man 2 sigaltstack now (they're using + // malloc()). +- void* base = MmapOrDie(kAltStackSize, __func__); ++ void *base = MmapOrDie(GetAltStackSize(), __func__); + altstack.ss_sp = (char*) base; + altstack.ss_flags = 0; +- altstack.ss_size = kAltStackSize; ++ altstack.ss_size = GetAltStackSize(); + CHECK_EQ(0, sigaltstack(&altstack, nullptr)); + } + +@@ -191,7 +195,7 @@ void UnsetAlternateSignalStack() { + stack_t altstack, oldstack; + altstack.ss_sp = nullptr; + altstack.ss_flags = SS_DISABLE; +- altstack.ss_size = kAltStackSize; // Some sane value required on Darwin. ++ altstack.ss_size = GetAltStackSize(); // Some sane value required on Darwin. + CHECK_EQ(0, sigaltstack(&altstack, &oldstack)); + UnmapOrDie(oldstack.ss_sp, oldstack.ss_size); + } +--- a/llvm/lib/Transforms/CMakeLists.txt ++++ b/llvm/lib/Transforms/CMakeLists.txt +@@ -5,7 +5,6 @@ add_subdirectory(InstCombine) + add_subdirectory(Scalar) + add_subdirectory(IPO) + add_subdirectory(Vectorize) +-add_subdirectory(Hello) + add_subdirectory(ObjCARC) + add_subdirectory(Coroutines) + add_subdirectory(CFGuard) +--- a/llvm/test/CMakeLists.txt ++++ b/llvm/test/CMakeLists.txt +@@ -47,7 +47,6 @@ configure_lit_site_cfg( + set(LLVM_TEST_DEPENDS + BugpointPasses + FileCheck +- LLVMHello + UnitTests + bugpoint + count +--- a/libcxx/include/__config ++++ b/libcxx/include/__config +@@ -1167,10 +1167,6 @@ _LIBCPP_FUNC_VIS extern "C" void __sanitizer_annotate_contiguous_container( + _LIBCPP_HAS_NO_THREADS is defined. + #endif + +-#if defined(__STDCPP_THREADS__) && defined(_LIBCPP_HAS_NO_THREADS) +-#error _LIBCPP_HAS_NO_THREADS cannot be set when __STDCPP_THREADS__ is set. +-#endif +- + #if !defined(_LIBCPP_HAS_NO_THREADS) && !defined(__STDCPP_THREADS__) + #define __STDCPP_THREADS__ 1 + #endif \ No newline at end of file diff --git a/scripts/build/patches/llvm120.patch b/scripts/build/patches/llvm120.patch new file mode 100644 index 0000000000..f72eb38d49 --- /dev/null +++ b/scripts/build/patches/llvm120.patch @@ -0,0 +1,8 @@ +diff --git a/msan_suppressions.txt b/msan_suppressions.txt +new file mode 100644 +index 000000000..f8c825e6f +--- /dev/null ++++ b/msan_suppressions.txt +@@ -0,0 +1,2 @@ ++# Ignore llvm-config issue ++mainfile:llvm-config.cpp diff --git a/scripts/build/patches/llvm60.patch b/scripts/build/patches/llvm60.patch deleted file mode 100644 index 6a9f7eb775..0000000000 --- a/scripts/build/patches/llvm60.patch +++ /dev/null @@ -1,13 +0,0 @@ ---- a/llvm/tools/llvm-shlib/CMakeLists.txt -+++ b/llvm/tools/llvm-shlib/CMakeLists.txt -@@ -36,7 +36,10 @@ endif() - - add_llvm_library(LLVM SHARED DISABLE_LLVM_LINK_LLVM_DYLIB SONAME ${SOURCES}) - -+if(LIB_NAMES) - list(REMOVE_DUPLICATES LIB_NAMES) -+endif() -+ - if(("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") OR (MINGW) OR (HAIKU) - OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "FreeBSD") - OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "DragonFly") \ No newline at end of file diff --git a/scripts/build/patches/llvm70.patch b/scripts/build/patches/llvm70.patch deleted file mode 100644 index bb6462b75d..0000000000 --- a/scripts/build/patches/llvm70.patch +++ /dev/null @@ -1,13 +0,0 @@ ---- a/llvm/tools/llvm-shlib/CMakeLists.txt -+++ b/llvm/tools/llvm-shlib/CMakeLists.txt -@@ -36,7 +36,10 @@ endif() - - add_llvm_library(LLVM SHARED DISABLE_LLVM_LINK_LLVM_DYLIB SONAME ${SOURCES}) - -+if(LIB_NAMES) - list(REMOVE_DUPLICATES LIB_NAMES) -+endif() -+ - if(("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") OR (MINGW) OR (HAIKU) - OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "FreeBSD") - OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "OpenBSD") \ No newline at end of file diff --git a/scripts/build/patches/llvm80.patch b/scripts/build/patches/llvm80.patch deleted file mode 100644 index dcc9f78c42..0000000000 --- a/scripts/build/patches/llvm80.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- a/llvm/tools/llvm-shlib/CMakeLists.txt -+++ b/llvm/tools/llvm-shlib/CMakeLists.txt -@@ -41,7 +41,9 @@ if(LLVM_BUILD_LLVM_DYLIB) - - add_llvm_library(LLVM SHARED DISABLE_LLVM_LINK_LLVM_DYLIB SONAME ${SOURCES}) - -+ if(LIB_NAMES) - list(REMOVE_DUPLICATES LIB_NAMES) -+ endif() - if(("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") OR (MINGW) OR (HAIKU) - OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "FreeBSD") - OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "GNU") \ No newline at end of file diff --git a/scripts/build/patches/llvm90.patch b/scripts/build/patches/llvm90.patch deleted file mode 100644 index e99827b6b2..0000000000 --- a/scripts/build/patches/llvm90.patch +++ /dev/null @@ -1,64 +0,0 @@ ---- a/llvm/tools/llvm-shlib/CMakeLists.txt -+++ b/llvm/tools/llvm-shlib/CMakeLists.txt -@@ -41,7 +41,9 @@ if(LLVM_BUILD_LLVM_DYLIB) - - add_llvm_library(LLVM SHARED DISABLE_LLVM_LINK_LLVM_DYLIB SONAME ${SOURCES}) - -+ if(LIB_NAMES) - list(REMOVE_DUPLICATES LIB_NAMES) -+ endif() - if(("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") OR (MINGW) OR (HAIKU) - OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "FreeBSD") - OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "GNU") ---- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp -+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp -@@ -143,7 +143,6 @@ typedef struct user_fpregs elf_fpregset_t; - # include - #endif - #include --#include - #include - #include - #include -@@ -459,7 +458,6 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr); - - #if SANITIZER_GLIBC - unsigned struct_ax25_parms_struct_sz = sizeof(struct ax25_parms_struct); -- unsigned struct_cyclades_monitor_sz = sizeof(struct cyclades_monitor); - #if EV_VERSION > (0x010000) - unsigned struct_input_keymap_entry_sz = sizeof(struct input_keymap_entry); - #else -@@ -823,15 +821,6 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr); - #endif // SANITIZER_LINUX - - #if SANITIZER_LINUX && !SANITIZER_ANDROID -- unsigned IOCTL_CYGETDEFTHRESH = CYGETDEFTHRESH; -- unsigned IOCTL_CYGETDEFTIMEOUT = CYGETDEFTIMEOUT; -- unsigned IOCTL_CYGETMON = CYGETMON; -- unsigned IOCTL_CYGETTHRESH = CYGETTHRESH; -- unsigned IOCTL_CYGETTIMEOUT = CYGETTIMEOUT; -- unsigned IOCTL_CYSETDEFTHRESH = CYSETDEFTHRESH; -- unsigned IOCTL_CYSETDEFTIMEOUT = CYSETDEFTIMEOUT; -- unsigned IOCTL_CYSETTHRESH = CYSETTHRESH; -- unsigned IOCTL_CYSETTIMEOUT = CYSETTIMEOUT; - unsigned IOCTL_EQL_EMANCIPATE = EQL_EMANCIPATE; - unsigned IOCTL_EQL_ENSLAVE = EQL_ENSLAVE; - unsigned IOCTL_EQL_GETMASTRCFG = EQL_GETMASTRCFG; ---- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc -+++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc -@@ -370,15 +370,6 @@ static void ioctl_table_fill() { - - #if SANITIZER_GLIBC - // _(SIOCDEVPLIP, WRITE, struct_ifreq_sz); // the same as EQL_ENSLAVE -- _(CYGETDEFTHRESH, WRITE, sizeof(int)); -- _(CYGETDEFTIMEOUT, WRITE, sizeof(int)); -- _(CYGETMON, WRITE, struct_cyclades_monitor_sz); -- _(CYGETTHRESH, WRITE, sizeof(int)); -- _(CYGETTIMEOUT, WRITE, sizeof(int)); -- _(CYSETDEFTHRESH, NONE, 0); -- _(CYSETDEFTIMEOUT, NONE, 0); -- _(CYSETTHRESH, NONE, 0); -- _(CYSETTIMEOUT, NONE, 0); - _(EQL_EMANCIPATE, WRITE, struct_ifreq_sz); - _(EQL_ENSLAVE, WRITE, struct_ifreq_sz); - _(EQL_GETMASTRCFG, WRITE, struct_ifreq_sz); \ No newline at end of file diff --git a/scripts/build/patches/metasmt.patch b/scripts/build/patches/metasmt.patch new file mode 100644 index 0000000000..f14b41b995 --- /dev/null +++ b/scripts/build/patches/metasmt.patch @@ -0,0 +1,72 @@ +--- /dev/null ++++ b/Z3-4.8.6/setup.sh +@@ -0,0 +1,8 @@ ++#!/bin/sh ++ ++version=4.8.6 ++branch=z3-4.8.6 ++ ++cmake_files_dir=$base_dir/Z3-git ++ ++source $base_dir/Z3-git/shared.sh +--- a/cvc4-1.5/shared.sh ++++ b/cvc4-1.5/shared.sh +@@ -9,10 +9,10 @@ if [ -z "$package_dir" ] ; then + exit 1 + fi + +-package=cvc4 ++package=CVC4 + source="$package-$version.tar.gz" + build_dir=$build/$package-$version +-url="http://cvc4.cs.stanford.edu/downloads/builds/src/$source" ++url="https://github.com/CVC4/CVC4-archived/archive/refs/tags/$version.tar.gz" + + if [ -z "$BOOST_ROOT" ]; then + dependencies="$DEPS_BOOST" +@@ -24,7 +24,7 @@ fi + unpack() { + cd $cache && + tar -xf $source && +- mv -f $package-$version $build_dir ++ mv -f $package-archived-$version $build_dir + cd $build_dir + } + +@@ -39,7 +39,8 @@ build_install() { + contrib/get-antlr-3.4 + # build CVC4 with --bsd to allow usage under the terms of + # the modified BSD license. +- ./configure --prefix="$target" --bsd --with-antlr-dir=$build_dir/antlr-3.4 --with-boost=$boost_path ANTLR=$build_dir/antlr-3.4/bin/antlr3 && ++ ./configure.sh --prefix="$target" --antlr-dir=$build_dir/antlr-3.4 && ++ cd build && + make -j $num_threads && + make install && + cp -f "$package_dir/CVC4Config.cmake" "$target/CVC4Config.cmake" +--- /dev/null ++++ b/cvc4-1.8/CVC4Config.cmake +@@ -0,0 +1,5 @@ ++get_filename_component(CVC4_DIR ${CMAKE_CURRENT_LIST_FILE} PATH) ++set(CVC4_BIN_DIRS ${CVC4_DIR}/bin ) ++set(CVC4_INCLUDE_DIRS ${CVC4_DIR}/include ) ++set(CVC4_INCLUDE_DIR ${CVC4_INCLUDE_DIRS} ) ++set(CVC4_LIBRARIES ${CVC4_DIR}/lib/libcvc4.so ) +--- /dev/null ++++ b/cvc4-1.8/setup.sh +@@ -0,0 +1,5 @@ ++#!/bin/sh ++ ++version="1.8" ++source $base_dir/cvc4-1.5/shared.sh ++ +--- /dev/null ++++ b/yices-2.6.2/setup.sh +@@ -0,0 +1,8 @@ ++#!/bin/sh ++ ++version=2.6.2 ++branch=Yices-2.6.2 ++ ++config_files_dir=$base_dir/yices-git ++ ++source $base_dir/yices-git/shared.sh diff --git a/scripts/build/run-tests.sh b/scripts/build/run-tests.sh index 76500da79b..4b9b972e92 100755 --- a/scripts/build/run-tests.sh +++ b/scripts/build/run-tests.sh @@ -38,7 +38,7 @@ run_tests() { cd "${build_dir}" # Remove klee from PATH - export PATH=${PATH%":/home/klee/klee_build/bin"} + export PATH=${PATH/":/home/klee/klee_build/bin"/} if which klee; then return 1 # should not happen fi @@ -94,7 +94,7 @@ function upload_coverage() { } function run_docker() { - docker_arguments=(docker run -u root --cap-add SYS_PTRACE -t) + docker_arguments=(docker run -u root --cap-add SYS_PTRACE -t -e SOLVERS -e METASMT_DEFAULT) script_arguments=("--debug" '"/tmp/klee_build"*') if [[ "${COVERAGE}" -eq 1 ]]; then script_arguments+=("--coverage") diff --git a/scripts/build/sanitizer/klee.txt b/scripts/build/sanitizer/klee.txt new file mode 100644 index 0000000000..856aba570a --- /dev/null +++ b/scripts/build/sanitizer/klee.txt @@ -0,0 +1,2 @@ +# checkMemoryUsage depends on the malloc library linked with, ignore it +fun:_ZN4klee4util19GetTotalMallocUsageEv diff --git a/scripts/build/sanitizer/sqlite.txt b/scripts/build/sanitizer/sqlite.txt new file mode 100644 index 0000000000..6b3ce57ad8 --- /dev/null +++ b/scripts/build/sanitizer/sqlite.txt @@ -0,0 +1,2 @@ +# Ignore uninit memory for sqlite3 external fstat call +src:sqlite3.c diff --git a/scripts/build/v-klee.inc b/scripts/build/v-klee.inc index 78c4e1d1a2..4b0f1085f1 100644 --- a/scripts/build/v-klee.inc +++ b/scripts/build/v-klee.inc @@ -21,8 +21,8 @@ artifact_dependency_klee(){ dependencies+=(uclibc) fi - [[ "${USE_TCMALLOC}" -eq 1 ]] && dependencies+=("tcmalloc") - [[ "${USE_LIBCXX}" -eq 1 ]] && dependencies+=("libcxx") + [[ "${USE_TCMALLOC:-}" -eq 1 ]] && dependencies+=("tcmalloc") + [[ "${USE_LIBCXX:-}" -eq 1 ]] && dependencies+=("libcxx") for d in "${dependencies[@]}"; do echo "${d}" @@ -36,8 +36,8 @@ runtime_artifact_dependency_klee(){ fi dependencies+=("llvm" "solvers" "gtest" "sqlite") - [[ "${USE_TCMALLOC}" -eq 1 ]] && dependencies+=("tcmalloc") - [[ "${USE_LIBCXX}" -eq 1 ]] && dependencies+=("libcxx") + [[ "${USE_TCMALLOC:-}" -eq 1 ]] && dependencies+=("tcmalloc") + [[ "${USE_LIBCXX:-}" -eq 1 ]] && dependencies+=("libcxx") for d in "${dependencies[@]}"; do echo "${d}" diff --git a/scripts/build/v-libcxx.inc b/scripts/build/v-libcxx.inc index 4a60d69e10..5f15770161 100644 --- a/scripts/build/v-libcxx.inc +++ b/scripts/build/v-libcxx.inc @@ -7,6 +7,6 @@ required_variables_check_libcxx() { } artifact_dependency_libcxx(){ - echo "clang" + echo "llvm" echo "cmake" } diff --git a/scripts/build/v-sanitizer.inc b/scripts/build/v-sanitizer.inc index b86ef23f00..09005df053 100644 --- a/scripts/build/v-sanitizer.inc +++ b/scripts/build/v-sanitizer.inc @@ -75,8 +75,8 @@ setup_variables_sanitizer() { # Undefined Behaviour Sanitizer if [ "${sanitizer}" == "undefined" ]; then echo "Using UBSan" - flags=("-fsanitize=undefined" "-fno-omit-frame-pointer" "-g" - "-fno-sanitize-recover=undefined") + # Allow to recover from any undefined behaviour + flags=("-fsanitize=undefined" "-fno-omit-frame-pointer" "-g" "-fsanitize-recover=signed-integer-overflow,alignment,vptr") SANITIZER_CXX_FLAGS+=("${flags[@]}") SANITIZER_C_FLAGS+=("${flags[@]}") SANITIZER_LD_FLAGS+=("${flags[@]}") @@ -87,6 +87,30 @@ setup_variables_sanitizer() { # Memory Sanitizer if [ "${sanitizer}" == "memory" ]; then echo "Using Memory Sanitizer" + # Generate full sanitizer ignore file. + cat "${DIR}/sanitizer/"*.txt > "${BASE}/sanitizer_ignore.txt" + flags=("-fsanitize=memory" "-fno-omit-frame-pointer" "-g" "-fsanitize-memory-track-origins" "-fsanitize-ignorelist=${BASE}/sanitizer_ignore.txt") + + if [[ -n "${LLVM_VERSION:-}" ]]; then + # Workaround as we have to pull in MemSan-instrumented libcxx + local LLVM_BUILD_LIBCXX="${BASE}/llvm-${LLVM_VERSION}0-install_NO_D_A_memsan-libcxx" + if [[ -d "${LLVM_BUILD_LIBCXX}" ]]; then + SANITIZER_CXX_FLAGS+=( + "-nostdinc++" + "-isystem ${LLVM_BUILD_LIBCXX}/include" + "-isystem ${LLVM_BUILD_LIBCXX}/include/c++/v1" + ) + SANITIZER_LD_FLAGS+=( + "-lc++abi" + "-Wl,--rpath=${LLVM_BUILD_LIBCXX}/lib" + "-L${LLVM_BUILD_LIBCXX}/lib" + "-stdlib=libc++" + ) + fi + fi + SANITIZER_CXX_FLAGS+=("${flags[@]}") + SANITIZER_C_FLAGS+=("${flags[@]}") + SANITIZER_LD_FLAGS+=("${flags[@]}") SANITIZER_SUFFIX+="_memsan" continue fi diff --git a/scripts/build/v-sqlite.inc b/scripts/build/v-sqlite.inc index 366f442fba..17f248cc39 100644 --- a/scripts/build/v-sqlite.inc +++ b/scripts/build/v-sqlite.inc @@ -1,3 +1,5 @@ artifact_dependency_sqlite=("sanitizer") -required_variables_sqlite=("") +required_variables_sqlite=( + "SQLITE_VERSION" +) diff --git a/scripts/build/v-stp.inc b/scripts/build/v-stp.inc index 0885a3d13d..17a84acc61 100644 --- a/scripts/build/v-stp.inc +++ b/scripts/build/v-stp.inc @@ -5,4 +5,11 @@ required_variables_stp=( ) # On which artifacts does STP depend on -artifact_dependency_stp=("sanitizer") \ No newline at end of file +artifact_dependency_stp=("sanitizer") + +artifact_dependency_stp() { + echo "sanitizer" + if [[ "${SANITIZER_BUILD:-}" == "memory" ]]; then + echo "llvm" + fi +} \ No newline at end of file diff --git a/scripts/build/v-uclibc.inc b/scripts/build/v-uclibc.inc index 7cdedfcdc9..3c1c3d730d 100644 --- a/scripts/build/v-uclibc.inc +++ b/scripts/build/v-uclibc.inc @@ -6,5 +6,5 @@ required_variables_uclibc=( artifact_dependency_uclibc(){ # Add llvm if needed; otherwise only use clang package # TODO this is quite distribution specific; should be handled in a more general case - echo "clang" + echo "llvm" } diff --git a/scripts/klee-control b/scripts/klee-control index 0a918b42f7..e9d22db698 100755 --- a/scripts/klee-control +++ b/scripts/klee-control @@ -77,7 +77,7 @@ def main(): if opts.dumpStates: execCmd(pid, "p dumpStates = 1", opts) if opts.dumpTree: - execCmd(pid, "p dumpPTree = 1", opts) + execCmd(pid, "p dumpExecutionTree = 1", opts) if opts.stopForking: execCmd(pid, 'p stop_forking()', opts) if opts.haltExecution: diff --git a/test/ArrayOpt/test-mix.c b/test/ArrayOpt/test-mix.c index 21148dc421..54c48dc43c 100644 --- a/test/ArrayOpt/test-mix.c +++ b/test/ArrayOpt/test-mix.c @@ -1,7 +1,6 @@ // RUN: %clang %s -emit-llvm %O0opt -c -o %t.bc // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=index %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_I +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=index %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_I // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: test -f %t.klee-out/test000003.kquery @@ -27,8 +26,7 @@ // RUN: not FileCheck %s -input-file=%t.klee-out/test000011.kquery -check-prefix=CHECK-CONST_ARR // RUN: not FileCheck %s -input-file=%t.klee-out/test000012.kquery -check-prefix=CHECK-CONST_ARR // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=value %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_V +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=value %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_V // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: test -f %t.klee-out/test000003.kquery @@ -54,9 +52,7 @@ // RUN: not FileCheck %s -input-file=%t.klee-out/test000011.kquery -check-prefix=CHECK-CONST_ARR // RUN: not FileCheck %s -input-file=%t.klee-out/test000012.kquery -check-prefix=CHECK-CONST_ARR // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=all %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_I -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_V +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=all %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_I -check-prefix=CHECK-OPT_V // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: test -f %t.klee-out/test000003.kquery @@ -82,8 +78,8 @@ // RUN: not FileCheck %s -input-file=%t.klee-out/test000011.kquery -check-prefix=CHECK-CONST_ARR // RUN: not FileCheck %s -input-file=%t.klee-out/test000012.kquery -check-prefix=CHECK-CONST_ARR -// CHECK-OPT_I: KLEE: WARNING: OPT_I: successful -// CHECK-OPT_V: KLEE: WARNING: OPT_V: successful +// CHECK-OPT_I-DAG: KLEE: WARNING: OPT_I: successful +// CHECK-OPT_V-DAG: KLEE: WARNING: OPT_V: successful // CHECK-CONST_ARR: const_arr #include @@ -107,11 +103,10 @@ int main() { arraychar[0] = 'a'; arraychar[2] = 'c'; - // CHECK: Yes - // CHECK: No - // CHECK: Good - // CHECK: Char - // CHECK: Concrete + // CHECK-DAG: Yes + // CHECK-DAG: No + // CHECK-DAG: Char + // CHECK-DAG: Concrete if (array[k] == 3) printf("Yes\n"); else if (array[k] > 4) @@ -127,7 +122,7 @@ int main() { printf("Concrete\n"); } - // CHECK: KLEE: done: completed paths = 12 + // CHECK-DAG: KLEE: done: completed paths = 12 return 0; } diff --git a/test/ArrayOpt/test_and.c b/test/ArrayOpt/test_and.c index a9e78959b5..e498fe60f7 100644 --- a/test/ArrayOpt/test_and.c +++ b/test/ArrayOpt/test_and.c @@ -1,13 +1,12 @@ // RUN: %clang %s -emit-llvm %O0opt -c -o %t.bc // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=index %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_I +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=index %t.bc 2>&1 | FileCheck %s // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR // RUN: not FileCheck %s -input-file=%t.klee-out/test000002.kquery -check-prefix=CHECK-CONST_ARR -// CHECK-OPT_I: KLEE: WARNING: OPT_I: successful +// CHECK: KLEE: WARNING: OPT_I: successful // CHECK-CONST_ARR: const_arr #include @@ -22,14 +21,14 @@ int main() { klee_make_symbolic(&k, sizeof(k), "k"); klee_assume(k < 5); - // CHECK: Yes - // CHECK-NEXT: No + // CHECK-DAG: Yes + // CHECK-DAG: No if (array[k&1] > 0) printf("Yes\n"); else printf("No\n"); - // CHECK: KLEE: done: completed paths = 2 + // CHECK-DAG: KLEE: done: completed paths = 2 return 0; } diff --git a/test/ArrayOpt/test_array_index_array.c b/test/ArrayOpt/test_array_index_array.c index d656d35b30..8f045f8e09 100644 --- a/test/ArrayOpt/test_array_index_array.c +++ b/test/ArrayOpt/test_array_index_array.c @@ -1,21 +1,18 @@ // RUN: %clang %s -emit-llvm %O0opt -c -o %t.bc // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=index %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_I +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=index %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_I // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR // RUN: not FileCheck %s -input-file=%t.klee-out/test000002.kquery -check-prefix=CHECK-CONST_ARR // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=value %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_V +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=value %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_V // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR // RUN: not FileCheck %s -input-file=%t.klee-out/test000002.kquery -check-prefix=CHECK-CONST_ARR // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=all %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_V +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=all %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_V // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR @@ -37,14 +34,14 @@ int main() { klee_make_symbolic(&k, sizeof(k), "k"); klee_assume(k < 5); - // CHECK: Yes - // CHECK-NEXT: No + // CHECK-DAG: Yes + // CHECK-DAG: No if (array[array2[k]] == 7) printf("Yes\n"); else printf("No\n"); - // CHECK: KLEE: done: completed paths = 2 + // CHECK-DAG: KLEE: done: completed paths = 2 return 0; } diff --git a/test/ArrayOpt/test_array_index_array_diffsize.c b/test/ArrayOpt/test_array_index_array_diffsize.c index d08b83eb2b..93522f3a8e 100644 --- a/test/ArrayOpt/test_array_index_array_diffsize.c +++ b/test/ArrayOpt/test_array_index_array_diffsize.c @@ -1,21 +1,18 @@ // RUN: %clang %s -emit-llvm %O0opt -c -o %t.bc // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=index %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_I +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=index %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_I // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR // RUN: not FileCheck %s -input-file=%t.klee-out/test000002.kquery -check-prefix=CHECK-CONST_ARR // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=value %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_V +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=value %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_V // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR // RUN: not FileCheck %s -input-file=%t.klee-out/test000002.kquery -check-prefix=CHECK-CONST_ARR // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=all %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_V +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=all %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_V // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR @@ -38,14 +35,14 @@ int main() { klee_make_symbolic(&k, sizeof(k), "k"); klee_assume(k < 10); - // CHECK: Yes - // CHECK-NEXT: No + // CHECK-DAG: No + // CHECK-DAG: Yes if (array[array2[array3[k]]] == 7) printf("Yes\n"); else printf("No\n"); - // CHECK: KLEE: done: completed paths = 2 + // CHECK-DAG: KLEE: done: completed paths = 2 return 0; } diff --git a/test/ArrayOpt/test_cache.c b/test/ArrayOpt/test_cache.c index 5005a7451b..ad4311aef2 100644 --- a/test/ArrayOpt/test_cache.c +++ b/test/ArrayOpt/test_cache.c @@ -1,7 +1,6 @@ // RUN: %clang %s -emit-llvm %O0opt -c -o %t.bc // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=index %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_I +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=index %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_I // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: test -f %t.klee-out/test000003.kquery @@ -15,8 +14,7 @@ // RUN: not FileCheck %s -input-file=%t.klee-out/test000005.kquery -check-prefix=CHECK-CONST_ARR // RUN: not FileCheck %s -input-file=%t.klee-out/test000006.kquery -check-prefix=CHECK-CONST_ARR // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=value %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_V +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=value %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_V // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: test -f %t.klee-out/test000003.kquery @@ -30,8 +28,7 @@ // RUN: not FileCheck %s -input-file=%t.klee-out/test000005.kquery -check-prefix=CHECK-CONST_ARR // RUN: not FileCheck %s -input-file=%t.klee-out/test000006.kquery -check-prefix=CHECK-CONST_ARR // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=all %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_I +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=all %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_I // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: test -f %t.klee-out/test000003.kquery @@ -66,11 +63,10 @@ int main() { klee_assume(x < 2); klee_assume(x >= 0); - // CHECK: Yes - // CHECK: No - // CHECK: Good - // CHECK: Char - // CHECK: Concrete + // CHECK-DAG: Yes + // CHECK-DAG: No + // CHECK-DAG: Char + // CHECK-DAG: Concrete if (array[k] == 3) printf("Yes\n"); else if (array[k] > 4) @@ -86,7 +82,7 @@ int main() { printf("Concrete\n"); } - // CHECK: KLEE: done: completed paths = 6 + // CHECK-DAG: KLEE: done: completed paths = 6 return 0; } diff --git a/test/ArrayOpt/test_const_arr-idx.c b/test/ArrayOpt/test_const_arr-idx.c index 679944e590..5425426cf1 100644 --- a/test/ArrayOpt/test_const_arr-idx.c +++ b/test/ArrayOpt/test_const_arr-idx.c @@ -1,13 +1,22 @@ // RUN: %clang %s -emit-llvm %O0opt -c -o %t.bc // RUN: rm -rf %t.klee-out // RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=index %t.bc > %t.log 2>&1 +// RUN: FileCheck %s -input-file=%t.log // RUN: not FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_I +// RUN: test -f %t.klee-out/test000001.kquery +// RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR // RUN: rm -rf %t.klee-out // RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=value %t.bc > %t.log 2>&1 +// RUN: FileCheck %s -input-file=%t.log // RUN: not FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_V +// RUN: test -f %t.klee-out/test000001.kquery +// RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR // RUN: rm -rf %t.klee-out // RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=all %t.bc > %t.log 2>&1 +// RUN: FileCheck %s -input-file=%t.log // RUN: not FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_I +// RUN: test -f %t.klee-out/test000001.kquery +// RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR // CHECK-OPT_I: KLEE: WARNING: OPT_I: successful // CHECK-OPT_V: KLEE: WARNING: OPT_V: successful @@ -23,11 +32,11 @@ int main() { int x = 2; unsigned k = arr[x]; - // CHECK: Yes + // CHECK-DAG: Yes if (array[k] == 3) printf("Yes\n"); - // CHECK: KLEE: done: completed paths = 1 + // CHECK-DAG: KLEE: done: completed paths = 1 return 0; } diff --git a/test/ArrayOpt/test_expr_complex.c b/test/ArrayOpt/test_expr_complex.c index 0edf616994..9068e2d3e7 100644 --- a/test/ArrayOpt/test_expr_complex.c +++ b/test/ArrayOpt/test_expr_complex.c @@ -1,19 +1,16 @@ // RUN: %clang %s -emit-llvm %O0opt -c -o %t.bc // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=index %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_I +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=index %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_I // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=value %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_V +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=value %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_V // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR // RUN: not FileCheck %s -input-file=%t.klee-out/test000002.kquery -check-prefix=CHECK-CONST_ARR // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=all %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_I +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=all %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_I // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR @@ -35,14 +32,14 @@ int main() { klee_assume(k < 4); klee_assume(k >=0); - // CHECK: Yes - // CHECK-NEXT: No + // CHECK-DAG: Yes + // CHECK-DAG: No if (array[k*3] < 0) printf("Yes\n"); else printf("No\n"); - // CHECK: KLEE: done: completed paths = 2 + // CHECK-DAG: KLEE: done: completed paths = 2 return 0; } diff --git a/test/ArrayOpt/test_expr_simple.c b/test/ArrayOpt/test_expr_simple.c index fa1040022f..0ea81d8d12 100644 --- a/test/ArrayOpt/test_expr_simple.c +++ b/test/ArrayOpt/test_expr_simple.c @@ -1,19 +1,16 @@ // RUN: %clang %s -emit-llvm %O0opt -c -o %t.bc // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=index %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_I +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=index %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_I // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=value %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_V +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=value %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_V // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR // RUN: not FileCheck %s -input-file=%t.klee-out/test000002.kquery -check-prefix=CHECK-CONST_ARR // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=all %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_I +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=all %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_I // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR @@ -34,14 +31,14 @@ int main() { klee_make_symbolic(&k, sizeof(k), "k"); klee_assume(k < 5); - // CHECK: Yes - // CHECK-NEXT: No + // CHECK-DAG: No + // CHECK-DAG: Yes if (array[k] == -4) printf("Yes\n"); else printf("No\n"); - // CHECK: KLEE: done: completed paths = 2 + // CHECK-DAG: KLEE: done: completed paths = 2 return 0; } diff --git a/test/ArrayOpt/test_feasible.c b/test/ArrayOpt/test_feasible.c index 253227dd89..8dc3c4e3e8 100644 --- a/test/ArrayOpt/test_feasible.c +++ b/test/ArrayOpt/test_feasible.c @@ -1,21 +1,18 @@ // RUN: %clang %s -emit-llvm %O0opt -c -o %t.bc // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=index %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_I +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=index %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_I // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR // RUN: not FileCheck %s -input-file=%t.klee-out/test000002.kquery -check-prefix=CHECK-CONST_ARR // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=value %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_V +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=value %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_V // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR // RUN: not FileCheck %s -input-file=%t.klee-out/test000002.kquery -check-prefix=CHECK-CONST_ARR // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=all %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_I +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=all %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_I // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR @@ -25,8 +22,9 @@ // CHECK-OPT_V: KLEE: WARNING: OPT_V: successful // CHECK-CONST_ARR: const_arr -#include #include "klee/klee.h" +#include +#include char array[5] = {0,1,0,1,0}; @@ -36,19 +34,18 @@ int main() { klee_make_symbolic(&k, sizeof(k), "k"); klee_assume(k < 5); - // CHECK: zero - // CHECK-NEXT: Correct! - // CHECK-NOT: Wrong! + // CHECK-DAG: zero + // CHECK-DAG: Correct! if (array[k] == 0) { printf("zero\n"); if (k==0|k==2|k==4) { printf("Correct!\n"); } else { - printf("Wrong!\n"); + klee_assert(0); } } - // CHECK: KLEE: done: completed paths = 2 + // CHECK-DAG: KLEE: done: completed paths = 2 return 0; } diff --git a/test/ArrayOpt/test_hybrid.c b/test/ArrayOpt/test_hybrid.c index 3b1ac1dca6..53c57b52f0 100644 --- a/test/ArrayOpt/test_hybrid.c +++ b/test/ArrayOpt/test_hybrid.c @@ -1,11 +1,10 @@ // RUN: %clang %s -emit-llvm %O0opt -c -o %t.bc // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=index %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_I +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=index %t.bc 2>&1 | FileCheck %s // RUN: test -f %t.klee-out/test000001.kquery // RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR -// CHECK-OPT_I: KLEE: WARNING: OPT_I: successful +// CHECK: KLEE: WARNING: OPT_I: successful // CHECK-CONST_ARR: const_arr #include @@ -19,12 +18,11 @@ int main() { klee_make_symbolic(&k, sizeof(k), "k"); klee_assume(k < 10); - // CHECK: Yes - // CHECK-NEXT: No + // CHECK-DAG: Yes if (array[k] >= 1) printf("Yes\n"); - // CHECK: KLEE: done: completed paths = 1 + // CHECK-DAG: KLEE: done: completed paths = 1 return 0; } diff --git a/test/ArrayOpt/test_multindex.c b/test/ArrayOpt/test_multindex.c index 5af8a23610..c4c5579de7 100644 --- a/test/ArrayOpt/test_multindex.c +++ b/test/ArrayOpt/test_multindex.c @@ -1,17 +1,16 @@ // RUN: %clang %s -emit-llvm %O0opt -c -o %t.bc // RUN: rm -rf %t.klee-out // RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=index %t.bc > %t.log 2>&1 +// RUN: FileCheck %s -input-file=%t.log // RUN: not FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_I // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=value %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_V +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=value %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_V // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR // RUN: not FileCheck %s -input-file=%t.klee-out/test000002.kquery -check-prefix=CHECK-CONST_ARR // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=all %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_V +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=all %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_V // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR @@ -35,11 +34,11 @@ int main() { klee_make_symbolic(&x, sizeof(x), "x"); klee_assume(x < 5); - // CHECK: Yes + // CHECK-DAG: Yes if ((array[k] + array[x]) - 7 == 0) printf("Yes\n"); - // CHECK: KLEE: done: completed paths = 2 + // CHECK-DAG: KLEE: done: completed paths = 2 return 0; } diff --git a/test/ArrayOpt/test_multindex_multarray.c b/test/ArrayOpt/test_multindex_multarray.c new file mode 100644 index 0000000000..54e91f48ba --- /dev/null +++ b/test/ArrayOpt/test_multindex_multarray.c @@ -0,0 +1,46 @@ +// RUN: %clang %s -emit-llvm %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=index %t.bc > %t.log 2>&1 +// RUN: not FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_I +// RUN: rm -rf %t.klee-out +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=value %t.bc > %t.log 2>&1 +// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_V +// RUN: test -f %t.klee-out/test000001.kquery +// RUN: test -f %t.klee-out/test000002.kquery +// RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR +// RUN: not FileCheck %s -input-file=%t.klee-out/test000002.kquery -check-prefix=CHECK-CONST_ARR +// RUN: rm -rf %t.klee-out +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=all %t.bc > %t.log 2>&1 +// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_V +// RUN: test -f %t.klee-out/test000001.kquery +// RUN: test -f %t.klee-out/test000002.kquery +// RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR +// RUN: not FileCheck %s -input-file=%t.klee-out/test000002.kquery -check-prefix=CHECK-CONST_ARR + +// CHECK-OPT_I: KLEE: WARNING: OPT_I: successful +// CHECK-OPT_V: KLEE: WARNING: OPT_V: successful +// CHECK-CONST_ARR: const_arr + +#include "klee/klee.h" +#include + +char array1[5] = {0, 1, 2, 3, 4}; +char array2[5] = {0, 1, 2, 3, 4}; + +int main() { + unsigned k; + unsigned x; + + klee_make_symbolic(&k, sizeof(k), "k"); + klee_assume(k < 5); + klee_make_symbolic(&x, sizeof(x), "x"); + klee_assume(x < 5); + + // CHECK: Yes + if ((array1[k] + array2[x] + array2[k]) - 7 == 0) + printf("Yes\n"); + + // CHECK: KLEE: done: completed paths = 2 + + return 0; +} diff --git a/test/ArrayOpt/test_new.c b/test/ArrayOpt/test_new.c index 5c83889311..c797751651 100644 --- a/test/ArrayOpt/test_new.c +++ b/test/ArrayOpt/test_new.c @@ -1,19 +1,18 @@ // RUN: %clang %s -emit-llvm %O0opt -c -o %t.bc // RUN: rm -rf %t.klee-out // RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=index %t.bc > %t.log 2>&1 +// RUN: FileCheck %s -input-file=%t.log // RUN: not FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_I // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=value %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_V +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=value %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_V // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR // RUN: not FileCheck %s -input-file=%t.klee-out/test000002.kquery -check-prefix=CHECK-CONST_ARR // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=all %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_V +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=all %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_V // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR @@ -34,14 +33,14 @@ int main() { klee_make_symbolic(&k, sizeof(k), "k"); klee_assume(k < 4); - // CHECK: Yes - // CHECK-NEXT: No + // CHECK-DAG: Yes + // CHECK-DAG: No if (array[k] + array[k+1] < 0) printf("Yes\n"); else printf("No\n"); - // CHECK: KLEE: done: completed paths = 2 + // CHECK-DAG: KLEE: done: completed paths = 2 return 0; } diff --git a/test/ArrayOpt/test_nier.c b/test/ArrayOpt/test_nier.c index 2c02f11421..7e3ac45a54 100644 --- a/test/ArrayOpt/test_nier.c +++ b/test/ArrayOpt/test_nier.c @@ -2,22 +2,19 @@ // Ignore msan: Generates a large stack trace > 8k but not a stack overflow for larger stacks // RUN: %clang %s -emit-llvm %O0opt -c -o %t.bc // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=index %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_I +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=index %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_I // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR // RUN: not FileCheck %s -input-file=%t.klee-out/test000002.kquery -check-prefix=CHECK-CONST_ARR // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=value %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_V +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=value %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_V // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR // RUN: not FileCheck %s -input-file=%t.klee-out/test000002.kquery -check-prefix=CHECK-CONST_ARR // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=all %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_I +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=all %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_I // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR @@ -27,7 +24,7 @@ // CHECK-OPT_V: KLEE: WARNING: OPT_V: successful // CHECK-CONST_ARR: const_arr -#include +#include #include "klee/klee.h" int array[1000] = {0, 1, 8, 27, 64, 125, 216, 343, 512, 729, 1000, 1331, 1728, 2197, 2744, 3375, 4096, 4913, 5832, 6859, 8000, 9261, 10648, 12167, 13824, 15625, 17576, 19683, 21952, 24389, 27000, 29791, 32768, 35937, 39304, 42875, 46656, 50653, 54872, 59319, 64000, 68921, 74088, 79507, 85184, 91125, 97336, 103823, 110592, 117649, 125000, 132651, 140608, 148877, 157464, 166375, 175616, 185193, 195112, 205379, 216000, 226981, 238328, 250047, 262144, 274625, 287496, 300763, 314432, 328509, 343000, 357911, 373248, 389017, 405224, 421875, 438976, 456533, 474552, 493039, 512000, 531441, 551368, 571787, 592704, 614125, 636056, 658503, 681472, 704969, 729000, 753571, 778688, 804357, 830584, 857375, 884736, 912673, 941192, 970299, 1000000, 1030301, 1061208, 1092727, 1124864, 1157625, 1191016, 1225043, 1259712, 1295029, 1331000, 1367631, 1404928, 1442897, 1481544, 1520875, 1560896, 1601613, 1643032, 1685159, 1728000, 1771561, 1815848, 1860867, 1906624, 1953125, 2000376, 2048383, 2097152, 2146689, 2197000, 2248091, 2299968, 2352637, 2406104, 2460375, 2515456, 2571353, 2628072, 2685619, 2744000, 2803221, 2863288, 2924207, 2985984, 3048625, 3112136, 3176523, 3241792, 3307949, 3375000, 3442951, 3511808, 3581577, 3652264, 3723875, 3796416, 3869893, 3944312, 4019679, 4096000, 4173281, 4251528, 4330747, 4410944, 4492125, 4574296, 4657463, 4741632, 4826809, 4913000, 5000211, 5088448, 5177717, 5268024, 5359375, 5451776, 5545233, 5639752, 5735339, 5832000, 5929741, 6028568, 6128487, 6229504, 6331625, 6434856, 6539203, 6644672, 6751269, 6859000, 6967871, 7077888, 7189057, 7301384, 7414875, 7529536, 7645373, 7762392, 7880599, 8000000, 8120601, 8242408, 8365427, 8489664, 8615125, 8741816, 8869743, 8998912, 9129329, 9261000, 9393931, 9528128, 9663597, 9800344, 9938375, 10077696, 10218313, 10360232, 10503459, 10648000, 10793861, 10941048, 11089567, 11239424, 11390625, 11543176, 11697083, 11852352, 12008989, 12167000, 12326391, 12487168, 12649337, 12812904, 12977875, 13144256, 13312053, 13481272, 13651919, 13824000, 13997521, 14172488, 14348907, 14526784, 14706125, 14886936, 15069223, 15252992, 15438249, 15625000, 15813251, 16003008, 16194277, 16387064, 16581375, 16777216, 16974593, 17173512, 17373979, 17576000, 17779581, 17984728, 18191447, 18399744, 18609625, 18821096, 19034163, 19248832, 19465109, 19683000, 19902511, 20123648, 20346417, 20570824, 20796875, 21024576, 21253933, 21484952, 21717639, 21952000, 22188041, 22425768, 22665187, 22906304, 23149125, 23393656, 23639903, 23887872, 24137569, 24389000, 24642171, 24897088, 25153757, 25412184, 25672375, 25934336, 26198073, 26463592, 26730899, 27000000, 27270901, 27543608, 27818127, 28094464, 28372625, 28652616, 28934443, 29218112, 29503629, 29791000, 30080231, 30371328, 30664297, 30959144, 31255875, 31554496, 31855013, 32157432, 32461759, 32768000, 33076161, 33386248, 33698267, 34012224, 34328125, 34645976, 34965783, 35287552, 35611289, 35937000, 36264691, 36594368, 36926037, 37259704, 37595375, 37933056, 38272753, 38614472, 38958219, 39304000, 39651821, 40001688, 40353607, 40707584, 41063625, 41421736, 41781923, 42144192, 42508549, 42875000, 43243551, 43614208, 43986977, 44361864, 44738875, 45118016, 45499293, 45882712, 46268279, 46656000, 47045881, 47437928, 47832147, 48228544, 48627125, 49027896, 49430863, 49836032, 50243409, 50653000, 51064811, 51478848, 51895117, 52313624, 52734375, 53157376, 53582633, 54010152, 54439939, 54872000, 55306341, 55742968, 56181887, 56623104, 57066625, 57512456, 57960603, 58411072, 58863869, 59319000, 59776471, 60236288, 60698457, 61162984, 61629875, 62099136, 62570773, 63044792, 63521199, 64000000, 64481201, 64964808, 65450827, 65939264, 66430125, 66923416, 67419143, 67917312, 68417929, 68921000, 69426531, 69934528, 70444997, 70957944, 71473375, 71991296, 72511713, 73034632, 73560059, 74088000, 74618461, 75151448, 75686967, 76225024, 76765625, 77308776, 77854483, 78402752, 78953589, 79507000, 80062991, 80621568, 81182737, 81746504, 82312875, 82881856, 83453453, 84027672, 84604519, 85184000, 85766121, 86350888, 86938307, 87528384, 88121125, 88716536, 89314623, 89915392, 90518849, 91125000, 91733851, 92345408, 92959677, 93576664, 94196375, 94818816, 95443993, 96071912, 96702579, 97336000, 97972181, 98611128, 99252847, 99897344, 100544625, 101194696, 101847563, 102503232, 103161709, 103823000, 104487111, 105154048, 105823817, 106496424, 107171875, 107850176, 108531333, 109215352, 109902239, 110592000, 111284641, 111980168, 112678587, 113379904, 114084125, 114791256, 115501303, 116214272, 116930169, 117649000, 118370771, 119095488, 119823157, 120553784, 121287375, 122023936, 122763473, 123505992, 124251499, 125000000, 125751501, 126506008, 127263527, 128024064, 128787625, 129554216, 130323843, 131096512, 131872229, 132651000, 133432831, 134217728, 135005697, 135796744, 136590875, 137388096, 138188413, 138991832, 139798359, 140608000, 141420761, 142236648, 143055667, 143877824, 144703125, 145531576, 146363183, 147197952, 148035889, 148877000, 149721291, 150568768, 151419437, 152273304, 153130375, 153990656, 154854153, 155720872, 156590819, 157464000, 158340421, 159220088, 160103007, 160989184, 161878625, 162771336, 163667323, 164566592, 165469149, 166375000, 167284151, 168196608, 169112377, 170031464, 170953875, 171879616, 172808693, 173741112, 174676879, 175616000, 176558481, 177504328, 178453547, 179406144, 180362125, 181321496, 182284263, 183250432, 184220009, 185193000, 186169411, 187149248, 188132517, 189119224, 190109375, 191102976, 192100033, 193100552, 194104539, 195112000, 196122941, 197137368, 198155287, 199176704, 200201625, 201230056, 202262003, 203297472, 204336469, 205379000, 206425071, 207474688, 208527857, 209584584, 210644875, 211708736, 212776173, 213847192, 214921799, 216000000, 217081801, 218167208, 219256227, 220348864, 221445125, 222545016, 223648543, 224755712, 225866529, 226981000, 228099131, 229220928, 230346397, 231475544, 232608375, 233744896, 234885113, 236029032, 237176659, 238328000, 239483061, 240641848, 241804367, 242970624, 244140625, 245314376, 246491883, 247673152, 248858189, 250047000, 251239591, 252435968, 253636137, 254840104, 256047875, 257259456, 258474853, 259694072, 260917119, 262144000, 263374721, 264609288, 265847707, 267089984, 268336125, 269586136, 270840023, 272097792, 273359449, 274625000, 275894451, 277167808, 278445077, 279726264, 281011375, 282300416, 283593393, 284890312, 286191179, 287496000, 288804781, 290117528, 291434247, 292754944, 294079625, 295408296, 296740963, 298077632, 299418309, 300763000, 302111711, 303464448, 304821217, 306182024, 307546875, 308915776, 310288733, 311665752, 313046839, 314432000, 315821241, 317214568, 318611987, 320013504, 321419125, 322828856, 324242703, 325660672, 327082769, 328509000, 329939371, 331373888, 332812557, 334255384, 335702375, 337153536, 338608873, 340068392, 341532099, 343000000, 344472101, 345948408, 347428927, 348913664, 350402625, 351895816, 353393243, 354894912, 356400829, 357911000, 359425431, 360944128, 362467097, 363994344, 365525875, 367061696, 368601813, 370146232, 371694959, 373248000, 374805361, 376367048, 377933067, 379503424, 381078125, 382657176, 384240583, 385828352, 387420489, 389017000, 390617891, 392223168, 393832837, 395446904, 397065375, 398688256, 400315553, 401947272, 403583419, 405224000, 406869021, 408518488, 410172407, 411830784, 413493625, 415160936, 416832723, 418508992, 420189749, 421875000, 423564751, 425259008, 426957777, 428661064, 430368875, 432081216, 433798093, 435519512, 437245479, 438976000, 440711081, 442450728, 444194947, 445943744, 447697125, 449455096, 451217663, 452984832, 454756609, 456533000, 458314011, 460099648, 461889917, 463684824, 465484375, 467288576, 469097433, 470910952, 472729139, 474552000, 476379541, 478211768, 480048687, 481890304, 483736625, 485587656, 487443403, 489303872, 491169069, 493039000, 494913671, 496793088, 498677257, 500566184, 502459875, 504358336, 506261573, 508169592, 510082399, 512000000, 513922401, 515849608, 517781627, 519718464, 521660125, 523606616, 525557943, 527514112, 529475129, 531441000, 533411731, 535387328, 537367797, 539353144, 541343375, 543338496, 545338513, 547343432, 549353259, 551368000, 553387661, 555412248, 557441767, 559476224, 561515625, 563559976, 565609283, 567663552, 569722789, 571787000, 573856191, 575930368, 578009537, 580093704, 582182875, 584277056, 586376253, 588480472, 590589719, 592704000, 594823321, 596947688, 599077107, 601211584, 603351125, 605495736, 607645423, 609800192, 611960049, 614125000, 616295051, 618470208, 620650477, 622835864, 625026375, 627222016, 629422793, 631628712, 633839779, 636056000, 638277381, 640503928, 642735647, 644972544, 647214625, 649461896, 651714363, 653972032, 656234909, 658503000, 660776311, 663054848, 665338617, 667627624, 669921875, 672221376, 674526133, 676836152, 679151439, 681472000, 683797841, 686128968, 688465387, 690807104, 693154125, 695506456, 697864103, 700227072, 702595369, 704969000, 707347971, 709732288, 712121957, 714516984, 716917375, 719323136, 721734273, 724150792, 726572699, 729000000, 731432701, 733870808, 736314327, 738763264, 741217625, 743677416, 746142643, 748613312, 751089429, 753571000, 756058031, 758550528, 761048497, 763551944, 766060875, 768575296, 771095213, 773620632, 776151559, 778688000, 781229961, 783777448, 786330467, 788889024, 791453125, 794022776, 796597983, 799178752, 801765089, 804357000, 806954491, 809557568, 812166237, 814780504, 817400375, 820025856, 822656953, 825293672, 827936019, 830584000, 833237621, 835896888, 838561807, 841232384, 843908625, 846590536, 849278123, 851971392, 854670349, 857375000, 860085351, 862801408, 865523177, 868250664, 870983875, 873722816, 876467493, 879217912, 881974079, 884736000, 887503681, 890277128, 893056347, 895841344, 898632125, 901428696, 904231063, 907039232, 909853209, 912673000, 915498611, 918330048, 921167317, 924010424, 926859375, 929714176, 932574833, 935441352, 938313739, 941192000, 944076141, 946966168, 949862087, 952763904, 955671625, 958585256, 961504803, 964430272, 967361669, 970299000, 973242271, 976191488, 979146657, 982107784, 985074875, 988047936, 991026973, 994011992, 997002999}; @@ -40,15 +37,15 @@ int main() { klee_assume(k<1000); // CHECK-NOT: memory error: out of bound pointer - // CHECK: Yes - // CHECK-NEXT: No + // CHECK-DAG: Yes + // CHECK-DAG: No if (array[k] > 1000000 || array[k-1] > 1000000) printf("Yes\n"); else printf("No\n"); - // CHECK: KLEE: done: completed paths = 2 + // CHECK-DAG: KLEE: done: completed paths = 2 return 0; } diff --git a/test/ArrayOpt/test_noncontiguous_idx.c b/test/ArrayOpt/test_noncontiguous_idx.c index 2a6a15d209..fbef469e25 100644 --- a/test/ArrayOpt/test_noncontiguous_idx.c +++ b/test/ArrayOpt/test_noncontiguous_idx.c @@ -1,19 +1,16 @@ // RUN: %clang %s -emit-llvm %O0opt -c -o %t.bc // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=index %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_I +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=index %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_I // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=value %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_V +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=value %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_V // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR // RUN: not FileCheck %s -input-file=%t.klee-out/test000002.kquery -check-prefix=CHECK-CONST_ARR // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=all %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_I +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=all %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_I // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR @@ -35,11 +32,11 @@ int main() { klee_make_symbolic(&k, sizeof(k), "k"); klee_assume(k < 5); - // CHECK: Zero + // CHECK-DAG: zero if (array[k] == 0) printf("zero\n"); - // CHECK: KLEE: done: completed paths = 2 + // CHECK-DAG: KLEE: done: completed paths = 2 return 0; } diff --git a/test/ArrayOpt/test_position.c b/test/ArrayOpt/test_position.c index 015c4f1901..5cc0b364ea 100644 --- a/test/ArrayOpt/test_position.c +++ b/test/ArrayOpt/test_position.c @@ -1,19 +1,16 @@ // RUN: %clang %s -emit-llvm %O0opt -c -o %t.bc // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=index %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_I +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=index %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_I // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=value %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_V +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=value %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_V // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR // RUN: not FileCheck %s -input-file=%t.klee-out/test000002.kquery -check-prefix=CHECK-CONST_ARR // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=all %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_I +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=all %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_I // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR @@ -34,14 +31,14 @@ int main() { klee_make_symbolic(&k, sizeof(k), "k"); klee_assume(k < 5); - // CHECK: Yes - // CHECK-NEXT: No + // CHECK-DAG: No + // CHECK-DAG: Yes if (array[k] == 5) printf("Yes\n"); else printf("No\n"); - // CHECK: KLEE: done: completed paths = 2 + // CHECK-DAG: KLEE: done: completed paths = 2 return 0; } diff --git a/test/ArrayOpt/test_sub_idx.c b/test/ArrayOpt/test_sub_idx.c index 14f666eda8..36d5cbdfda 100644 --- a/test/ArrayOpt/test_sub_idx.c +++ b/test/ArrayOpt/test_sub_idx.c @@ -1,21 +1,18 @@ // RUN: %clang %s -emit-llvm %O0opt -c -o %t.bc // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=index %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_I +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=index %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_I // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR // RUN: not FileCheck %s -input-file=%t.klee-out/test000002.kquery -check-prefix=CHECK-CONST_ARR // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=value %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_V +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=value %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_V // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR // RUN: not FileCheck %s -input-file=%t.klee-out/test000002.kquery -check-prefix=CHECK-CONST_ARR // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=all %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_I +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=all %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_I // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR @@ -37,14 +34,14 @@ int main() { klee_assume(k < 5); klee_assume(k > 0); - // CHECK: Yes - // CHECK-NEXT: No + // CHECK-DAG: Yes + // CHECK-DAG: No if (array[k-1] == 1) printf("Yes\n"); else printf("No\n"); - // CHECK: KLEE: done: completed paths = 2 + // CHECK-DAG: KLEE: done: completed paths = 2 return 0; } diff --git a/test/ArrayOpt/test_var_idx.c b/test/ArrayOpt/test_var_idx.c index 3e077c1ebe..6c189e28da 100644 --- a/test/ArrayOpt/test_var_idx.c +++ b/test/ArrayOpt/test_var_idx.c @@ -1,21 +1,18 @@ // RUN: %clang %s -emit-llvm %O0opt -c -o %t.bc // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=index %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_I +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=index %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_I // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR // RUN: not FileCheck %s -input-file=%t.klee-out/test000002.kquery -check-prefix=CHECK-CONST_ARR // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=value %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_V +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=value %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_V // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR // RUN: not FileCheck %s -input-file=%t.klee-out/test000002.kquery -check-prefix=CHECK-CONST_ARR // RUN: rm -rf %t.klee-out -// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=all %t.bc > %t.log 2>&1 -// RUN: FileCheck %s -input-file=%t.log -check-prefix=CHECK-OPT_I +// RUN: %klee --write-kqueries --output-dir=%t.klee-out --optimize-array=all %t.bc 2>&1 | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPT_I // RUN: test -f %t.klee-out/test000001.kquery // RUN: test -f %t.klee-out/test000002.kquery // RUN: not FileCheck %s -input-file=%t.klee-out/test000001.kquery -check-prefix=CHECK-CONST_ARR @@ -35,14 +32,14 @@ int main() { klee_make_symbolic(&idx, sizeof(idx), "idx"); klee_assume(idx < 5); - // CHECK: Yes - // CHECK-NEXT: No + // CHECK-DAG: No + // CHECK-DAG: Yes if (array[idx] == 3) printf("Yes\n"); else printf("No\n"); - // CHECK: KLEE: done: completed paths = 2 + // CHECK-DAG: KLEE: done: completed paths = 2 return 0; } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index a62347c18e..3218d9e5f0 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -16,7 +16,12 @@ set(LLVMCC "${LLVMCC} -I${CMAKE_SOURCE_DIR}/include") set(LLVMCXX "${LLVMCXX} -I${CMAKE_SOURCE_DIR}/include") set(NATIVE_CC "${CMAKE_C_COMPILER} ${CMAKE_C_FLAGS} -I ${CMAKE_SOURCE_DIR}/include") set(NATIVE_CXX "${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS} -I ${CMAKE_SOURCE_DIR}/include") -set(TARGET_TRIPLE "${TARGET_TRIPLE}") + +if (${LLVM_VERSION_MAJOR} GREATER_EQUAL 15) + set(TARGET_TRIPLE "${LLVM_TARGET_TRIPLE}") +else() + set(TARGET_TRIPLE "${TARGET_TRIPLE}") +endif() # Extend native compiler invocation on macOS to point to the currently selected systems directory if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") @@ -28,10 +33,16 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") set(NATIVE_CXX "${NATIVE_CXX} -isysroot ${MAC_OS_SDK_PATH}") endif() +if (NOT KLEE_UCLIBC_PATH STREQUAL "") + set(SUPPORT_KLEE_UCLIBC 1) +else() + set(SUPPORT_KLEE_UCLIBC 0) +endif() + # FIXME: Do this to avoid changing the template file that # is shared by both build systems. if (ENABLE_POSIX_RUNTIME) - if (ENABLE_KLEE_UCLIBC) + if (NOT KLEE_UCLIBC_PATH STREQUAL "") set(ENABLE_POSIX_RUNTIME 1) else() message(AUTHOR_WARNING @@ -90,10 +101,8 @@ if (DOWNLOAD_FILECHECK_SOURCE) add_executable(FileCheck ${FILECHECK_SRC_FILE} ) - klee_get_llvm_libs(FILECHECK_NEEDED_LIBS Support) - target_include_directories(FileCheck PRIVATE ${KLEE_COMPONENT_EXTRA_INCLUDE_DIRS}) - target_compile_options(FileCheck PRIVATE ${KLEE_COMPONENT_CXX_FLAGS}) - target_compile_definitions(FileCheck PRIVATE ${KLEE_COMPONENT_CXX_DEFINES}) + llvm_config(FileCheck "${USE_LLVM_SHARED}" support) + target_include_directories(FileCheck PRIVATE ${LLVM_INCLUDE_DIRS}) target_link_libraries(FileCheck PRIVATE ${FILECHECK_NEEDED_LIBS}) endif() @@ -113,10 +122,8 @@ if (DOWNLOAD_NOT_SOURCE) add_executable("not" ${NOT_SRC_FILE} ) - klee_get_llvm_libs(NOT_NEEDED_LIBS Support) - target_include_directories("not" PRIVATE ${KLEE_COMPONENT_EXTRA_INCLUDE_DIRS}) - target_compile_options("not" PRIVATE ${KLEE_COMPONENT_CXX_FLAGS}) - target_compile_definitions("not" PRIVATE ${KLEE_COMPONENT_CXX_DEFINES}) + llvm_config("not" "${USE_LLVM_SHARED}" support) + target_include_directories("not" PRIVATE ${LLVM_INCLUDE_DIRS}) target_link_libraries("not" PRIVATE ${NOT_NEEDED_LIBS}) endif() @@ -145,7 +152,7 @@ file(GENERATE add_custom_target(systemtests COMMAND "${LIT_TOOL}" ${LIT_ARGS} "${CMAKE_CURRENT_BINARY_DIR}" - DEPENDS klee kleaver klee-replay kleeRuntest gen-bout gen-random-bout + DEPENDS klee kleaver klee-exec-tree klee-replay kleeRuntest ktest-gen ktest-randgen COMMENT "Running system tests" USES_TERMINAL ) diff --git a/test/CXX/LandingPad.cpp b/test/CXX/LandingPad.cpp index 18cad7c8a7..6b6e6748d5 100644 --- a/test/CXX/LandingPad.cpp +++ b/test/CXX/LandingPad.cpp @@ -1,3 +1,5 @@ +// REQUIRES: lt-llvm-15.0 +// Different LLVM IR syntax with opaque ptr - it's a nullptr directly, no constant // RUN: %clangxx %s -emit-llvm -c -o %t1.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out %t1.bc 2>&1 | FileCheck %s diff --git a/test/CXX/symex/libc++/atexit.cpp b/test/CXX/symex/libc++/atexit.cpp index fa8df47526..d084958b8a 100644 --- a/test/CXX/symex/libc++/atexit.cpp +++ b/test/CXX/symex/libc++/atexit.cpp @@ -2,7 +2,7 @@ // Disabling msan because it times out on CI // REQUIRES: libcxx // REQUIRES: uclibc -// RUN: %clangxx %s -emit-llvm %O0opt -c -std=c++11 -I "%libcxx_include" -g -nostdinc++ -o %t1.bc +// RUN: %clangxx %s -emit-llvm %O0opt -c -std=c++11 %libcxx_includes -g -nostdinc++ -o %t1.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --libc=uclibc --libcxx %t1.bc 2>&1 | FileCheck %s diff --git a/test/CXX/symex/libc++/can_catch_test.cpp b/test/CXX/symex/libc++/can_catch_test.cpp index c70d14a2aa..4c59c1263c 100644 --- a/test/CXX/symex/libc++/can_catch_test.cpp +++ b/test/CXX/symex/libc++/can_catch_test.cpp @@ -1,7 +1,7 @@ // REQUIRES: uclibc // REQUIRES: libcxx // REQUIRES: eh-cxx -// RUN: %clangxx %s -emit-llvm %O0opt -std=c++11 -c -I "%libcxx_include" -g -nostdinc++ -o %t.bc +// RUN: %clangxx %s -emit-llvm %O0opt -std=c++11 -c %libcxx_includes -g -nostdinc++ -o %t.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --exit-on-error --libcxx --libc=uclibc %t.bc 2>&1 | FileCheck %s diff --git a/test/CXX/symex/libc++/catch_recover.cpp b/test/CXX/symex/libc++/catch_recover.cpp index c77bea9182..8eee326a71 100644 --- a/test/CXX/symex/libc++/catch_recover.cpp +++ b/test/CXX/symex/libc++/catch_recover.cpp @@ -2,7 +2,7 @@ // Disabling msan because it times out on CI // REQUIRES: libcxx // REQUIRES: eh-cxx -// RUN: %clangxx %s -emit-llvm %O0opt -c -std=c++11 -I "%libcxx_include" -g -nostdinc++ -o %t1.bc +// RUN: %clangxx %s -emit-llvm %O0opt -c -std=c++11 %libcxx_includes -g -nostdinc++ -o %t1.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --libc=uclibc --libcxx %t1.bc 2>&1 | FileCheck %s diff --git a/test/CXX/symex/libc++/catch_with_adjusted_exception_pointer.cpp b/test/CXX/symex/libc++/catch_with_adjusted_exception_pointer.cpp index e3bf08ad95..57751b23f8 100644 --- a/test/CXX/symex/libc++/catch_with_adjusted_exception_pointer.cpp +++ b/test/CXX/symex/libc++/catch_with_adjusted_exception_pointer.cpp @@ -1,7 +1,7 @@ // REQUIRES: uclibc // REQUIRES: libcxx // REQUIRES: eh-cxx -// RUN: %clangxx %s -emit-llvm %O0opt -std=c++11 -c -I "%libcxx_include" -g -nostdinc++ -o %t.bc +// RUN: %clangxx %s -emit-llvm %O0opt -std=c++11 -c %libcxx_includes -g -nostdinc++ -o %t.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --exit-on-error --libcxx --libc=uclibc %t.bc 2>&1 | FileCheck %s diff --git a/test/CXX/symex/libc++/cout.cpp b/test/CXX/symex/libc++/cout.cpp index 62cd0406da..d845a1ead6 100644 --- a/test/CXX/symex/libc++/cout.cpp +++ b/test/CXX/symex/libc++/cout.cpp @@ -2,7 +2,7 @@ // Disabling msan because it times out on CI // REQUIRES: libcxx // REQUIRES: uclibc -// RUN: %clangxx %s -emit-llvm %O0opt -c -std=c++11 -I "%libcxx_include" -g -nostdinc++ -o %t1.bc +// RUN: %clangxx %s -emit-llvm %O0opt -c -std=c++11 %libcxx_includes -g -nostdinc++ -o %t1.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --libc=uclibc --libcxx %t1.bc 2>&1 | FileCheck %s diff --git a/test/CXX/symex/libc++/cout_sym.cpp b/test/CXX/symex/libc++/cout_sym.cpp index 177c3ed737..69420ac93a 100644 --- a/test/CXX/symex/libc++/cout_sym.cpp +++ b/test/CXX/symex/libc++/cout_sym.cpp @@ -2,7 +2,7 @@ // Disabling msan because it times out on CI // REQUIRES: libcxx // REQUIRES: uclibc -// RUN: %clangxx %s -emit-llvm %O0opt -c -std=c++11 -I "%libcxx_include" -g -nostdinc++ -o %t1.bc +// RUN: %clangxx %s -emit-llvm %O0opt -c -std=c++11 %libcxx_includes -g -nostdinc++ -o %t1.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --libc=uclibc --libcxx %t1.bc 2>&1 | FileCheck %s diff --git a/test/CXX/symex/libc++/dynamic_cast.cpp b/test/CXX/symex/libc++/dynamic_cast.cpp index a2fc8b82ac..f8a039ce06 100644 --- a/test/CXX/symex/libc++/dynamic_cast.cpp +++ b/test/CXX/symex/libc++/dynamic_cast.cpp @@ -2,7 +2,7 @@ // Disabling msan because it times out on CI // REQUIRES: libcxx // REQUIRES: uclibc -// RUN: %clangxx %s -emit-llvm %O0opt -c -std=c++11 -I "%libcxx_include" -g -nostdinc++ -o %t1.bc +// RUN: %clangxx %s -emit-llvm %O0opt -c -std=c++11 %libcxx_includes -g -nostdinc++ -o %t1.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --libc=uclibc --libcxx %t1.bc diff --git a/test/CXX/symex/libc++/exception.cpp b/test/CXX/symex/libc++/exception.cpp index 4d6805f65d..c36db2d939 100644 --- a/test/CXX/symex/libc++/exception.cpp +++ b/test/CXX/symex/libc++/exception.cpp @@ -2,7 +2,7 @@ // Disabling msan because it times out on CI // REQUIRES: libcxx // REQUIRES: eh-cxx -// RUN: %clangxx %s -emit-llvm %O0opt -c -std=c++11 -I "%libcxx_include" -g -nostdinc++ -o %t1.bc +// RUN: %clangxx %s -emit-llvm %O0opt -c -std=c++11 %libcxx_includes -g -nostdinc++ -o %t1.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --libc=uclibc --libcxx %t1.bc 2>&1 | FileCheck %s diff --git a/test/CXX/symex/libc++/exception_inheritance.cpp b/test/CXX/symex/libc++/exception_inheritance.cpp index ca207eb4be..4551bc18ee 100644 --- a/test/CXX/symex/libc++/exception_inheritance.cpp +++ b/test/CXX/symex/libc++/exception_inheritance.cpp @@ -1,7 +1,7 @@ // REQUIRES: uclibc // REQUIRES: libcxx // REQUIRES: eh-cxx -// RUN: %clangxx %s -emit-llvm %O0opt -std=c++11 -c -I "%libcxx_include" -g -nostdinc++ -o %t.bc +// RUN: %clangxx %s -emit-llvm %O0opt -std=c++11 -c %libcxx_includes -g -nostdinc++ -o %t.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --exit-on-error --libcxx --libc=uclibc %t.bc 2>&1 | FileCheck %s diff --git a/test/CXX/symex/libc++/general_catch.cpp b/test/CXX/symex/libc++/general_catch.cpp index c544f7a3a1..eb045d169e 100644 --- a/test/CXX/symex/libc++/general_catch.cpp +++ b/test/CXX/symex/libc++/general_catch.cpp @@ -2,7 +2,7 @@ // Disabling msan because it times out on CI // REQUIRES: libcxx // REQUIRES: eh-cxx -// RUN: %clangxx %s -emit-llvm %O0opt -c -std=c++11 -I "%libcxx_include" -g -nostdinc++ -o %t1.bc +// RUN: %clangxx %s -emit-llvm %O0opt -c -std=c++11 %libcxx_includes -g -nostdinc++ -o %t1.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --libc=uclibc --libcxx %t1.bc 2>&1 | FileCheck %s diff --git a/test/CXX/symex/libc++/landingpad.cpp b/test/CXX/symex/libc++/landingpad.cpp index 13dd6bc47a..c23b8ee239 100644 --- a/test/CXX/symex/libc++/landingpad.cpp +++ b/test/CXX/symex/libc++/landingpad.cpp @@ -4,7 +4,7 @@ // REQUIRES: uclibc // REQUIRES: libcxx // REQUIRES: eh-cxx -// RUN: %clangxx %s -emit-llvm %O0opt -std=c++11 -c -I "%libcxx_include" -g -nostdinc++ -o %t.bc +// RUN: %clangxx %s -emit-llvm %O0opt -std=c++11 -c %libcxx_includes -g -nostdinc++ -o %t.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --exit-on-error --libcxx --libc=uclibc %t.bc | FileCheck %s // Expect the following output: diff --git a/test/CXX/symex/libc++/multi_throw.cpp b/test/CXX/symex/libc++/multi_throw.cpp index 52e8d9b982..626585f4bd 100644 --- a/test/CXX/symex/libc++/multi_throw.cpp +++ b/test/CXX/symex/libc++/multi_throw.cpp @@ -2,7 +2,7 @@ // Disabling msan because it times out on CI // REQUIRES: libcxx // REQUIRES: eh-cxx -// RUN: %clangxx %s -emit-llvm %O0opt -c -std=c++11 -I "%libcxx_include" -g -nostdinc++ -o %t1.bc +// RUN: %clangxx %s -emit-llvm %O0opt -c -std=c++11 %libcxx_includes -g -nostdinc++ -o %t1.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --libc=uclibc --libcxx %t1.bc 2>&1 | FileCheck %s diff --git a/test/CXX/symex/libc++/multi_unwind.cpp b/test/CXX/symex/libc++/multi_unwind.cpp index cf29422cda..ab8d7a5c1b 100644 --- a/test/CXX/symex/libc++/multi_unwind.cpp +++ b/test/CXX/symex/libc++/multi_unwind.cpp @@ -2,7 +2,7 @@ // Disabling msan because it times out on CI // REQUIRES: libcxx // REQUIRES: eh-cxx -// RUN: %clangxx %s -emit-llvm %O0opt -c -std=c++11 -I "%libcxx_include" -g -nostdinc++ -o %t1.bc +// RUN: %clangxx %s -emit-llvm %O0opt -c -std=c++11 %libcxx_includes -g -nostdinc++ -o %t1.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --libc=uclibc --libcxx %t1.bc 2>&1 | FileCheck %s diff --git a/test/CXX/symex/libc++/nested.cpp b/test/CXX/symex/libc++/nested.cpp index 2122264246..1273a3b9e2 100644 --- a/test/CXX/symex/libc++/nested.cpp +++ b/test/CXX/symex/libc++/nested.cpp @@ -2,7 +2,7 @@ // Disabling msan because it times out on CI // REQUIRES: libcxx // REQUIRES: eh-cxx -// RUN: %clangxx %s -emit-llvm %O0opt -c -std=c++11 -I "%libcxx_include" -g -nostdinc++ -o %t1.bc +// RUN: %clangxx %s -emit-llvm %O0opt -c -std=c++11 %libcxx_includes -g -nostdinc++ -o %t1.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --exit-on-error --libc=uclibc --libcxx %t1.bc 2>&1 | FileCheck %s diff --git a/test/CXX/symex/libc++/nested_fail.cpp b/test/CXX/symex/libc++/nested_fail.cpp index d0b8ca0936..fe2df4c996 100644 --- a/test/CXX/symex/libc++/nested_fail.cpp +++ b/test/CXX/symex/libc++/nested_fail.cpp @@ -2,7 +2,7 @@ // Disabling msan because it times out on CI // REQUIRES: libcxx // REQUIRES: eh-cxx -// RUN: %clangxx %s -emit-llvm %O0opt -c -std=c++11 -I "%libcxx_include" -g -nostdinc++ -o %t1.bc +// RUN: %clangxx %s -emit-llvm %O0opt -c -std=c++11 %libcxx_includes -g -nostdinc++ -o %t1.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --libc=uclibc --libcxx %t1.bc 2>&1 | FileCheck %s @@ -24,4 +24,4 @@ int main(int argc, char **args) { } return 0; } -// CHECK: terminating with uncaught exception of type char* +// CHECK: terminating {{.*}} uncaught exception of type char* diff --git a/test/CXX/symex/libc++/rethrow.cpp b/test/CXX/symex/libc++/rethrow.cpp index 149fe693d5..213cb1aff9 100644 --- a/test/CXX/symex/libc++/rethrow.cpp +++ b/test/CXX/symex/libc++/rethrow.cpp @@ -1,7 +1,7 @@ // REQUIRES: uclibc // REQUIRES: libcxx // REQUIRES: eh-cxx -// RUN: %clangxx %s -emit-llvm %O0opt -std=c++11 -c -I "%libcxx_include" -g -nostdinc++ -o %t.bc +// RUN: %clangxx %s -emit-llvm %O0opt -std=c++11 -c %libcxx_includes -g -nostdinc++ -o %t.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --exit-on-error --libcxx --libc=uclibc %t.bc 2>&1 | FileCheck %s diff --git a/test/CXX/symex/libc++/simple_exception.cpp b/test/CXX/symex/libc++/simple_exception.cpp index 0196e1eb18..0ca8f8edf8 100644 --- a/test/CXX/symex/libc++/simple_exception.cpp +++ b/test/CXX/symex/libc++/simple_exception.cpp @@ -2,7 +2,7 @@ // Disabling msan because it times out on CI // REQUIRES: libcxx // REQUIRES: eh-cxx -// RUN: %clangxx %s -emit-llvm %O0opt -c -std=c++11 -I "%libcxx_include" -g -nostdinc++ -o %t1.bc +// RUN: %clangxx %s -emit-llvm %O0opt -c -std=c++11 %libcxx_includes -g -nostdinc++ -o %t1.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --libc=uclibc --libcxx %t1.bc 2>&1 | FileCheck %s diff --git a/test/CXX/symex/libc++/simple_exception_fail.cpp b/test/CXX/symex/libc++/simple_exception_fail.cpp index bda2cd333f..c3e295c22a 100644 --- a/test/CXX/symex/libc++/simple_exception_fail.cpp +++ b/test/CXX/symex/libc++/simple_exception_fail.cpp @@ -2,7 +2,7 @@ // Disabling msan because it times out on CI // REQUIRES: libcxx // REQUIRES: eh-cxx -// RUN: %clangxx %s -emit-llvm %O0opt -c -std=c++11 -I "%libcxx_include" -g -nostdinc++ -o %t1.bc +// RUN: %clangxx %s -emit-llvm %O0opt -c -std=c++11 %libcxx_includes -g -nostdinc++ -o %t1.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --libc=uclibc --libcxx %t1.bc 2>&1 | FileCheck %s @@ -11,4 +11,4 @@ int main(int argc, char **args) { throw std::runtime_error("foo"); } -// CHECK: terminating with uncaught exception of type std::runtime_error: foo \ No newline at end of file +// CHECK: terminating {{.*}} uncaught exception of type std::runtime_error: foo \ No newline at end of file diff --git a/test/CXX/symex/libc++/symbolic_exception.cpp b/test/CXX/symex/libc++/symbolic_exception.cpp index 3f29fa04db..50d682ba1a 100644 --- a/test/CXX/symex/libc++/symbolic_exception.cpp +++ b/test/CXX/symex/libc++/symbolic_exception.cpp @@ -2,7 +2,7 @@ // Disabling msan because it times out on CI // REQUIRES: libcxx // REQUIRES: eh-cxx -// RUN: %clangxx %s -emit-llvm %O0opt -c -std=c++11 -I "%libcxx_include" -g -nostdinc++ -o %t1.bc +// RUN: %clangxx %s -emit-llvm %O0opt -c -std=c++11 %libcxx_includes -g -nostdinc++ -o %t1.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --libc=uclibc --libcxx %t1.bc 2>&1 | FileCheck %s diff --git a/test/CXX/symex/libc++/throw_specifiers.cpp b/test/CXX/symex/libc++/throw_specifiers.cpp index 96195cd498..efd6a0be09 100644 --- a/test/CXX/symex/libc++/throw_specifiers.cpp +++ b/test/CXX/symex/libc++/throw_specifiers.cpp @@ -3,7 +3,7 @@ // REQUIRES: uclibc // REQUIRES: libcxx // REQUIRES: eh-cxx -// RUN: %clangxx %s -emit-llvm %O0opt -std=c++11 -c -I "%libcxx_include" -g -nostdinc++ -o %t.bc +// RUN: %clangxx %s -emit-llvm %O0opt -std=c++11 -c %libcxx_includes -g -nostdinc++ -o %t.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --libcxx --libc=uclibc %t.bc | FileCheck %s diff --git a/test/CXX/symex/libc++/throwing_exception_destructor.cpp b/test/CXX/symex/libc++/throwing_exception_destructor.cpp index 02d7cdb920..7505027c0e 100644 --- a/test/CXX/symex/libc++/throwing_exception_destructor.cpp +++ b/test/CXX/symex/libc++/throwing_exception_destructor.cpp @@ -2,7 +2,7 @@ // REQUIRES: uclibc // REQUIRES: libcxx // REQUIRES: eh-cxx -// RUN: %clangxx %s -emit-llvm -O0 -std=c++11 -c -I "%libcxx_include" -g -nostdinc++ -o %t.bc +// RUN: %clangxx %s -emit-llvm -O0 -std=c++11 -c %libcxx_includes -g -nostdinc++ -o %t.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --libcxx --libc=uclibc --exit-on-error %t.bc diff --git a/test/CXX/symex/libc++/uncaught_exception.cpp b/test/CXX/symex/libc++/uncaught_exception.cpp index 848013a0f0..4f9444a610 100644 --- a/test/CXX/symex/libc++/uncaught_exception.cpp +++ b/test/CXX/symex/libc++/uncaught_exception.cpp @@ -2,7 +2,7 @@ // Disabling msan because it times out on CI // REQUIRES: libcxx // REQUIRES: eh-cxx -// RUN: %clangxx %s -emit-llvm %O0opt -c -std=c++11 -I "%libcxx_include" -g -nostdinc++ -o %t1.bc +// RUN: %clangxx %s -emit-llvm %O0opt -c -std=c++11 %libcxx_includes -g -nostdinc++ -o %t1.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --libc=uclibc --libcxx %t1.bc 2>&1 | FileCheck %s diff --git a/test/CXX/symex/libc++/vector.cpp b/test/CXX/symex/libc++/vector.cpp index 6f69ad6539..33821b9e99 100644 --- a/test/CXX/symex/libc++/vector.cpp +++ b/test/CXX/symex/libc++/vector.cpp @@ -2,7 +2,7 @@ // Disabling msan because it times out on CI // REQUIRES: libcxx // REQUIRES: uclibc -// RUN: %clangxx %s -emit-llvm %O0opt -c -std=c++11 -I "%libcxx_include" -g -nostdinc++ -o %t1.bc +// RUN: %clangxx %s -emit-llvm %O0opt -c -std=c++11 %libcxx_includes -g -nostdinc++ -o %t1.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --exit-on-error --libc=uclibc --libcxx %t1.bc 2>&1 | FileCheck %s diff --git a/test/Concrete/CMakeLists.txt b/test/Concrete/CMakeLists.txt index e7cf2416ee..a073482ce8 100644 --- a/test/Concrete/CMakeLists.txt +++ b/test/Concrete/CMakeLists.txt @@ -8,4 +8,8 @@ #===------------------------------------------------------------------------===# set(OZERO_OPT "-O0 -Xclang -disable-O0-optnone") +if ("${LLVM_VERSION_MAJOR}" EQUAL 15) + set(LLVM_AS_FLAGS "-opaque-pointers") + set(LLVM_LINK_FLAGS "-opaque-pointers") +endif () configure_file(Makefile.cmake.test.in Makefile.cmake.test @ONLY) diff --git a/test/Concrete/ConstantExpr.ll b/test/Concrete/ConstantExpr.ll index efe9f14154..b85ce36ab1 100644 --- a/test/Concrete/ConstantExpr.ll +++ b/test/Concrete/ConstantExpr.ll @@ -1,3 +1,4 @@ +; REQUIRES: geq-llvm-15.0 ; RUN: %S/ConcreteTest.py --klee='%klee' --lli=%lli %s ; Most of the test below use the *address* of gInt as part of their computation, @@ -86,32 +87,6 @@ define void @"test_simple_arith"() { ret void } - -define void @"test_div_and_mod"() { - %t1 = add i32 udiv(i32 ptrtoint(i32* @gInt to i32), i32 13), 0 - %t2 = add i32 urem(i32 ptrtoint(i32* @gInt to i32), i32 13), 0 - %t3 = add i32 sdiv(i32 ptrtoint(i32* @gInt to i32), i32 13), 0 - %t4 = add i32 srem(i32 ptrtoint(i32* @gInt to i32), i32 13), 0 - - %p = ptrtoint i32* @gInt to i32 - - %i1 = udiv i32 %p, 13 - %i2 = urem i32 %p, 13 - %i3 = sdiv i32 %p, 13 - %i4 = srem i32 %p, 13 - - %x1 = sub i32 %t1, %i1 - %x2 = sub i32 %t2, %i2 - %x3 = sub i32 %t3, %i3 - %x4 = sub i32 %t4, %i4 - - call void @print_i32(i32 %x1) - call void @print_i32(i32 %x2) - call void @print_i32(i32 %x3) - call void @print_i32(i32 %x4) - - ret void -} define void @test_cmp() { %t1 = add i8 zext(i1 icmp ult (i64 ptrtoint(i32* @gInt to i64), i64 0) to i8), 1 @@ -142,8 +117,6 @@ define void @test_cmp() { define i32 @main() { call void @test_simple_arith() - call void @test_div_and_mod() - call void @test_cmp() call void @test_int_to_ptr() diff --git a/test/Concrete/ConstantExprOld.ll b/test/Concrete/ConstantExprOld.ll new file mode 100644 index 0000000000..2e6438bcea --- /dev/null +++ b/test/Concrete/ConstantExprOld.ll @@ -0,0 +1,166 @@ +; REQUIRES: lt-llvm-15.0 +; RUN: %S/ConcreteTest.py --klee='%klee' --lli=%lli %s + +; Most of the test below use the *address* of gInt as part of their computation, +; and then perform some operation (like x | ~x) which makes the result +; deterministic. They do, however, assume that the sign bit of the address as a +; 64-bit value will never be set. +@gInt = global i32 10 +@gIntWithConstant = global i32 sub(i32 ptrtoint(i32* @gInt to i32), + i32 ptrtoint(i32* @gInt to i32)) + +define void @"test_int_to_ptr"() { + %t1 = add i8 ptrtoint(i8* inttoptr(i32 100 to i8*) to i8), 0 + %t2 = add i32 ptrtoint(i32* inttoptr(i8 100 to i32*) to i32), 0 + %t3 = add i32 ptrtoint(i32* inttoptr(i64 100 to i32*) to i32), 0 + %t4 = add i64 ptrtoint(i8* inttoptr(i32 100 to i8*) to i64), 0 + + call void @print_i8(i8 %t1) + call void @print_i32(i32 %t2) + call void @print_i32(i32 %t3) + call void @print_i64(i64 %t4) + + ret void +} + +define void @"test_constant_ops"() { + %t1 = add i8 trunc(i64 add(i64 ptrtoint(i32* @gInt to i64), i64 -10) to i8), 10 + %t2 = and i64 sub(i64 sext(i32 ptrtoint(i32* @gInt to i32) to i64), i64 ptrtoint(i32* @gInt to i64)), 4294967295 + %t3 = and i64 sub(i64 zext(i32 ptrtoint(i32* @gInt to i32) to i64), i64 ptrtoint(i32* @gInt to i64)), 4294967295 + + %t4 = icmp eq i8 trunc(i64 ptrtoint(i32* @gInt to i64) to i8), %t1 + %t5 = zext i1 %t4 to i8 + + call void @print_i8(i8 %t5) + call void @print_i64(i64 %t2) + call void @print_i64(i64 %t3) + + ret void +} + +define void @"test_logical_ops"() { + %t1 = add i32 -10, and(i32 ptrtoint(i32* @gInt to i32), i32 xor(i32 ptrtoint(i32* @gInt to i32), i32 -1)) + %t2 = add i32 -10, or(i32 ptrtoint(i32* @gInt to i32), i32 xor(i32 ptrtoint(i32* @gInt to i32), i32 -1)) + %t3 = add i32 -10, xor(i32 xor(i32 ptrtoint(i32* @gInt to i32), i32 1024), i32 ptrtoint(i32* @gInt to i32)) + + call void @print_i32(i32 %t1) + call void @print_i32(i32 %t2) + call void @print_i32(i32 %t3) + + ; or the address with 1 to ensure the addresses will differ in 'ne' below + %t4 = shl i64 lshr(i64 or(i64 ptrtoint(i32* @gInt to i64), i64 1), i64 8), 8 + %t5 = shl i64 ashr(i64 or(i64 ptrtoint(i32* @gInt to i64), i64 1), i64 8), 8 + %t6 = lshr i64 shl(i64 or(i64 ptrtoint(i32* @gInt to i64), i64 1), i64 8), 8 + + %t7 = icmp eq i64 %t4, %t5 + %t8 = icmp ne i64 %t4, %t6 + + %t9 = zext i1 %t7 to i8 + %t10 = zext i1 %t8 to i8 + + call void @print_i8(i8 %t9) + call void @print_i8(i8 %t10) + + ret void +} + +%test.struct.type = type { i32, i32 } +@test_struct = global %test.struct.type { i32 0, i32 10 } + +define void @"test_misc"() { + ; probability that @gInt == 100 is very very low + %t1 = add i32 select(i1 icmp eq (i32* @gInt, i32* inttoptr(i32 100 to i32*)), i32 10, i32 0), 0 + call void @print_i32(i32 %t1) + + %t2 = load i32, i32* getelementptr(%test.struct.type, %test.struct.type* @test_struct, i32 0, i32 1) + call void @print_i32(i32 %t2) + + ret void +} + +define void @"test_simple_arith"() { + %t1 = add i32 add(i32 ptrtoint(i32* @gInt to i32), i32 0), 0 + %t2 = add i32 sub(i32 0, i32 ptrtoint(i32* @gInt to i32)), %t1 + %t3 = mul i32 mul(i32 ptrtoint(i32* @gInt to i32), i32 10), %t2 + + call void @print_i32(i32 %t3) + + ret void +} + +define void @"test_div_and_mod"() { + %t1 = add i32 udiv(i32 ptrtoint(i32* @gInt to i32), i32 13), 0 + %t2 = add i32 urem(i32 ptrtoint(i32* @gInt to i32), i32 13), 0 + %t3 = add i32 sdiv(i32 ptrtoint(i32* @gInt to i32), i32 13), 0 + %t4 = add i32 srem(i32 ptrtoint(i32* @gInt to i32), i32 13), 0 + + %p = ptrtoint i32* @gInt to i32 + + %i1 = udiv i32 %p, 13 + %i2 = urem i32 %p, 13 + %i3 = sdiv i32 %p, 13 + %i4 = srem i32 %p, 13 + + %x1 = sub i32 %t1, %i1 + %x2 = sub i32 %t2, %i2 + %x3 = sub i32 %t3, %i3 + %x4 = sub i32 %t4, %i4 + + call void @print_i32(i32 %x1) + call void @print_i32(i32 %x2) + call void @print_i32(i32 %x3) + call void @print_i32(i32 %x4) + + ret void +} + +define void @test_cmp() { + %t1 = add i8 zext(i1 icmp ult (i64 ptrtoint(i32* @gInt to i64), i64 0) to i8), 1 + %t2 = add i8 zext(i1 icmp ule (i64 ptrtoint(i32* @gInt to i64), i64 0) to i8), 1 + %t3 = add i8 zext(i1 icmp uge (i64 ptrtoint(i32* @gInt to i64), i64 0) to i8), 1 + %t4 = add i8 zext(i1 icmp ugt (i64 ptrtoint(i32* @gInt to i64), i64 0) to i8), 1 + %t5 = add i8 zext(i1 icmp slt (i64 ptrtoint(i32* @gInt to i64), i64 0) to i8), 1 + %t6 = add i8 zext(i1 icmp sle (i64 ptrtoint(i32* @gInt to i64), i64 0) to i8), 1 + %t7 = add i8 zext(i1 icmp sge (i64 ptrtoint(i32* @gInt to i64), i64 0) to i8), 1 + %t8 = add i8 zext(i1 icmp sgt (i64 ptrtoint(i32* @gInt to i64), i64 0) to i8), 1 + %t9 = add i8 zext(i1 icmp eq (i64 ptrtoint(i32* @gInt to i64), i64 10) to i8), 1 + %t10 = add i8 zext(i1 icmp ne (i64 ptrtoint(i32* @gInt to i64), i64 10) to i8), 1 + + call void @print_i1(i8 %t1) + call void @print_i1(i8 %t2) + call void @print_i1(i8 %t3) + call void @print_i1(i8 %t4) + call void @print_i1(i8 %t5) + call void @print_i1(i8 %t6) + call void @print_i1(i8 %t7) + call void @print_i1(i8 %t8) + call void @print_i1(i8 %t9) + call void @print_i1(i8 %t10) + + ret void +} + +define i32 @main() { + call void @test_simple_arith() + + call void @test_div_and_mod() + + call void @test_cmp() + + call void @test_int_to_ptr() + + call void @test_constant_ops() + + call void @test_logical_ops() + + call void @test_misc() + + ret i32 0 +} + +; defined in print_int.c +declare void @print_i1(i8) +declare void @print_i8(i8) +declare void @print_i16(i16) +declare void @print_i32(i32) +declare void @print_i64(i64) diff --git a/test/Concrete/Makefile.cmake.test.in b/test/Concrete/Makefile.cmake.test.in index 2282bb0837..765ea690fe 100644 --- a/test/Concrete/Makefile.cmake.test.in +++ b/test/Concrete/Makefile.cmake.test.in @@ -14,6 +14,8 @@ LLVMCC := @LLVMCC@ LLVMAS := @LLVM_AS@ LLVMLINK := @LLVM_LINK@ LLVMCC.CFlags := @OZERO_OPT@ -Wall +LLVMAS.Flags := @LLVM_AS_FLAGS@ +LLVMLINK.Flags := @LLVM_LINK_FLAGS@ # Make sure source files can match the pattern rules VPATH := @CMAKE_CURRENT_SOURCE_DIR@ @@ -28,7 +30,7 @@ Output/%.bc: %.c Output/.dir $(LLVMCC) -emit-llvm -c $(LLVMCC.CFlags) $< -o $@ Output/%.bc: %.ll $(LLVMAS) Output/.dir - $(LLVMAS) -f $< -o $@ + $(LLVMAS) $(LLVMAS.Flags) -f $< -o $@ # We build a separate testingUtils bitcode for each test, to make sure parallel # tests don't interact with one another. @@ -36,7 +38,7 @@ Output/%_testingUtils.bc: _testingUtils.c Output/.dir $(LLVMCC) -emit-llvm -c $(LLVMCC.CFlags) $< -o $@ Output/linked_%.bc: Output/%.bc Output/%_testingUtils.bc - $(LLVMLINK) $< Output/$*_testingUtils.bc -o $@ + $(LLVMLINK) $(LLVMLINK.Flags) $< Output/$*_testingUtils.bc -o $@ .PRECIOUS: Output/.dir diff --git a/test/Concrete/_testingUtils.c b/test/Concrete/_testingUtils.c index fa39582098..d51c696918 100644 --- a/test/Concrete/_testingUtils.c +++ b/test/Concrete/_testingUtils.c @@ -69,12 +69,11 @@ int main(int argc, char *argv[]) printf("print_i1(0)\n"); print_i1(0); // CHECK: i1(0) - // CHECK_NEXT: 0 + // CHECK-NEXT: 0 printf("print_i1(1)\n"); print_i1(1); // CHECK: i1(1) - // CHECK_NEXT: 1 - + // CHECK-NEXT: 1 } #endif diff --git a/test/Coverage/ReplayOutDir.c b/test/Coverage/ReplayOutDir.c index 6476f32fb6..d2e34b6ec3 100644 --- a/test/Coverage/ReplayOutDir.c +++ b/test/Coverage/ReplayOutDir.c @@ -3,6 +3,8 @@ // RUN: %klee --output-dir=%t1.out %t1.bc // RUN: %klee --output-dir=%t1.replay --replay-ktest-dir=%t1.out %t1.bc +#include "klee/klee.h" + int main() { int i; klee_make_symbolic(&i, sizeof i, "i"); diff --git a/test/DeterministicAllocation/OneOutOfBounds.c b/test/DeterministicAllocation/OneOutOfBounds.c new file mode 100644 index 0000000000..c3dbc597b1 --- /dev/null +++ b/test/DeterministicAllocation/OneOutOfBounds.c @@ -0,0 +1,12 @@ +// RUN: %clang %s -g -emit-llvm %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --kdalloc %t.bc 2>&1 | FileCheck %s +// RUN: test -f %t.klee-out/test000001.ptr.err +#include +int main() { + int *x = malloc(sizeof(int)); + // CHECK: OneOutOfBounds.c:[[@LINE+1]]: memory error: out of bound pointer + x[1] = 1; + free(x); + return 0; +} diff --git a/test/DeterministicAllocation/double-free-loh.c b/test/DeterministicAllocation/double-free-loh.c new file mode 100644 index 0000000000..f37b477724 --- /dev/null +++ b/test/DeterministicAllocation/double-free-loh.c @@ -0,0 +1,16 @@ +// RUN: %clang %s -emit-llvm -g -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee -kdalloc -kdalloc-quarantine=1 -output-dir=%t.klee-out %t.bc -exit-on-error >%t.output 2>&1 +// RUN: FileCheck %s -input-file=%t.output + +#include + +int main() { + void *ptr = malloc(4096); + free(ptr); + + // CHECK: double free + free(ptr); + + return 0; +} diff --git a/test/DeterministicAllocation/double-free.c b/test/DeterministicAllocation/double-free.c new file mode 100644 index 0000000000..141427fac2 --- /dev/null +++ b/test/DeterministicAllocation/double-free.c @@ -0,0 +1,16 @@ +// RUN: %clang %s -emit-llvm -g -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee -kdalloc -kdalloc-quarantine=1 -output-dir=%t.klee-out %t.bc -exit-on-error >%t.output 2>&1 +// RUN: FileCheck %s -input-file=%t.output + +#include + +int main() { + void *ptr = malloc(8); + free(ptr); + + // CHECK: double free + free(ptr); + + return 0; +} diff --git a/test/DeterministicAllocation/madvise.c b/test/DeterministicAllocation/madvise.c new file mode 100644 index 0000000000..bbaff5e848 --- /dev/null +++ b/test/DeterministicAllocation/madvise.c @@ -0,0 +1,49 @@ +// REQUIRES: not-msan && not-asan +// RUN: %clang %s -emit-llvm -g -c -o %t.bc +// RUN: rm -rf %t.klee-out %t.log +// RUN: %klee -kdalloc -kdalloc-quarantine=-1 -output-dir=%t.klee-out %t.bc -exit-on-error 2>&1 | tee %t.log +// RUN: FileCheck %s -input-file=%t.log + +// This test is disabled for asan and msan because they create additional page faults + +#include +#include +#include +#include + +#include "klee/klee.h" + +size_t maxrss() { + struct rusage usage; + int res = getrusage(RUSAGE_SELF, &usage); + assert(!res && "getrusage succeeded"); + return usage.ru_maxrss; +} + +int main(void) { + size_t baseline = maxrss(); +#if defined(__APPLE__) + size_t limit = baseline + 100 * 1024 * 1024; // limit is 100 MiB above baseline +#else + size_t limit = baseline + 100 * 1024; // limit is 100 MiB above baseline +#endif + + // CHECK: Deterministic allocator: Using unlimited quarantine + + size_t bins[] = {1, 4, 8, 16, 32, 64, 256, 2048}; + for (int i = 0; i < 1000; ++i) { + for (size_t j = 0; j < sizeof(bins) / sizeof(*bins); ++j) { + void *volatile p = malloc(bins[j]); + void *volatile p2 = malloc(4096); // for faster growth + + // CHECK: calling external: getrusage + // CHECK-NOT: ASSERTION FAIL + assert(maxrss() < limit && "MaxRSS is below limit"); + + free(p); + free(p2); + } + } + + return 0; +} \ No newline at end of file diff --git a/test/DeterministicAllocation/nullpage-read.c b/test/DeterministicAllocation/nullpage-read.c new file mode 100644 index 0000000000..15bdfd7d38 --- /dev/null +++ b/test/DeterministicAllocation/nullpage-read.c @@ -0,0 +1,20 @@ +// RUN: %clang %s -emit-llvm -g -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee -kdalloc -kdalloc-quarantine=1 -output-dir=%t.klee-out %t.bc -exit-on-error >%t.output 2>&1 +// RUN: FileCheck %s -input-file=%t.output + +#include +#include + +int main() { + struct { + int x; + int y; + } *ptr = NULL; + + // CHECK: null page access + int y; + memcpy(&y, &ptr->y, sizeof(ptr->y)); + + return 0; +} diff --git a/test/DeterministicAllocation/nullpage-write.c b/test/DeterministicAllocation/nullpage-write.c new file mode 100644 index 0000000000..950e2e1773 --- /dev/null +++ b/test/DeterministicAllocation/nullpage-write.c @@ -0,0 +1,19 @@ +// RUN: %clang %s -emit-llvm -g -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee -kdalloc -kdalloc-quarantine=1 -output-dir=%t.klee-out %t.bc -exit-on-error >%t.output 2>&1 +// RUN: FileCheck %s -input-file=%t.output + +#include +#include + +int main() { + struct { + int x; + int y; + } *ptr = NULL; + + // CHECK: null page access + memset(&ptr->y, 0, sizeof(ptr->y)); + + return 0; +} diff --git a/test/DeterministicAllocation/use-after-free-loh.c b/test/DeterministicAllocation/use-after-free-loh.c new file mode 100644 index 0000000000..5a576b42f6 --- /dev/null +++ b/test/DeterministicAllocation/use-after-free-loh.c @@ -0,0 +1,17 @@ +// RUN: %clang %s -emit-llvm -g -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee -kdalloc -kdalloc-quarantine=1 -output-dir=%t.klee-out %t.bc -exit-on-error >%t.output 2>&1 +// RUN: FileCheck %s -input-file=%t.output + +#include +#include + +int main() { + void *ptr = malloc(4096); + free(ptr); + + // CHECK: use after free + memset(ptr, 0, 4096); + + return 0; +} diff --git a/test/DeterministicAllocation/use-after-free.c b/test/DeterministicAllocation/use-after-free.c new file mode 100644 index 0000000000..c4a14435a7 --- /dev/null +++ b/test/DeterministicAllocation/use-after-free.c @@ -0,0 +1,17 @@ +// RUN: %clang %s -emit-llvm -g -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee -kdalloc -kdalloc-quarantine=1 -output-dir=%t.klee-out %t.bc -exit-on-error >%t.output 2>&1 +// RUN: FileCheck %s -input-file=%t.output + +#include +#include + +int main() { + void *ptr = malloc(8); + free(ptr); + + // CHECK: use after free + memset(ptr, 0, 8); + + return 0; +} diff --git a/test/Feature/AddressOfLabelsSymbolic.c b/test/Feature/AddressOfLabelsSymbolic.c index 0b24a42d62..1097a189bc 100644 --- a/test/Feature/AddressOfLabelsSymbolic.c +++ b/test/Feature/AddressOfLabelsSymbolic.c @@ -4,6 +4,8 @@ // RUN: FileCheck %s -check-prefix=CHECK-MSG --input-file=%t.log // RUN: FileCheck %s -check-prefix=CHECK-ERR --input-file=%t.stderr.log +#include "klee/klee.h" + #include int main(void) { diff --git a/test/Feature/BFSSearcherAndDFSSearcherInterleaved.c b/test/Feature/BFSSearcherAndDFSSearcherInterleaved.c index 88d49548cf..8e4859a3b4 100644 --- a/test/Feature/BFSSearcherAndDFSSearcherInterleaved.c +++ b/test/Feature/BFSSearcherAndDFSSearcherInterleaved.c @@ -13,7 +13,7 @@ // RUN: FileCheck -input-file=%t-dfs-bfs.out %s #include "klee/klee.h" - +#include int main() { int x, y, z; klee_make_symbolic(&x, sizeof(x), "x"); diff --git a/test/Feature/BitcastAlias.ll b/test/Feature/BitcastAlias.ll index cf84df0680..c432acf78c 100644 --- a/test/Feature/BitcastAlias.ll +++ b/test/Feature/BitcastAlias.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as %s -f -o %t1.bc +; RUN: %llvmas %s -f -o %t1.bc ; RUN: rm -rf %t.klee-out ; RUN: %klee --output-dir=%t.klee-out --optimize=false %t1.bc > %t2 ; RUN: grep PASS %t2 diff --git a/test/Feature/BitcastAliasMD2U.ll b/test/Feature/BitcastAliasMD2U.ll index bf43d8c33a..aa2d301146 100644 --- a/test/Feature/BitcastAliasMD2U.ll +++ b/test/Feature/BitcastAliasMD2U.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as %s -f -o %t1.bc +; RUN: %llvmas %s -f -o %t1.bc ; RUN: rm -rf %t.klee-out ; RUN: %klee --output-dir=%t.klee-out --optimize=false -search=nurs:md2u %t1.bc > %t2 ; RUN: grep PASS %t2 diff --git a/test/Feature/ByteSwap.c b/test/Feature/ByteSwap.c index 1e4ec190d1..d862b53d50 100644 --- a/test/Feature/ByteSwap.c +++ b/test/Feature/ByteSwap.c @@ -1,7 +1,7 @@ // RUN: %clang %s -emit-llvm %O0opt -c -o %t1.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --libc=klee --exit-on-error %t1.bc - +#include "klee/klee.h" #include #include diff --git a/test/Feature/CheckMemoryAccess.c b/test/Feature/CheckMemoryAccess.c index a9e0e6b5bf..9854f98350 100644 --- a/test/Feature/CheckMemoryAccess.c +++ b/test/Feature/CheckMemoryAccess.c @@ -3,10 +3,10 @@ // RUN: %klee --output-dir=%t.klee-out %t.bc > %t.log // RUN: grep -q "good" %t.log // RUN: not grep -q "bad" %t.log - +#include "klee/klee.h" #include -#include #include +#include int main() { char buf[4]; diff --git a/test/Feature/CompressedExprLogging.c b/test/Feature/CompressedExprLogging.c index 42c4240264..1344988bc5 100644 --- a/test/Feature/CompressedExprLogging.c +++ b/test/Feature/CompressedExprLogging.c @@ -10,7 +10,7 @@ // RUN: %klee --output-dir=%t.klee-out2 --use-cex-cache=false --compress-query-log --use-query-log=all:kquery %t1.bc // RUN: gunzip -d %t.klee-out2/all-queries.kquery.gz // RUN: diff %t.klee-out/all-queries.kquery %t.klee-out/all-queries.kquery - +#include "klee/klee.h" #include int constantArr[16] = {1 << 0, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, diff --git a/test/Feature/ConcretizeSymbolicExternals.c b/test/Feature/ConcretizeSymbolicExternals.c new file mode 100644 index 0000000000..89f1ad8d2e --- /dev/null +++ b/test/Feature/ConcretizeSymbolicExternals.c @@ -0,0 +1,35 @@ +// Check for calling external functions using symbolic parameters. +// Externals calls might modify memory objects that have been previously fully symbolic. +// The constant modifications should be propagated back. +// RUN: %clang %s -emit-llvm -g -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out -external-calls=all %t.bc > %t.log +// RUN: FileCheck -input-file=%t.log %s +// REQUIRES: not-darwin +#include "klee/klee.h" +#include + +int main() { + + int a; + int b; + int c; + + // Symbolize argument that gets concretized by the external call + klee_make_symbolic(&a, sizeof(a), "a"); + klee_make_symbolic(&b, sizeof(b), "b"); + klee_make_symbolic(&c, sizeof(c), "c"); + if (a == 2 && b == 3) { + // Constrain fully symbolic `a` and `b` to concrete values + + // Although a and b are not character vectors, explicitly constraining them to `2` and `3` + // leads to the most significant bits of the int (e.g. bit 8 to 31 of 32bit) set to `\0`. + // This leads to an actual null-termination of the character vector, which makes it safe + // to use by an external function. + printf("%s%s%n\n", (char *)&a, (char *)&b, &c); + printf("after: a = %d b = %d c = %d\n", a, b, c); + //CHECK: after: a = 2 b = 3 c = 2 + } + + return 0; +} diff --git a/test/Feature/ConstantArray.ll b/test/Feature/ConstantArray.ll index 32d4934cc7..176addb6f5 100644 --- a/test/Feature/ConstantArray.ll +++ b/test/Feature/ConstantArray.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as %s -f -o %t1.bc +; RUN: %llvmas %s -f -o %t1.bc ; RUN: rm -rf %t.klee-out ; RUN: %klee --output-dir=%t.klee-out --optimize=false %t1.bc 2>&1 | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" diff --git a/test/Feature/ConstantStruct.ll b/test/Feature/ConstantStruct.ll index 57ca1663e8..1ccd50449f 100644 --- a/test/Feature/ConstantStruct.ll +++ b/test/Feature/ConstantStruct.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as %s -f -o %t1.bc +; RUN: %llvmas %s -f -o %t1.bc ; RUN: rm -rf %t.klee-out ; RUN: %klee --output-dir=%t.klee-out --optimize=false %t1.bc > %t2 ; RUN: grep PASS %t2 diff --git a/test/Feature/CopyOnWrite.c b/test/Feature/CopyOnWrite.c index 9d443bf604..73342642cc 100644 --- a/test/Feature/CopyOnWrite.c +++ b/test/Feature/CopyOnWrite.c @@ -1,7 +1,7 @@ // RUN: %clang %s -emit-llvm -g -c -o %t1.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --search=random-state --exit-on-error %t1.bc - +#include "klee/klee.h" #include #define N 5 diff --git a/test/Feature/DanglingConcreteReadExpr.c b/test/Feature/DanglingConcreteReadExpr.c index ba7c7bc54f..7b0c981dc9 100644 --- a/test/Feature/DanglingConcreteReadExpr.c +++ b/test/Feature/DanglingConcreteReadExpr.c @@ -2,7 +2,7 @@ // RUN: rm -rf %t.klee-out // RUN: %klee --optimize=false --output-dir=%t.klee-out %t1.bc // RUN: grep "total queries = 2" %t.klee-out/info - +#include "klee/klee.h" #include int main() { diff --git a/test/Feature/DefineFixedObject.c b/test/Feature/DefineFixedObject.c index 6e7efb14fc..102034d0ba 100644 --- a/test/Feature/DefineFixedObject.c +++ b/test/Feature/DefineFixedObject.c @@ -1,7 +1,7 @@ // RUN: %clang -emit-llvm -c -o %t1.bc %s // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --exit-on-error %t1.bc - +#include "klee/klee.h" #include #define ADDRESS ((int*) 0x0080) diff --git a/test/Feature/DoubleFree.c b/test/Feature/DoubleFree.c index 96cf9bcd97..c8fb197414 100644 --- a/test/Feature/DoubleFree.c +++ b/test/Feature/DoubleFree.c @@ -1,12 +1,14 @@ // RUN: %clang %s -emit-llvm %O0opt -c -o %t1.bc // RUN: rm -rf %t.klee-out -// RUN: %klee --output-dir=%t.klee-out %t1.bc 2>&1 | FileCheck %s +// RUN: %klee --output-dir=%t.klee-out --kdalloc %t1.bc 2>&1 | FileCheck %s // RUN: test -f %t.klee-out/test000001.ptr.err +#include + int main() { - int *x = malloc(4); + int *x = malloc(sizeof(*x)); free(x); - // CHECK: memory error: invalid pointer: free + // CHECK: memory error: double free free(x); return 0; } diff --git a/test/Feature/EntryPoint.c b/test/Feature/EntryPoint.c index 8265973350..48442659fc 100644 --- a/test/Feature/EntryPoint.c +++ b/test/Feature/EntryPoint.c @@ -1,11 +1,27 @@ // RUN: %clang -emit-llvm -g -c %s -o %t.bc // RUN: rm -rf %t.klee-out -// RUN: %klee --output-dir=%t.klee-out --entry-point=other_main %t.bc > %t.log -// RUN: grep "Hello World" %t.log +// RUN: %klee --output-dir=%t.klee-out --entry-point=other_main %t.bc | FileCheck -check-prefix=CHECK-OTHER_MAIN %s + +// RUN: rm -rf %t.klee-out +// RUN: %clang -emit-llvm -g -c -DMAIN %s -o %t.bc +// RUN: %klee --output-dir=%t.klee-out --entry-point=other_main %t.bc | FileCheck -check-prefix=CHECK-OTHER_MAIN %s + +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --entry-point="" %t.bc 2>%t.stderr.log || echo "Exit status must be 0" +// RUN: FileCheck -check-prefix=CHECK-EMPTY --input-file=%t.stderr.log %s #include int other_main() { printf("Hello World\n"); + // CHECK-OTHER_MAIN: Hello World return 0; } + +#ifdef MAIN +int main() { + return 0; +} +#endif + +// CHECK-EMPTY: KLEE: ERROR: entry-point cannot be empty diff --git a/test/Feature/EntryPointMissing.c b/test/Feature/EntryPointMissing.c new file mode 100644 index 0000000000..c18fe59004 --- /dev/null +++ b/test/Feature/EntryPointMissing.c @@ -0,0 +1,63 @@ +// REQUIRES: posix-runtime +// REQUIRES: uclibc + +// RUN: %clang -emit-llvm -g -c %s -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: not %klee --output-dir=%t.klee-out --entry-point=missing %t.bc 2>&1 | FileCheck -check-prefix=CHECK-MISSING %s + +// RUN: %clang -emit-llvm -g -c %s -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: not %klee --output-dir=%t.klee-out --entry-point=missing --libc=uclibc %t.bc 2>&1 | FileCheck -check-prefix=CHECK-MISSING %s + +// RUN: %clang -emit-llvm -g -c %s -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: not %klee --output-dir=%t.klee-out --entry-point=missing %t.bc --posix-runtime 2>&1 | FileCheck -check-prefix=CHECK-MISSING %s + +// RUN: %clang -emit-llvm -g -c %s -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: not %klee --output-dir=%t.klee-out --entry-point=missing %t.bc --libc=uclibc --posix-runtime 2>&1 | FileCheck -check-prefix=CHECK-MISSING %s + +// RUN: %clang -emit-llvm -g -c %s -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: not %klee --output-dir=%t.klee-out --entry-point=missing --libc=klee %t.bc 2>&1 | FileCheck -check-prefix=CHECK-MISSING %s + +// RUN: %clang -emit-llvm -g -c %s -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: not %klee --output-dir=%t.klee-out --entry-point=missing --libc=klee --posix-runtime %t.bc 2>&1 | FileCheck -check-prefix=CHECK-MISSING %s + + +/* Missing main */ + +// RUN: %clang -emit-llvm -g -c %s -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: not %klee --output-dir=%t.klee-out --entry-point=main %t.bc 2>&1 | FileCheck -check-prefix=CHECK-MAIN %s + +// RUN: %clang -emit-llvm -g -c %s -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: not %klee --output-dir=%t.klee-out --entry-point=main --libc=uclibc %t.bc 2>&1 | FileCheck -check-prefix=CHECK-MAIN %s + +// RUN: %clang -emit-llvm -g -c %s -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: not %klee --output-dir=%t.klee-out --entry-point=main --posix-runtime %t.bc 2>&1 | FileCheck -check-prefix=CHECK-MAIN %s + +// RUN: %clang -emit-llvm -g -c %s -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: not %klee --output-dir=%t.klee-out --entry-point=main --libc=uclibc --posix-runtime %t.bc 2>&1 | FileCheck -check-prefix=CHECK-MAIN %s + +// RUN: %clang -emit-llvm -g -c %s -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: not %klee --output-dir=%t.klee-out --entry-point=main --libc=klee %t.bc 2>&1 | FileCheck -check-prefix=CHECK-MAIN %s + +// RUN: %clang -emit-llvm -g -c %s -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: not %klee --output-dir=%t.klee-out --entry-point=main --libc=klee --posix-runtime %t.bc 2>&1 | FileCheck -check-prefix=CHECK-MAIN %s + +#include + +int hello() { + printf("Hello World\n"); + return 0; +} + +// CHECK-MISSING: Entry function 'missing' not found in module +// CHECK-MAIN: Entry function 'main' not found in module diff --git a/test/Feature/EntryPointUclibcPosix.c b/test/Feature/EntryPointUclibcPosix.c new file mode 100644 index 0000000000..e3d8092854 --- /dev/null +++ b/test/Feature/EntryPointUclibcPosix.c @@ -0,0 +1,45 @@ +// REQUIRES: uclibc +// REQUIRES: posix-runtime + +/* Similar test as EntryPoint.c, but with POSIX and uclibc. This + checks that the various wrappers and renames introduced when + linking the uclibc and the POSIX runtime are correctly handled. */ + +// RUN: %clang -emit-llvm -g -c %s -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --libc=uclibc --posix-runtime --output-dir=%t.klee-out --entry-point=other_main %t.bc | FileCheck %s + +// RUN: rm -rf %t.klee-out +// RUN: %clang -emit-llvm -g -c -DMAIN %s -o %t.bc +// RUN: %klee --libc=uclibc --posix-runtime --output-dir=%t.klee-out --entry-point=other_main %t.bc | FileCheck %s + +// RUN: %clang -emit-llvm -g -c %s -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --libc=uclibc --output-dir=%t.klee-out --entry-point=other_main %t.bc | FileCheck %s + +// RUN: rm -rf %t.klee-out +// RUN: %clang -emit-llvm -g -c -DMAIN %s -o %t.bc +// RUN: %klee --libc=uclibc --output-dir=%t.klee-out --entry-point=other_main %t.bc | FileCheck %s + +// RUN: %clang -emit-llvm -g -c %s -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --posix-runtime --output-dir=%t.klee-out --entry-point=other_main %t.bc | FileCheck %s + +// RUN: rm -rf %t.klee-out +// RUN: %clang -emit-llvm -g -c -DMAIN %s -o %t.bc +// RUN: %klee --posix-runtime --output-dir=%t.klee-out --entry-point=other_main %t.bc | FileCheck %s + + +#include + +int other_main() { + printf("Hello World\n"); + // CHECK: Hello World + return 0; +} + +#ifdef MAIN +int main() { + return 0; +} +#endif diff --git a/test/Feature/Envp.c b/test/Feature/Envp.c index 62c913257b..2b1b6bdcea 100644 --- a/test/Feature/Envp.c +++ b/test/Feature/Envp.c @@ -1,8 +1,9 @@ // RUN: %clang %s -emit-llvm -g -c -o %t1.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --exit-on-error %t1.bc - #include +#include +#include int main(int argc, char **argv, char **envp) { unsigned i; diff --git a/test/Feature/ExprLogging.c b/test/Feature/ExprLogging.c index 70aaa49be3..d892272a88 100644 --- a/test/Feature/ExprLogging.c +++ b/test/Feature/ExprLogging.c @@ -11,6 +11,8 @@ // RUN: grep "^; Query" %t.klee-out/all-queries.smt2 | wc -l | grep -q 17 // RUN: grep "^; Query" %t.klee-out/solver-queries.smt2 | wc -l | grep -q 17 +#include "klee/klee.h" + #include int constantArr[16 ] = { diff --git a/test/Feature/ExtCall.c b/test/Feature/ExtCall.c new file mode 100644 index 0000000000..e38f92d948 --- /dev/null +++ b/test/Feature/ExtCall.c @@ -0,0 +1,23 @@ +// This test checks that symbolic arguments to a function call are correctly concretized +// RUN: %clang %s -emit-llvm %O0opt -g -c -o %t.bc + +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --external-calls=all --exit-on-error %t.bc 2>&1 | FileCheck %s + +#include "klee/klee.h" + +#include +#include +#include + +int main() { + int x; + klee_make_symbolic(&x, sizeof(x), "x"); + klee_assume(x >= 0); + + int y = abs(x); + printf("y = %d\n", y); + // CHECK: calling external: abs((ReadLSB w32 0 x)) + + assert(x == y); +} diff --git a/test/Feature/ExtCallOverapprox.c b/test/Feature/ExtCallOverapprox.c new file mode 100644 index 0000000000..76ae319dcd --- /dev/null +++ b/test/Feature/ExtCallOverapprox.c @@ -0,0 +1,26 @@ +// This test checks that under using the over-approximate external call policy, the symbolic arguments are left unconstrained by the external call + +// RUN: %clang %s -emit-llvm %O0opt -g -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --external-calls=over-approx %t.bc 2>&1 | FileCheck %s + +#include "klee/klee.h" + +#include +#include +#include + +int main() { + int x; + klee_make_symbolic(&x, sizeof(x), "x"); + + printf("%d\n", x); + // CHECK: calling external: printf + if (x > 0) { + printf("Yes\n"); + // CHECK-DAG: Yes + } else { + printf("No\n"); + // CHECK-DAG: No + } +} diff --git a/test/Feature/ExtCallWarnings.c b/test/Feature/ExtCallWarnings.c new file mode 100644 index 0000000000..6ee3f3711e --- /dev/null +++ b/test/Feature/ExtCallWarnings.c @@ -0,0 +1,26 @@ +// RUN: %clang %s -emit-llvm %O0opt -g -c -o %t.bc + +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --external-call-warnings=none %t.bc 2>&1 | FileCheck --check-prefix=CHECK-NONE %s + +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --external-call-warnings=once-per-function %t.bc 2>&1 | FileCheck --check-prefix=CHECK-ONCE %s + +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --external-call-warnings=all %t.bc 2>&1 | FileCheck --check-prefix=CHECK-ALL %s + +#include "klee/klee.h" +#include +#include + +int main() { + return abs(-5) + abs(6); + // CHECK-NONE-NOT: calling external + + // CHECK-ONCE: calling external + // CHECK-ONCE-NOT: calling external + + // CHECK-ALL: calling external + // CHECK-ALL: calling external + // CHECK-ALL-NOT: calling external +} diff --git a/test/Feature/FNeg.ll b/test/Feature/FNeg.ll index cdea6aaa77..a6213fc2f8 100644 --- a/test/Feature/FNeg.ll +++ b/test/Feature/FNeg.ll @@ -1,4 +1,3 @@ -; REQUIRES: geq-llvm-8.0 ; RUN: %llvmas %s -o %t.bc ; RUN: rm -rf %t.klee-out ; RUN: %klee -exit-on-error -output-dir=%t.klee-out -optimize=false %t.bc diff --git a/test/Feature/FunctionAliasExit.c b/test/Feature/FunctionAliasExit.c index b30838d0c8..40b5d617d8 100644 --- a/test/Feature/FunctionAliasExit.c +++ b/test/Feature/FunctionAliasExit.c @@ -1,6 +1,8 @@ // RUN: %clang %s -emit-llvm %O0opt -c -o %t.bc // RUN: rm -rf %t.klee-out -// RUN: %klee --output-dir=%t.klee-out -function-alias=exit:end %t.bc 2>&1 | FileCheck %s +// RUN: %klee --search=bfs --output-dir=%t.klee-out -function-alias=exit:end %t.bc 2>&1 | FileCheck %s + +#include "klee/klee.h" #include #include diff --git a/test/Feature/FunctionPointer.c b/test/Feature/FunctionPointer.c index 649946dc37..b2e31ee096 100644 --- a/test/Feature/FunctionPointer.c +++ b/test/Feature/FunctionPointer.c @@ -1,6 +1,6 @@ // RUN: %clang %s -emit-llvm -g -c -o %t.bc // RUN: rm -rf %t.klee-out -// RUN: %klee --output-dir=%t.klee-out --write-no-tests --exit-on-error %t.bc 2>&1 | FileCheck %s +// RUN: %klee --search=bfs --output-dir=%t.klee-out --write-no-tests --exit-on-error %t.bc 2>&1 | FileCheck %s #include "klee/klee.h" @@ -42,8 +42,8 @@ int main(int argc, char **argv) { void (*fp2)(const char *); klee_make_symbolic(&fp2, sizeof fp2, "fp2"); if(fp2 == baz || fp2 == foo) { - // CHECK-DAG: baz: calling via symbolic! - // CHECK-DAG: foo: calling via symbolic! + // CHECK: baz: calling via symbolic! + // CHECK: foo: calling via symbolic! fp2("calling via symbolic!"); } diff --git a/test/Feature/GetElementPtr.ll b/test/Feature/GetElementPtr.ll index e92b27c24b..e0adfd7906 100644 --- a/test/Feature/GetElementPtr.ll +++ b/test/Feature/GetElementPtr.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as %s -f -o %t1.bc +; RUN: %llvmas %s -f -o %t1.bc ; RUN: rm -rf %t.klee-out ; RUN: %klee --output-dir=%t.klee-out --optimize=false %t1.bc > %t2 ; RUN: grep PASS %t2 diff --git a/test/Feature/GetValue.c b/test/Feature/GetValue.c index d2b046f4fd..c652658f9c 100644 --- a/test/Feature/GetValue.c +++ b/test/Feature/GetValue.c @@ -1,9 +1,9 @@ // RUN: %clang -emit-llvm -c -o %t1.bc %s // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --exit-on-error %t1.bc - -#include +#include "klee/klee.h" #include +#include int main() { int x = klee_int("x"); diff --git a/test/Feature/GlobalVariable.ll b/test/Feature/GlobalVariable.ll index 7b567bcb87..e7f31e4f66 100644 --- a/test/Feature/GlobalVariable.ll +++ b/test/Feature/GlobalVariable.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as %s -f -o %t1.bc +; RUN: %llvmas %s -f -o %t1.bc ; RUN: rm -rf %t.klee-out ; Run KLEE and expect it to error out but not crash ; RUN: not %klee --output-dir=%t.klee-out --optimize=false %t1.bc 2> %t2 diff --git a/test/Feature/ImpliedValue.c.failing b/test/Feature/ImpliedValue.c.failing index dd4d8f5571..2673d69f15 100644 --- a/test/Feature/ImpliedValue.c.failing +++ b/test/Feature/ImpliedValue.c.failing @@ -1,7 +1,7 @@ // RUN: rm -f %t4.out %t4.err %t4.log // RUN: %llvmgcc %s -emit-llvm -O2 -c -o %t1.bc -// RUN: llvm-as -f ../_utils._ll -o %t2.bc -// RUN: llvm-ld --optimize=false -link-as-library %t1.bc %t2.bc -o %t3.bc +// RUN: %llvmas -f ../_utils._ll -o %t2.bc +// RUN: %llvm-ld --optimize=false -link-as-library %t1.bc %t2.bc -o %t3.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --log-file %t4.log --debug-check-for-implied-values %t3.bc > %t4.out 2> %t4.err // RUN: ls %t.klee-out | not grep .err diff --git a/test/Feature/InAndOutOfBounds.c b/test/Feature/InAndOutOfBounds.c index 39ed83220a..37c30e8fa7 100644 --- a/test/Feature/InAndOutOfBounds.c +++ b/test/Feature/InAndOutOfBounds.c @@ -4,6 +4,8 @@ // RUN: test -f %t.klee-out/test000001.ptr.err -o -f %t.klee-out/test000002.ptr.err // RUN: not test -f %t.klee-out/test000001.ptr.err -a -f %t.klee-out/test000002.ptr.err // RUN: not test -f %t.klee-out/test000003.ktest +#include "klee/klee.h" +#include unsigned klee_urange(unsigned start, unsigned end) { unsigned x; diff --git a/test/Feature/IndirectCallToExternal.c b/test/Feature/IndirectCallToExternal.c index 03447c7ddc..2d4943dc76 100644 --- a/test/Feature/IndirectCallToExternal.c +++ b/test/Feature/IndirectCallToExternal.c @@ -8,7 +8,7 @@ #include int main() { - int (*scmp)(char*,char*) = strcmp; + int (*scmp)(const char *, const char *) = strcmp; assert(scmp("hello","hi") < 0); diff --git a/test/Feature/InsertExtractValue.ll b/test/Feature/InsertExtractValue.ll index b4e7ab558e..9df3eec5ba 100644 --- a/test/Feature/InsertExtractValue.ll +++ b/test/Feature/InsertExtractValue.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as %s -f -o %t1.bc +; RUN: %llvmas %s -f -o %t1.bc ; RUN: rm -rf %t.klee-out ; RUN: %klee --output-dir=%t.klee-out --optimize=false %t1.bc > %t2 ; RUN: grep PASS %t2 diff --git a/test/Feature/IsSymbolic.c b/test/Feature/IsSymbolic.c index 033d9d6a4d..266dd23f43 100644 --- a/test/Feature/IsSymbolic.c +++ b/test/Feature/IsSymbolic.c @@ -1,7 +1,7 @@ // RUN: %clang %s -emit-llvm %O0opt -c -o %t1.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out %t1.bc - +#include "klee/klee.h" #include int main() { diff --git a/test/Feature/KleeReportError.c b/test/Feature/KleeReportError.c index f406696f24..afd447f573 100644 --- a/test/Feature/KleeReportError.c +++ b/test/Feature/KleeReportError.c @@ -2,6 +2,7 @@ // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --emit-all-errors %t2.bc 2>&1 | FileCheck %s // RUN: ls %t.klee-out/ | grep .my.err | wc -l | grep 2 +#include "klee/klee.h" #include #include diff --git a/test/Feature/KleeStatsColumns.test b/test/Feature/KleeStatsColumns.test deleted file mode 100644 index 6fcbdf4bb5..0000000000 --- a/test/Feature/KleeStatsColumns.test +++ /dev/null @@ -1,6 +0,0 @@ -RUN: %klee-stats --print-all %S/klee-stats/missing_column %S/klee-stats/run %S/klee-stats/additional_column | FileCheck %s - -// Path, Instrs, ..., extra_column -CHECK: {{^}}| missing_column | |{{.*}}| |{{$}} -CHECK: {{^}}| run | 3|{{.*}}| |{{$}} -CHECK: {{^}}|additional_column| 3|{{.*}}| 4711|{{$}} diff --git a/test/Feature/KleeStatsEmpty.test b/test/Feature/KleeStatsEmpty.test deleted file mode 100644 index aae1fee129..0000000000 --- a/test/Feature/KleeStatsEmpty.test +++ /dev/null @@ -1,4 +0,0 @@ -RUN: %klee-stats %S/klee-stats/empty | FileCheck %s - -CHECK: {{^}}|{{ *}}Path{{ *}}|{{$}} -CHECK: {{^}}|{{.*}}empty{{ *}}|{{$}} diff --git a/test/Feature/LargeArrayBecomesSym.c b/test/Feature/LargeArrayBecomesSym.c new file mode 100644 index 0000000000..a875e99eca --- /dev/null +++ b/test/Feature/LargeArrayBecomesSym.c @@ -0,0 +1,33 @@ +/* This test checks that KLEE emits a warning when a large (> 4096) + concrete array becomes symbolic. */ + +// RUN: %clang %s -emit-llvm %O0opt -c -o %t1.bc +// RUN: rm -rf %t.klee-out +/* The solver timeout is needed as some solvers, such as metaSMT+CVC4, time out here. */ +// RUN: %klee --max-solver-time=2 --output-dir=%t.klee-out %t1.bc 2>&1 | FileCheck %s + +#include "klee/klee.h" + +#include +#include + +#define N 4100 + +int main() { + char a[N] = { + 1, + 2, + }; + + unsigned k; + klee_make_symbolic(&k, sizeof(k), "k"); + klee_assume(k < N); + a[k] = 3; + // CHECK: KLEE: WARNING ONCE: Symbolic memory access will send the following array of 4100 bytes to the constraint solver + + unsigned i; + klee_make_symbolic(&i, sizeof(i), "i"); + klee_assume(i < N); + if (a[i] == 2) + assert(i == 1); +} diff --git a/test/Feature/LongDoubleSupport.c b/test/Feature/LongDoubleSupport.c index 4f7d10eecb..1faf16f715 100644 --- a/test/Feature/LongDoubleSupport.c +++ b/test/Feature/LongDoubleSupport.c @@ -34,7 +34,10 @@ int main() { assert(N0 == 6); assert(N1 == 9); - assert(N2 == 13); + // This is the case on Apple Silicon + if (sizeof(long double) == sizeof(double)) + assert(N2 == 9); + else assert(N2 == 13); return 0; } diff --git a/test/Feature/LowerSwitch.c b/test/Feature/LowerSwitch.c index a1bd3f3872..76b9e63b7e 100644 --- a/test/Feature/LowerSwitch.c +++ b/test/Feature/LowerSwitch.c @@ -6,7 +6,7 @@ // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --exit-on-error --switch-type=simple %t.bc // RUN: test -f %t.klee-out/test000010.ktest - +#include "klee/klee.h" #include int main(int argc, char **argv) { diff --git a/test/Feature/MakeSymbolicAPI.c b/test/Feature/MakeSymbolicAPI.c index d530542267..ea11593696 100644 --- a/test/Feature/MakeSymbolicAPI.c +++ b/test/Feature/MakeSymbolicAPI.c @@ -1,9 +1,8 @@ -// RUN: %clang %s -emit-llvm -g -c -o %t1.bc +// RUN: %clang %s -std=c89 -emit-llvm -g -c -o %t1.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out %t1.bc 2> %t.stderr.log // RUN: FileCheck %s -check-prefix=CHECK-WRN --input-file=%t.klee-out/warnings.txt // RUN: FileCheck %s -check-prefix=CHECK-ERR --input-file=%t.stderr.log - int main() { unsigned a, b, c; char *p; diff --git a/test/Feature/MakeSymbolicName.c b/test/Feature/MakeSymbolicName.c index a57d9a8414..332565d7e3 100644 --- a/test/Feature/MakeSymbolicName.c +++ b/test/Feature/MakeSymbolicName.c @@ -1,7 +1,7 @@ // RUN: %clang %s -emit-llvm -g -c -o %t1.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --search=random-state --exit-on-error %t1.bc - +#include "klee/klee.h" #include int main() { diff --git a/test/Feature/Memalign.c b/test/Feature/Memalign.c index e5d09f6cdd..524e257def 100644 --- a/test/Feature/Memalign.c +++ b/test/Feature/Memalign.c @@ -1,9 +1,9 @@ +// REQUIRES: not-darwin // RUN: %clang -emit-llvm -g -c %s -o %t.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --exit-on-error %t.bc > %t.log - +#include #include - int main(int argc, char *argv[]) { int *a = (int *)memalign(8, sizeof(int) * 5); for (int i = 0; i < 5; ++i) { diff --git a/test/Feature/MultiMkSym.c b/test/Feature/MultiMkSym.c index 16ac7d1b58..e5222a94a7 100644 --- a/test/Feature/MultiMkSym.c +++ b/test/Feature/MultiMkSym.c @@ -6,7 +6,7 @@ // RUN: grep "a\[100\]" %t1 | wc -l | grep 2 /* Tests that the Array factory correctly distinguishes between arrays created at the same location but with different sizes */ - +#include "klee/klee.h" #include #include diff --git a/test/Feature/MultipleFreeResolution.c b/test/Feature/MultipleFreeResolution.c index aa931c1387..f30eabed65 100644 --- a/test/Feature/MultipleFreeResolution.c +++ b/test/Feature/MultipleFreeResolution.c @@ -1,9 +1,11 @@ // RUN: %clang %s -g -emit-llvm %O0opt -c -o %t1.bc // RUN: rm -rf %t.klee-out -// RUN: %klee --output-dir=%t.klee-out --emit-all-errors %t1.bc 2>&1 | FileCheck %s +// RUN: %klee --output-dir=%t.klee-out --kdalloc --emit-all-errors %t1.bc 2>&1 | FileCheck %s // RUN: ls %t.klee-out/ | grep .ktest | wc -l | grep 4 // RUN: ls %t.klee-out/ | grep .err | wc -l | grep 3 +#include "klee/klee.h" + #include #include @@ -34,9 +36,9 @@ int main() { free(buf[s]); for (i = 0; i < 3; i++) { - // CHECK: MultipleFreeResolution.c:[[@LINE+3]]: memory error: out of bound pointer - // CHECK: MultipleFreeResolution.c:[[@LINE+2]]: memory error: out of bound pointer - // CHECK: MultipleFreeResolution.c:[[@LINE+1]]: memory error: out of bound pointer + // CHECK: MultipleFreeResolution.c:[[@LINE+3]]: memory error: use after free + // CHECK: MultipleFreeResolution.c:[[@LINE+2]]: memory error: use after free + // CHECK: MultipleFreeResolution.c:[[@LINE+1]]: memory error: use after free printf("*buf[%d] = %d\n", i, *buf[i]); } diff --git a/test/Feature/MultipleReadResolution.c b/test/Feature/MultipleReadResolution.c index 8701d06871..92f3f92b8a 100644 --- a/test/Feature/MultipleReadResolution.c +++ b/test/Feature/MultipleReadResolution.c @@ -7,8 +7,9 @@ // RUN: %klee --output-dir=%t.klee-out %t1.bc > %t1.log // RUN: diff %t1.res %t1.log +#include "klee/klee.h" #include - +#include unsigned klee_urange(unsigned start, unsigned end) { unsigned x; klee_make_symbolic(&x, sizeof x, "x"); diff --git a/test/Feature/MultipleReallocResolution.c b/test/Feature/MultipleReallocResolution.c index 84dd15e20b..9057053735 100644 --- a/test/Feature/MultipleReallocResolution.c +++ b/test/Feature/MultipleReallocResolution.c @@ -3,10 +3,10 @@ // RUN: %klee --output-dir=%t.klee-out %t1.bc // RUN: ls %t.klee-out/ | grep .err | wc -l | grep 2 // RUN: ls %t.klee-out/ | grep .ptr.err | wc -l | grep 2 - +#include "klee/klee.h" #include -#include #include +#include unsigned klee_urange(unsigned start, unsigned end) { unsigned x; diff --git a/test/Feature/MultipleWriteResolution.c b/test/Feature/MultipleWriteResolution.c index 89296c1134..326767f2ea 100644 --- a/test/Feature/MultipleWriteResolution.c +++ b/test/Feature/MultipleWriteResolution.c @@ -6,9 +6,9 @@ // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out %t1.bc > %t1.log // RUN: diff %t1.res %t1.log - +#include "klee/klee.h" #include - +#include unsigned klee_urange(unsigned start, unsigned end) { unsigned x; klee_make_symbolic(&x, sizeof x, "x"); diff --git a/test/Feature/NamedSeedMatching.c b/test/Feature/NamedSeedMatching.c index 6f97e4e757..2cc4734091 100644 --- a/test/Feature/NamedSeedMatching.c +++ b/test/Feature/NamedSeedMatching.c @@ -10,9 +10,9 @@ // RUN: grep -q "b==4" %t.log // RUN: grep -q "c==5" %t.log // RUN: grep -q "x==6" %t.log - -#include +#include "klee/klee.h" #include +#include int main(int argc, char **argv) { int a, b, c, x; diff --git a/test/Feature/NoExternalCallsAllowed.c b/test/Feature/NoExternalCallsAllowed.c index 8a8dc54b19..625704349f 100644 --- a/test/Feature/NoExternalCallsAllowed.c +++ b/test/Feature/NoExternalCallsAllowed.c @@ -2,8 +2,8 @@ // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --external-calls=none %t1.bc 2>&1 | FileCheck %s // RUN: test %t.klee-out/test000001.user.err - #include +#include int main(int argc, char** argv) { // CHECK: Disallowed call to external function: abs diff --git a/test/Feature/OneFreeError.c b/test/Feature/OneFreeError.c index 7eed722ad1..aa403717e4 100644 --- a/test/Feature/OneFreeError.c +++ b/test/Feature/OneFreeError.c @@ -1,12 +1,14 @@ // RUN: %clang %s -g -emit-llvm %O0opt -c -o %t1.bc // RUN: rm -rf %t.klee-out -// RUN: %klee --output-dir=%t.klee-out %t1.bc 2>&1 | FileCheck %s +// RUN: %klee --output-dir=%t.klee-out --kdalloc %t1.bc 2>&1 | FileCheck %s // RUN: test -f %t.klee-out/test000001.ptr.err +#include + int main() { - int *x = malloc(4); + int *x = malloc(sizeof(*x)); free(x); - // CHECK: OneFreeError.c:[[@LINE+1]]: memory error: out of bound pointer + // CHECK: OneFreeError.c:[[@LINE+1]]: memory error: use after free x[0] = 1; return 0; } diff --git a/test/Feature/OneOutOfBounds.c b/test/Feature/OneOutOfBounds.c index a3e6db1f2e..0dfee6d6eb 100644 --- a/test/Feature/OneOutOfBounds.c +++ b/test/Feature/OneOutOfBounds.c @@ -2,6 +2,7 @@ // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out %t1.bc 2>&1 | FileCheck %s // RUN: test -f %t.klee-out/test000001.ptr.err +#include int main() { int *x = malloc(sizeof(int)); diff --git a/test/Feature/Optimize.c b/test/Feature/Optimize.c index e14be96d44..e125eff47f 100644 --- a/test/Feature/Optimize.c +++ b/test/Feature/Optimize.c @@ -6,6 +6,7 @@ // RUN: diff %t3.log %t3.good // should complete by 100 instructions if opt is on +#include int main() { int i, res = 0; diff --git a/test/Feature/OverlappedError.c b/test/Feature/OverlappedError.c index e6d36b7593..e6595cd113 100644 --- a/test/Feature/OverlappedError.c +++ b/test/Feature/OverlappedError.c @@ -3,7 +3,7 @@ // RUN: %klee --output-dir=%t.klee-out %t1.bc // RUN: ls %t.klee-out/ | grep .ktest | wc -l | grep 4 // RUN: ls %t.klee-out/ | grep .ptr.err | wc -l | grep 2 - +#include "klee/klee.h" #include int main() { diff --git a/test/Feature/PreferCex.c b/test/Feature/PreferCex.c index 39337cf55c..28a0eb2057 100644 --- a/test/Feature/PreferCex.c +++ b/test/Feature/PreferCex.c @@ -2,10 +2,7 @@ // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --exit-on-error %t1.bc // RUN: %ktest-tool %t.klee-out/test000001.ktest | FileCheck %s - -#include -#include -#include +#include "klee/klee.h" int main() { char buf[4]; diff --git a/test/Expr/ReadExprConsistency.c b/test/Feature/ReadExprConsistency.c similarity index 78% rename from test/Expr/ReadExprConsistency.c rename to test/Feature/ReadExprConsistency.c index f71483ba48..6429dc9973 100644 --- a/test/Expr/ReadExprConsistency.c +++ b/test/Feature/ReadExprConsistency.c @@ -2,20 +2,20 @@ // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --exit-on-error %t.bc 2>%t.log // RUN: cat %t.log | FileCheck %s - +#include "klee/klee.h" #include +#include /* This tests checks ensures that only relevant updates are present when doing concrete reads. If they are not, there can be situations where ReadExpr are -in inconcistent state and depend on ordering of other operations. +in inconsistent state and depend on ordering of other operations. See https://github.com/klee/klee/issues/921 https://github.com/klee/klee/pull/1061 */ -void klee_print_expr(const char*, char); int main() { char arr[3]; char symbolic; @@ -25,12 +25,12 @@ int main() { char a = arr[2]; // (ReadExpr 2 arr) - //CHECK: arr[2]:(Read w8 2 arr) + // CHECK: arr[2]:(SExt w32 (Read w8 2 arr)) klee_print_expr("arr[2]", arr[2]); arr[1] = 0; char b = arr[symbolic]; // (ReadExpr symbolic [1=0]@arr) - //CHECK: arr[2]:(Read w8 2 arr) - //CHECK-NOT: arr[2]:(Read w8 2 [1=0]@arr) + // CHECK: arr[2]:(SExt w32 (Read w8 2 arr)) + // CHECK-NOT: arr[2]:(SExt w32 (Read w8 2 [1=0]@arr)) klee_print_expr("arr[2]", arr[2]); if(a == b) printf("Equal!\n"); diff --git a/test/Feature/ReplayPath.c b/test/Feature/ReplayPath.c index f77656f853..e2eb95afc3 100644 --- a/test/Feature/ReplayPath.c +++ b/test/Feature/ReplayPath.c @@ -6,9 +6,9 @@ // RUN: rm -rf %t.klee-out-2 // RUN: %klee --output-dir=%t.klee-out-2 --replay-path %t.klee-out/test000001.path %t2.bc > %t3.log // RUN: diff %t3.log %t3.good - -#include +#include "klee/klee.h" #include +#include void cond_exit() { #ifdef COND_EXIT diff --git a/test/Feature/Searchers.c b/test/Feature/Searchers.c index cd8069501f..c5260f3d62 100644 --- a/test/Feature/Searchers.c +++ b/test/Feature/Searchers.c @@ -30,7 +30,7 @@ /* this test is basically just for coverage and doesn't really do any correctness check (aside from testing that the various combinations don't crash) */ - +#include "klee/klee.h" #include int validate(char *buf, int N) { diff --git a/test/Feature/SeedConcretizeExtendFP.c b/test/Feature/SeedConcretizeExtendFP.c new file mode 100644 index 0000000000..3ecd3bc37e --- /dev/null +++ b/test/Feature/SeedConcretizeExtendFP.c @@ -0,0 +1,37 @@ +/* This test checks the case where the seed needs to be patched on re-run */ + +// RUN: %clang -emit-llvm -c %O0opt -g %s -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --entry-point=TestGen %t.bc +// RUN: test -f %t.klee-out/test000001.ktest +// RUN: not test -f %t.klee-out/test000002.ktest + +// RUN: rm -rf %t.klee-out-2 +// RUN: %klee --exit-on-error --output-dir=%t.klee-out-2 --seed-file %t.klee-out/test000001.ktest --allow-seed-extension %t.bc 2>&1 | FileCheck %s +// RUN: %klee-stats --print-columns 'SolverQueries' --table-format=csv %t.klee-out-2 | FileCheck --check-prefix=CHECK-STATS %s + +#include "klee/klee.h" + +#include +#include +#include + +void TestGen() { + uint16_t x; + klee_make_symbolic(&x, sizeof(x), "x"); + klee_assume(x == 1234); +} + +int main() { + uint32_t i; + klee_make_symbolic(&i, sizeof(i), "i"); + + if (i < 5000) { + double d = i; + // CHECK: concretizing (reason: floating point) + assert((unsigned) d < 5001); + } + + // CHECK-STATS: 3 + // These is similar to SeedConcretizeFP.c (1 query) plus the extra queries due to an incomplete seed +} diff --git a/test/Feature/SeedConcretizeExternalCall.c b/test/Feature/SeedConcretizeExternalCall.c new file mode 100644 index 0000000000..1898417075 --- /dev/null +++ b/test/Feature/SeedConcretizeExternalCall.c @@ -0,0 +1,28 @@ +// RUN: %clang -emit-llvm -c -g %s -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --entry-point=TestGen %t.bc +// RUN: test -f %t.klee-out/test000001.ktest +// RUN: not test -f %t.klee-out/test000002.ktest + +// RUN: rm -rf %t.klee-out-2 +// RUN: %klee --external-calls=all --exit-on-error --output-dir=%t.klee-out-2 --seed-file %t.klee-out/test000001.ktest %t.bc +// RUN: %klee-stats --print-columns 'SolverQueries' --table-format=csv %t.klee-out-2 | FileCheck --check-prefix=CHECK-STATS %s + +#include "klee/klee.h" + +#include +#include + +void TestGen() { + int x; + klee_make_symbolic(&x, sizeof(x), "x"); + klee_assume(x == 12345678); +} + +int main() { + int x; + klee_make_symbolic(&x, sizeof(x), "x"); + assert(abs(x) == 12345678); + + // CHECK-STATS: 1 +} diff --git a/test/Feature/SeedConcretizeFP.c b/test/Feature/SeedConcretizeFP.c new file mode 100644 index 0000000000..bde6b32973 --- /dev/null +++ b/test/Feature/SeedConcretizeFP.c @@ -0,0 +1,31 @@ +// RUN: %clang -emit-llvm -c -g %s -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --entry-point=TestGen %t.bc +// RUN: test -f %t.klee-out/test000001.ktest +// RUN: not test -f %t.klee-out/test000002.ktest + +// RUN: rm -rf %t.klee-out-2 +// RUN: %klee --exit-on-error --output-dir=%t.klee-out-2 --seed-file %t.klee-out/test000001.ktest %t.bc 2>&1 | FileCheck %s +// RUN: %klee-stats --print-columns 'SolverQueries' --table-format=csv %t.klee-out-2 | FileCheck --check-prefix=CHECK-STATS %s + +#include "klee/klee.h" + +#include +#include + +void TestGen() { + unsigned x; + klee_make_symbolic(&x, sizeof(x), "x"); + klee_assume(x == 12345678); +} + +int main() { + unsigned i; + klee_make_symbolic(&i, sizeof(i), "i"); + double d = i; + // CHECK: concretizing (reason: floating point) + assert((unsigned) d == 12345678); + + // CHECK-STATS: 1 + // This one query involves the constraint that i == 12345678 +} diff --git a/test/Feature/SeedConcretizeMalloc.c b/test/Feature/SeedConcretizeMalloc.c new file mode 100644 index 0000000000..877488467e --- /dev/null +++ b/test/Feature/SeedConcretizeMalloc.c @@ -0,0 +1,36 @@ +// RUN: %clang -emit-llvm -c -g %s -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --entry-point=SeedGen %t.bc +// RUN: test -f %t.klee-out/test000001.ktest +// RUN: not test -f %t.klee-out/test000002.ktest + +// RUN: rm -rf %t.klee-out-2 +// RUN: %klee --output-dir=%t.klee-out-2 --seed-file %t.klee-out/test000001.ktest %t.bc | FileCheck --allow-empty %s +// RUN: %klee-stats --print-columns 'SolverQueries' --table-format=csv %t.klee-out-2 | FileCheck --check-prefix=CHECK-STATS %s + +#include "klee/klee.h" + +#include +#include +#include + +void SeedGen() { + size_t x; + klee_make_symbolic(&x, sizeof(x), "x"); + klee_assume(x == 100); +} + +int main(int argc, char **argv) { + size_t s; + klee_make_symbolic(&s, sizeof(s), "size"); + char *p = (char *)malloc(s); + if (!p) + return 0; + + if (s != 100) + printf("Error\n"); + // CHECK-NOT: Error + + // CHECK-STATS: 4 + // These queries are due to the explicit constraint asserting that s is 100 and the implicit one checking if we have a huge malloc +} diff --git a/test/Feature/SeedExtension.c b/test/Feature/SeedExtension.c new file mode 100644 index 0000000000..04f6d7a6cc --- /dev/null +++ b/test/Feature/SeedExtension.c @@ -0,0 +1,39 @@ +/* This test checks the case where the seed needs to be patched on re-run */ + +// RUN: %clang -emit-llvm -c %O0opt -g %s -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --entry-point=TestGen %t.bc +// RUN: test -f %t.klee-out/test000001.ktest +// RUN: not test -f %t.klee-out/test000002.ktest + +// RUN: rm -rf %t.klee-out-2 +// RUN: %klee --exit-on-error --output-dir=%t.klee-out-2 --seed-file %t.klee-out/test000001.ktest --allow-seed-extension %t.bc 2>&1 | FileCheck %s + +#include "klee/klee.h" + +#include +#include +#include + +void TestGen() { + int x; + klee_make_symbolic(&x, sizeof(x), "x"); + klee_assume(x == 12345678); +} + +int main() { + int i; + klee_make_symbolic(&i, sizeof(i), "i"); + double d = i; + // CHECK: concretizing (reason: floating point) + assert((unsigned)d == 12345678); + + int j; + klee_make_symbolic(&j, sizeof(j), "j"); + if (j) + printf("Yes\n"); + // CHECK-DAG: Yes + else + printf("No\n"); + // CHECK-DAG: No +} diff --git a/test/Feature/SetForking.c b/test/Feature/SetForking.c index b739910dc0..a291174356 100644 --- a/test/Feature/SetForking.c +++ b/test/Feature/SetForking.c @@ -5,7 +5,7 @@ // RUN: grep "1 A" %t.uniq.log // RUN: grep "1 B" %t.uniq.log // RUN: grep "1 C" %t.uniq.log - +#include "klee/klee.h" #include int main() { diff --git a/test/Feature/SilentKleeAssume.c b/test/Feature/SilentKleeAssume.c index 06872e9b99..2413802934 100644 --- a/test/Feature/SilentKleeAssume.c +++ b/test/Feature/SilentKleeAssume.c @@ -5,9 +5,9 @@ // RUN: rm -rf %t.klee-out // RUN: not %klee --output-dir=%t.klee-out --exit-on-error %t.bc > %t.default-klee-assume.log 2>&1 // RUN: FileCheck -input-file=%t.default-klee-assume.log -check-prefix=CHECK-DEFAULT-KLEE-ASSUME %s - -#include +#include "klee/klee.h" #include +#include int main() { int x = klee_int("x"); diff --git a/test/Feature/SingleObjectResolution.c b/test/Feature/SingleObjectResolution.c new file mode 100644 index 0000000000..c1de4185ee --- /dev/null +++ b/test/Feature/SingleObjectResolution.c @@ -0,0 +1,66 @@ +// RUN: %clang %s -g -emit-llvm %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --search=dfs --output-dir=%t.klee-out --single-object-resolution %t.bc > %t.log 2>&1 +// RUN: FileCheck %s -input-file=%t.log + +#include "klee/klee.h" +#include + +struct A { + long long int y; + long long int y2; + int z; +}; + +struct B { + long long int x; + struct A y[20]; + struct A *y1; + struct A *y2; + int z; +}; + +int bar(int *pointer, int selector) { + int *ptr = 0; + if (selector) + ptr = pointer + 123; + else + ptr = pointer + 124; + // CHECK: SingleObjectResolution.c:[[@LINE+1]]: memory error: out of bound pointer + return *ptr; +} + +int foo() { + size_t x; + int y; + struct B b; + + // create a lot of memory objects + int *ptrs[1024]; + for (int i = 0; i < 1024; i++) { + ptrs[i] = malloc(23); + } + + klee_make_symbolic(&x, sizeof(x), "x"); + klee_make_symbolic(&y, sizeof(y), "y"); + + b.y1 = malloc(20 * sizeof(struct A)); + + // dereference of a pointer within a struct + int *tmp = &b.y1[x].z; + + int z = bar(tmp, y); + // cleanup test for heap + free(b.y1); + + tmp = &b.y[x].z; // this is to test the cleanup for stack vars + z = bar(tmp, y); + return z; +} + +int main(int argc, char *argv[]) { + // CHECK: KLEE: done: completed paths = 2 + // CHECK: KLEE: done: partially completed paths = 2 + // CHECK: KLEE: done: generated tests = 3 + return foo(); +} diff --git a/test/Feature/SolverTimeout.c b/test/Feature/SolverTimeout.c index 98c9ecde5b..aee7f4dadc 100644 --- a/test/Feature/SolverTimeout.c +++ b/test/Feature/SolverTimeout.c @@ -3,7 +3,7 @@ // RUN: %klee --output-dir=%t.klee-out --max-solver-time=1 %t.bc // // Note: This test occasionally fails when using Z3 4.4.1 - +#include "klee/klee.h" #include int main() { diff --git a/test/Feature/StackTraceOutput.c b/test/Feature/StackTraceOutput.c new file mode 100644 index 0000000000..d28cb13c17 --- /dev/null +++ b/test/Feature/StackTraceOutput.c @@ -0,0 +1,31 @@ +// RUN: %clang %s -emit-llvm %O0opt -g -c -fdiscard-value-names -o %t.bc +// RUN: rm -rf %t.klee-out-d +// RUN: %klee --output-dir=%t.klee-out-d %t.bc +// RUN: FileCheck -input-file=%t.klee-out-d/test000001.assert.err -check-prefix=CHECK-DISCARD %s + +// RUN: %clang %s -emit-llvm %O0opt -g -c -fno-discard-value-names -o %t.bc +// RUN: rm -rf %t.klee-out-n +// RUN: %klee --output-dir=%t.klee-out-n %t.bc +// RUN: FileCheck -input-file=%t.klee-out-n/test000001.assert.err -check-prefix=CHECK-NODISCARD %s + +#include "klee/klee.h" + +#include + +void foo(int i, int k) { + ++i; + ++k; + + // CHECK-DISCARD: {{.*}} in foo(symbolic, 12) at {{.*}}.c:[[@LINE+2]] + // CHECK-NODISCARD: {{.*}} in foo(i=symbolic, k=12) at {{.*}}.c:[[@LINE+1]] + assert(0); +} + +int main(void) { + int i, k = 12; + klee_make_symbolic(&i, sizeof(i), "i"); + + // CHECK-DISCARD: {{.*}} in main() at {{.*}}.c:[[@LINE+2]] + // CHECK-NODISCARD: {{.*}} in main() at {{.*}}.c:[[@LINE+1]] + foo(i, k); +} diff --git a/test/Feature/TargetMismatch.c b/test/Feature/TargetMismatch.c index aae7fda6fc..e0e896bc69 100644 --- a/test/Feature/TargetMismatch.c +++ b/test/Feature/TargetMismatch.c @@ -1,4 +1,3 @@ -// REQUIRES: not-darwin // RUN: %clang %s -m32 -emit-llvm %O0opt -c -o %t1.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --exit-on-error > %t2.out 2>&1 || true diff --git a/test/Feature/WithLibc.c b/test/Feature/WithLibc.c index bb1c66c0ca..2babbe629f 100644 --- a/test/Feature/WithLibc.c +++ b/test/Feature/WithLibc.c @@ -4,6 +4,11 @@ // RUN: echo "good" > %t3.good // RUN: diff %t3.log %t3.good +#include "klee/klee.h" + +#include +#include + int main() { char buf[4]; char *s = "foo"; diff --git a/test/Feature/WriteCov.c b/test/Feature/WriteCov.c index 304198c55c..3fd0074c9b 100644 --- a/test/Feature/WriteCov.c +++ b/test/Feature/WriteCov.c @@ -7,7 +7,7 @@ // RUN: grep %t.klee-out/test000001.cov:1 %t3.txt // RUN: grep %t.klee-out/test000002.cov:0 %t3.txt // RUN: grep %t.klee-out/test000002.cov:1 %t3.txt - +#include "klee/klee.h" #include #include diff --git a/test/Feature/WriteXML.c b/test/Feature/WriteXML.c new file mode 100644 index 0000000000..b4ce3bf0c5 --- /dev/null +++ b/test/Feature/WriteXML.c @@ -0,0 +1,16 @@ +// RUN: %clang %s -emit-llvm -g -c -o %t2.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --exit-on-error --write-xml-tests --xml-metadata-programfile=WriteXML.c --xml-metadata-programhash=0 %t2.bc +// RUN: test -f %t.klee-out/test000001.xml +// RUN: test -f %t.klee-out/test000002.xml +#include "klee/klee.h" +#include + +int main() { + if (klee_range(0, 2, "range")) { + printf("__LINE__ = %d\n", __LINE__); + } else { + printf("__LINE__ = %d\n", __LINE__); + } + return 0; +} diff --git a/test/Feature/arithmetic-right-overshift-sym-conc.c b/test/Feature/arithmetic-right-overshift-sym-conc.c index c58f13a13c..efe946f263 100644 --- a/test/Feature/arithmetic-right-overshift-sym-conc.c +++ b/test/Feature/arithmetic-right-overshift-sym-conc.c @@ -3,6 +3,9 @@ // RUN: %klee --output-dir=%t.klee-out -use-cex-cache=1 -check-overshift=0 %t.bc // RUN: not grep "ASSERTION FAIL" %t.klee-out/messages.txt // RUN: grep "KLEE: done: explored paths = 1" %t.klee-out/info + +#include "klee/klee.h" + #include #include diff --git a/test/Feature/consecutive_divide_by_zero.c b/test/Feature/consecutive_divide_by_zero.c index 0915bbaa37..7a0dc1d919 100644 --- a/test/Feature/consecutive_divide_by_zero.c +++ b/test/Feature/consecutive_divide_by_zero.c @@ -8,6 +8,8 @@ * only one test case is generated EVEN IF THERE ARE MULTIPLE * DISTINCT ERRORS! */ + +#include "klee/klee.h" int main() { unsigned int a = 15; unsigned int b = 15; diff --git a/test/Feature/const_array_opt1.c b/test/Feature/const_array_opt1.c index f633e659f0..f41bdf47c4 100644 --- a/test/Feature/const_array_opt1.c +++ b/test/Feature/const_array_opt1.c @@ -1,12 +1,15 @@ +// REQUIRES: not-msan +// REQUIRES: not-ubsan +// Disabling msan and ubsan because it times out on CI // RUN: %clang %s -emit-llvm %O0opt -c -o %t.bc // RUN: rm -rf %t.klee-out -// RUN: %klee --output-dir=%t.klee-out --const-array-opt --max-time=10 --only-output-states-covering-new %t.bc >%t.log -// grep -q "Finished successfully!\n" +// RUN: %klee --output-dir=%t.klee-out --const-array-opt --max-time=10 --only-output-states-covering-new %t.bc | FileCheck %s /* This is testing the const array optimization. On my 2.3GHz machine this takes under 2 seconds w/ the optimization and almost 6 minutes w/o. So we kill it in 10 sec and check if it has finished successfully. */ +#include "klee/klee.h" #include #include @@ -32,6 +35,7 @@ int main() { else klee_silent_exit(0); } + // CHECK: Finished successfully! printf("Finished successfully!\n"); return 0; diff --git a/test/Feature/left-overshift-sym-conc.c b/test/Feature/left-overshift-sym-conc.c index 0320334f40..2aaaf6f1c2 100644 --- a/test/Feature/left-overshift-sym-conc.c +++ b/test/Feature/left-overshift-sym-conc.c @@ -3,8 +3,9 @@ // RUN: %klee --output-dir=%t.klee-out -use-cex-cache=1 -check-overshift=0 %t.bc // RUN: not grep "ASSERTION FAIL" %t.klee-out/messages.txt // RUN: grep "KLEE: done: explored paths = 1" %t.klee-out/info -#include +#include "klee/klee.h" #include +#include typedef enum { diff --git a/test/Feature/logical-right-overshift-sym-conc.c b/test/Feature/logical-right-overshift-sym-conc.c index 06bae156e4..4c4b6f9899 100644 --- a/test/Feature/logical-right-overshift-sym-conc.c +++ b/test/Feature/logical-right-overshift-sym-conc.c @@ -3,8 +3,9 @@ // RUN: %klee --output-dir=%t.klee-out -use-cex-cache=1 -check-overshift=0 %t.bc // RUN: not grep "ASSERTION FAIL" %t.klee-out/messages.txt // RUN: grep "KLEE: done: explored paths = 1" %t.klee-out/info -#include +#include "klee/klee.h" #include +#include typedef enum { diff --git a/test/Feature/srem.c b/test/Feature/srem.c index 65b324d389..0b542b17f0 100644 --- a/test/Feature/srem.c +++ b/test/Feature/srem.c @@ -3,8 +3,7 @@ // RUN: %klee --output-dir=%t.klee-out --klee-call-optimisation=false %t.bc 2>&1 | FileCheck %s // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --klee-call-optimisation=false --optimize %t.bc 2>&1 | FileCheck %s - -#include +#include "klee/klee.h" #include int main(int argc, char** argv) diff --git a/test/Feature/ubsan_signed_overflow.c b/test/Feature/ubsan_signed_overflow.c deleted file mode 100644 index ced2ca067a..0000000000 --- a/test/Feature/ubsan_signed_overflow.c +++ /dev/null @@ -1,25 +0,0 @@ -// RUN: %clang %s -fsanitize=signed-integer-overflow -emit-llvm -g %O0opt -c -o %t.bc -// RUN: rm -rf %t.klee-out -// RUN: %klee --output-dir=%t.klee-out %t.bc 2>&1 | FileCheck %s - -#include "klee/klee.h" - -int main() { - signed int x; - signed int y; - volatile signed int result; - - klee_make_symbolic(&x, sizeof(x), "x"); - klee_make_symbolic(&y, sizeof(y), "y"); - - // CHECK: ubsan_signed_overflow.c:[[@LINE+1]]: overflow on addition - result = x + y; - - // CHECK: ubsan_signed_overflow.c:[[@LINE+1]]: overflow on subtraction - result = x - y; - - // CHECK: ubsan_signed_overflow.c:[[@LINE+1]]: overflow on multiplication - result = x * y; - - return 0; -} diff --git a/test/Feature/ubsan_unsigned_overflow.c b/test/Feature/ubsan_unsigned_overflow.c deleted file mode 100644 index 2734f8684c..0000000000 --- a/test/Feature/ubsan_unsigned_overflow.c +++ /dev/null @@ -1,25 +0,0 @@ -// RUN: %clang %s -fsanitize=unsigned-integer-overflow -emit-llvm -g %O0opt -c -o %t.bc -// RUN: rm -rf %t.klee-out -// RUN: %klee --output-dir=%t.klee-out %t.bc 2>&1 | FileCheck %s - -#include "klee/klee.h" - -int main() { - unsigned int x; - unsigned int y; - volatile unsigned int result; - - klee_make_symbolic(&x, sizeof(x), "x"); - klee_make_symbolic(&y, sizeof(y), "y"); - - // CHECK: ubsan_unsigned_overflow.c:[[@LINE+1]]: overflow on addition - result = x + y; - - // CHECK: ubsan_unsigned_overflow.c:[[@LINE+1]]: overflow on subtraction - result = x - y; - - // CHECK: ubsan_unsigned_overflow.c:[[@LINE+1]]: overflow on multiplication - result = x * y; - - return 0; -} diff --git a/test/InlineAsm/InlineAsm.c b/test/InlineAsm/InlineAsm.c new file mode 100644 index 0000000000..6d5b4353e1 --- /dev/null +++ b/test/InlineAsm/InlineAsm.c @@ -0,0 +1,28 @@ +// REQUIRES: x86_64 + +// RUN: %clang %s -emit-llvm %O0opt -c -g -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --external-calls=all --exit-on-error --output-dir=%t.klee-out %t.bc > %t.output.log 2>&1 + +#include "klee/klee.h" +#include + +int main() { + + int x; + klee_make_symbolic(&x, sizeof(x), "x"); + if (x == 239) { + __asm__("neg %0" + : "+r"(x)); + assert(x == -239); + } + + int y = x; + __asm__("add $5, %0" + : "+r"(x)); + __asm__("add $0, %0" + : "+r"(y)); + assert(x == y + 5); + + return 0; +} diff --git a/test/Feature/RaiseAsm.c b/test/InlineAsm/RaiseAsm.c similarity index 95% rename from test/Feature/RaiseAsm.c rename to test/InlineAsm/RaiseAsm.c index 842d9f3d45..d6c9c511cd 100644 --- a/test/Feature/RaiseAsm.c +++ b/test/InlineAsm/RaiseAsm.c @@ -1,7 +1,10 @@ +// REQUIRES: x86_64 + // RUN: %clang %s -emit-llvm %O0opt -c -o %t1.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --exit-on-error %t1.bc +#include "klee/klee.h" #include typedef unsigned short uint16; diff --git a/test/Feature/asm_lifting.ll b/test/InlineAsm/asm_lifting.ll similarity index 82% rename from test/Feature/asm_lifting.ll rename to test/InlineAsm/asm_lifting.ll index 4f414eeb30..362ddcdb9c 100644 --- a/test/Feature/asm_lifting.ll +++ b/test/InlineAsm/asm_lifting.ll @@ -1,4 +1,6 @@ -; RUN: llvm-as %s -f -o %t1.bc +; REQUIRES: x86_64 + +; RUN: %llvmas %s -f -o %t1.bc ; RUN: rm -rf %t.klee-out ; RUN: %klee --output-dir=%t.klee-out --optimize=false %t1.bc ; RUN: FileCheck %s --input-file=%t.klee-out/assembly.ll @@ -17,7 +19,7 @@ entry: %1 = getelementptr inbounds [47 x i8], [47 x i8]* %0, i64 0, i64 0 ; Make sure memory barrier with function arguments is kept %2 = call i8* asm sideeffect "", "=r,0,~{memory},~{dirflag},~{fpsr},~{flags}"(i8* nonnull %1) - ; CHECK: %2 = call i8* asm sideeffect "", "=r,0,~{memory},~{dirflag},~{fpsr},~{flags}"(i8* nonnull %1) + ; CHECK: %2 = call {{.*}} asm sideeffect "", "=r,0,~{memory},~{dirflag},~{fpsr},~{flags}"({{.*}} nonnull %1) ret i32 0 } diff --git a/test/Intrinsics/FMulAdd.ll b/test/Intrinsics/FMulAdd.ll new file mode 100644 index 0000000000..989b88a858 --- /dev/null +++ b/test/Intrinsics/FMulAdd.ll @@ -0,0 +1,55 @@ +; RUN: rm -rf %t.klee-out +; RUN: %klee -exit-on-error --output-dir=%t.klee-out --optimize=false %s + +define dso_local i32 @main() local_unnamed_addr { +fma.float: + %0 = call float @llvm.fma.f32(float 2.0, float 2.0, float 1.0) + %cmp0 = fcmp one float %0, 5.0 + br i1 %cmp0, label %abort.block, label %fma.double + +fma.double: + %1 = call double @llvm.fma.f64(double 2.0, double 2.0, double 1.0) + %cmp1 = fcmp one double %1, 5.0 + br i1 %cmp1, label %abort.block, label %fma.fp80 + +fma.fp80: + %2 = call x86_fp80 @llvm.fma.f80(x86_fp80 0xK40008000000000000000, + x86_fp80 0xK40008000000000000000, + x86_fp80 0xK3FFF8000000000000000) + %cmp2 = fcmp one x86_fp80 %2, 0xK4001A000000000000000 + br i1 %cmp2, label %abort.block, label %fmuladd.float + +fmuladd.float: + %3 = call float @llvm.fmuladd.f32(float 2.0, float 2.0, float 1.0) + %cmp3 = fcmp one float %3, 5.0 + br i1 %cmp3, label %abort.block, label %fmuladd.double + +fmuladd.double: + %4 = call double @llvm.fmuladd.f64(double 2.0, double 2.0, double 1.0) + %cmp4 = fcmp one double %4, 5.0 + br i1 %cmp4, label %abort.block, label %fmuladd.fp80 + +fmuladd.fp80: + %5 = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 0xK40008000000000000000, + x86_fp80 0xK40008000000000000000, + x86_fp80 0xK3FFF8000000000000000) + %cmp5 = fcmp one x86_fp80 %5, 0xK4001A000000000000000 + br i1 %cmp4, label %abort.block, label %exit.block + +exit.block: + ret i32 0 + +abort.block: + call void @abort() + unreachable +} + +declare void @abort() noreturn nounwind + +declare float @llvm.fma.f32(float %a, float %b, float %c) +declare double @llvm.fma.f64(double %a, double %b, double %c) +declare x86_fp80 @llvm.fma.f80(x86_fp80 %a, x86_fp80 %b, x86_fp80 %c) + +declare float @llvm.fmuladd.f32(float %a, float %b, float %c) +declare double @llvm.fmuladd.f64(double %a, double %b, double %c) +declare x86_fp80 @llvm.fmuladd.f80(x86_fp80 %a, x86_fp80 %b, x86_fp80 %c) diff --git a/test/Intrinsics/IntrinsicTrap.ll b/test/Intrinsics/IntrinsicTrap.ll index c88a328a67..5ac2fa7338 100644 --- a/test/Intrinsics/IntrinsicTrap.ll +++ b/test/Intrinsics/IntrinsicTrap.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as %s -f -o %t1.bc +; RUN: %llvmas %s -f -o %t1.bc ; RUN: rm -rf %t.klee-out ; RUN: %klee --output-dir=%t.klee-out --optimize=false %t1.bc ; RUN: FileCheck %s --input-file=%t.klee-out/assembly.ll diff --git a/test/Intrinsics/IsConstant.ll b/test/Intrinsics/IsConstant.ll index b196d9331c..72ab5e7284 100644 --- a/test/Intrinsics/IsConstant.ll +++ b/test/Intrinsics/IsConstant.ll @@ -1,4 +1,3 @@ -; REQUIRES: geq-llvm-8.0 ; RUN: %llvmas %s -o=%t.bc ; RUN: rm -rf %t.klee-out ; RUN: %klee -exit-on-error --output-dir=%t.klee-out --optimize=false %t.bc diff --git a/test/Intrinsics/Overflow.ll b/test/Intrinsics/Overflow.ll index 3131102907..f11e7da5bc 100644 --- a/test/Intrinsics/Overflow.ll +++ b/test/Intrinsics/Overflow.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as %s -f -o %t1.bc +; RUN: %llvmas %s -f -o %t1.bc ; RUN: rm -rf %t.klee-out ; RUN: %klee --output-dir=%t.klee-out --optimize=false %t1.bc > %t2 ; RUN: grep PASS %t2 diff --git a/test/Intrinsics/OverflowMul.ll b/test/Intrinsics/OverflowMul.ll index 9343fdd80e..b51c8bd856 100644 --- a/test/Intrinsics/OverflowMul.ll +++ b/test/Intrinsics/OverflowMul.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as %s -f -o %t1.bc +; RUN: %llvmas %s -f -o %t1.bc ; RUN: rm -rf %t.klee-out ; RUN: %klee --output-dir=%t.klee-out --optimize=false %t1.bc > %t2 ; RUN: grep PASS %t2 diff --git a/test/Intrinsics/Saturating.ll b/test/Intrinsics/Saturating.ll index cce8b6cb3c..306ec93b51 100644 --- a/test/Intrinsics/Saturating.ll +++ b/test/Intrinsics/Saturating.ll @@ -1,5 +1,4 @@ -; REQUIRES: geq-llvm-8.0 -; RUN: llvm-as %s -f -o %t1.bc +; RUN: %llvmas %s -f -o %t1.bc ; RUN: rm -rf %t.klee-out ; RUN: %klee --output-dir=%t.klee-out --optimize=false %t1.bc | FileCheck %s diff --git a/test/Intrinsics/fshlr.ll b/test/Intrinsics/fshlr.ll index fcdf32ff4d..a47951f327 100644 --- a/test/Intrinsics/fshlr.ll +++ b/test/Intrinsics/fshlr.ll @@ -14,7 +14,6 @@ ; where the constants a, b, c and r are copied from the constants ; used in the LLVM testfile llvm/test/Analysis/ConstantFolding/funnel-shift.ll -; REQUIRES: geq-llvm-7.0 ; RUN: %llvmas %s -o=%t.bc ; RUN: rm -rf %t.klee-out ; RUN: %klee -exit-on-error --output-dir=%t.klee-out --optimize=false %t.bc diff --git a/test/Intrinsics/noalias-scope-decl.ll b/test/Intrinsics/noalias-scope-decl.ll new file mode 100644 index 0000000000..61dcba0030 --- /dev/null +++ b/test/Intrinsics/noalias-scope-decl.ll @@ -0,0 +1,57 @@ +; REQUIRES: geq-llvm-12.0 +; RUN: rm -rf %t.klee-out +; RUN: %klee -exit-on-error --output-dir=%t.klee-out --optimize=false %s 2>&1 | FileCheck %s + +; Check that IntrinsicCleaner strips out intrinsic +; CHECK-NOT: KLEE: WARNING ONCE: unsupported intrinsic llvm.experimental.noalias.scope.decl + +; Check that Executor doesn't notice stripped intrinsic +; CHECK-NOT: KLEE: WARNING: unimplemented intrinsic: llvm.experimental.noalias.scope.decl +; CHECK-NOT: KLEE: ERROR: (location information missing) unimplemented intrinsic +; CHECK-NOT: KLEE: WARNING: unimplemented intrinsic: llvm.experimental.noalias.scope.decl + +; Check that Executor explores all paths +; CHECK: KLEE: done: completed paths = 1 +; CHECK: KLEE: done: partially completed paths = 0 +; CHECK: KLEE: done: generated tests = 1 + + + +declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind +declare void @llvm.experimental.noalias.scope.decl(metadata) +declare void @abort() noreturn nounwind + +define void @test1(i8* %P, i8* %Q) nounwind { + tail call void @llvm.experimental.noalias.scope.decl(metadata !0) + tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 1, i1 false) + ret void +} + +define dso_local i32 @main() local_unnamed_addr { + %1 = alloca i32, align 4 + %2 = alloca i8, align 1 + %3 = alloca i8, align 1 + store i32 0, i32* %1, align 4 + store i8 0, i8* %2, align 1 + store i8 1, i8* %3, align 1 + + call void @test1(i8* %2, i8* %3) + + %4 = load i8, i8* %2, align 1 + %5 = sext i8 %4 to i32 + %6 = load i8, i8* %3, align 1 + %7 = sext i8 %6 to i32 + %8 = icmp eq i32 %5, %7 + br i1 %8, label %exit.block, label %abort.block + + exit.block: + ret i32 0 + + abort.block: + call void @abort() + unreachable +} + +!0 = !{ !1 } +!1 = distinct !{ !1, !2, !"test1: var" } +!2 = distinct !{ !2, !"test1" } diff --git a/test/Intrinsics/objectsize.leq80.ll b/test/Intrinsics/objectsize.leq80.ll deleted file mode 100644 index ce2a24297f..0000000000 --- a/test/Intrinsics/objectsize.leq80.ll +++ /dev/null @@ -1,40 +0,0 @@ -; REQUIRES: lt-llvm-9.0 -; RUN: %llvmas %s -o=%t.bc -; RUN: rm -rf %t.klee-out -; RUN: %klee -exit-on-error --output-dir=%t.klee-out --optimize=false %t.bc -; ModuleID = 'objectsize.c' -target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" -target triple = "x86_64-unknown-linux-gnu" - -define i32 @main() nounwind uwtable { -entry: - %a = alloca i8*, align 8 - %0 = load i8*, i8** %a, align 8 - %1 = call i64 @llvm.objectsize.i64.p0i8(i8* %0, i1 true, i1 false) - %cmp = icmp ne i64 %1, 0 - br i1 %cmp, label %abort.block, label %continue.block - -continue.block: - %2 = load i8*, i8** %a, align 8 - %3 = call i64 @llvm.objectsize.i64.p0i8(i8* %2, i1 false, i1 false) - %cmp1 = icmp ne i64 %3, -1 - br i1 %cmp1, label %abort.block, label %continue.block2 - -continue.block2: -; allocate one byte - %b = alloca i8, align 8 - %4 = call i64 @llvm.objectsize.i64.p0i8(i8* %b, i1 false, i1 false) - %cmp2 = icmp ne i64 %4, 1 - br i1 %cmp2, label %abort.block, label %exit.block - -exit.block: - ret i32 0 - -abort.block: - call void @abort() - unreachable -} - -declare i64 @llvm.objectsize.i64.p0i8(i8*, i1, i1) nounwind readnone - -declare void @abort() noreturn nounwind diff --git a/test/Intrinsics/objectsize.ll b/test/Intrinsics/objectsize.ll index 9fa84de5f0..f5d6a51a03 100644 --- a/test/Intrinsics/objectsize.ll +++ b/test/Intrinsics/objectsize.ll @@ -1,5 +1,4 @@ ; LLVM 9 added parameter "dynamic" to @llvm.objectsize -; REQUIRES: geq-llvm-9.0 ; RUN: %llvmas %s -o=%t.bc ; RUN: rm -rf %t.klee-out ; RUN: %klee -exit-on-error --output-dir=%t.klee-out --optimize=false %t.bc diff --git a/test/Merging/merge_fail.c b/test/Merging/merge_fail.c index 00ea21ef86..41ced1aae1 100644 --- a/test/Merging/merge_fail.c +++ b/test/Merging/merge_fail.c @@ -14,6 +14,7 @@ // This test will not merge because we cannot merge states when they allocated memory. #include "klee/klee.h" +#include int main(int argc, char **args) { diff --git a/test/Merging/unexpected_close.c b/test/Merging/unexpected_close.c index c6cf73988b..56818f1eb7 100644 --- a/test/Merging/unexpected_close.c +++ b/test/Merging/unexpected_close.c @@ -1,6 +1,6 @@ // RUN: %clang -emit-llvm -g -c -o %t.bc %s // RUN: rm -rf %t.klee-out -// RUN: %klee --output-dir=%t.klee-out --use-merge --search=nurs:covnew --max-time=2 %t.bc +// RUN: %klee --output-dir=%t.klee-out --use-merge --search=nurs:covnew --max-time=2 %t.bc 2>&1 | FileCheck %s // CHECK: ran into a close at // CHECK: generated tests = 2{{$}} diff --git a/test/Programs/pcregrep.c b/test/Programs/pcregrep.c deleted file mode 100644 index ba5c79db29..0000000000 --- a/test/Programs/pcregrep.c +++ /dev/null @@ -1,14581 +0,0 @@ -// RUN: %clang -m32 %s -emit-llvm %O0opt -c -o %t1.bc -// RUN: rm -rf %t.klee-out -// RUN: %klee --output-dir=%t.klee-out --libc=klee --exit-on-error %t1.bc 2 2 -// XFAIL: x86_64 - -/* Provide Declarations */ -#include -#include -/* get a declaration for alloca */ -#if defined(__CYGWIN__) || defined(__MINGW32__) -#define alloca(x) __builtin_alloca((x)) -#define _alloca(x) __builtin_alloca((x)) -#elif defined(__APPLE__) -extern void *__builtin_alloca(unsigned long); -#define alloca(x) __builtin_alloca(x) -#define longjmp _longjmp -#define setjmp _setjmp -#elif defined(__sun__) -#if defined(__sparcv9) -extern void *__builtin_alloca(unsigned long); -#else -extern void *__builtin_alloca(unsigned int); -#endif -#define alloca(x) __builtin_alloca(x) -#elif defined(__FreeBSD__) || defined(__OpenBSD__) -#define alloca(x) __builtin_alloca(x) -#elif defined(_MSC_VER) -#define inline _inline -#define alloca(x) _alloca(x) -#else -#include -#endif - -#ifndef __GNUC__ /* Can only support "linkonce" vars with GCC */ -#define __attribute__(X) -#endif - -#if defined(__GNUC__) && defined(__APPLE_CC__) -#define __EXTERNAL_WEAK__ __attribute__((weak_import)) -#elif defined(__GNUC__) -#define __EXTERNAL_WEAK__ __attribute__((weak)) -#else -#define __EXTERNAL_WEAK__ -#endif - -#if defined(__GNUC__) && defined(__APPLE_CC__) -#define __ATTRIBUTE_WEAK__ -#elif defined(__GNUC__) -#define __ATTRIBUTE_WEAK__ __attribute__((weak)) -#else -#define __ATTRIBUTE_WEAK__ -#endif - -#if defined(__GNUC__) -#define __HIDDEN__ __attribute__((visibility("hidden"))) -#endif - -#ifdef __GNUC__ -#define LLVM_NAN(NanStr) __builtin_nan(NanStr) /* Double */ -#define LLVM_NANF(NanStr) __builtin_nanf(NanStr) /* Float */ -#define LLVM_NANS(NanStr) __builtin_nans(NanStr) /* Double */ -#define LLVM_NANSF(NanStr) __builtin_nansf(NanStr) /* Float */ -#define LLVM_INF __builtin_inf() /* Double */ -#define LLVM_INFF __builtin_inff() /* Float */ -#define LLVM_PREFETCH(addr,rw,locality) __builtin_prefetch(addr,rw,locality) -#define __ATTRIBUTE_CTOR__ __attribute__((constructor)) -#define __ATTRIBUTE_DTOR__ __attribute__((destructor)) -#define LLVM_ASM __asm__ -#else -#define LLVM_NAN(NanStr) ((double)0.0) /* Double */ -#define LLVM_NANF(NanStr) 0.0F /* Float */ -#define LLVM_NANS(NanStr) ((double)0.0) /* Double */ -#define LLVM_NANSF(NanStr) 0.0F /* Float */ -#define LLVM_INF ((double)0.0) /* Double */ -#define LLVM_INFF 0.0F /* Float */ -#define LLVM_PREFETCH(addr,rw,locality) /* PREFETCH */ -#define __ATTRIBUTE_CTOR__ -#define __ATTRIBUTE_DTOR__ -#define LLVM_ASM(X) -#endif - -#if __GNUC__ < 4 /* Old GCC's, or compilers not GCC */ -#define __builtin_stack_save() 0 /* not implemented */ -#define __builtin_stack_restore(X) /* noop */ -#endif - -#define CODE_FOR_MAIN() /* Any target-specific code for main()*/ -#if defined(__GNUC__) && !defined(__llvm__) -#if defined(i386) || defined(__i386__) || defined(__i386) || defined(__x86_64__) -#undef CODE_FOR_MAIN -#define CODE_FOR_MAIN() \ - {short F;__asm__ ("fnstcw %0" : "=m" (*&F)); \ - F=(F&~0x300)|0x200;__asm__("fldcw %0"::"m"(*&F));} -#endif -#endif - -#ifndef __cplusplus -typedef unsigned char bool; -#endif - - -/* Support for floating point constants */ -typedef unsigned long long ConstantDoubleTy; -typedef unsigned int ConstantFloatTy; - - -/* Global Declarations */ -/* Helper union for bitcasts */ -typedef union { - unsigned int Int32; - unsigned long long Int64; - float Float; - double Double; -} llvmBitCastUnion; -/* Structure forward decls */ -struct l_struct_2E__IO_FILE; -struct l_struct_2E__IO_marker; -struct l_struct_2E_branch_chain; -struct l_struct_2E_compile_data; -struct l_struct_2E_pcre; - -/* Typedefs */ -typedef struct l_struct_2E__IO_FILE l_struct_2E__IO_FILE; -typedef struct l_struct_2E__IO_marker l_struct_2E__IO_marker; -typedef struct l_struct_2E_branch_chain l_struct_2E_branch_chain; -typedef struct l_struct_2E_compile_data l_struct_2E_compile_data; -typedef struct l_struct_2E_pcre l_struct_2E_pcre; - -/* Structure contents */ -struct l_struct_2E__IO_FILE { - unsigned int field0; - unsigned char *field1; - unsigned char *field2; - unsigned char *field3; - unsigned char *field4; - unsigned char *field5; - unsigned char *field6; - unsigned char *field7; - unsigned char *field8; - unsigned char *field9; - unsigned char *field10; - unsigned char *field11; - struct l_struct_2E__IO_marker *field12; - struct l_struct_2E__IO_FILE *field13; - unsigned int field14; - unsigned int field15; - unsigned int field16; - unsigned short field17; - unsigned char field18; - unsigned char field19[1]; - unsigned char *field20; - unsigned long long field21; - unsigned char *field22; - unsigned char *field23; - unsigned int field24; - unsigned char field25[52]; -}; - -struct l_struct_2E__IO_marker { - struct l_struct_2E__IO_marker *field0; - struct l_struct_2E__IO_FILE *field1; - unsigned int field2; -}; - -struct l_struct_2E_branch_chain { - struct l_struct_2E_branch_chain *field0; - unsigned char *field1; -}; - -struct l_struct_2E_compile_data { - unsigned char *field0; - unsigned char *field1; - unsigned char *field2; - unsigned char *field3; - unsigned char *field4; - unsigned char *field5; - unsigned char *field6; - unsigned char *field7; - unsigned char *field8; - unsigned char *field9; - unsigned int field10; - unsigned int field11; - unsigned int field12; - unsigned int field13; - unsigned int field14; - unsigned int field15; - unsigned int field16; - unsigned int field17; - unsigned int field18; - unsigned int field19; - unsigned char field20[4]; -}; - -struct l_struct_2E_pcre { - unsigned int field0; - unsigned int field1; - unsigned int field2; - unsigned int field3; - unsigned short field4; - unsigned short field5; - unsigned short field6; - unsigned short field7; - unsigned short field8; - unsigned short field9; - unsigned short field10; - unsigned short field11; - unsigned char *field12; - unsigned char *field13; -}; - -/* Function Declarations */ -double fmod(double, double); -float fmodf(float, float); -int main(int llvm_cbe_argc, char **llvm_cbe_argv); -unsigned int fprintf(struct l_struct_2E__IO_FILE *, unsigned char *, ...); -unsigned int __strtol_internal(unsigned char *, unsigned char **, unsigned int , unsigned int ); -unsigned int printf(unsigned char *, ...); -unsigned int fwrite(unsigned char *, unsigned int , unsigned int , unsigned char *); -unsigned int klee_make_symbolic(); -unsigned int puts(unsigned char *); -static unsigned int check_escape(unsigned char **llvm_cbe_ptrptr, unsigned int *llvm_cbe_errorcodeptr, unsigned int llvm_cbe_bracount, unsigned int llvm_cbe_options, unsigned int llvm_cbe_isclass); -static unsigned int find_parens(unsigned char *llvm_cbe_ptr, unsigned int llvm_cbe_count, unsigned char *llvm_cbe_name, unsigned int llvm_cbe_lorn, unsigned int llvm_cbe_xmode); -unsigned int strncmp(unsigned char *, unsigned char *, unsigned int ); -static unsigned char *first_significant_code(unsigned char *llvm_cbe_code, unsigned int *llvm_cbe_options, unsigned int llvm_cbe_optbit, unsigned int llvm_cbe_skipassert); -static unsigned int find_fixedlength(unsigned char *llvm_cbe_code); -static unsigned char *find_bracket(unsigned char *llvm_cbe_code, unsigned int llvm_cbe_number); -static unsigned int could_be_empty_branch(unsigned char *llvm_cbe_code, unsigned char *llvm_cbe_endcode); -static unsigned int check_posix_syntax(unsigned char *llvm_cbe_ptr, unsigned char **llvm_cbe_endptr, struct l_struct_2E_compile_data *llvm_cbe_cd); -static void adjust_recurse(unsigned char *llvm_cbe_group, unsigned int llvm_cbe_adjust, struct l_struct_2E_compile_data *llvm_cbe_cd, unsigned char *llvm_cbe_save_hwm); -static unsigned int check_auto_possessive(unsigned int llvm_cbe_op_code, unsigned int llvm_cbe_item, unsigned char *llvm_cbe_ptr, unsigned int llvm_cbe_options, struct l_struct_2E_compile_data *llvm_cbe_cd); -static unsigned int _pcre_is_newline(unsigned char *llvm_cbe_ptr, unsigned int llvm_cbe_type, unsigned char *llvm_cbe_endptr, unsigned int *llvm_cbe_lenptr); -static unsigned int compile_regex(unsigned int llvm_cbe_options, unsigned int llvm_cbe_oldims, unsigned char **llvm_cbe_codeptr, unsigned char **llvm_cbe_ptrptr, unsigned int *llvm_cbe_errorcodeptr, unsigned int llvm_cbe_lookbehind, unsigned int llvm_cbe_reset_bracount, unsigned int llvm_cbe_skipbytes, unsigned int *llvm_cbe_firstbyteptr, unsigned int *llvm_cbe_reqbyteptr, struct l_struct_2E_branch_chain *llvm_cbe_bcptr, struct l_struct_2E_compile_data *llvm_cbe_cd, unsigned int *llvm_cbe_lengthptr); -unsigned int memcmp(unsigned char *, unsigned char *, unsigned int ); -static unsigned int is_anchored(unsigned char *llvm_cbe_code, unsigned int *llvm_cbe_options, unsigned int llvm_cbe_bracket_map, unsigned int llvm_cbe_backref_map); -static unsigned int is_startline(unsigned char *llvm_cbe_code, unsigned int llvm_cbe_bracket_map, unsigned int llvm_cbe_backref_map); -static unsigned int find_firstassertedchar(unsigned char *llvm_cbe_code, unsigned int *llvm_cbe_options, unsigned int llvm_cbe_inassert); -unsigned int strlen(unsigned char *); -void free(unsigned char *); -unsigned char *malloc(unsigned int ); -void abort(void); -unsigned char *memmove(unsigned char *, unsigned char *, unsigned int ); -unsigned char *memset(unsigned char *, unsigned int , unsigned int ); -//unsigned char *memcpy(unsigned char *, unsigned char *, unsigned int ); - - -/* Global Variable Declarations */ -static unsigned char _2E_str[41]; -static unsigned char _2E_str1[42]; -static unsigned char _2E_str2[15]; -static unsigned char _2E_str3[24]; -static unsigned char digitab[256]; -static unsigned int posix_class_maps[42]; -static unsigned char *posix_names[14]; -static unsigned char _2E_str59[6]; -static unsigned char _2E_str60[6]; -static unsigned char _2E_str61[6]; -static unsigned char _2E_str62[6]; -static unsigned char _2E_str63[6]; -static unsigned char _2E_str64[6]; -static unsigned char _2E_str65[6]; -static unsigned char _2E_str66[6]; -static unsigned char _2E_str67[6]; -static unsigned char _2E_str68[6]; -static unsigned char _2E_str69[6]; -static unsigned char _2E_str70[6]; -static unsigned char _2E_str71[5]; -static unsigned char _2E_str72[7]; -static unsigned char posix_name_lengths[15]; -static unsigned short escapes[75]; -static unsigned char _pcre_OP_lengths[104]; -static unsigned char _2E_str73[4]; -static unsigned char _2E_str74[7]; -static unsigned char _pcre_default_tables[1088]; - - -/* Global Variable Definitions and Initialization */ -static unsigned char _2E_str[41] = "Usage: %s \n"; -static unsigned char _2E_str1[42] = "Using pattern size: %d, subject size: %d\n"; -static unsigned char _2E_str2[15] = "invalid sizes\n"; -static unsigned char _2E_str3[24] = "PCRE compilation failed"; -static unsigned char digitab[256] = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x00\x00\x00\x00\x00\x00\x00\x08\x08\x08\x08\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x08\x08\x08\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; -static unsigned int posix_class_maps[42] = { ((unsigned int )160), ((unsigned int )64), ((unsigned int )-2), ((unsigned int )128), ((unsigned int )-1), ((unsigned int )0), ((unsigned int )96), ((unsigned int )-1), ((unsigned int )0), ((unsigned int )160), ((unsigned int )-1), ((unsigned int )2), ((unsigned int )224), ((unsigned int )288), ((unsigned int )0), ((unsigned int )0), ((unsigned int )-1), ((unsigned int )1), ((unsigned int )288), ((unsigned int )-1), ((unsigned int )0), ((unsigned int )64), ((unsigned int )-1), ((unsigned int )0), ((unsigned int )192), ((unsigned int )-1), ((unsigned int )0), ((unsigned int )224), ((unsigned int )-1), ((unsigned int )0), ((unsigned int )256), ((unsigned int )-1), ((unsigned int )0), ((unsigned int )0), ((unsigned int )-1), ((unsigned int )0), ((unsigned int )160), ((unsigned int )-1), ((unsigned int )0), ((unsigned int )32), ((unsigned int )-1), ((unsigned int )0) }; -static unsigned char *posix_names[14] = { (&(_2E_str59[((unsigned int )0)])), (&(_2E_str60[((unsigned int )0)])), (&(_2E_str61[((unsigned int )0)])), (&(_2E_str62[((unsigned int )0)])), (&(_2E_str63[((unsigned int )0)])), (&(_2E_str64[((unsigned int )0)])), (&(_2E_str65[((unsigned int )0)])), (&(_2E_str66[((unsigned int )0)])), (&(_2E_str67[((unsigned int )0)])), (&(_2E_str68[((unsigned int )0)])), (&(_2E_str69[((unsigned int )0)])), (&(_2E_str70[((unsigned int )0)])), (&(_2E_str71[((unsigned int )0)])), (&(_2E_str72[((unsigned int )0)])) }; -static unsigned char _2E_str59[6] = "alpha"; -static unsigned char _2E_str60[6] = "lower"; -static unsigned char _2E_str61[6] = "upper"; -static unsigned char _2E_str62[6] = "alnum"; -static unsigned char _2E_str63[6] = "ascii"; -static unsigned char _2E_str64[6] = "blank"; -static unsigned char _2E_str65[6] = "cntrl"; -static unsigned char _2E_str66[6] = "digit"; -static unsigned char _2E_str67[6] = "graph"; -static unsigned char _2E_str68[6] = "print"; -static unsigned char _2E_str69[6] = "punct"; -static unsigned char _2E_str70[6] = "space"; -static unsigned char _2E_str71[5] = "word"; -static unsigned char _2E_str72[7] = "xdigit"; -static unsigned char posix_name_lengths[15] = "\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x04\x06"; -static unsigned short escapes[75] = { ((unsigned short )0), ((unsigned short )0), ((unsigned short )0), ((unsigned short )0), ((unsigned short )0), ((unsigned short )0), ((unsigned short )0), ((unsigned short )0), ((unsigned short )0), ((unsigned short )0), ((unsigned short )58), ((unsigned short )59), ((unsigned short )60), ((unsigned short )61), ((unsigned short )62), ((unsigned short )63), ((unsigned short )64), ((unsigned short )-1), ((unsigned short )-4), ((unsigned short )-13), ((unsigned short )-6), ((unsigned short )-24), ((unsigned short )0), ((unsigned short )-2), ((unsigned short )-17), ((unsigned short )0), ((unsigned short )0), ((unsigned short )-3), ((unsigned short )0), ((unsigned short )0), ((unsigned short )0), ((unsigned short )0), ((unsigned short )-14), ((unsigned short )-25), ((unsigned short )-16), ((unsigned short )-8), ((unsigned short )0), ((unsigned short )0), ((unsigned short )-19), ((unsigned short )-10), ((unsigned short )-21), ((unsigned short )0), ((unsigned short )-22), ((unsigned short )91), ((unsigned short )92), ((unsigned short )93), ((unsigned short )94), ((unsigned short )95), ((unsigned short )96), ((unsigned short )7), ((unsigned short )-5), ((unsigned short )0), ((unsigned short )-7), ((unsigned short )27), ((unsigned short )12), ((unsigned short )0), ((unsigned short )-18), ((unsigned short )0), ((unsigned short )0), ((unsigned short )-26), ((unsigned short )0), ((unsigned short )0), ((unsigned short )10), ((unsigned short )0), ((unsigned short )-15), ((unsigned short )0), ((unsigned short )13), ((unsigned short )-9), ((unsigned short )9), ((unsigned short )0), ((unsigned short )-20), ((unsigned short )-11), ((unsigned short )0), ((unsigned short )0), ((unsigned short )-23) }; -static unsigned char _pcre_OP_lengths[104] = { ((unsigned char )1), ((unsigned char )1), ((unsigned char )1), ((unsigned char )1), ((unsigned char )1), ((unsigned char )1), ((unsigned char )1), ((unsigned char )1), ((unsigned char )1), ((unsigned char )1), ((unsigned char )1), ((unsigned char )1), ((unsigned char )1), ((unsigned char )1), ((unsigned char )3), ((unsigned char )3), ((unsigned char )1), ((unsigned char )1), ((unsigned char )1), ((unsigned char )1), ((unsigned char )1), ((unsigned char )1), ((unsigned char )1), ((unsigned char )1), ((unsigned char )2), ((unsigned char )1), ((unsigned char )1), ((unsigned char )2), ((unsigned char )2), ((unsigned char )2), ((unsigned char )2), ((unsigned char )2), ((unsigned char )2), ((unsigned char )2), ((unsigned char )2), ((unsigned char )2), ((unsigned char )4), ((unsigned char )4), ((unsigned char )4), ((unsigned char )2), ((unsigned char )2), ((unsigned char )2), ((unsigned char )4), ((unsigned char )2), ((unsigned char )2), ((unsigned char )2), ((unsigned char )2), ((unsigned char )2), ((unsigned char )2), ((unsigned char )4), ((unsigned char )4), ((unsigned char )4), ((unsigned char )2), ((unsigned char )2), ((unsigned char )2), ((unsigned char )4), ((unsigned char )2), ((unsigned char )2), ((unsigned char )2), ((unsigned char )2), ((unsigned char )2), ((unsigned char )2), ((unsigned char )4), ((unsigned char )4), ((unsigned char )4), ((unsigned char )2), ((unsigned char )2), ((unsigned char )2), ((unsigned char )4), ((unsigned char )1), ((unsigned char )1), ((unsigned char )1), ((unsigned char )1), ((unsigned char )1), ((unsigned char )1), ((unsigned char )5), ((unsigned char )5), ((unsigned char )33), ((unsigned char )33), ((unsigned char )0), ((unsigned char )3), ((unsigned char )3), ((unsigned char )6), ((unsigned char )3), ((unsigned char )3), ((unsigned char )3), ((unsigned char )3), ((unsigned char )3), ((unsigned char )3), ((unsigned char )3), ((unsigned char )3), ((unsigned char )3), ((unsigned char )3), ((unsigned char )3), ((unsigned char )5), ((unsigned char )3), ((unsigned char )3), ((unsigned char )5), ((unsigned char )3), ((unsigned char )3), ((unsigned char )3), ((unsigned char )1), ((unsigned char )1), ((unsigned char )1) }; -static unsigned char _2E_str73[4] = "{0,"; -static unsigned char _2E_str74[7] = "DEFINE"; -static unsigned char _pcre_default_tables[1088] = "\x00\x01\x02\x03\x04\x05\x06\a\x08\t\n\v\x0C\r\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F !\"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7F\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF\x00\x01\x02\x03\x04\x05\x06\a\x08\t\n\v\x0C\r\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F !\"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~\x7F\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF\x00>\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\x03~\x00\x00\x00~\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFE\xFF\xFF\a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFE\xFF\xFF\a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\x03\xFE\xFF\xFF\x87\xFE\xFF\xFF\a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFE\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFE\xFF\x00\xFC\x01\x00\x00\xF8\x01\x00\x00x\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x80\x00\x00\x00\x80\x80\x80\x80\x00\x00\x80\x00\x1C\x1C\x1C\x1C\x1C\x1C\x1C\x1C\x1C\x1C\x00\x00\x00\x00\x00\x80\x00\x1A\x1A\x1A\x1A\x1A\x1A\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x80\x80\x00\x80\x10\x00\x1A\x1A\x1A\x1A\x1A\x1A\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x80\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; - - -/* Function Bodies */ -static inline int llvm_fcmp_ord(double X, double Y) { return X == X && Y == Y; } -static inline int llvm_fcmp_uno(double X, double Y) { return X != X || Y != Y; } -static inline int llvm_fcmp_ueq(double X, double Y) { return X == Y || llvm_fcmp_uno(X, Y); } -static inline int llvm_fcmp_une(double X, double Y) { return X != Y; } -static inline int llvm_fcmp_ult(double X, double Y) { return X < Y || llvm_fcmp_uno(X, Y); } -static inline int llvm_fcmp_ugt(double X, double Y) { return X > Y || llvm_fcmp_uno(X, Y); } -static inline int llvm_fcmp_ule(double X, double Y) { return X <= Y || llvm_fcmp_uno(X, Y); } -static inline int llvm_fcmp_uge(double X, double Y) { return X >= Y || llvm_fcmp_uno(X, Y); } -static inline int llvm_fcmp_oeq(double X, double Y) { return X == Y ; } -static inline int llvm_fcmp_one(double X, double Y) { return X != Y && llvm_fcmp_ord(X, Y); } -static inline int llvm_fcmp_olt(double X, double Y) { return X < Y ; } -static inline int llvm_fcmp_ogt(double X, double Y) { return X > Y ; } -static inline int llvm_fcmp_ole(double X, double Y) { return X <= Y ; } -static inline int llvm_fcmp_oge(double X, double Y) { return X >= Y ; } - -int main(int llvm_cbe_argc, char **llvm_cbe_argv) { - unsigned int llvm_cbe_length_i_i; /* Address-exposed local */ - unsigned int llvm_cbe_firstbyte_i_i; /* Address-exposed local */ - unsigned int llvm_cbe_reqbyte_i_i; /* Address-exposed local */ - unsigned int llvm_cbe_errorcode_i_i; /* Address-exposed local */ - unsigned char *llvm_cbe_code_i_i; /* Address-exposed local */ - unsigned char *llvm_cbe_ptr_i_i; /* Address-exposed local */ - struct l_struct_2E_compile_data llvm_cbe_compile_block_i_i; /* Address-exposed local */ - unsigned char llvm_cbe_cworkspace_i_i[4096]; /* Address-exposed local */ - unsigned int llvm_cbe_temp_options_i_i; /* Address-exposed local */ - unsigned char *llvm_cbe_tmp6; - struct l_struct_2E__IO_FILE *llvm_cbe_tmp7; - unsigned int llvm_cbe_tmp9; - unsigned char *llvm_cbe_tmp13; - unsigned int llvm_cbe_tmp22; - unsigned char *llvm_cbe_tmp30; - unsigned int llvm_cbe_tmp42; - unsigned int llvm_cbe_tmp51; - struct l_struct_2E__IO_FILE *llvm_cbe_tmp64; - unsigned int llvm_cbe_tmp67; - unsigned char *ltmp_0_1; - unsigned char *ltmp_1_1; - unsigned char *ltmp_2_1; - unsigned char *ltmp_3_1; - unsigned int llvm_cbe_tmp76; - unsigned int llvm_cbe_tmp79; - unsigned char **llvm_cbe_tmp55_i_i; - unsigned int *llvm_cbe_tmp122_i_i; - unsigned int *llvm_cbe_tmp124_i_i; - unsigned int *llvm_cbe_tmp126_i_i; - unsigned int *llvm_cbe_tmp128_i_i; - unsigned int *llvm_cbe_tmp130_i_i; - unsigned char **llvm_cbe_tmp132_i_i; - unsigned char *llvm_cbe_cworkspace135_i_i; - unsigned char **llvm_cbe_tmp137_i_i; - unsigned char **llvm_cbe_tmp140_i_i; - unsigned int llvm_cbe_tmp146_i_i; - unsigned int *llvm_cbe_tmp152_i_i; - unsigned int *llvm_cbe_tmp154_i_i; - unsigned int *llvm_cbe_tmp156_i_i; - unsigned int llvm_cbe_tmp168_i_i; - unsigned int llvm_cbe_tmp169_i_i; - unsigned int llvm_cbe_tmp175_i_i; - unsigned int llvm_cbe_tmp183_i_i; - unsigned int llvm_cbe_tmp186_i_i; - unsigned int llvm_cbe_tmp191_i_i; - unsigned char *llvm_cbe_tmp194_i_i; - struct l_struct_2E_pcre *llvm_cbe_tmp194195_i_i; - unsigned int llvm_cbe_tmp209_i_i; - unsigned int *llvm_cbe_tmp211_i_i; - unsigned short *llvm_cbe_tmp215_i_i; - unsigned short *llvm_cbe_tmp217_i_i; - unsigned short *llvm_cbe_tmp219_i_i; - unsigned int llvm_cbe_tmp222_i_i; - unsigned short *llvm_cbe_tmp225_i_i; - unsigned int llvm_cbe_tmp228_i_i; - unsigned short *llvm_cbe_tmp231_i_i; - unsigned short llvm_cbe_tmp255_i_i; - unsigned int llvm_cbe_tmp255256_i_i; - unsigned short llvm_cbe_tmp265_i_i; - unsigned short llvm_cbe_tmp269_i_i; - unsigned int llvm_cbe_tmp271_i_i; - unsigned char *llvm_cbe_tmp272_i_i; - unsigned int llvm_cbe_tmp288_i_i; - unsigned int llvm_cbe_tmp294_i_i; - unsigned int llvm_cbe_tmp297_i_i; - unsigned short *llvm_cbe_tmp300_i_i; - unsigned int llvm_cbe_tmp303_i_i; - unsigned short *llvm_cbe_tmp306_i_i; - unsigned int llvm_cbe_tmp309_i_i; - unsigned int llvm_cbe_tmp316_i_i; - unsigned int llvm_cbe_tmp321_i_i; - unsigned char *llvm_cbe_tmp326_i_i; - unsigned char llvm_cbe_tmp327_i_i; - unsigned char *llvm_cbe_tmp334_i_i; - unsigned char *llvm_cbe_tmp335_i_i; - unsigned int llvm_cbe_tmp338339_i_i; - unsigned int llvm_cbe_tmp341_i_i; - unsigned int llvm_cbe_tmp375_i_i; - unsigned char llvm_cbe_tmp410411412_i_i; - unsigned char *llvm_cbe_tmp351_i_i; - unsigned char llvm_cbe_tmp358_i_i; - unsigned char llvm_cbe_tmp365_i_i; - unsigned int llvm_cbe_tmp367_i_i; - unsigned char *llvm_cbe_tmp370_i_i; - unsigned char llvm_cbe_tmp371_i_i; - unsigned char *llvm_cbe_tmp377_i_i; - unsigned char llvm_cbe_tmp378_i_i; - unsigned char *llvm_cbe_tmp388_i_i; - unsigned int llvm_cbe_tmp419_i_i; - unsigned char *llvm_cbe_tmp427_i_i; - unsigned int llvm_cbe_tmp433_i_i; - unsigned short llvm_cbe_tmp440_i_i; - unsigned short llvm_cbe_tmp443_i_i; - unsigned int llvm_cbe_tmp450_i_i; - unsigned int llvm_cbe_tmp480_i_i; - unsigned int llvm_cbe_tmp492_i_i; - unsigned int llvm_cbe_tmp494_i_i; - unsigned int llvm_cbe_tmp501_i_i; - unsigned int llvm_cbe_tmp578724_i_i; - unsigned int llvm_cbe_tmp506_i_i; - unsigned int llvm_cbe_tmp512_i_i; - unsigned int llvm_cbe_tmp514_i_i; - unsigned int llvm_cbe_tmp520_i_i; - unsigned char *llvm_cbe_tmp532_i_i; - unsigned char llvm_cbe_tmp535_i_i; - unsigned int llvm_cbe_iftmp_595_0_in_i_i; - unsigned int llvm_cbe_iftmp_595_0_in_i_i__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp554_i_i; - unsigned int llvm_cbe_tmp578726_i_i; - unsigned int llvm_cbe_tmp561_i_i; - unsigned int llvm_cbe_tmp563_i_i; - unsigned int llvm_cbe_tmp570_i_i; - unsigned int llvm_cbe_tmp578_i_i; - unsigned int llvm_cbe_tmp585_i_i; - unsigned int llvm_cbe_tmp593_i_i; - unsigned int llvm_cbe_tmp600_i_i; - unsigned int llvm_cbe_tmp601_i_i; - unsigned char *llvm_cbe_tmp613_i_i; - unsigned char llvm_cbe_tmp616_i_i; - unsigned short llvm_cbe_tmp626_i_i; - unsigned short llvm_cbe_tmp628629_i_i; - unsigned short llvm_cbe_iftmp_603_0_i_i; - unsigned short llvm_cbe_iftmp_603_0_i_i__PHI_TEMPORARY; - struct l_struct_2E_pcre *llvm_cbe_tmp61_i; - struct l_struct_2E_pcre *llvm_cbe_tmp61_i__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp96; - - CODE_FOR_MAIN(); - if ((llvm_cbe_argc == 1) || (llvm_cbe_argc == ((unsigned int )3))) { - goto llvm_cbe_cond_next; - } else { - goto llvm_cbe_cond_true; - } - -llvm_cbe_cond_true: - llvm_cbe_tmp6 = *llvm_cbe_argv; - llvm_cbe_tmp9 = printf((&(_2E_str[((unsigned int )0)])), llvm_cbe_tmp6); - return ((unsigned int )1); -llvm_cbe_cond_next: - // XXX here - if (llvm_cbe_argc==1) { - llvm_cbe_tmp22 = 2; - llvm_cbe_tmp42 = 2; - } else { - llvm_cbe_tmp22 = atoi(llvm_cbe_argv[1]); // XXX here! - llvm_cbe_tmp42 = atoi(llvm_cbe_argv[2]); // XXX here! - } - llvm_cbe_tmp51 = printf((&(_2E_str1[((unsigned int )0)])), llvm_cbe_tmp22, llvm_cbe_tmp42); - if (((((signed int )llvm_cbe_tmp42) < ((signed int )((unsigned int )1))) | (((signed int )llvm_cbe_tmp22) < ((signed int )((unsigned int )1))))) { - goto llvm_cbe_cond_true63; - } else { - goto llvm_cbe_cond_next69; - } - -llvm_cbe_cond_true63: - llvm_cbe_tmp67 = printf("error: invalid sizes\n"); - return ((unsigned int )1); -llvm_cbe_cond_next69: - ltmp_0_1 = /*tail*/ ((unsigned char * (*) ())(void*)malloc)(llvm_cbe_tmp22); - ltmp_1_1 = ((unsigned char *)ltmp_0_1); - ltmp_2_1 = /*tail*/ ((unsigned char * (*) ())(void*)malloc)(llvm_cbe_tmp42); - ltmp_3_1 = ((unsigned char *)ltmp_2_1); -#ifdef FT - ft_make_symbolic_array(ltmp_1_1, llvm_cbe_tmp22, "pattern"); - ft_make_symbolic_array(ltmp_3_1, llvm_cbe_tmp42, "source"); -#else - klee_make_symbolic(ltmp_1_1, llvm_cbe_tmp22, "ltmp_1_1"); - klee_make_symbolic(ltmp_3_1, llvm_cbe_tmp42, "ltmp_3_1"); -#endif - *(<mp_1_1[(llvm_cbe_tmp22 + ((unsigned int )-1))]) = ((unsigned char )0); - *(<mp_3_1[(llvm_cbe_tmp42 + ((unsigned int )-1))]) = ((unsigned char )0); - *(&llvm_cbe_length_i_i) = ((unsigned int )1); - *(&llvm_cbe_errorcode_i_i) = ((unsigned int )0); - *(&llvm_cbe_ptr_i_i) = ltmp_1_1; - *(&llvm_cbe_compile_block_i_i.field0) = (&(_pcre_default_tables[((unsigned int )0)])); - llvm_cbe_tmp55_i_i = &llvm_cbe_compile_block_i_i.field1; - *llvm_cbe_tmp55_i_i = (&(_pcre_default_tables[((unsigned int )256)])); - *(&llvm_cbe_compile_block_i_i.field2) = (&(_pcre_default_tables[((unsigned int )512)])); - *(&llvm_cbe_compile_block_i_i.field3) = (&(_pcre_default_tables[((unsigned int )832)])); - *(&llvm_cbe_compile_block_i_i.field18) = ((unsigned int )0); - *(&llvm_cbe_compile_block_i_i.field19) = ((unsigned int )1); - *(&llvm_cbe_compile_block_i_i.field20[((unsigned int )0)]) = ((unsigned char )10); - llvm_cbe_tmp122_i_i = &llvm_cbe_compile_block_i_i.field13; - *llvm_cbe_tmp122_i_i = ((unsigned int )0); - llvm_cbe_tmp124_i_i = &llvm_cbe_compile_block_i_i.field14; - *llvm_cbe_tmp124_i_i = ((unsigned int )0); - llvm_cbe_tmp126_i_i = &llvm_cbe_compile_block_i_i.field12; - *llvm_cbe_tmp126_i_i = ((unsigned int )0); - llvm_cbe_tmp128_i_i = &llvm_cbe_compile_block_i_i.field10; - *llvm_cbe_tmp128_i_i = ((unsigned int )0); - llvm_cbe_tmp130_i_i = &llvm_cbe_compile_block_i_i.field11; - *llvm_cbe_tmp130_i_i = ((unsigned int )0); - llvm_cbe_tmp132_i_i = &llvm_cbe_compile_block_i_i.field9; - *llvm_cbe_tmp132_i_i = ((unsigned char *)/*NULL*/0); - llvm_cbe_cworkspace135_i_i = &llvm_cbe_cworkspace_i_i[((unsigned int )0)]; - *(&llvm_cbe_compile_block_i_i.field4) = llvm_cbe_cworkspace135_i_i; - llvm_cbe_tmp137_i_i = &llvm_cbe_compile_block_i_i.field5; - *llvm_cbe_tmp137_i_i = llvm_cbe_cworkspace135_i_i; - llvm_cbe_tmp140_i_i = &llvm_cbe_compile_block_i_i.field8; - *llvm_cbe_tmp140_i_i = llvm_cbe_cworkspace135_i_i; - *(&llvm_cbe_compile_block_i_i.field6) = ltmp_1_1; - llvm_cbe_tmp146_i_i = strlen(ltmp_1_1); - *(&llvm_cbe_compile_block_i_i.field7) = (<mp_1_1[llvm_cbe_tmp146_i_i]); - llvm_cbe_tmp152_i_i = &llvm_cbe_compile_block_i_i.field16; - *llvm_cbe_tmp152_i_i = ((unsigned int )0); - llvm_cbe_tmp154_i_i = &llvm_cbe_compile_block_i_i.field17; - *llvm_cbe_tmp154_i_i = ((unsigned int )0); - llvm_cbe_tmp156_i_i = &llvm_cbe_compile_block_i_i.field15; - *llvm_cbe_tmp156_i_i = ((unsigned int )0); - *(&llvm_cbe_code_i_i) = llvm_cbe_cworkspace135_i_i; - *llvm_cbe_cworkspace135_i_i = ((unsigned char )93); - llvm_cbe_tmp168_i_i = compile_regex(((unsigned int )0), ((unsigned int )0), (&llvm_cbe_code_i_i), (&llvm_cbe_ptr_i_i), (&llvm_cbe_errorcode_i_i), ((unsigned int )0), ((unsigned int )0), ((unsigned int )0), (&llvm_cbe_firstbyte_i_i), (&llvm_cbe_reqbyte_i_i), ((struct l_struct_2E_branch_chain *)/*NULL*/0), (&llvm_cbe_compile_block_i_i), (&llvm_cbe_length_i_i)); - llvm_cbe_tmp169_i_i = *(&llvm_cbe_errorcode_i_i); - if ((llvm_cbe_tmp169_i_i == ((unsigned int )0))) { - goto llvm_cbe_cond_next174_i_i; - } else { - llvm_cbe_tmp61_i__PHI_TEMPORARY = ((struct l_struct_2E_pcre *)/*NULL*/0); /* for PHI node */ - goto llvm_cbe_pcre_compile_exit; - } - -llvm_cbe_cond_next174_i_i: - llvm_cbe_tmp175_i_i = *(&llvm_cbe_length_i_i); - if ((((signed int )llvm_cbe_tmp175_i_i) > ((signed int )((unsigned int )65536)))) { - goto llvm_cbe_cond_true179_i_i; - } else { - goto llvm_cbe_cond_next180_i_i; - } - -llvm_cbe_cond_true179_i_i: - *(&llvm_cbe_errorcode_i_i) = ((unsigned int )20); - llvm_cbe_tmp61_i__PHI_TEMPORARY = ((struct l_struct_2E_pcre *)/*NULL*/0); /* for PHI node */ - goto llvm_cbe_pcre_compile_exit; - -llvm_cbe_cond_next180_i_i: - llvm_cbe_tmp183_i_i = *llvm_cbe_tmp128_i_i; - llvm_cbe_tmp186_i_i = *llvm_cbe_tmp130_i_i; - llvm_cbe_tmp191_i_i = (llvm_cbe_tmp175_i_i + ((unsigned int )40)) + ((llvm_cbe_tmp186_i_i + ((unsigned int )3)) * llvm_cbe_tmp183_i_i); - llvm_cbe_tmp194_i_i = malloc(llvm_cbe_tmp191_i_i); - llvm_cbe_tmp194195_i_i = ((struct l_struct_2E_pcre *)llvm_cbe_tmp194_i_i); - if ((llvm_cbe_tmp194_i_i == ((unsigned char *)/*NULL*/0))) { - goto llvm_cbe_cond_true200_i_i; - } else { - goto llvm_cbe_cond_next201_i_i; - } - -llvm_cbe_cond_true200_i_i: - *(&llvm_cbe_errorcode_i_i) = ((unsigned int )21); - llvm_cbe_tmp61_i__PHI_TEMPORARY = ((struct l_struct_2E_pcre *)/*NULL*/0); /* for PHI node */ - goto llvm_cbe_pcre_compile_exit; - -llvm_cbe_cond_next201_i_i: - *(((unsigned int *)llvm_cbe_tmp194_i_i)) = ((unsigned int )1346589253); - *(&llvm_cbe_tmp194195_i_i->field1) = llvm_cbe_tmp191_i_i; - llvm_cbe_tmp209_i_i = *llvm_cbe_tmp156_i_i; - llvm_cbe_tmp211_i_i = &llvm_cbe_tmp194195_i_i->field2; - *llvm_cbe_tmp211_i_i = llvm_cbe_tmp209_i_i; - *(&llvm_cbe_tmp194195_i_i->field3) = ((unsigned int )0); - llvm_cbe_tmp215_i_i = &llvm_cbe_tmp194195_i_i->field6; - *llvm_cbe_tmp215_i_i = ((unsigned short )0); - llvm_cbe_tmp217_i_i = &llvm_cbe_tmp194195_i_i->field7; - *llvm_cbe_tmp217_i_i = ((unsigned short )0); - llvm_cbe_tmp219_i_i = &llvm_cbe_tmp194195_i_i->field8; - *llvm_cbe_tmp219_i_i = ((unsigned short )40); - llvm_cbe_tmp222_i_i = *llvm_cbe_tmp130_i_i; - llvm_cbe_tmp225_i_i = &llvm_cbe_tmp194195_i_i->field9; - *llvm_cbe_tmp225_i_i = (((unsigned short )llvm_cbe_tmp222_i_i)); - llvm_cbe_tmp228_i_i = *llvm_cbe_tmp128_i_i; - llvm_cbe_tmp231_i_i = &llvm_cbe_tmp194195_i_i->field10; - *llvm_cbe_tmp231_i_i = (((unsigned short )llvm_cbe_tmp228_i_i)); - *(&llvm_cbe_tmp194195_i_i->field11) = ((unsigned short )0); - *(&llvm_cbe_tmp194195_i_i->field12) = ((unsigned char *)/*NULL*/0); - *(&llvm_cbe_tmp194195_i_i->field13) = ((unsigned char *)/*NULL*/0); - *llvm_cbe_tmp126_i_i = ((unsigned int )0); - *llvm_cbe_tmp128_i_i = ((unsigned int )0); - llvm_cbe_tmp255_i_i = *llvm_cbe_tmp219_i_i; - llvm_cbe_tmp255256_i_i = ((unsigned int )(unsigned short )llvm_cbe_tmp255_i_i); - *llvm_cbe_tmp132_i_i = (&llvm_cbe_tmp194_i_i[llvm_cbe_tmp255256_i_i]); - llvm_cbe_tmp265_i_i = *llvm_cbe_tmp225_i_i; - llvm_cbe_tmp269_i_i = *llvm_cbe_tmp231_i_i; - llvm_cbe_tmp271_i_i = (((unsigned int )(unsigned short )llvm_cbe_tmp269_i_i)) * (((unsigned int )(unsigned short )llvm_cbe_tmp265_i_i)); - llvm_cbe_tmp272_i_i = &llvm_cbe_tmp194_i_i[(llvm_cbe_tmp255256_i_i + llvm_cbe_tmp271_i_i)]; - *llvm_cbe_tmp137_i_i = llvm_cbe_tmp272_i_i; - *llvm_cbe_tmp140_i_i = llvm_cbe_cworkspace135_i_i; - *llvm_cbe_tmp152_i_i = ((unsigned int )0); - *llvm_cbe_tmp154_i_i = ((unsigned int )0); - *(&llvm_cbe_ptr_i_i) = ltmp_1_1; - *(&llvm_cbe_code_i_i) = llvm_cbe_tmp272_i_i; - *llvm_cbe_tmp272_i_i = ((unsigned char )93); - llvm_cbe_tmp288_i_i = *llvm_cbe_tmp211_i_i; - llvm_cbe_tmp294_i_i = compile_regex(llvm_cbe_tmp288_i_i, (llvm_cbe_tmp288_i_i & ((unsigned int )7)), (&llvm_cbe_code_i_i), (&llvm_cbe_ptr_i_i), (&llvm_cbe_errorcode_i_i), ((unsigned int )0), ((unsigned int )0), ((unsigned int )0), (&llvm_cbe_firstbyte_i_i), (&llvm_cbe_reqbyte_i_i), ((struct l_struct_2E_branch_chain *)/*NULL*/0), (&llvm_cbe_compile_block_i_i), ((unsigned int *)/*NULL*/0)); - llvm_cbe_tmp297_i_i = *llvm_cbe_tmp126_i_i; - llvm_cbe_tmp300_i_i = &llvm_cbe_tmp194195_i_i->field4; - *llvm_cbe_tmp300_i_i = (((unsigned short )llvm_cbe_tmp297_i_i)); - llvm_cbe_tmp303_i_i = *llvm_cbe_tmp122_i_i; - llvm_cbe_tmp306_i_i = &llvm_cbe_tmp194195_i_i->field5; - *llvm_cbe_tmp306_i_i = (((unsigned short )llvm_cbe_tmp303_i_i)); - llvm_cbe_tmp309_i_i = *llvm_cbe_tmp154_i_i; - if ((llvm_cbe_tmp309_i_i == ((unsigned int )0))) { - goto llvm_cbe_cond_next320_i_i; - } else { - goto llvm_cbe_cond_true313_i_i; - } - -llvm_cbe_cond_true313_i_i: - llvm_cbe_tmp316_i_i = *llvm_cbe_tmp211_i_i; - *llvm_cbe_tmp211_i_i = (llvm_cbe_tmp316_i_i | ((unsigned int )2147483648u)); - goto llvm_cbe_cond_next320_i_i; - -llvm_cbe_cond_next320_i_i: - llvm_cbe_tmp321_i_i = *(&llvm_cbe_errorcode_i_i); - if ((llvm_cbe_tmp321_i_i == ((unsigned int )0))) { - goto llvm_cbe_cond_true325_i_i; - } else { - goto llvm_cbe_cond_next333_i_i; - } - -llvm_cbe_cond_true325_i_i: - llvm_cbe_tmp326_i_i = *(&llvm_cbe_ptr_i_i); - llvm_cbe_tmp327_i_i = *llvm_cbe_tmp326_i_i; - if ((llvm_cbe_tmp327_i_i == ((unsigned char )0))) { - goto llvm_cbe_cond_next333_i_i; - } else { - goto llvm_cbe_cond_true331_i_i; - } - -llvm_cbe_cond_true331_i_i: - *(&llvm_cbe_errorcode_i_i) = ((unsigned int )22); - goto llvm_cbe_cond_next333_i_i; - -llvm_cbe_cond_next333_i_i: - llvm_cbe_tmp334_i_i = *(&llvm_cbe_code_i_i); - *llvm_cbe_tmp334_i_i = ((unsigned char )0); - llvm_cbe_tmp335_i_i = &llvm_cbe_tmp334_i_i[((unsigned int )1)]; - *(&llvm_cbe_code_i_i) = llvm_cbe_tmp335_i_i; - llvm_cbe_tmp338339_i_i = ((unsigned int )(unsigned long)llvm_cbe_tmp272_i_i); - llvm_cbe_tmp341_i_i = *(&llvm_cbe_length_i_i); - if ((((signed int )((((unsigned int )(unsigned long)llvm_cbe_tmp335_i_i)) - llvm_cbe_tmp338339_i_i)) > ((signed int )llvm_cbe_tmp341_i_i))) { - goto llvm_cbe_cond_true345_i_i; - } else { - goto llvm_cbe_bb418_preheader_i_i; - } - -llvm_cbe_bb418_preheader_i_i: - llvm_cbe_tmp375_i_i = llvm_cbe_tmp271_i_i + ((unsigned int )1); - llvm_cbe_tmp410411412_i_i = ((unsigned char )(unsigned long)llvm_cbe_tmp272_i_i); - goto llvm_cbe_bb418_i_i; - -llvm_cbe_cond_true345_i_i: - *(&llvm_cbe_errorcode_i_i) = ((unsigned int )23); - goto llvm_cbe_bb432_i_i; - -llvm_cbe_cond_true393_i_i: - *(&llvm_cbe_errorcode_i_i) = ((unsigned int )53); - goto llvm_cbe_bb432_i_i; - - do { /* Syntactic loop 'bb418.i.i' to make GCC happy */ -llvm_cbe_bb418_i_i: - llvm_cbe_tmp419_i_i = *(&llvm_cbe_errorcode_i_i); - if ((llvm_cbe_tmp419_i_i == ((unsigned int )0))) { - goto llvm_cbe_cond_next424_i_i; - } else { - goto llvm_cbe_bb432_i_i; - } - -llvm_cbe_cond_false394_i_i: - *llvm_cbe_tmp370_i_i = (((unsigned char )(((unsigned int )(((unsigned int )((((unsigned int )(unsigned long)llvm_cbe_tmp388_i_i)) - llvm_cbe_tmp338339_i_i)) >> ((unsigned int )((unsigned int )8))))))); - *llvm_cbe_tmp377_i_i = (((unsigned char )((((unsigned char )(unsigned long)llvm_cbe_tmp388_i_i)) - llvm_cbe_tmp410411412_i_i))); - goto llvm_cbe_bb418_i_i; - -llvm_cbe_bb347_i_i: - llvm_cbe_tmp351_i_i = &llvm_cbe_tmp427_i_i[((unsigned int )-2)]; - *llvm_cbe_tmp140_i_i = llvm_cbe_tmp351_i_i; - llvm_cbe_tmp358_i_i = *llvm_cbe_tmp351_i_i; - llvm_cbe_tmp365_i_i = *(&llvm_cbe_tmp427_i_i[((unsigned int )-1)]); - llvm_cbe_tmp367_i_i = (((unsigned int )(unsigned char )llvm_cbe_tmp365_i_i)) | ((((unsigned int )(unsigned char )llvm_cbe_tmp358_i_i)) << ((unsigned int )8)); - llvm_cbe_tmp370_i_i = &llvm_cbe_tmp194_i_i[(llvm_cbe_tmp255256_i_i + (llvm_cbe_tmp367_i_i + llvm_cbe_tmp271_i_i))]; - llvm_cbe_tmp371_i_i = *llvm_cbe_tmp370_i_i; - llvm_cbe_tmp377_i_i = &llvm_cbe_tmp194_i_i[(llvm_cbe_tmp255256_i_i + (llvm_cbe_tmp375_i_i + llvm_cbe_tmp367_i_i))]; - llvm_cbe_tmp378_i_i = *llvm_cbe_tmp377_i_i; - llvm_cbe_tmp388_i_i = find_bracket(llvm_cbe_tmp272_i_i, (((((unsigned int )(unsigned char )llvm_cbe_tmp371_i_i)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp378_i_i)))); - if ((llvm_cbe_tmp388_i_i == ((unsigned char *)/*NULL*/0))) { - goto llvm_cbe_cond_true393_i_i; - } else { - goto llvm_cbe_cond_false394_i_i; - } - -llvm_cbe_cond_next424_i_i: - llvm_cbe_tmp427_i_i = *llvm_cbe_tmp140_i_i; - if ((((unsigned char *)llvm_cbe_tmp427_i_i) > ((unsigned char *)llvm_cbe_cworkspace135_i_i))) { - goto llvm_cbe_bb347_i_i; - } else { - goto llvm_cbe_bb432_i_i; - } - - } while (1); /* end of syntactic loop 'bb418.i.i' */ -llvm_cbe_bb432_i_i: - llvm_cbe_tmp433_i_i = *(&llvm_cbe_errorcode_i_i); - if ((llvm_cbe_tmp433_i_i == ((unsigned int )0))) { - goto llvm_cbe_cond_true437_i_i; - } else { - goto llvm_cbe_cond_next449_i_i; - } - -llvm_cbe_cond_true437_i_i: - llvm_cbe_tmp440_i_i = *llvm_cbe_tmp306_i_i; - llvm_cbe_tmp443_i_i = *llvm_cbe_tmp300_i_i; - if ((((unsigned short )llvm_cbe_tmp440_i_i) > ((unsigned short )llvm_cbe_tmp443_i_i))) { - goto llvm_cbe_cond_true447_i_i; - } else { - goto llvm_cbe_cond_next449_i_i; - } - -llvm_cbe_cond_true447_i_i: - *(&llvm_cbe_errorcode_i_i) = ((unsigned int )15); - goto llvm_cbe_cond_next449_i_i; - -llvm_cbe_cond_next449_i_i: - llvm_cbe_tmp450_i_i = *(&llvm_cbe_errorcode_i_i); - if ((llvm_cbe_tmp450_i_i == ((unsigned int )0))) { - goto llvm_cbe_cond_next477_i_i; - } else { - goto llvm_cbe_cond_true454_i_i; - } - -llvm_cbe_cond_true454_i_i: - free(llvm_cbe_tmp194_i_i); - llvm_cbe_tmp61_i__PHI_TEMPORARY = ((struct l_struct_2E_pcre *)/*NULL*/0); /* for PHI node */ - goto llvm_cbe_pcre_compile_exit; - -llvm_cbe_cond_next477_i_i: - llvm_cbe_tmp480_i_i = *llvm_cbe_tmp211_i_i; - if (((llvm_cbe_tmp480_i_i & ((unsigned int )16)) == ((unsigned int )0))) { - goto llvm_cbe_cond_true486_i_i; - } else { - goto llvm_cbe_cond_next577_i_i; - } - -llvm_cbe_cond_true486_i_i: - *(&llvm_cbe_temp_options_i_i) = llvm_cbe_tmp480_i_i; - llvm_cbe_tmp492_i_i = *llvm_cbe_tmp124_i_i; - llvm_cbe_tmp494_i_i = is_anchored(llvm_cbe_tmp272_i_i, (&llvm_cbe_temp_options_i_i), ((unsigned int )0), llvm_cbe_tmp492_i_i); - if ((llvm_cbe_tmp494_i_i == ((unsigned int )0))) { - goto llvm_cbe_cond_false505_i_i; - } else { - goto llvm_cbe_cond_true498_i_i; - } - -llvm_cbe_cond_true498_i_i: - llvm_cbe_tmp501_i_i = *llvm_cbe_tmp211_i_i; - *llvm_cbe_tmp211_i_i = (llvm_cbe_tmp501_i_i | ((unsigned int )16)); - llvm_cbe_tmp578724_i_i = *(&llvm_cbe_reqbyte_i_i); - if ((((signed int )llvm_cbe_tmp578724_i_i) > ((signed int )((unsigned int )-1)))) { - goto llvm_cbe_cond_true582_i_i; - } else { - llvm_cbe_tmp61_i__PHI_TEMPORARY = llvm_cbe_tmp194195_i_i; /* for PHI node */ - goto llvm_cbe_pcre_compile_exit; - } - -llvm_cbe_cond_false505_i_i: - llvm_cbe_tmp506_i_i = *(&llvm_cbe_firstbyte_i_i); - if ((((signed int )llvm_cbe_tmp506_i_i) < ((signed int )((unsigned int )0)))) { - goto llvm_cbe_cond_true510_i_i; - } else { - goto llvm_cbe_cond_next513_i_i; - } - -llvm_cbe_cond_true510_i_i: - llvm_cbe_tmp512_i_i = find_firstassertedchar(llvm_cbe_tmp272_i_i, (&llvm_cbe_temp_options_i_i), ((unsigned int )0)); - *(&llvm_cbe_firstbyte_i_i) = llvm_cbe_tmp512_i_i; - goto llvm_cbe_cond_next513_i_i; - -llvm_cbe_cond_next513_i_i: - llvm_cbe_tmp514_i_i = *(&llvm_cbe_firstbyte_i_i); - if ((((signed int )llvm_cbe_tmp514_i_i) > ((signed int )((unsigned int )-1)))) { - goto llvm_cbe_cond_true518_i_i; - } else { - goto llvm_cbe_cond_false558_i_i; - } - -llvm_cbe_cond_true518_i_i: - llvm_cbe_tmp520_i_i = llvm_cbe_tmp514_i_i & ((unsigned int )255); - if (((llvm_cbe_tmp514_i_i & ((unsigned int )256)) == ((unsigned int )0))) { - goto llvm_cbe_bb545_i_i; - } else { - goto llvm_cbe_cond_next529_i_i; - } - -llvm_cbe_cond_next529_i_i: - llvm_cbe_tmp532_i_i = *llvm_cbe_tmp55_i_i; - llvm_cbe_tmp535_i_i = *(&llvm_cbe_tmp532_i_i[llvm_cbe_tmp520_i_i]); - if (((((unsigned int )(unsigned char )llvm_cbe_tmp535_i_i)) == llvm_cbe_tmp520_i_i)) { - llvm_cbe_iftmp_595_0_in_i_i__PHI_TEMPORARY = llvm_cbe_tmp520_i_i; /* for PHI node */ - goto llvm_cbe_bb548_i_i; - } else { - goto llvm_cbe_bb545_i_i; - } - -llvm_cbe_bb545_i_i: - llvm_cbe_iftmp_595_0_in_i_i__PHI_TEMPORARY = llvm_cbe_tmp514_i_i; /* for PHI node */ - goto llvm_cbe_bb548_i_i; - -llvm_cbe_bb548_i_i: - llvm_cbe_iftmp_595_0_in_i_i = llvm_cbe_iftmp_595_0_in_i_i__PHI_TEMPORARY; - *llvm_cbe_tmp215_i_i = (((unsigned short )llvm_cbe_iftmp_595_0_in_i_i)); - llvm_cbe_tmp554_i_i = *llvm_cbe_tmp211_i_i; - *llvm_cbe_tmp211_i_i = (llvm_cbe_tmp554_i_i | ((unsigned int )1073741824)); - llvm_cbe_tmp578726_i_i = *(&llvm_cbe_reqbyte_i_i); - if ((((signed int )llvm_cbe_tmp578726_i_i) > ((signed int )((unsigned int )-1)))) { - goto llvm_cbe_cond_true582_i_i; - } else { - llvm_cbe_tmp61_i__PHI_TEMPORARY = llvm_cbe_tmp194195_i_i; /* for PHI node */ - goto llvm_cbe_pcre_compile_exit; - } - -llvm_cbe_cond_false558_i_i: - llvm_cbe_tmp561_i_i = *llvm_cbe_tmp124_i_i; - llvm_cbe_tmp563_i_i = is_startline(llvm_cbe_tmp272_i_i, ((unsigned int )0), llvm_cbe_tmp561_i_i); - if ((llvm_cbe_tmp563_i_i == ((unsigned int )0))) { - goto llvm_cbe_cond_next577_i_i; - } else { - goto llvm_cbe_cond_true567_i_i; - } - -llvm_cbe_cond_true567_i_i: - llvm_cbe_tmp570_i_i = *llvm_cbe_tmp211_i_i; - *llvm_cbe_tmp211_i_i = (llvm_cbe_tmp570_i_i | ((unsigned int )268435456)); - goto llvm_cbe_cond_next577_i_i; - -llvm_cbe_cond_next577_i_i: - llvm_cbe_tmp578_i_i = *(&llvm_cbe_reqbyte_i_i); - if ((((signed int )llvm_cbe_tmp578_i_i) > ((signed int )((unsigned int )-1)))) { - goto llvm_cbe_cond_true582_i_i; - } else { - llvm_cbe_tmp61_i__PHI_TEMPORARY = llvm_cbe_tmp194195_i_i; /* for PHI node */ - goto llvm_cbe_pcre_compile_exit; - } - -llvm_cbe_cond_true582_i_i: - llvm_cbe_tmp585_i_i = *llvm_cbe_tmp211_i_i; - if (((llvm_cbe_tmp585_i_i & ((unsigned int )16)) == ((unsigned int )0))) { - goto llvm_cbe_bb598_i_i; - } else { - goto llvm_cbe_cond_next592_i_i; - } - -llvm_cbe_cond_next592_i_i: - llvm_cbe_tmp593_i_i = *(&llvm_cbe_reqbyte_i_i); - if (((llvm_cbe_tmp593_i_i & ((unsigned int )512)) == ((unsigned int )0))) { - llvm_cbe_tmp61_i__PHI_TEMPORARY = llvm_cbe_tmp194195_i_i; /* for PHI node */ - goto llvm_cbe_pcre_compile_exit; - } else { - goto llvm_cbe_bb598_i_i; - } - -llvm_cbe_bb598_i_i: - llvm_cbe_tmp600_i_i = *(&llvm_cbe_reqbyte_i_i); - llvm_cbe_tmp601_i_i = llvm_cbe_tmp600_i_i & ((unsigned int )255); - if (((llvm_cbe_tmp600_i_i & ((unsigned int )256)) == ((unsigned int )0))) { - goto llvm_cbe_bb627_i_i; - } else { - goto llvm_cbe_cond_next610_i_i; - } - -llvm_cbe_cond_next610_i_i: - llvm_cbe_tmp613_i_i = *llvm_cbe_tmp55_i_i; - llvm_cbe_tmp616_i_i = *(&llvm_cbe_tmp613_i_i[llvm_cbe_tmp601_i_i]); - if (((((unsigned int )(unsigned char )llvm_cbe_tmp616_i_i)) == llvm_cbe_tmp601_i_i)) { - goto llvm_cbe_cond_next623_i_i; - } else { - goto llvm_cbe_bb627_i_i; - } - -llvm_cbe_cond_next623_i_i: - llvm_cbe_tmp626_i_i = ((unsigned short )((((unsigned short )llvm_cbe_tmp600_i_i)) & ((unsigned short )-257))); - llvm_cbe_iftmp_603_0_i_i__PHI_TEMPORARY = llvm_cbe_tmp626_i_i; /* for PHI node */ - goto llvm_cbe_bb630_i_i; - -llvm_cbe_bb627_i_i: - llvm_cbe_tmp628629_i_i = ((unsigned short )llvm_cbe_tmp600_i_i); - llvm_cbe_iftmp_603_0_i_i__PHI_TEMPORARY = llvm_cbe_tmp628629_i_i; /* for PHI node */ - goto llvm_cbe_bb630_i_i; - -llvm_cbe_bb630_i_i: - llvm_cbe_iftmp_603_0_i_i = llvm_cbe_iftmp_603_0_i_i__PHI_TEMPORARY; - *llvm_cbe_tmp217_i_i = llvm_cbe_iftmp_603_0_i_i; - *llvm_cbe_tmp211_i_i = (llvm_cbe_tmp585_i_i | ((unsigned int )536870912)); - llvm_cbe_tmp61_i__PHI_TEMPORARY = llvm_cbe_tmp194195_i_i; /* for PHI node */ - goto llvm_cbe_pcre_compile_exit; - -llvm_cbe_pcre_compile_exit: - llvm_cbe_tmp61_i = llvm_cbe_tmp61_i__PHI_TEMPORARY; - if ((llvm_cbe_tmp61_i == ((struct l_struct_2E_pcre *)/*NULL*/0))) { - goto llvm_cbe_cond_true94; - } else { - goto llvm_cbe_UnifiedReturnBlock; - } - -llvm_cbe_cond_true94: - // llvm_cbe_tmp96 = puts((&(_2E_str3[((unsigned int )0)]))); - return ((unsigned int )0); -llvm_cbe_UnifiedReturnBlock: - return ((unsigned int )0); -} - - -static unsigned int check_escape(unsigned char **llvm_cbe_ptrptr, unsigned int *llvm_cbe_errorcodeptr, unsigned int llvm_cbe_bracount, unsigned int llvm_cbe_options, unsigned int llvm_cbe_isclass) { - unsigned int llvm_cbe_tmp3; - unsigned char *llvm_cbe_tmp5; - unsigned char *llvm_cbe_tmp6; - unsigned char llvm_cbe_tmp8; - unsigned int llvm_cbe_tmp89; - unsigned int llvm_cbe_tmp19; - unsigned short llvm_cbe_tmp27; - unsigned int llvm_cbe_tmp2728; - unsigned char *llvm_cbe_tmp44; - unsigned char llvm_cbe_tmp45; - unsigned char *llvm_cbe_tmp51; - unsigned char llvm_cbe_tmp76521; - unsigned int llvm_cbe_p_3513_0_rec; - unsigned int llvm_cbe_p_3513_0_rec__PHI_TEMPORARY; - unsigned char *llvm_cbe_p_3513_0; - unsigned char llvm_cbe_tmp54; - unsigned char llvm_cbe_tmp63; - unsigned char *llvm_cbe_tmp73; - unsigned char llvm_cbe_tmp76; - unsigned int llvm_cbe_indvar_next573; - unsigned char *llvm_cbe_p_3513_1; - unsigned char *llvm_cbe_p_3513_1__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp91; - bool llvm_cbe_braced_0; - bool llvm_cbe_braced_0__PHI_TEMPORARY; - unsigned char *llvm_cbe_ptr_0; - unsigned char *llvm_cbe_ptr_0__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp110; - unsigned char llvm_cbe_tmp111; - unsigned char *llvm_cbe_ptr_4_ph; - unsigned char llvm_cbe_tmp133546; - unsigned char llvm_cbe_tmp136549; - unsigned int llvm_cbe_ptr_4544_rec; - unsigned int llvm_cbe_ptr_4544_rec__PHI_TEMPORARY; - unsigned int llvm_cbe_c_2543; - unsigned int llvm_cbe_c_2543__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp124_rec; - unsigned char *llvm_cbe_tmp124; - unsigned char llvm_cbe_tmp126; - unsigned int llvm_cbe_tmp129; - unsigned char llvm_cbe_tmp133; - unsigned char llvm_cbe_tmp136; - unsigned char *llvm_cbe_ptr_4_lcssa; - unsigned char *llvm_cbe_ptr_4_lcssa__PHI_TEMPORARY; - unsigned int llvm_cbe_c_2_lcssa; - unsigned int llvm_cbe_c_2_lcssa__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp156; - unsigned char llvm_cbe_tmp158; - unsigned char *llvm_cbe_ptr_6; - unsigned char *llvm_cbe_ptr_6__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp217557; - unsigned char llvm_cbe_tmp220560; - unsigned int llvm_cbe_ptr_7553_rec; - unsigned int llvm_cbe_ptr_7553_rec__PHI_TEMPORARY; - unsigned int llvm_cbe_c_6555; - unsigned int llvm_cbe_c_6555__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp208; - unsigned char llvm_cbe_tmp210; - unsigned int llvm_cbe_tmp212; - unsigned int llvm_cbe_c_6; - unsigned char llvm_cbe_tmp217; - unsigned char llvm_cbe_tmp220; - unsigned int llvm_cbe_c_6_lcssa; - unsigned int llvm_cbe_c_6_lcssa__PHI_TEMPORARY; - unsigned char *llvm_cbe_ptr_7_lcssa; - unsigned char *llvm_cbe_ptr_7_lcssa__PHI_TEMPORARY; - unsigned int llvm_cbe_c_6_in_lcssa; - unsigned int llvm_cbe_c_6_in_lcssa__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp267; - unsigned int llvm_cbe_ptr_10_rec; - unsigned int llvm_cbe_ptr_10_rec__PHI_TEMPORARY; - unsigned int llvm_cbe_c_7_in; - unsigned int llvm_cbe_c_7_in__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp13_sum577; - unsigned int llvm_cbe_c_7; - unsigned char llvm_cbe_tmp282; - unsigned char *llvm_cbe_ptr_10; - unsigned char llvm_cbe_tmp312; - unsigned char *llvm_cbe_tmp318; - unsigned char *llvm_cbe_tmp324; - unsigned char *llvm_cbe_tmp324_us; - unsigned char *llvm_cbe_tmp324_lcssa_us_lcssa; - unsigned char *llvm_cbe_tmp324_lcssa_us_lcssa__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp321322_lcssa_us_lcssa_in; - unsigned char llvm_cbe_tmp321322_lcssa_us_lcssa_in__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp321322_lcssa_us_lcssa; - unsigned int llvm_cbe_cc_4; - unsigned int llvm_cbe_tmp360; - unsigned int llvm_cbe_indvar_next571; - unsigned int llvm_cbe_count_3_ph; - unsigned int llvm_cbe_count_3_ph__PHI_TEMPORARY; - unsigned char *llvm_cbe_pt_3_ph; - unsigned char *llvm_cbe_pt_3_ph__PHI_TEMPORARY; - unsigned int llvm_cbe_c_9_ph; - unsigned int llvm_cbe_c_9_ph__PHI_TEMPORARY; - unsigned int llvm_cbe_pt_3_us_rec; - unsigned int llvm_cbe_pt_3_us_rec__PHI_TEMPORARY; - unsigned char *llvm_cbe_pt_3_us; - unsigned char llvm_cbe_tmp363_us; - unsigned char llvm_cbe_tmp366_us; - unsigned int llvm_cbe_tmp324_us_rec; - unsigned char llvm_cbe_tmp363; - unsigned char llvm_cbe_tmp366; - unsigned char llvm_cbe_tmp321_lcssa_us_lcssa; - unsigned char llvm_cbe_tmp321_lcssa_us_lcssa__PHI_TEMPORARY; - unsigned char *llvm_cbe_pt_3_lcssa_us_lcssa; - unsigned char *llvm_cbe_pt_3_lcssa_us_lcssa__PHI_TEMPORARY; - unsigned int llvm_cbe_cc404_3; - unsigned int llvm_cbe_tmp430; - unsigned int llvm_cbe_ptr_11_rec; - unsigned int llvm_cbe_ptr_11_rec__PHI_TEMPORARY; - unsigned int llvm_cbe_c_10; - unsigned int llvm_cbe_c_10__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp13_sum581; - unsigned char llvm_cbe_tmp444; - unsigned int llvm_cbe_tmp444445; - unsigned char llvm_cbe_tmp447; - unsigned char *llvm_cbe_tmp456; - unsigned char llvm_cbe_tmp458; - unsigned int llvm_cbe_tmp458459; - unsigned char *llvm_cbe_ptr_11; - unsigned int llvm_cbe_c_0; - unsigned int llvm_cbe_c_0__PHI_TEMPORARY; - unsigned char *llvm_cbe_ptr_1; - unsigned char *llvm_cbe_ptr_1__PHI_TEMPORARY; - - llvm_cbe_tmp3 = (((unsigned int )(((unsigned int )llvm_cbe_options) >> ((unsigned int )((unsigned int )11))))) & ((unsigned int )1); - llvm_cbe_tmp5 = *llvm_cbe_ptrptr; - llvm_cbe_tmp6 = &llvm_cbe_tmp5[((unsigned int )1)]; - llvm_cbe_tmp8 = *llvm_cbe_tmp6; - llvm_cbe_tmp89 = ((unsigned int )(unsigned char )llvm_cbe_tmp8); - if ((llvm_cbe_tmp8 == ((unsigned char )0))) { - goto llvm_cbe_cond_true; - } else { - goto llvm_cbe_cond_false; - } - -llvm_cbe_cond_true: - *llvm_cbe_errorcodeptr = ((unsigned int )1); - *llvm_cbe_ptrptr = llvm_cbe_tmp6; - return llvm_cbe_tmp89; -llvm_cbe_cond_false: - llvm_cbe_tmp19 = llvm_cbe_tmp89 + ((unsigned int )-48); - if ((((unsigned int )llvm_cbe_tmp19) < ((unsigned int )((unsigned int )75)))) { - goto llvm_cbe_cond_true23; - } else { - llvm_cbe_c_0__PHI_TEMPORARY = llvm_cbe_tmp89; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp6; /* for PHI node */ - goto llvm_cbe_cond_next494; - } - -llvm_cbe_cond_true23: - llvm_cbe_tmp27 = *(&escapes[llvm_cbe_tmp19]); - llvm_cbe_tmp2728 = ((signed int )(signed short )llvm_cbe_tmp27); - if ((llvm_cbe_tmp27 == ((unsigned short )0))) { - goto llvm_cbe_cond_false35; - } else { - llvm_cbe_c_0__PHI_TEMPORARY = llvm_cbe_tmp2728; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp6; /* for PHI node */ - goto llvm_cbe_cond_next494; - } - -llvm_cbe_cond_false35: - switch (llvm_cbe_tmp89) { - default: - goto llvm_cbe_bb479; -; - case ((unsigned int )48): - llvm_cbe_ptr_10_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_c_7_in__PHI_TEMPORARY = llvm_cbe_tmp89; /* for PHI node */ - goto llvm_cbe_bb269; - case ((unsigned int )49): - goto llvm_cbe_bb195; - case ((unsigned int )50): - goto llvm_cbe_bb195; - case ((unsigned int )51): - goto llvm_cbe_bb195; - case ((unsigned int )52): - goto llvm_cbe_bb195; - case ((unsigned int )53): - goto llvm_cbe_bb195; - case ((unsigned int )54): - goto llvm_cbe_bb195; - case ((unsigned int )55): - goto llvm_cbe_bb195; - case ((unsigned int )56): - goto llvm_cbe_bb195; - case ((unsigned int )57): - goto llvm_cbe_bb195; - case ((unsigned int )76): - goto llvm_cbe_bb40; - break; - case ((unsigned int )78): - goto llvm_cbe_bb40; - break; - case ((unsigned int )85): - goto llvm_cbe_bb40; - break; - case ((unsigned int )99): - goto llvm_cbe_bb454; - case ((unsigned int )103): - goto llvm_cbe_bb42; - case ((unsigned int )108): - goto llvm_cbe_bb40; - break; - case ((unsigned int )117): - goto llvm_cbe_bb40; - break; - case ((unsigned int )120): - goto llvm_cbe_bb309; - } -llvm_cbe_bb40: - *llvm_cbe_errorcodeptr = ((unsigned int )37); - *llvm_cbe_ptrptr = llvm_cbe_tmp6; - return llvm_cbe_tmp89; -llvm_cbe_bb42: - llvm_cbe_tmp44 = &llvm_cbe_tmp5[((unsigned int )2)]; - llvm_cbe_tmp45 = *llvm_cbe_tmp44; - if ((llvm_cbe_tmp45 == ((unsigned char )123))) { - goto llvm_cbe_cond_true49; - } else { - llvm_cbe_braced_0__PHI_TEMPORARY = 1; /* for PHI node */ - llvm_cbe_ptr_0__PHI_TEMPORARY = llvm_cbe_tmp6; /* for PHI node */ - goto llvm_cbe_cond_next108; - } - -llvm_cbe_cond_true49: - llvm_cbe_tmp51 = &llvm_cbe_tmp5[((unsigned int )3)]; - llvm_cbe_tmp76521 = *llvm_cbe_tmp51; - switch (llvm_cbe_tmp76521) { - default: - llvm_cbe_p_3513_0_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb52; -; - case ((unsigned char )0): - llvm_cbe_p_3513_1__PHI_TEMPORARY = llvm_cbe_tmp51; /* for PHI node */ - goto llvm_cbe_bb88; - case ((unsigned char )125): - llvm_cbe_p_3513_1__PHI_TEMPORARY = llvm_cbe_tmp51; /* for PHI node */ - goto llvm_cbe_bb88; - } - do { /* Syntactic loop 'bb52' to make GCC happy */ -llvm_cbe_bb52: - llvm_cbe_p_3513_0_rec = llvm_cbe_p_3513_0_rec__PHI_TEMPORARY; - llvm_cbe_p_3513_0 = &llvm_cbe_tmp5[(llvm_cbe_p_3513_0_rec + ((unsigned int )3))]; - llvm_cbe_tmp54 = *llvm_cbe_p_3513_0; - if ((llvm_cbe_tmp54 == ((unsigned char )45))) { - goto llvm_cbe_cond_next71; - } else { - goto llvm_cbe_cond_true58; - } - -llvm_cbe_cond_next71: - llvm_cbe_tmp73 = &llvm_cbe_tmp5[(llvm_cbe_p_3513_0_rec + ((unsigned int )4))]; - llvm_cbe_tmp76 = *llvm_cbe_tmp73; - llvm_cbe_indvar_next573 = llvm_cbe_p_3513_0_rec + ((unsigned int )1); - switch (llvm_cbe_tmp76) { - default: - llvm_cbe_p_3513_0_rec__PHI_TEMPORARY = llvm_cbe_indvar_next573; /* for PHI node */ - goto llvm_cbe_bb52; -; - case ((unsigned char )0): - llvm_cbe_p_3513_1__PHI_TEMPORARY = llvm_cbe_tmp73; /* for PHI node */ - goto llvm_cbe_bb88; - break; - case ((unsigned char )125): - llvm_cbe_p_3513_1__PHI_TEMPORARY = llvm_cbe_tmp73; /* for PHI node */ - goto llvm_cbe_bb88; - break; - } -llvm_cbe_cond_true58: - llvm_cbe_tmp63 = *(&digitab[(((unsigned int )(unsigned char )llvm_cbe_tmp54))]); - if (((((unsigned char )(llvm_cbe_tmp63 & ((unsigned char )4)))) == ((unsigned char )0))) { - llvm_cbe_p_3513_1__PHI_TEMPORARY = llvm_cbe_p_3513_0; /* for PHI node */ - goto llvm_cbe_bb88; - } else { - goto llvm_cbe_cond_next71; - } - - } while (1); /* end of syntactic loop 'bb52' */ -llvm_cbe_bb88: - llvm_cbe_p_3513_1 = llvm_cbe_p_3513_1__PHI_TEMPORARY; - llvm_cbe_tmp91 = *llvm_cbe_p_3513_1; - switch (llvm_cbe_tmp91) { - default: - llvm_cbe_c_0__PHI_TEMPORARY = ((unsigned int )-26); /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp6; /* for PHI node */ - goto llvm_cbe_cond_next494; -; - case ((unsigned char )0): - llvm_cbe_braced_0__PHI_TEMPORARY = 0; /* for PHI node */ - llvm_cbe_ptr_0__PHI_TEMPORARY = llvm_cbe_tmp44; /* for PHI node */ - goto llvm_cbe_cond_next108; - break; - case ((unsigned char )125): - llvm_cbe_braced_0__PHI_TEMPORARY = 0; /* for PHI node */ - llvm_cbe_ptr_0__PHI_TEMPORARY = llvm_cbe_tmp44; /* for PHI node */ - goto llvm_cbe_cond_next108; - break; - } -llvm_cbe_cond_next108: - llvm_cbe_braced_0 = llvm_cbe_braced_0__PHI_TEMPORARY; - llvm_cbe_ptr_0 = llvm_cbe_ptr_0__PHI_TEMPORARY; - llvm_cbe_tmp110 = &llvm_cbe_ptr_0[((unsigned int )1)]; - llvm_cbe_tmp111 = *llvm_cbe_tmp110; - llvm_cbe_ptr_4_ph = (((llvm_cbe_tmp111 == ((unsigned char )45))) ? (llvm_cbe_tmp110) : (llvm_cbe_ptr_0)); - llvm_cbe_tmp133546 = *(&llvm_cbe_ptr_4_ph[((unsigned int )1)]); - llvm_cbe_tmp136549 = *(&digitab[(((unsigned int )(unsigned char )llvm_cbe_tmp133546))]); - if (((((unsigned char )(llvm_cbe_tmp136549 & ((unsigned char )4)))) == ((unsigned char )0))) { - llvm_cbe_ptr_4_lcssa__PHI_TEMPORARY = llvm_cbe_ptr_4_ph; /* for PHI node */ - llvm_cbe_c_2_lcssa__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb142; - } else { - llvm_cbe_ptr_4544_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_c_2543__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb120; - } - - do { /* Syntactic loop 'bb120' to make GCC happy */ -llvm_cbe_bb120: - llvm_cbe_ptr_4544_rec = llvm_cbe_ptr_4544_rec__PHI_TEMPORARY; - llvm_cbe_c_2543 = llvm_cbe_c_2543__PHI_TEMPORARY; - llvm_cbe_tmp124_rec = llvm_cbe_ptr_4544_rec + ((unsigned int )1); - llvm_cbe_tmp124 = &llvm_cbe_ptr_4_ph[llvm_cbe_tmp124_rec]; - llvm_cbe_tmp126 = *llvm_cbe_tmp124; - llvm_cbe_tmp129 = ((llvm_cbe_c_2543 * ((unsigned int )10)) + ((unsigned int )-48)) + (((unsigned int )(unsigned char )llvm_cbe_tmp126)); - llvm_cbe_tmp133 = *(&llvm_cbe_ptr_4_ph[(llvm_cbe_ptr_4544_rec + ((unsigned int )2))]); - llvm_cbe_tmp136 = *(&digitab[(((unsigned int )(unsigned char )llvm_cbe_tmp133))]); - if (((((unsigned char )(llvm_cbe_tmp136 & ((unsigned char )4)))) == ((unsigned char )0))) { - llvm_cbe_ptr_4_lcssa__PHI_TEMPORARY = llvm_cbe_tmp124; /* for PHI node */ - llvm_cbe_c_2_lcssa__PHI_TEMPORARY = llvm_cbe_tmp129; /* for PHI node */ - goto llvm_cbe_bb142; - } else { - llvm_cbe_ptr_4544_rec__PHI_TEMPORARY = llvm_cbe_tmp124_rec; /* for PHI node */ - llvm_cbe_c_2543__PHI_TEMPORARY = llvm_cbe_tmp129; /* for PHI node */ - goto llvm_cbe_bb120; - } - - } while (1); /* end of syntactic loop 'bb120' */ -llvm_cbe_bb142: - llvm_cbe_ptr_4_lcssa = llvm_cbe_ptr_4_lcssa__PHI_TEMPORARY; - llvm_cbe_c_2_lcssa = llvm_cbe_c_2_lcssa__PHI_TEMPORARY; - if ((llvm_cbe_c_2_lcssa == ((unsigned int )0))) { - goto llvm_cbe_bb162; - } else { - goto llvm_cbe_cond_next148; - } - -llvm_cbe_cond_next148: - if (llvm_cbe_braced_0) { - llvm_cbe_ptr_6__PHI_TEMPORARY = llvm_cbe_ptr_4_lcssa; /* for PHI node */ - goto llvm_cbe_bb165; - } else { - goto llvm_cbe_cond_next154; - } - -llvm_cbe_cond_next154: - llvm_cbe_tmp156 = &llvm_cbe_ptr_4_lcssa[((unsigned int )1)]; - llvm_cbe_tmp158 = *llvm_cbe_tmp156; - if ((llvm_cbe_tmp158 == ((unsigned char )125))) { - llvm_cbe_ptr_6__PHI_TEMPORARY = llvm_cbe_tmp156; /* for PHI node */ - goto llvm_cbe_bb165; - } else { - goto llvm_cbe_bb162; - } - -llvm_cbe_bb162: - *llvm_cbe_errorcodeptr = ((unsigned int )57); - return ((unsigned int )0); -llvm_cbe_bb165: - llvm_cbe_ptr_6 = llvm_cbe_ptr_6__PHI_TEMPORARY; - if ((llvm_cbe_tmp111 == ((unsigned char )45))) { - goto llvm_cbe_cond_true170; - } else { - goto llvm_cbe_cond_next184; - } - -llvm_cbe_cond_true170: - if ((((signed int )llvm_cbe_c_2_lcssa) > ((signed int )llvm_cbe_bracount))) { - goto llvm_cbe_cond_true176; - } else { - goto llvm_cbe_cond_next179; - } - -llvm_cbe_cond_true176: - *llvm_cbe_errorcodeptr = ((unsigned int )15); - return ((unsigned int )0); -llvm_cbe_cond_next179: - *llvm_cbe_ptrptr = llvm_cbe_ptr_6; - return ((((unsigned int )-28) - llvm_cbe_bracount) + llvm_cbe_c_2_lcssa); -llvm_cbe_cond_next184: - *llvm_cbe_ptrptr = llvm_cbe_ptr_6; - return (((unsigned int )-27) - llvm_cbe_c_2_lcssa); -llvm_cbe_bb195: - if ((llvm_cbe_isclass == ((unsigned int )0))) { - goto llvm_cbe_bb214_preheader; - } else { - goto llvm_cbe_cond_next244; - } - -llvm_cbe_bb214_preheader: - llvm_cbe_tmp217557 = *(&llvm_cbe_tmp5[((unsigned int )2)]); - llvm_cbe_tmp220560 = *(&digitab[(((unsigned int )(unsigned char )llvm_cbe_tmp217557))]); - if (((((unsigned char )(llvm_cbe_tmp220560 & ((unsigned char )4)))) == ((unsigned char )0))) { - llvm_cbe_c_6_lcssa__PHI_TEMPORARY = llvm_cbe_tmp19; /* for PHI node */ - llvm_cbe_ptr_7_lcssa__PHI_TEMPORARY = llvm_cbe_tmp6; /* for PHI node */ - llvm_cbe_c_6_in_lcssa__PHI_TEMPORARY = llvm_cbe_tmp89; /* for PHI node */ - goto llvm_cbe_bb226; - } else { - llvm_cbe_ptr_7553_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_c_6555__PHI_TEMPORARY = llvm_cbe_tmp19; /* for PHI node */ - goto llvm_cbe_bb204; - } - - do { /* Syntactic loop 'bb204' to make GCC happy */ -llvm_cbe_bb204: - llvm_cbe_ptr_7553_rec = llvm_cbe_ptr_7553_rec__PHI_TEMPORARY; - llvm_cbe_c_6555 = llvm_cbe_c_6555__PHI_TEMPORARY; - llvm_cbe_tmp208 = &llvm_cbe_tmp5[(llvm_cbe_ptr_7553_rec + ((unsigned int )2))]; - llvm_cbe_tmp210 = *llvm_cbe_tmp208; - llvm_cbe_tmp212 = (((unsigned int )(unsigned char )llvm_cbe_tmp210)) + (llvm_cbe_c_6555 * ((unsigned int )10)); - llvm_cbe_c_6 = llvm_cbe_tmp212 + ((unsigned int )-48); - llvm_cbe_tmp217 = *(&llvm_cbe_tmp5[(llvm_cbe_ptr_7553_rec + ((unsigned int )3))]); - llvm_cbe_tmp220 = *(&digitab[(((unsigned int )(unsigned char )llvm_cbe_tmp217))]); - if (((((unsigned char )(llvm_cbe_tmp220 & ((unsigned char )4)))) == ((unsigned char )0))) { - llvm_cbe_c_6_lcssa__PHI_TEMPORARY = llvm_cbe_c_6; /* for PHI node */ - llvm_cbe_ptr_7_lcssa__PHI_TEMPORARY = llvm_cbe_tmp208; /* for PHI node */ - llvm_cbe_c_6_in_lcssa__PHI_TEMPORARY = llvm_cbe_tmp212; /* for PHI node */ - goto llvm_cbe_bb226; - } else { - llvm_cbe_ptr_7553_rec__PHI_TEMPORARY = (llvm_cbe_ptr_7553_rec + ((unsigned int )1)); /* for PHI node */ - llvm_cbe_c_6555__PHI_TEMPORARY = llvm_cbe_c_6; /* for PHI node */ - goto llvm_cbe_bb204; - } - - } while (1); /* end of syntactic loop 'bb204' */ -llvm_cbe_bb226: - llvm_cbe_c_6_lcssa = llvm_cbe_c_6_lcssa__PHI_TEMPORARY; - llvm_cbe_ptr_7_lcssa = llvm_cbe_ptr_7_lcssa__PHI_TEMPORARY; - llvm_cbe_c_6_in_lcssa = llvm_cbe_c_6_in_lcssa__PHI_TEMPORARY; - if (((((signed int )llvm_cbe_c_6_lcssa) < ((signed int )((unsigned int )10))) | (((signed int )llvm_cbe_c_6_lcssa) <= ((signed int )llvm_cbe_bracount)))) { - goto llvm_cbe_cond_true239; - } else { - goto llvm_cbe_cond_next244; - } - -llvm_cbe_cond_true239: - *llvm_cbe_ptrptr = llvm_cbe_ptr_7_lcssa; - return (((unsigned int )21) - llvm_cbe_c_6_in_lcssa); -llvm_cbe_cond_next244: - if ((((signed int )llvm_cbe_tmp89) > ((signed int )((unsigned int )55)))) { - llvm_cbe_c_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp5; /* for PHI node */ - goto llvm_cbe_cond_next494; - } else { - llvm_cbe_ptr_10_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_c_7_in__PHI_TEMPORARY = llvm_cbe_tmp89; /* for PHI node */ - goto llvm_cbe_bb269; - } - - do { /* Syntactic loop 'bb269' to make GCC happy */ -llvm_cbe_bb269: - llvm_cbe_ptr_10_rec = llvm_cbe_ptr_10_rec__PHI_TEMPORARY; - llvm_cbe_c_7_in = llvm_cbe_c_7_in__PHI_TEMPORARY; - llvm_cbe_tmp13_sum577 = llvm_cbe_ptr_10_rec + ((unsigned int )1); - llvm_cbe_c_7 = llvm_cbe_c_7_in + ((unsigned int )-48); - if ((((signed int )(llvm_cbe_ptr_10_rec + llvm_cbe_tmp2728)) < ((signed int )((unsigned int )2)))) { - goto llvm_cbe_cond_next279; - } else { - goto llvm_cbe_bb294; - } - -llvm_cbe_bb259: - llvm_cbe_tmp267 = (((unsigned int )(unsigned char )llvm_cbe_tmp282)) + (llvm_cbe_c_7 << ((unsigned int )3)); - llvm_cbe_ptr_10_rec__PHI_TEMPORARY = llvm_cbe_tmp13_sum577; /* for PHI node */ - llvm_cbe_c_7_in__PHI_TEMPORARY = llvm_cbe_tmp267; /* for PHI node */ - goto llvm_cbe_bb269; - -llvm_cbe_cond_next279: - llvm_cbe_tmp282 = *(&llvm_cbe_tmp5[(llvm_cbe_ptr_10_rec + ((unsigned int )2))]); - if ((((unsigned char )(((unsigned char )(llvm_cbe_tmp282 + ((unsigned char )-48))))) < ((unsigned char )((unsigned char )8)))) { - goto llvm_cbe_bb259; - } else { - goto llvm_cbe_bb294; - } - - } while (1); /* end of syntactic loop 'bb269' */ -llvm_cbe_bb294: - llvm_cbe_ptr_10 = &llvm_cbe_tmp5[llvm_cbe_tmp13_sum577]; - if (((((signed int )llvm_cbe_c_7) > ((signed int )((unsigned int )255))) & (llvm_cbe_tmp3 == ((unsigned int )0)))) { - goto llvm_cbe_cond_true306; - } else { - llvm_cbe_c_0__PHI_TEMPORARY = llvm_cbe_c_7; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_ptr_10; /* for PHI node */ - goto llvm_cbe_cond_next494; - } - -llvm_cbe_cond_true306: - *llvm_cbe_errorcodeptr = ((unsigned int )51); - *llvm_cbe_ptrptr = llvm_cbe_ptr_10; - return llvm_cbe_c_7; -llvm_cbe_bb309: - llvm_cbe_tmp312 = *(&llvm_cbe_tmp5[((unsigned int )2)]); - if ((llvm_cbe_tmp312 == ((unsigned char )123))) { - goto llvm_cbe_cond_true316; - } else { - llvm_cbe_ptr_11_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_c_10__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb431; - } - -llvm_cbe_cond_true316: - llvm_cbe_tmp318 = &llvm_cbe_tmp5[((unsigned int )3)]; - llvm_cbe_count_3_ph__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_pt_3_ph__PHI_TEMPORARY = llvm_cbe_tmp318; /* for PHI node */ - llvm_cbe_c_9_ph__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb361_outer; - - do { /* Syntactic loop 'bb361.outer' to make GCC happy */ -llvm_cbe_bb361_outer: - llvm_cbe_count_3_ph = llvm_cbe_count_3_ph__PHI_TEMPORARY; - llvm_cbe_pt_3_ph = llvm_cbe_pt_3_ph__PHI_TEMPORARY; - llvm_cbe_c_9_ph = llvm_cbe_c_9_ph__PHI_TEMPORARY; - if ((llvm_cbe_c_9_ph == ((unsigned int )0))) { - llvm_cbe_pt_3_us_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb361_us; - } else { - goto llvm_cbe_bb361; - } - -llvm_cbe_cond_next337_split: - llvm_cbe_tmp324_lcssa_us_lcssa = llvm_cbe_tmp324_lcssa_us_lcssa__PHI_TEMPORARY; - llvm_cbe_tmp321322_lcssa_us_lcssa_in = llvm_cbe_tmp321322_lcssa_us_lcssa_in__PHI_TEMPORARY; - llvm_cbe_tmp321322_lcssa_us_lcssa = ((unsigned int )(unsigned char )llvm_cbe_tmp321322_lcssa_us_lcssa_in); - llvm_cbe_cc_4 = ((((((signed int )llvm_cbe_tmp321322_lcssa_us_lcssa) > ((signed int )((unsigned int )96)))) ? (((unsigned int )-32)) : (((unsigned int )0)))) + llvm_cbe_tmp321322_lcssa_us_lcssa; - llvm_cbe_tmp360 = (llvm_cbe_cc_4 + (llvm_cbe_c_9_ph << ((unsigned int )4))) - ((((((signed int )llvm_cbe_cc_4) < ((signed int )((unsigned int )65)))) ? (((unsigned int )48)) : (((unsigned int )55)))); - llvm_cbe_indvar_next571 = llvm_cbe_count_3_ph + ((unsigned int )1); - llvm_cbe_count_3_ph__PHI_TEMPORARY = llvm_cbe_indvar_next571; /* for PHI node */ - llvm_cbe_pt_3_ph__PHI_TEMPORARY = llvm_cbe_tmp324_lcssa_us_lcssa; /* for PHI node */ - llvm_cbe_c_9_ph__PHI_TEMPORARY = llvm_cbe_tmp360; /* for PHI node */ - goto llvm_cbe_bb361_outer; - -llvm_cbe_bb319: - llvm_cbe_tmp324 = &llvm_cbe_pt_3_ph[((unsigned int )1)]; - llvm_cbe_tmp324_lcssa_us_lcssa__PHI_TEMPORARY = llvm_cbe_tmp324; /* for PHI node */ - llvm_cbe_tmp321322_lcssa_us_lcssa_in__PHI_TEMPORARY = llvm_cbe_tmp363; /* for PHI node */ - goto llvm_cbe_cond_next337_split; - -llvm_cbe_bb361: - llvm_cbe_tmp363 = *llvm_cbe_pt_3_ph; - llvm_cbe_tmp366 = *(&digitab[(((unsigned int )(unsigned char )llvm_cbe_tmp363))]); - if (((((unsigned char )(llvm_cbe_tmp366 & ((unsigned char )8)))) == ((unsigned char )0))) { - llvm_cbe_tmp321_lcssa_us_lcssa__PHI_TEMPORARY = llvm_cbe_tmp363; /* for PHI node */ - llvm_cbe_pt_3_lcssa_us_lcssa__PHI_TEMPORARY = llvm_cbe_pt_3_ph; /* for PHI node */ - goto llvm_cbe_bb372_split; - } else { - goto llvm_cbe_bb319; - } - -llvm_cbe_cond_next337_split_loopexit: - llvm_cbe_tmp324_us = &llvm_cbe_pt_3_ph[llvm_cbe_tmp324_us_rec]; - llvm_cbe_tmp324_lcssa_us_lcssa__PHI_TEMPORARY = llvm_cbe_tmp324_us; /* for PHI node */ - llvm_cbe_tmp321322_lcssa_us_lcssa_in__PHI_TEMPORARY = llvm_cbe_tmp363_us; /* for PHI node */ - goto llvm_cbe_cond_next337_split; - - do { /* Syntactic loop 'bb361.us' to make GCC happy */ -llvm_cbe_bb361_us: - llvm_cbe_pt_3_us_rec = llvm_cbe_pt_3_us_rec__PHI_TEMPORARY; - llvm_cbe_pt_3_us = &llvm_cbe_pt_3_ph[llvm_cbe_pt_3_us_rec]; - llvm_cbe_tmp363_us = *llvm_cbe_pt_3_us; - llvm_cbe_tmp366_us = *(&digitab[(((unsigned int )(unsigned char )llvm_cbe_tmp363_us))]); - if (((((unsigned char )(llvm_cbe_tmp366_us & ((unsigned char )8)))) == ((unsigned char )0))) { - llvm_cbe_tmp321_lcssa_us_lcssa__PHI_TEMPORARY = llvm_cbe_tmp363_us; /* for PHI node */ - llvm_cbe_pt_3_lcssa_us_lcssa__PHI_TEMPORARY = llvm_cbe_pt_3_us; /* for PHI node */ - goto llvm_cbe_bb372_split; - } else { - goto llvm_cbe_bb319_us; - } - -llvm_cbe_bb319_us: - llvm_cbe_tmp324_us_rec = llvm_cbe_pt_3_us_rec + ((unsigned int )1); - if ((llvm_cbe_tmp363_us == ((unsigned char )48))) { - llvm_cbe_pt_3_us_rec__PHI_TEMPORARY = llvm_cbe_tmp324_us_rec; /* for PHI node */ - goto llvm_cbe_bb361_us; - } else { - goto llvm_cbe_cond_next337_split_loopexit; - } - - } while (1); /* end of syntactic loop 'bb361.us' */ - } while (1); /* end of syntactic loop 'bb361.outer' */ -llvm_cbe_bb372_split: - llvm_cbe_tmp321_lcssa_us_lcssa = llvm_cbe_tmp321_lcssa_us_lcssa__PHI_TEMPORARY; - llvm_cbe_pt_3_lcssa_us_lcssa = llvm_cbe_pt_3_lcssa_us_lcssa__PHI_TEMPORARY; - if ((llvm_cbe_tmp321_lcssa_us_lcssa == ((unsigned char )125))) { - goto llvm_cbe_cond_true378; - } else { - llvm_cbe_ptr_11_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_c_10__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb431; - } - -llvm_cbe_cond_true378: - if ((((signed int )llvm_cbe_c_9_ph) < ((signed int )((unsigned int )0)))) { - goto llvm_cbe_bb397; - } else { - goto llvm_cbe_cond_next384; - } - -llvm_cbe_cond_next384: - if ((((signed int )((((llvm_cbe_tmp3 == ((unsigned int )0))) ? (((unsigned int )2)) : (((unsigned int )8))))) < ((signed int )llvm_cbe_count_3_ph))) { - goto llvm_cbe_bb397; - } else { - llvm_cbe_c_0__PHI_TEMPORARY = llvm_cbe_c_9_ph; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_pt_3_lcssa_us_lcssa; /* for PHI node */ - goto llvm_cbe_cond_next494; - } - -llvm_cbe_bb397: - *llvm_cbe_errorcodeptr = ((unsigned int )34); - *llvm_cbe_ptrptr = llvm_cbe_pt_3_lcssa_us_lcssa; - return llvm_cbe_c_9_ph; - do { /* Syntactic loop 'bb431' to make GCC happy */ -llvm_cbe_bb431: - llvm_cbe_ptr_11_rec = llvm_cbe_ptr_11_rec__PHI_TEMPORARY; - llvm_cbe_c_10 = llvm_cbe_c_10__PHI_TEMPORARY; - llvm_cbe_tmp13_sum581 = llvm_cbe_ptr_11_rec + ((unsigned int )1); - if ((((signed int )(llvm_cbe_ptr_11_rec + llvm_cbe_tmp2728)) < ((signed int )((unsigned int )2)))) { - goto llvm_cbe_cond_next441; - } else { - goto llvm_cbe_cond_next494_loopexit; - } - -llvm_cbe_bb403: - llvm_cbe_cc404_3 = ((((((signed int )llvm_cbe_tmp444445) > ((signed int )((unsigned int )96)))) ? (((unsigned int )-32)) : (((unsigned int )0)))) + llvm_cbe_tmp444445; - llvm_cbe_tmp430 = (llvm_cbe_cc404_3 + (llvm_cbe_c_10 << ((unsigned int )4))) - ((((((signed int )llvm_cbe_cc404_3) < ((signed int )((unsigned int )65)))) ? (((unsigned int )48)) : (((unsigned int )55)))); - llvm_cbe_ptr_11_rec__PHI_TEMPORARY = llvm_cbe_tmp13_sum581; /* for PHI node */ - llvm_cbe_c_10__PHI_TEMPORARY = llvm_cbe_tmp430; /* for PHI node */ - goto llvm_cbe_bb431; - -llvm_cbe_cond_next441: - llvm_cbe_tmp444 = *(&llvm_cbe_tmp5[(llvm_cbe_ptr_11_rec + ((unsigned int )2))]); - llvm_cbe_tmp444445 = ((unsigned int )(unsigned char )llvm_cbe_tmp444); - llvm_cbe_tmp447 = *(&digitab[llvm_cbe_tmp444445]); - if (((((unsigned char )(llvm_cbe_tmp447 & ((unsigned char )8)))) == ((unsigned char )0))) { - goto llvm_cbe_cond_next494_loopexit; - } else { - goto llvm_cbe_bb403; - } - - } while (1); /* end of syntactic loop 'bb431' */ -llvm_cbe_bb454: - llvm_cbe_tmp456 = &llvm_cbe_tmp5[((unsigned int )2)]; - llvm_cbe_tmp458 = *llvm_cbe_tmp456; - llvm_cbe_tmp458459 = ((unsigned int )(unsigned char )llvm_cbe_tmp458); - if ((llvm_cbe_tmp458 == ((unsigned char )0))) { - goto llvm_cbe_cond_true464; - } else { - goto llvm_cbe_cond_next467; - } - -llvm_cbe_cond_true464: - *llvm_cbe_errorcodeptr = ((unsigned int )2); - return ((unsigned int )0); -llvm_cbe_cond_next467: - *llvm_cbe_ptrptr = llvm_cbe_tmp456; - return ((((((((unsigned int )(llvm_cbe_tmp458459 + ((unsigned int )-97))) < ((unsigned int )((unsigned int )26)))) ? (((unsigned int )-32)) : (((unsigned int )0)))) + llvm_cbe_tmp458459) ^ ((unsigned int )64)); -llvm_cbe_bb479: - if (((llvm_cbe_options & ((unsigned int )64)) == ((unsigned int )0))) { - llvm_cbe_c_0__PHI_TEMPORARY = llvm_cbe_tmp89; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp6; /* for PHI node */ - goto llvm_cbe_cond_next494; - } else { - goto llvm_cbe_cond_true485; - } - -llvm_cbe_cond_true485: - *llvm_cbe_errorcodeptr = ((unsigned int )3); - *llvm_cbe_ptrptr = llvm_cbe_tmp6; - return llvm_cbe_tmp89; -llvm_cbe_cond_next494_loopexit: - llvm_cbe_ptr_11 = &llvm_cbe_tmp5[llvm_cbe_tmp13_sum581]; - llvm_cbe_c_0__PHI_TEMPORARY = llvm_cbe_c_10; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_ptr_11; /* for PHI node */ - goto llvm_cbe_cond_next494; - -llvm_cbe_cond_next494: - llvm_cbe_c_0 = llvm_cbe_c_0__PHI_TEMPORARY; - llvm_cbe_ptr_1 = llvm_cbe_ptr_1__PHI_TEMPORARY; - *llvm_cbe_ptrptr = llvm_cbe_ptr_1; - return llvm_cbe_c_0; -} - - -static unsigned int find_parens(unsigned char *llvm_cbe_ptr, unsigned int llvm_cbe_count, unsigned char *llvm_cbe_name, unsigned int llvm_cbe_lorn, unsigned int llvm_cbe_xmode) { - unsigned char llvm_cbe_tmp334386; - unsigned int llvm_cbe_count_addr_2364_0; - unsigned int llvm_cbe_count_addr_2364_0__PHI_TEMPORARY; - unsigned char *llvm_cbe_ptr_addr_2372_0; - unsigned char *llvm_cbe_ptr_addr_2372_0__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp3; - unsigned char *llvm_cbe_tmp7; - unsigned char llvm_cbe_tmp9; - unsigned char *llvm_cbe_ptr_addr_3; - unsigned char *llvm_cbe_ptr_addr_3__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp25; - unsigned char llvm_cbe_tmp27; - unsigned char *llvm_cbe_tmp49; - unsigned char llvm_cbe_tmp51; - unsigned char *llvm_cbe_tmp74; - unsigned char llvm_cbe_tmp76; - unsigned char *llvm_cbe_ptr_addr_5; - unsigned char *llvm_cbe_ptr_addr_5__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp93; - unsigned char llvm_cbe_tmp95; - unsigned char *llvm_cbe_tmp116; - unsigned char llvm_cbe_tmp118; - unsigned char *llvm_cbe_ptr_addr_4; - unsigned char *llvm_cbe_ptr_addr_4__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp129; - unsigned char llvm_cbe_tmp131; - unsigned int llvm_cbe_ptr_addr_6_rec; - unsigned int llvm_cbe_ptr_addr_6_rec__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp151_rec; - unsigned char *llvm_cbe_tmp151; - unsigned char llvm_cbe_tmp153; - unsigned char llvm_cbe_tmp184; - unsigned int llvm_cbe_tmp190; - unsigned char *llvm_cbe_tmp209; - unsigned char llvm_cbe_tmp211; - unsigned char *llvm_cbe_tmp217; - unsigned char *llvm_cbe_ptr_addr_7; - unsigned char *llvm_cbe_ptr_addr_7__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp220; - unsigned char llvm_cbe_tmp228; - unsigned int llvm_cbe_tmp250; - unsigned char *llvm_cbe_tmp271; - unsigned int llvm_cbe_term_3; - unsigned char llvm_cbe_tmp284395; - unsigned int llvm_cbe_ptr_addr_8388_0_rec; - unsigned int llvm_cbe_ptr_addr_8388_0_rec__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp281; - unsigned char llvm_cbe_tmp284; - unsigned char *llvm_cbe_ptr_addr_8388_1; - unsigned char *llvm_cbe_ptr_addr_8388_1__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp317; - unsigned char *llvm_cbe_ptr_addr_0; - unsigned char *llvm_cbe_ptr_addr_0__PHI_TEMPORARY; - unsigned int llvm_cbe_count_addr_0; - unsigned int llvm_cbe_count_addr_0__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp331; - unsigned char llvm_cbe_tmp334; - unsigned int llvm_cbe_retval_0; - unsigned int llvm_cbe_retval_0__PHI_TEMPORARY; - - llvm_cbe_tmp334386 = *llvm_cbe_ptr; - if ((llvm_cbe_tmp334386 == ((unsigned char )0))) { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_return; - } else { - goto llvm_cbe_bb_preheader; - } - -llvm_cbe_bb_preheader: - llvm_cbe_count_addr_2364_0__PHI_TEMPORARY = llvm_cbe_count; /* for PHI node */ - llvm_cbe_ptr_addr_2372_0__PHI_TEMPORARY = llvm_cbe_ptr; /* for PHI node */ - goto llvm_cbe_bb; - - do { /* Syntactic loop 'bb' to make GCC happy */ -llvm_cbe_bb: - llvm_cbe_count_addr_2364_0 = llvm_cbe_count_addr_2364_0__PHI_TEMPORARY; - llvm_cbe_ptr_addr_2372_0 = llvm_cbe_ptr_addr_2372_0__PHI_TEMPORARY; - llvm_cbe_tmp3 = *llvm_cbe_ptr_addr_2372_0; - switch (llvm_cbe_tmp3) { - default: - goto llvm_cbe_cond_next136; -; - case ((unsigned char )92): - goto llvm_cbe_cond_true; - break; - case ((unsigned char )91): - llvm_cbe_ptr_addr_4__PHI_TEMPORARY = llvm_cbe_ptr_addr_2372_0; /* for PHI node */ - goto llvm_cbe_bb127; - } -llvm_cbe_bb332: - llvm_cbe_ptr_addr_0 = llvm_cbe_ptr_addr_0__PHI_TEMPORARY; - llvm_cbe_count_addr_0 = llvm_cbe_count_addr_0__PHI_TEMPORARY; - llvm_cbe_tmp331 = &llvm_cbe_ptr_addr_0[((unsigned int )1)]; - llvm_cbe_tmp334 = *llvm_cbe_tmp331; - if ((llvm_cbe_tmp334 == ((unsigned char )0))) { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_return; - } else { - llvm_cbe_count_addr_2364_0__PHI_TEMPORARY = llvm_cbe_count_addr_0; /* for PHI node */ - llvm_cbe_ptr_addr_2372_0__PHI_TEMPORARY = llvm_cbe_tmp331; /* for PHI node */ - goto llvm_cbe_bb; - } - -llvm_cbe_cond_true: - llvm_cbe_tmp7 = &llvm_cbe_ptr_addr_2372_0[((unsigned int )1)]; - llvm_cbe_tmp9 = *llvm_cbe_tmp7; - switch (llvm_cbe_tmp9) { - default: - llvm_cbe_ptr_addr_0__PHI_TEMPORARY = llvm_cbe_tmp7; /* for PHI node */ - llvm_cbe_count_addr_0__PHI_TEMPORARY = llvm_cbe_count_addr_2364_0; /* for PHI node */ - goto llvm_cbe_bb332; -; - case ((unsigned char )0): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned char )81): - llvm_cbe_ptr_addr_3__PHI_TEMPORARY = llvm_cbe_tmp7; /* for PHI node */ - goto llvm_cbe_bb23; - break; - } - do { /* Syntactic loop 'bb23' to make GCC happy */ -llvm_cbe_bb23: - llvm_cbe_ptr_addr_3 = llvm_cbe_ptr_addr_3__PHI_TEMPORARY; - llvm_cbe_tmp25 = &llvm_cbe_ptr_addr_3[((unsigned int )1)]; - llvm_cbe_tmp27 = *llvm_cbe_tmp25; - switch (llvm_cbe_tmp27) { - default: - llvm_cbe_ptr_addr_3__PHI_TEMPORARY = llvm_cbe_tmp25; /* for PHI node */ - goto llvm_cbe_bb23; -; - case ((unsigned char )0): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned char )92): - goto llvm_cbe_cond_next47; - break; - } -llvm_cbe_cond_next47: - llvm_cbe_tmp49 = &llvm_cbe_ptr_addr_3[((unsigned int )2)]; - llvm_cbe_tmp51 = *llvm_cbe_tmp49; - if ((llvm_cbe_tmp51 == ((unsigned char )69))) { - llvm_cbe_ptr_addr_0__PHI_TEMPORARY = llvm_cbe_tmp49; /* for PHI node */ - llvm_cbe_count_addr_0__PHI_TEMPORARY = llvm_cbe_count_addr_2364_0; /* for PHI node */ - goto llvm_cbe_bb332; - } else { - llvm_cbe_ptr_addr_3__PHI_TEMPORARY = llvm_cbe_tmp49; /* for PHI node */ - goto llvm_cbe_bb23; - } - - } while (1); /* end of syntactic loop 'bb23' */ - do { /* Syntactic loop 'bb127' to make GCC happy */ -llvm_cbe_bb127: - llvm_cbe_ptr_addr_4 = llvm_cbe_ptr_addr_4__PHI_TEMPORARY; - llvm_cbe_tmp129 = &llvm_cbe_ptr_addr_4[((unsigned int )1)]; - llvm_cbe_tmp131 = *llvm_cbe_tmp129; - switch (llvm_cbe_tmp131) { - default: - llvm_cbe_ptr_addr_4__PHI_TEMPORARY = llvm_cbe_tmp129; /* for PHI node */ - goto llvm_cbe_bb127; -; - case ((unsigned char )93): - llvm_cbe_ptr_addr_0__PHI_TEMPORARY = llvm_cbe_tmp129; /* for PHI node */ - llvm_cbe_count_addr_0__PHI_TEMPORARY = llvm_cbe_count_addr_2364_0; /* for PHI node */ - goto llvm_cbe_bb332; - case ((unsigned char )92): - goto llvm_cbe_cond_true72; - } -llvm_cbe_cond_true72: - llvm_cbe_tmp74 = &llvm_cbe_ptr_addr_4[((unsigned int )2)]; - llvm_cbe_tmp76 = *llvm_cbe_tmp74; - switch (llvm_cbe_tmp76) { - default: - llvm_cbe_ptr_addr_4__PHI_TEMPORARY = llvm_cbe_tmp74; /* for PHI node */ - goto llvm_cbe_bb127; -; - case ((unsigned char )0): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned char )81): - llvm_cbe_ptr_addr_5__PHI_TEMPORARY = llvm_cbe_tmp74; /* for PHI node */ - goto llvm_cbe_bb91; - break; - } - do { /* Syntactic loop 'bb91' to make GCC happy */ -llvm_cbe_bb91: - llvm_cbe_ptr_addr_5 = llvm_cbe_ptr_addr_5__PHI_TEMPORARY; - llvm_cbe_tmp93 = &llvm_cbe_ptr_addr_5[((unsigned int )1)]; - llvm_cbe_tmp95 = *llvm_cbe_tmp93; - switch (llvm_cbe_tmp95) { - default: - llvm_cbe_ptr_addr_5__PHI_TEMPORARY = llvm_cbe_tmp93; /* for PHI node */ - goto llvm_cbe_bb91; -; - case ((unsigned char )0): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned char )92): - goto llvm_cbe_cond_next114; - break; - } -llvm_cbe_cond_next114: - llvm_cbe_tmp116 = &llvm_cbe_ptr_addr_5[((unsigned int )2)]; - llvm_cbe_tmp118 = *llvm_cbe_tmp116; - if ((llvm_cbe_tmp118 == ((unsigned char )69))) { - llvm_cbe_ptr_addr_4__PHI_TEMPORARY = llvm_cbe_tmp116; /* for PHI node */ - goto llvm_cbe_bb127; - } else { - llvm_cbe_ptr_addr_5__PHI_TEMPORARY = llvm_cbe_tmp116; /* for PHI node */ - goto llvm_cbe_bb91; - } - - } while (1); /* end of syntactic loop 'bb91' */ - } while (1); /* end of syntactic loop 'bb127' */ - do { /* Syntactic loop 'bb149' to make GCC happy */ -llvm_cbe_bb149: - llvm_cbe_ptr_addr_6_rec = llvm_cbe_ptr_addr_6_rec__PHI_TEMPORARY; - llvm_cbe_tmp151_rec = llvm_cbe_ptr_addr_6_rec + ((unsigned int )1); - llvm_cbe_tmp151 = &llvm_cbe_ptr_addr_2372_0[llvm_cbe_tmp151_rec]; - llvm_cbe_tmp153 = *llvm_cbe_tmp151; - switch (llvm_cbe_tmp153) { - default: - llvm_cbe_ptr_addr_6_rec__PHI_TEMPORARY = llvm_cbe_tmp151_rec; /* for PHI node */ - goto llvm_cbe_bb149; -; - case ((unsigned char )0): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned char )10): - llvm_cbe_ptr_addr_0__PHI_TEMPORARY = llvm_cbe_tmp151; /* for PHI node */ - llvm_cbe_count_addr_0__PHI_TEMPORARY = llvm_cbe_count_addr_2364_0; /* for PHI node */ - goto llvm_cbe_bb332; - } - } while (1); /* end of syntactic loop 'bb149' */ -llvm_cbe_cond_next136: - if (((llvm_cbe_tmp3 == ((unsigned char )35)) & (llvm_cbe_xmode != ((unsigned int )0)))) { - llvm_cbe_ptr_addr_6_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb149; - } else { - goto llvm_cbe_cond_next174; - } - -llvm_cbe_cond_next174: - if ((llvm_cbe_tmp3 == ((unsigned char )40))) { - goto llvm_cbe_cond_next181; - } else { - llvm_cbe_ptr_addr_0__PHI_TEMPORARY = llvm_cbe_ptr_addr_2372_0; /* for PHI node */ - llvm_cbe_count_addr_0__PHI_TEMPORARY = llvm_cbe_count_addr_2364_0; /* for PHI node */ - goto llvm_cbe_bb332; - } - -llvm_cbe_cond_true188: - llvm_cbe_tmp190 = llvm_cbe_count_addr_2364_0 + ((unsigned int )1); - if (((llvm_cbe_tmp190 == llvm_cbe_lorn) & (llvm_cbe_name == ((unsigned char *)/*NULL*/0)))) { - llvm_cbe_retval_0__PHI_TEMPORARY = llvm_cbe_tmp190; /* for PHI node */ - goto llvm_cbe_return; - } else { - llvm_cbe_ptr_addr_0__PHI_TEMPORARY = llvm_cbe_ptr_addr_2372_0; /* for PHI node */ - llvm_cbe_count_addr_0__PHI_TEMPORARY = llvm_cbe_tmp190; /* for PHI node */ - goto llvm_cbe_bb332; - } - -llvm_cbe_cond_next181: - llvm_cbe_tmp184 = *(&llvm_cbe_ptr_addr_2372_0[((unsigned int )1)]); - if ((llvm_cbe_tmp184 == ((unsigned char )63))) { - goto llvm_cbe_cond_next207; - } else { - goto llvm_cbe_cond_true188; - } - -llvm_cbe_bb240: - if ((llvm_cbe_tmp220 == ((unsigned char )39))) { - goto llvm_cbe_bb248; - } else { - llvm_cbe_ptr_addr_0__PHI_TEMPORARY = llvm_cbe_ptr_addr_7; /* for PHI node */ - llvm_cbe_count_addr_0__PHI_TEMPORARY = llvm_cbe_count_addr_2364_0; /* for PHI node */ - goto llvm_cbe_bb332; - } - -llvm_cbe_cond_next218: - llvm_cbe_ptr_addr_7 = llvm_cbe_ptr_addr_7__PHI_TEMPORARY; - llvm_cbe_tmp220 = *llvm_cbe_ptr_addr_7; - if ((llvm_cbe_tmp220 == ((unsigned char )60))) { - goto llvm_cbe_cond_next225; - } else { - goto llvm_cbe_bb240; - } - -llvm_cbe_cond_next207: - llvm_cbe_tmp209 = &llvm_cbe_ptr_addr_2372_0[((unsigned int )2)]; - llvm_cbe_tmp211 = *llvm_cbe_tmp209; - if ((llvm_cbe_tmp211 == ((unsigned char )80))) { - goto llvm_cbe_cond_true215; - } else { - llvm_cbe_ptr_addr_7__PHI_TEMPORARY = llvm_cbe_tmp209; /* for PHI node */ - goto llvm_cbe_cond_next218; - } - -llvm_cbe_cond_true215: - llvm_cbe_tmp217 = &llvm_cbe_ptr_addr_2372_0[((unsigned int )3)]; - llvm_cbe_ptr_addr_7__PHI_TEMPORARY = llvm_cbe_tmp217; /* for PHI node */ - goto llvm_cbe_cond_next218; - -llvm_cbe_cond_next225: - llvm_cbe_tmp228 = *(&llvm_cbe_ptr_addr_7[((unsigned int )1)]); - switch (llvm_cbe_tmp228) { - default: - goto llvm_cbe_bb248; -; - case ((unsigned char )33): - goto llvm_cbe_bb240; - break; - case ((unsigned char )61): - goto llvm_cbe_bb240; - break; - } -llvm_cbe_bb290: - llvm_cbe_ptr_addr_8388_1 = llvm_cbe_ptr_addr_8388_1__PHI_TEMPORARY; - if ((llvm_cbe_name == ((unsigned char *)/*NULL*/0))) { - llvm_cbe_ptr_addr_0__PHI_TEMPORARY = llvm_cbe_ptr_addr_8388_1; /* for PHI node */ - llvm_cbe_count_addr_0__PHI_TEMPORARY = llvm_cbe_tmp250; /* for PHI node */ - goto llvm_cbe_bb332; - } else { - goto llvm_cbe_cond_true295; - } - -llvm_cbe_cond_next266: - llvm_cbe_tmp271 = &llvm_cbe_ptr_addr_7[((unsigned int )1)]; - llvm_cbe_term_3 = (((llvm_cbe_tmp220 == ((unsigned char )60))) ? (((unsigned int )62)) : ((((unsigned int )(unsigned char )llvm_cbe_tmp220)))); - llvm_cbe_tmp284395 = *llvm_cbe_tmp271; - if (((((unsigned int )(unsigned char )llvm_cbe_tmp284395)) == llvm_cbe_term_3)) { - llvm_cbe_ptr_addr_8388_1__PHI_TEMPORARY = llvm_cbe_tmp271; /* for PHI node */ - goto llvm_cbe_bb290; - } else { - llvm_cbe_ptr_addr_8388_0_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb279; - } - -llvm_cbe_bb248: - llvm_cbe_tmp250 = llvm_cbe_count_addr_2364_0 + ((unsigned int )1); - if (((llvm_cbe_tmp250 == llvm_cbe_lorn) & (llvm_cbe_name == ((unsigned char *)/*NULL*/0)))) { - llvm_cbe_retval_0__PHI_TEMPORARY = llvm_cbe_tmp250; /* for PHI node */ - goto llvm_cbe_return; - } else { - goto llvm_cbe_cond_next266; - } - - do { /* Syntactic loop 'bb279' to make GCC happy */ -llvm_cbe_bb279: - llvm_cbe_ptr_addr_8388_0_rec = llvm_cbe_ptr_addr_8388_0_rec__PHI_TEMPORARY; - llvm_cbe_tmp281 = &llvm_cbe_ptr_addr_7[(llvm_cbe_ptr_addr_8388_0_rec + ((unsigned int )2))]; - llvm_cbe_tmp284 = *llvm_cbe_tmp281; - if (((((unsigned int )(unsigned char )llvm_cbe_tmp284)) == llvm_cbe_term_3)) { - llvm_cbe_ptr_addr_8388_1__PHI_TEMPORARY = llvm_cbe_tmp281; /* for PHI node */ - goto llvm_cbe_bb290; - } else { - llvm_cbe_ptr_addr_8388_0_rec__PHI_TEMPORARY = (llvm_cbe_ptr_addr_8388_0_rec + ((unsigned int )1)); /* for PHI node */ - goto llvm_cbe_bb279; - } - - } while (1); /* end of syntactic loop 'bb279' */ -llvm_cbe_cond_true295: - if ((((((unsigned int )(unsigned long)llvm_cbe_ptr_addr_8388_1)) - (((unsigned int )(unsigned long)llvm_cbe_tmp271))) == llvm_cbe_lorn)) { - goto llvm_cbe_cond_false; - } else { - llvm_cbe_ptr_addr_0__PHI_TEMPORARY = llvm_cbe_ptr_addr_8388_1; /* for PHI node */ - llvm_cbe_count_addr_0__PHI_TEMPORARY = llvm_cbe_tmp250; /* for PHI node */ - goto llvm_cbe_bb332; - } - -llvm_cbe_cond_false: - llvm_cbe_tmp317 = /*tail*/ strncmp(llvm_cbe_name, llvm_cbe_tmp271, llvm_cbe_lorn); - if ((llvm_cbe_tmp317 == ((unsigned int )0))) { - llvm_cbe_retval_0__PHI_TEMPORARY = llvm_cbe_tmp250; /* for PHI node */ - goto llvm_cbe_return; - } else { - llvm_cbe_ptr_addr_0__PHI_TEMPORARY = llvm_cbe_ptr_addr_8388_1; /* for PHI node */ - llvm_cbe_count_addr_0__PHI_TEMPORARY = llvm_cbe_tmp250; /* for PHI node */ - goto llvm_cbe_bb332; - } - - } while (1); /* end of syntactic loop 'bb' */ -llvm_cbe_return: - llvm_cbe_retval_0 = llvm_cbe_retval_0__PHI_TEMPORARY; - return llvm_cbe_retval_0; -} - - -static unsigned char *first_significant_code(unsigned char *llvm_cbe_code, unsigned int *llvm_cbe_options, unsigned int llvm_cbe_optbit, unsigned int llvm_cbe_skipassert) { - unsigned char llvm_cbe_tmp2; - unsigned char *llvm_cbe_code_addr_099_0_ph; - unsigned char *llvm_cbe_code_addr_099_0_ph__PHI_TEMPORARY; - unsigned char *llvm_cbe_code_addr_099_0_us; - unsigned char *llvm_cbe_code_addr_099_0_us__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp10_us; - unsigned int llvm_cbe_tmp1011_us; - unsigned int llvm_cbe_tmp15_us; - unsigned char *llvm_cbe_tmp30_us; - unsigned char llvm_cbe_tmp2112_us; - unsigned char *llvm_cbe_tmp3098_us; - unsigned char llvm_cbe_tmp2109_us; - unsigned char *llvm_cbe_code_addr_099_0; - unsigned char *llvm_cbe_code_addr_099_0__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp30; - unsigned char llvm_cbe_tmp2112; - unsigned char *llvm_cbe_code_addr_099_1_ph153; - unsigned char *llvm_cbe_code_addr_099_1_ph153__PHI_TEMPORARY; - unsigned char *llvm_cbe_code_addr_099_1_ph; - unsigned char *llvm_cbe_code_addr_099_1_ph__PHI_TEMPORARY; - unsigned int llvm_cbe_code_addr_1_rec; - unsigned int llvm_cbe_code_addr_1_rec__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp45; - unsigned char llvm_cbe_tmp50; - unsigned int llvm_cbe_tmp52; - unsigned int llvm_cbe_tmp54_rec; - unsigned char llvm_cbe_tmp56; - unsigned char llvm_cbe_tmp65; - unsigned char *llvm_cbe_tmp69; - unsigned char llvm_cbe_tmp2115; - unsigned char *llvm_cbe_code_addr_099_2; - unsigned char *llvm_cbe_code_addr_099_2__PHI_TEMPORARY; - unsigned char *llvm_cbe_code_addr_099_3_ph_ph; - unsigned char *llvm_cbe_code_addr_099_3_ph_ph__PHI_TEMPORARY; - unsigned int llvm_cbe_code_addr_099_3_rec; - unsigned int llvm_cbe_code_addr_099_3_rec__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp85; - unsigned char llvm_cbe_tmp88; - unsigned int llvm_cbe_tmp91_rec; - unsigned char *llvm_cbe_tmp91; - unsigned char llvm_cbe_tmp2118; - unsigned char *llvm_cbe_code_addr_099_4; - unsigned char *llvm_cbe_code_addr_099_4__PHI_TEMPORARY; - - llvm_cbe_tmp2 = *llvm_cbe_code; - switch ((((unsigned int )(unsigned char )llvm_cbe_tmp2))) { - default: - llvm_cbe_code_addr_099_4__PHI_TEMPORARY = llvm_cbe_code; /* for PHI node */ - goto llvm_cbe_return; -; - case ((unsigned int )4): - llvm_cbe_code_addr_099_2__PHI_TEMPORARY = llvm_cbe_code; /* for PHI node */ - goto llvm_cbe_bb71; - case ((unsigned int )5): - llvm_cbe_code_addr_099_2__PHI_TEMPORARY = llvm_cbe_code; /* for PHI node */ - goto llvm_cbe_bb71; - case ((unsigned int )24): - llvm_cbe_code_addr_099_0_ph__PHI_TEMPORARY = llvm_cbe_code; /* for PHI node */ - goto llvm_cbe_bb4_preheader; - break; - case ((unsigned int )82): - llvm_cbe_code_addr_099_3_ph_ph__PHI_TEMPORARY = llvm_cbe_code; /* for PHI node */ - llvm_cbe_code_addr_099_3_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb83; - case ((unsigned int )88): - llvm_cbe_code_addr_099_1_ph153__PHI_TEMPORARY = llvm_cbe_code; /* for PHI node */ - goto llvm_cbe_bb33_preheader; - case ((unsigned int )89): - llvm_cbe_code_addr_099_1_ph153__PHI_TEMPORARY = llvm_cbe_code; /* for PHI node */ - goto llvm_cbe_bb33_preheader; - case ((unsigned int )90): - llvm_cbe_code_addr_099_1_ph153__PHI_TEMPORARY = llvm_cbe_code; /* for PHI node */ - goto llvm_cbe_bb33_preheader; - case ((unsigned int )99): - llvm_cbe_code_addr_099_3_ph_ph__PHI_TEMPORARY = llvm_cbe_code; /* for PHI node */ - llvm_cbe_code_addr_099_3_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb83; - case ((unsigned int )100): - llvm_cbe_code_addr_099_3_ph_ph__PHI_TEMPORARY = llvm_cbe_code; /* for PHI node */ - llvm_cbe_code_addr_099_3_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb83; - case ((unsigned int )101): - llvm_cbe_code_addr_099_3_ph_ph__PHI_TEMPORARY = llvm_cbe_code; /* for PHI node */ - llvm_cbe_code_addr_099_3_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb83; - } -llvm_cbe_bb4_preheader: - llvm_cbe_code_addr_099_0_ph = llvm_cbe_code_addr_099_0_ph__PHI_TEMPORARY; - if ((((signed int )llvm_cbe_optbit) > ((signed int )((unsigned int )0)))) { - llvm_cbe_code_addr_099_0_us__PHI_TEMPORARY = llvm_cbe_code_addr_099_0_ph; /* for PHI node */ - goto llvm_cbe_bb4_us; - } else { - llvm_cbe_code_addr_099_0__PHI_TEMPORARY = llvm_cbe_code_addr_099_0_ph; /* for PHI node */ - goto llvm_cbe_cond_next28; - } - - do { /* Syntactic loop 'bb4.us' to make GCC happy */ -llvm_cbe_bb4_us: - llvm_cbe_code_addr_099_0_us = llvm_cbe_code_addr_099_0_us__PHI_TEMPORARY; - llvm_cbe_tmp10_us = *(&llvm_cbe_code_addr_099_0_us[((unsigned int )1)]); - llvm_cbe_tmp1011_us = ((unsigned int )(unsigned char )llvm_cbe_tmp10_us); - llvm_cbe_tmp15_us = *llvm_cbe_options; - if ((((llvm_cbe_tmp1011_us ^ llvm_cbe_tmp15_us) & llvm_cbe_optbit) == ((unsigned int )0))) { - goto llvm_cbe_cond_next28_us; - } else { - goto llvm_cbe_cond_true21_us; - } - -llvm_cbe_cond_next28_us: - llvm_cbe_tmp30_us = &llvm_cbe_code_addr_099_0_us[((unsigned int )2)]; - llvm_cbe_tmp2112_us = *llvm_cbe_tmp30_us; - switch ((((unsigned int )(unsigned char )llvm_cbe_tmp2112_us))) { - default: - llvm_cbe_code_addr_099_4__PHI_TEMPORARY = llvm_cbe_tmp30_us; /* for PHI node */ - goto llvm_cbe_return; -; - case ((unsigned int )4): - llvm_cbe_code_addr_099_2__PHI_TEMPORARY = llvm_cbe_tmp30_us; /* for PHI node */ - goto llvm_cbe_bb71; - case ((unsigned int )5): - llvm_cbe_code_addr_099_2__PHI_TEMPORARY = llvm_cbe_tmp30_us; /* for PHI node */ - goto llvm_cbe_bb71; - case ((unsigned int )24): - llvm_cbe_code_addr_099_0_us__PHI_TEMPORARY = llvm_cbe_tmp30_us; /* for PHI node */ - goto llvm_cbe_bb4_us; - case ((unsigned int )82): - llvm_cbe_code_addr_099_3_ph_ph__PHI_TEMPORARY = llvm_cbe_tmp30_us; /* for PHI node */ - llvm_cbe_code_addr_099_3_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb83; - case ((unsigned int )88): - llvm_cbe_code_addr_099_1_ph153__PHI_TEMPORARY = llvm_cbe_tmp30_us; /* for PHI node */ - goto llvm_cbe_bb33_preheader; - case ((unsigned int )89): - llvm_cbe_code_addr_099_1_ph153__PHI_TEMPORARY = llvm_cbe_tmp30_us; /* for PHI node */ - goto llvm_cbe_bb33_preheader; - case ((unsigned int )90): - llvm_cbe_code_addr_099_1_ph153__PHI_TEMPORARY = llvm_cbe_tmp30_us; /* for PHI node */ - goto llvm_cbe_bb33_preheader; - case ((unsigned int )99): - llvm_cbe_code_addr_099_3_ph_ph__PHI_TEMPORARY = llvm_cbe_tmp30_us; /* for PHI node */ - llvm_cbe_code_addr_099_3_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb83; - case ((unsigned int )100): - llvm_cbe_code_addr_099_3_ph_ph__PHI_TEMPORARY = llvm_cbe_tmp30_us; /* for PHI node */ - llvm_cbe_code_addr_099_3_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb83; - case ((unsigned int )101): - llvm_cbe_code_addr_099_3_ph_ph__PHI_TEMPORARY = llvm_cbe_tmp30_us; /* for PHI node */ - llvm_cbe_code_addr_099_3_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb83; - } -llvm_cbe_cond_true21_us: - *llvm_cbe_options = llvm_cbe_tmp1011_us; - llvm_cbe_tmp3098_us = &llvm_cbe_code_addr_099_0_us[((unsigned int )2)]; - llvm_cbe_tmp2109_us = *llvm_cbe_tmp3098_us; - switch ((((unsigned int )(unsigned char )llvm_cbe_tmp2109_us))) { - default: - llvm_cbe_code_addr_099_4__PHI_TEMPORARY = llvm_cbe_tmp3098_us; /* for PHI node */ - goto llvm_cbe_return; -; - case ((unsigned int )4): - llvm_cbe_code_addr_099_2__PHI_TEMPORARY = llvm_cbe_tmp3098_us; /* for PHI node */ - goto llvm_cbe_bb71; - case ((unsigned int )5): - llvm_cbe_code_addr_099_2__PHI_TEMPORARY = llvm_cbe_tmp3098_us; /* for PHI node */ - goto llvm_cbe_bb71; - case ((unsigned int )24): - llvm_cbe_code_addr_099_0_us__PHI_TEMPORARY = llvm_cbe_tmp3098_us; /* for PHI node */ - goto llvm_cbe_bb4_us; - case ((unsigned int )82): - llvm_cbe_code_addr_099_3_ph_ph__PHI_TEMPORARY = llvm_cbe_tmp3098_us; /* for PHI node */ - llvm_cbe_code_addr_099_3_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb83; - case ((unsigned int )88): - llvm_cbe_code_addr_099_1_ph153__PHI_TEMPORARY = llvm_cbe_tmp3098_us; /* for PHI node */ - goto llvm_cbe_bb33_preheader; - case ((unsigned int )89): - llvm_cbe_code_addr_099_1_ph153__PHI_TEMPORARY = llvm_cbe_tmp3098_us; /* for PHI node */ - goto llvm_cbe_bb33_preheader; - case ((unsigned int )90): - llvm_cbe_code_addr_099_1_ph153__PHI_TEMPORARY = llvm_cbe_tmp3098_us; /* for PHI node */ - goto llvm_cbe_bb33_preheader; - case ((unsigned int )99): - llvm_cbe_code_addr_099_3_ph_ph__PHI_TEMPORARY = llvm_cbe_tmp3098_us; /* for PHI node */ - llvm_cbe_code_addr_099_3_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb83; - case ((unsigned int )100): - llvm_cbe_code_addr_099_3_ph_ph__PHI_TEMPORARY = llvm_cbe_tmp3098_us; /* for PHI node */ - llvm_cbe_code_addr_099_3_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb83; - case ((unsigned int )101): - llvm_cbe_code_addr_099_3_ph_ph__PHI_TEMPORARY = llvm_cbe_tmp3098_us; /* for PHI node */ - llvm_cbe_code_addr_099_3_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb83; - } - } while (1); /* end of syntactic loop 'bb4.us' */ - do { /* Syntactic loop 'cond_next28' to make GCC happy */ -llvm_cbe_cond_next28: - llvm_cbe_code_addr_099_0 = llvm_cbe_code_addr_099_0__PHI_TEMPORARY; - llvm_cbe_tmp30 = &llvm_cbe_code_addr_099_0[((unsigned int )2)]; - llvm_cbe_tmp2112 = *llvm_cbe_tmp30; - switch ((((unsigned int )(unsigned char )llvm_cbe_tmp2112))) { - default: - llvm_cbe_code_addr_099_4__PHI_TEMPORARY = llvm_cbe_tmp30; /* for PHI node */ - goto llvm_cbe_return; -; - case ((unsigned int )4): - llvm_cbe_code_addr_099_2__PHI_TEMPORARY = llvm_cbe_tmp30; /* for PHI node */ - goto llvm_cbe_bb71; - case ((unsigned int )5): - llvm_cbe_code_addr_099_2__PHI_TEMPORARY = llvm_cbe_tmp30; /* for PHI node */ - goto llvm_cbe_bb71; - case ((unsigned int )24): - llvm_cbe_code_addr_099_0__PHI_TEMPORARY = llvm_cbe_tmp30; /* for PHI node */ - goto llvm_cbe_cond_next28; - case ((unsigned int )82): - llvm_cbe_code_addr_099_3_ph_ph__PHI_TEMPORARY = llvm_cbe_tmp30; /* for PHI node */ - llvm_cbe_code_addr_099_3_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb83; - case ((unsigned int )88): - llvm_cbe_code_addr_099_1_ph153__PHI_TEMPORARY = llvm_cbe_tmp30; /* for PHI node */ - goto llvm_cbe_bb33_preheader; - break; - case ((unsigned int )89): - llvm_cbe_code_addr_099_1_ph153__PHI_TEMPORARY = llvm_cbe_tmp30; /* for PHI node */ - goto llvm_cbe_bb33_preheader; - break; - case ((unsigned int )90): - llvm_cbe_code_addr_099_1_ph153__PHI_TEMPORARY = llvm_cbe_tmp30; /* for PHI node */ - goto llvm_cbe_bb33_preheader; - break; - case ((unsigned int )99): - llvm_cbe_code_addr_099_3_ph_ph__PHI_TEMPORARY = llvm_cbe_tmp30; /* for PHI node */ - llvm_cbe_code_addr_099_3_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb83; - case ((unsigned int )100): - llvm_cbe_code_addr_099_3_ph_ph__PHI_TEMPORARY = llvm_cbe_tmp30; /* for PHI node */ - llvm_cbe_code_addr_099_3_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb83; - case ((unsigned int )101): - llvm_cbe_code_addr_099_3_ph_ph__PHI_TEMPORARY = llvm_cbe_tmp30; /* for PHI node */ - llvm_cbe_code_addr_099_3_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb83; - } - } while (1); /* end of syntactic loop 'cond_next28' */ -llvm_cbe_bb33_preheader: - llvm_cbe_code_addr_099_1_ph153 = llvm_cbe_code_addr_099_1_ph153__PHI_TEMPORARY; - if ((llvm_cbe_skipassert == ((unsigned int )0))) { - llvm_cbe_code_addr_099_4__PHI_TEMPORARY = llvm_cbe_code_addr_099_1_ph153; /* for PHI node */ - goto llvm_cbe_return; - } else { - llvm_cbe_code_addr_099_1_ph__PHI_TEMPORARY = llvm_cbe_code_addr_099_1_ph153; /* for PHI node */ - llvm_cbe_code_addr_1_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb42; - } - - do { /* Syntactic loop 'bb42' to make GCC happy */ -llvm_cbe_bb42: - llvm_cbe_code_addr_099_1_ph = llvm_cbe_code_addr_099_1_ph__PHI_TEMPORARY; - llvm_cbe_code_addr_1_rec = llvm_cbe_code_addr_1_rec__PHI_TEMPORARY; - llvm_cbe_tmp45 = *(&llvm_cbe_code_addr_099_1_ph[(llvm_cbe_code_addr_1_rec + ((unsigned int )1))]); - llvm_cbe_tmp50 = *(&llvm_cbe_code_addr_099_1_ph[(llvm_cbe_code_addr_1_rec + ((unsigned int )2))]); - llvm_cbe_tmp52 = ((((unsigned int )(unsigned char )llvm_cbe_tmp45)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp50)); - llvm_cbe_tmp54_rec = llvm_cbe_code_addr_1_rec + llvm_cbe_tmp52; - llvm_cbe_tmp56 = *(&llvm_cbe_code_addr_099_1_ph[llvm_cbe_tmp54_rec]); - if ((llvm_cbe_tmp56 == ((unsigned char )83))) { - llvm_cbe_code_addr_099_1_ph__PHI_TEMPORARY = llvm_cbe_code_addr_099_1_ph; /* for PHI node */ - llvm_cbe_code_addr_1_rec__PHI_TEMPORARY = llvm_cbe_tmp54_rec; /* for PHI node */ - goto llvm_cbe_bb42; - } else { - goto llvm_cbe_bb60; - } - -llvm_cbe_bb60: - llvm_cbe_tmp65 = *(&_pcre_OP_lengths[(((unsigned int )(unsigned char )llvm_cbe_tmp56))]); - llvm_cbe_tmp69 = &llvm_cbe_code_addr_099_1_ph[(llvm_cbe_code_addr_1_rec + ((((unsigned int )(unsigned char )llvm_cbe_tmp65)) + llvm_cbe_tmp52))]; - llvm_cbe_tmp2115 = *llvm_cbe_tmp69; - switch ((((unsigned int )(unsigned char )llvm_cbe_tmp2115))) { - default: - llvm_cbe_code_addr_099_4__PHI_TEMPORARY = llvm_cbe_tmp69; /* for PHI node */ - goto llvm_cbe_return; -; - case ((unsigned int )4): - llvm_cbe_code_addr_099_2__PHI_TEMPORARY = llvm_cbe_tmp69; /* for PHI node */ - goto llvm_cbe_bb71; - break; - case ((unsigned int )5): - llvm_cbe_code_addr_099_2__PHI_TEMPORARY = llvm_cbe_tmp69; /* for PHI node */ - goto llvm_cbe_bb71; - break; - case ((unsigned int )24): - llvm_cbe_code_addr_099_0_ph__PHI_TEMPORARY = llvm_cbe_tmp69; /* for PHI node */ - goto llvm_cbe_bb4_preheader; - case ((unsigned int )82): - llvm_cbe_code_addr_099_3_ph_ph__PHI_TEMPORARY = llvm_cbe_tmp69; /* for PHI node */ - llvm_cbe_code_addr_099_3_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb83; - case ((unsigned int )88): - llvm_cbe_code_addr_099_1_ph__PHI_TEMPORARY = llvm_cbe_tmp69; /* for PHI node */ - llvm_cbe_code_addr_1_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb42; - case ((unsigned int )89): - llvm_cbe_code_addr_099_1_ph__PHI_TEMPORARY = llvm_cbe_tmp69; /* for PHI node */ - llvm_cbe_code_addr_1_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb42; - case ((unsigned int )90): - llvm_cbe_code_addr_099_1_ph__PHI_TEMPORARY = llvm_cbe_tmp69; /* for PHI node */ - llvm_cbe_code_addr_1_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb42; - case ((unsigned int )99): - llvm_cbe_code_addr_099_3_ph_ph__PHI_TEMPORARY = llvm_cbe_tmp69; /* for PHI node */ - llvm_cbe_code_addr_099_3_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb83; - case ((unsigned int )100): - llvm_cbe_code_addr_099_3_ph_ph__PHI_TEMPORARY = llvm_cbe_tmp69; /* for PHI node */ - llvm_cbe_code_addr_099_3_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb83; - case ((unsigned int )101): - llvm_cbe_code_addr_099_3_ph_ph__PHI_TEMPORARY = llvm_cbe_tmp69; /* for PHI node */ - llvm_cbe_code_addr_099_3_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb83; - } - } while (1); /* end of syntactic loop 'bb42' */ -llvm_cbe_bb71: - llvm_cbe_code_addr_099_2 = llvm_cbe_code_addr_099_2__PHI_TEMPORARY; - if ((llvm_cbe_skipassert == ((unsigned int )0))) { - llvm_cbe_code_addr_099_4__PHI_TEMPORARY = llvm_cbe_code_addr_099_2; /* for PHI node */ - goto llvm_cbe_return; - } else { - llvm_cbe_code_addr_099_3_ph_ph__PHI_TEMPORARY = llvm_cbe_code_addr_099_2; /* for PHI node */ - llvm_cbe_code_addr_099_3_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb83; - } - - do { /* Syntactic loop 'bb83' to make GCC happy */ -llvm_cbe_bb83: - llvm_cbe_code_addr_099_3_ph_ph = llvm_cbe_code_addr_099_3_ph_ph__PHI_TEMPORARY; - llvm_cbe_code_addr_099_3_rec = llvm_cbe_code_addr_099_3_rec__PHI_TEMPORARY; - llvm_cbe_tmp85 = *(&llvm_cbe_code_addr_099_3_ph_ph[llvm_cbe_code_addr_099_3_rec]); - llvm_cbe_tmp88 = *(&_pcre_OP_lengths[(((unsigned int )(unsigned char )llvm_cbe_tmp85))]); - llvm_cbe_tmp91_rec = llvm_cbe_code_addr_099_3_rec + (((unsigned int )(unsigned char )llvm_cbe_tmp88)); - llvm_cbe_tmp91 = &llvm_cbe_code_addr_099_3_ph_ph[llvm_cbe_tmp91_rec]; - llvm_cbe_tmp2118 = *llvm_cbe_tmp91; - switch ((((unsigned int )(unsigned char )llvm_cbe_tmp2118))) { - default: - llvm_cbe_code_addr_099_4__PHI_TEMPORARY = llvm_cbe_tmp91; /* for PHI node */ - goto llvm_cbe_return; -; - case ((unsigned int )4): - llvm_cbe_code_addr_099_2__PHI_TEMPORARY = llvm_cbe_tmp91; /* for PHI node */ - goto llvm_cbe_bb71; - case ((unsigned int )5): - llvm_cbe_code_addr_099_2__PHI_TEMPORARY = llvm_cbe_tmp91; /* for PHI node */ - goto llvm_cbe_bb71; - case ((unsigned int )24): - llvm_cbe_code_addr_099_0_ph__PHI_TEMPORARY = llvm_cbe_tmp91; /* for PHI node */ - goto llvm_cbe_bb4_preheader; - case ((unsigned int )82): - llvm_cbe_code_addr_099_3_ph_ph__PHI_TEMPORARY = llvm_cbe_code_addr_099_3_ph_ph; /* for PHI node */ - llvm_cbe_code_addr_099_3_rec__PHI_TEMPORARY = llvm_cbe_tmp91_rec; /* for PHI node */ - goto llvm_cbe_bb83; - case ((unsigned int )88): - llvm_cbe_code_addr_099_1_ph153__PHI_TEMPORARY = llvm_cbe_tmp91; /* for PHI node */ - goto llvm_cbe_bb33_preheader; - case ((unsigned int )89): - llvm_cbe_code_addr_099_1_ph153__PHI_TEMPORARY = llvm_cbe_tmp91; /* for PHI node */ - goto llvm_cbe_bb33_preheader; - case ((unsigned int )90): - llvm_cbe_code_addr_099_1_ph153__PHI_TEMPORARY = llvm_cbe_tmp91; /* for PHI node */ - goto llvm_cbe_bb33_preheader; - case ((unsigned int )99): - llvm_cbe_code_addr_099_3_ph_ph__PHI_TEMPORARY = llvm_cbe_code_addr_099_3_ph_ph; /* for PHI node */ - llvm_cbe_code_addr_099_3_rec__PHI_TEMPORARY = llvm_cbe_tmp91_rec; /* for PHI node */ - goto llvm_cbe_bb83; - case ((unsigned int )100): - llvm_cbe_code_addr_099_3_ph_ph__PHI_TEMPORARY = llvm_cbe_code_addr_099_3_ph_ph; /* for PHI node */ - llvm_cbe_code_addr_099_3_rec__PHI_TEMPORARY = llvm_cbe_tmp91_rec; /* for PHI node */ - goto llvm_cbe_bb83; - case ((unsigned int )101): - llvm_cbe_code_addr_099_3_ph_ph__PHI_TEMPORARY = llvm_cbe_code_addr_099_3_ph_ph; /* for PHI node */ - llvm_cbe_code_addr_099_3_rec__PHI_TEMPORARY = llvm_cbe_tmp91_rec; /* for PHI node */ - goto llvm_cbe_bb83; - } - } while (1); /* end of syntactic loop 'bb83' */ -llvm_cbe_return: - llvm_cbe_code_addr_099_4 = llvm_cbe_code_addr_099_4__PHI_TEMPORARY; - return llvm_cbe_code_addr_099_4; -} - - -static unsigned int find_fixedlength(unsigned char *llvm_cbe_code) { - unsigned char *llvm_cbe_tmp3; - unsigned char *llvm_cbe_cc_0; - unsigned char *llvm_cbe_cc_0__PHI_TEMPORARY; - unsigned int llvm_cbe_branchlength_0; - unsigned int llvm_cbe_branchlength_0__PHI_TEMPORARY; - unsigned int llvm_cbe_length_1; - unsigned int llvm_cbe_length_1__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp5; - unsigned int llvm_cbe_tmp19; - unsigned int llvm_cbe_tmp30; - unsigned int llvm_cbe_cc_1_rec; - unsigned int llvm_cbe_cc_1_rec__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp34; - unsigned char llvm_cbe_tmp39; - unsigned int llvm_cbe_tmp41; - unsigned int llvm_cbe_tmp43_rec; - unsigned char llvm_cbe_tmp45; - unsigned char *llvm_cbe_tmp51; - unsigned int llvm_cbe_length_0; - unsigned int llvm_cbe_length_0__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp83; - unsigned int llvm_cbe_cc_2_rec; - unsigned int llvm_cbe_cc_2_rec__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp91; - unsigned char llvm_cbe_tmp96; - unsigned int llvm_cbe_tmp100_rec; - unsigned char *llvm_cbe_tmp100; - unsigned char llvm_cbe_tmp102; - unsigned char *llvm_cbe_cc_3; - unsigned char *llvm_cbe_cc_3__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp122; - unsigned char llvm_cbe_tmp125; - unsigned char *llvm_cbe_tmp128; - unsigned int llvm_cbe_tmp133; - unsigned char *llvm_cbe_tmp135; - unsigned char llvm_cbe_tmp139; - unsigned char llvm_cbe_tmp144; - unsigned int llvm_cbe_tmp148; - unsigned char *llvm_cbe_tmp150; - unsigned char llvm_cbe_tmp154; - unsigned char llvm_cbe_tmp159; - unsigned int llvm_cbe_tmp163; - unsigned char *llvm_cbe_tmp165; - unsigned int llvm_cbe_tmp1781; - unsigned char *llvm_cbe_tmp1802; - unsigned int llvm_cbe_tmp178; - unsigned char *llvm_cbe_tmp180; - unsigned char *llvm_cbe_tmp186; - unsigned char llvm_cbe_tmp188; - unsigned char llvm_cbe_tmp199; - unsigned char llvm_cbe_tmp204; - unsigned int llvm_cbe_tmp206; - unsigned char llvm_cbe_tmp209; - unsigned char llvm_cbe_tmp214; - unsigned int llvm_cbe_tmp234; - unsigned char *llvm_cbe_tmp236; - unsigned int llvm_cbe_tmp239; - unsigned int llvm_cbe_retval_0; - unsigned int llvm_cbe_retval_0__PHI_TEMPORARY; - - llvm_cbe_tmp3 = &llvm_cbe_code[((unsigned int )3)]; - llvm_cbe_cc_0__PHI_TEMPORARY = llvm_cbe_tmp3; /* for PHI node */ - llvm_cbe_branchlength_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_length_1__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_bb; - - do { /* Syntactic loop 'bb' to make GCC happy */ -llvm_cbe_bb: - llvm_cbe_cc_0 = llvm_cbe_cc_0__PHI_TEMPORARY; - llvm_cbe_branchlength_0 = llvm_cbe_branchlength_0__PHI_TEMPORARY; - llvm_cbe_length_1 = llvm_cbe_length_1__PHI_TEMPORARY; - llvm_cbe_tmp5 = *llvm_cbe_cc_0; - switch ((((unsigned int )(unsigned char )llvm_cbe_tmp5))) { - default: - goto llvm_cbe_UnifiedReturnBlock; -; - case ((unsigned int )0): - goto llvm_cbe_bb56; - case ((unsigned int )1): - llvm_cbe_cc_3__PHI_TEMPORARY = llvm_cbe_cc_0; /* for PHI node */ - goto llvm_cbe_bb120; - case ((unsigned int )2): - llvm_cbe_cc_3__PHI_TEMPORARY = llvm_cbe_cc_0; /* for PHI node */ - goto llvm_cbe_bb120; - case ((unsigned int )4): - llvm_cbe_cc_3__PHI_TEMPORARY = llvm_cbe_cc_0; /* for PHI node */ - goto llvm_cbe_bb120; - case ((unsigned int )5): - llvm_cbe_cc_3__PHI_TEMPORARY = llvm_cbe_cc_0; /* for PHI node */ - goto llvm_cbe_bb120; - case ((unsigned int )6): - goto llvm_cbe_bb176; - case ((unsigned int )7): - goto llvm_cbe_bb176; - case ((unsigned int )8): - goto llvm_cbe_bb176; - case ((unsigned int )9): - goto llvm_cbe_bb176; - case ((unsigned int )10): - goto llvm_cbe_bb176; - case ((unsigned int )11): - goto llvm_cbe_bb176; - case ((unsigned int )12): - goto llvm_cbe_bb176; - case ((unsigned int )13): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )-2); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )14): - goto llvm_cbe_bb167; - case ((unsigned int )15): - goto llvm_cbe_bb167; - case ((unsigned int )22): - llvm_cbe_cc_3__PHI_TEMPORARY = llvm_cbe_cc_0; /* for PHI node */ - goto llvm_cbe_bb120; - case ((unsigned int )23): - llvm_cbe_cc_3__PHI_TEMPORARY = llvm_cbe_cc_0; /* for PHI node */ - goto llvm_cbe_bb120; - case ((unsigned int )24): - llvm_cbe_cc_3__PHI_TEMPORARY = llvm_cbe_cc_0; /* for PHI node */ - goto llvm_cbe_bb120; - case ((unsigned int )25): - llvm_cbe_cc_3__PHI_TEMPORARY = llvm_cbe_cc_0; /* for PHI node */ - goto llvm_cbe_bb120; - case ((unsigned int )26): - llvm_cbe_cc_3__PHI_TEMPORARY = llvm_cbe_cc_0; /* for PHI node */ - goto llvm_cbe_bb120; - case ((unsigned int )27): - goto llvm_cbe_bb131; - case ((unsigned int )28): - goto llvm_cbe_bb131; - case ((unsigned int )29): - goto llvm_cbe_bb131; - case ((unsigned int )38): - goto llvm_cbe_bb136; - case ((unsigned int )64): - goto llvm_cbe_bb151; - case ((unsigned int )77): - goto llvm_cbe_bb184; - case ((unsigned int )78): - goto llvm_cbe_bb184; - case ((unsigned int )82): - llvm_cbe_cc_3__PHI_TEMPORARY = llvm_cbe_cc_0; /* for PHI node */ - goto llvm_cbe_bb120; - case ((unsigned int )83): - goto llvm_cbe_bb56; - case ((unsigned int )84): - goto llvm_cbe_bb56; - case ((unsigned int )85): - goto llvm_cbe_bb56; - case ((unsigned int )86): - goto llvm_cbe_bb56; - case ((unsigned int )87): - llvm_cbe_cc_2_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb88; - case ((unsigned int )88): - llvm_cbe_cc_2_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb88; - case ((unsigned int )89): - llvm_cbe_cc_2_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb88; - case ((unsigned int )90): - llvm_cbe_cc_2_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb88; - case ((unsigned int )91): - llvm_cbe_cc_3__PHI_TEMPORARY = llvm_cbe_cc_0; /* for PHI node */ - goto llvm_cbe_bb120; - case ((unsigned int )92): - goto llvm_cbe_bb11; - break; - case ((unsigned int )93): - goto llvm_cbe_bb11; - break; - case ((unsigned int )94): - goto llvm_cbe_bb11; - break; - case ((unsigned int )95): - goto llvm_cbe_bb11; - break; - case ((unsigned int )99): - llvm_cbe_cc_3__PHI_TEMPORARY = llvm_cbe_cc_0; /* for PHI node */ - goto llvm_cbe_bb120; - case ((unsigned int )100): - llvm_cbe_cc_3__PHI_TEMPORARY = llvm_cbe_cc_0; /* for PHI node */ - goto llvm_cbe_bb120; - case ((unsigned int )101): - llvm_cbe_cc_3__PHI_TEMPORARY = llvm_cbe_cc_0; /* for PHI node */ - goto llvm_cbe_bb120; - } -llvm_cbe_bb49: - llvm_cbe_tmp51 = &llvm_cbe_cc_0[(llvm_cbe_cc_1_rec + (llvm_cbe_tmp41 + ((unsigned int )3)))]; - llvm_cbe_cc_0__PHI_TEMPORARY = llvm_cbe_tmp51; /* for PHI node */ - llvm_cbe_branchlength_0__PHI_TEMPORARY = llvm_cbe_tmp30; /* for PHI node */ - llvm_cbe_length_1__PHI_TEMPORARY = llvm_cbe_length_1; /* for PHI node */ - goto llvm_cbe_bb; - - do { /* Syntactic loop 'bb31' to make GCC happy */ -llvm_cbe_bb31: - llvm_cbe_cc_1_rec = llvm_cbe_cc_1_rec__PHI_TEMPORARY; - llvm_cbe_tmp34 = *(&llvm_cbe_cc_0[(llvm_cbe_cc_1_rec + ((unsigned int )1))]); - llvm_cbe_tmp39 = *(&llvm_cbe_cc_0[(llvm_cbe_cc_1_rec + ((unsigned int )2))]); - llvm_cbe_tmp41 = ((((unsigned int )(unsigned char )llvm_cbe_tmp34)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp39)); - llvm_cbe_tmp43_rec = llvm_cbe_cc_1_rec + llvm_cbe_tmp41; - llvm_cbe_tmp45 = *(&llvm_cbe_cc_0[llvm_cbe_tmp43_rec]); - if ((llvm_cbe_tmp45 == ((unsigned char )83))) { - llvm_cbe_cc_1_rec__PHI_TEMPORARY = llvm_cbe_tmp43_rec; /* for PHI node */ - goto llvm_cbe_bb31; - } else { - goto llvm_cbe_bb49; - } - - } while (1); /* end of syntactic loop 'bb31' */ -llvm_cbe_cond_next27: - llvm_cbe_tmp30 = llvm_cbe_tmp19 + llvm_cbe_branchlength_0; - llvm_cbe_cc_1_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb31; - -llvm_cbe_bb11: - llvm_cbe_tmp19 = /*tail*/ find_fixedlength((&llvm_cbe_cc_0[((((llvm_cbe_tmp5 == ((unsigned char )94))) ? (((unsigned int )2)) : (((unsigned int )0))))])); - if ((((signed int )llvm_cbe_tmp19) < ((signed int )((unsigned int )0)))) { - llvm_cbe_retval_0__PHI_TEMPORARY = llvm_cbe_tmp19; /* for PHI node */ - goto llvm_cbe_return; - } else { - goto llvm_cbe_cond_next27; - } - -llvm_cbe_cond_next81: - llvm_cbe_tmp83 = &llvm_cbe_cc_0[((unsigned int )3)]; - llvm_cbe_cc_0__PHI_TEMPORARY = llvm_cbe_tmp83; /* for PHI node */ - llvm_cbe_branchlength_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_length_1__PHI_TEMPORARY = llvm_cbe_length_0; /* for PHI node */ - goto llvm_cbe_bb; - -llvm_cbe_cond_next72: - llvm_cbe_length_0 = llvm_cbe_length_0__PHI_TEMPORARY; - if ((llvm_cbe_tmp5 == ((unsigned char )83))) { - goto llvm_cbe_cond_next81; - } else { - llvm_cbe_retval_0__PHI_TEMPORARY = llvm_cbe_length_0; /* for PHI node */ - goto llvm_cbe_return; - } - -llvm_cbe_bb56: - if ((((signed int )llvm_cbe_length_1) < ((signed int )((unsigned int )0)))) { - llvm_cbe_length_0__PHI_TEMPORARY = llvm_cbe_branchlength_0; /* for PHI node */ - goto llvm_cbe_cond_next72; - } else { - goto llvm_cbe_cond_false63; - } - -llvm_cbe_cond_false63: - if ((llvm_cbe_length_1 == llvm_cbe_branchlength_0)) { - llvm_cbe_length_0__PHI_TEMPORARY = llvm_cbe_length_1; /* for PHI node */ - goto llvm_cbe_cond_next72; - } else { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_return; - } - -llvm_cbe_bb120: - llvm_cbe_cc_3 = llvm_cbe_cc_3__PHI_TEMPORARY; - llvm_cbe_tmp122 = *llvm_cbe_cc_3; - llvm_cbe_tmp125 = *(&_pcre_OP_lengths[(((unsigned int )(unsigned char )llvm_cbe_tmp122))]); - llvm_cbe_tmp128 = &llvm_cbe_cc_3[(((unsigned int )(unsigned char )llvm_cbe_tmp125))]; - llvm_cbe_cc_0__PHI_TEMPORARY = llvm_cbe_tmp128; /* for PHI node */ - llvm_cbe_branchlength_0__PHI_TEMPORARY = llvm_cbe_branchlength_0; /* for PHI node */ - llvm_cbe_length_1__PHI_TEMPORARY = llvm_cbe_length_1; /* for PHI node */ - goto llvm_cbe_bb; - - do { /* Syntactic loop 'bb88' to make GCC happy */ -llvm_cbe_bb88: - llvm_cbe_cc_2_rec = llvm_cbe_cc_2_rec__PHI_TEMPORARY; - llvm_cbe_tmp91 = *(&llvm_cbe_cc_0[(llvm_cbe_cc_2_rec + ((unsigned int )1))]); - llvm_cbe_tmp96 = *(&llvm_cbe_cc_0[(llvm_cbe_cc_2_rec + ((unsigned int )2))]); - llvm_cbe_tmp100_rec = llvm_cbe_cc_2_rec + (((((unsigned int )(unsigned char )llvm_cbe_tmp91)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp96))); - llvm_cbe_tmp100 = &llvm_cbe_cc_0[llvm_cbe_tmp100_rec]; - llvm_cbe_tmp102 = *llvm_cbe_tmp100; - if ((llvm_cbe_tmp102 == ((unsigned char )83))) { - llvm_cbe_cc_2_rec__PHI_TEMPORARY = llvm_cbe_tmp100_rec; /* for PHI node */ - goto llvm_cbe_bb88; - } else { - llvm_cbe_cc_3__PHI_TEMPORARY = llvm_cbe_tmp100; /* for PHI node */ - goto llvm_cbe_bb120; - } - - } while (1); /* end of syntactic loop 'bb88' */ -llvm_cbe_bb131: - llvm_cbe_tmp133 = llvm_cbe_branchlength_0 + ((unsigned int )1); - llvm_cbe_tmp135 = &llvm_cbe_cc_0[((unsigned int )2)]; - llvm_cbe_cc_0__PHI_TEMPORARY = llvm_cbe_tmp135; /* for PHI node */ - llvm_cbe_branchlength_0__PHI_TEMPORARY = llvm_cbe_tmp133; /* for PHI node */ - llvm_cbe_length_1__PHI_TEMPORARY = llvm_cbe_length_1; /* for PHI node */ - goto llvm_cbe_bb; - -llvm_cbe_bb136: - llvm_cbe_tmp139 = *(&llvm_cbe_cc_0[((unsigned int )1)]); - llvm_cbe_tmp144 = *(&llvm_cbe_cc_0[((unsigned int )2)]); - llvm_cbe_tmp148 = (((((unsigned int )(unsigned char )llvm_cbe_tmp139)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp144))) + llvm_cbe_branchlength_0; - llvm_cbe_tmp150 = &llvm_cbe_cc_0[((unsigned int )4)]; - llvm_cbe_cc_0__PHI_TEMPORARY = llvm_cbe_tmp150; /* for PHI node */ - llvm_cbe_branchlength_0__PHI_TEMPORARY = llvm_cbe_tmp148; /* for PHI node */ - llvm_cbe_length_1__PHI_TEMPORARY = llvm_cbe_length_1; /* for PHI node */ - goto llvm_cbe_bb; - -llvm_cbe_bb151: - llvm_cbe_tmp154 = *(&llvm_cbe_cc_0[((unsigned int )1)]); - llvm_cbe_tmp159 = *(&llvm_cbe_cc_0[((unsigned int )2)]); - llvm_cbe_tmp163 = (((((unsigned int )(unsigned char )llvm_cbe_tmp154)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp159))) + llvm_cbe_branchlength_0; - llvm_cbe_tmp165 = &llvm_cbe_cc_0[((unsigned int )4)]; - llvm_cbe_cc_0__PHI_TEMPORARY = llvm_cbe_tmp165; /* for PHI node */ - llvm_cbe_branchlength_0__PHI_TEMPORARY = llvm_cbe_tmp163; /* for PHI node */ - llvm_cbe_length_1__PHI_TEMPORARY = llvm_cbe_length_1; /* for PHI node */ - goto llvm_cbe_bb; - -llvm_cbe_bb167: - llvm_cbe_tmp1781 = llvm_cbe_branchlength_0 + ((unsigned int )1); - llvm_cbe_tmp1802 = &llvm_cbe_cc_0[((unsigned int )3)]; - llvm_cbe_cc_0__PHI_TEMPORARY = llvm_cbe_tmp1802; /* for PHI node */ - llvm_cbe_branchlength_0__PHI_TEMPORARY = llvm_cbe_tmp1781; /* for PHI node */ - llvm_cbe_length_1__PHI_TEMPORARY = llvm_cbe_length_1; /* for PHI node */ - goto llvm_cbe_bb; - -llvm_cbe_bb176: - llvm_cbe_tmp178 = llvm_cbe_branchlength_0 + ((unsigned int )1); - llvm_cbe_tmp180 = &llvm_cbe_cc_0[((unsigned int )1)]; - llvm_cbe_cc_0__PHI_TEMPORARY = llvm_cbe_tmp180; /* for PHI node */ - llvm_cbe_branchlength_0__PHI_TEMPORARY = llvm_cbe_tmp178; /* for PHI node */ - llvm_cbe_length_1__PHI_TEMPORARY = llvm_cbe_length_1; /* for PHI node */ - goto llvm_cbe_bb; - -llvm_cbe_cond_next222: - llvm_cbe_tmp234 = llvm_cbe_tmp206 + llvm_cbe_branchlength_0; - llvm_cbe_tmp236 = &llvm_cbe_cc_0[((unsigned int )38)]; - llvm_cbe_cc_0__PHI_TEMPORARY = llvm_cbe_tmp236; /* for PHI node */ - llvm_cbe_branchlength_0__PHI_TEMPORARY = llvm_cbe_tmp234; /* for PHI node */ - llvm_cbe_length_1__PHI_TEMPORARY = llvm_cbe_length_1; /* for PHI node */ - goto llvm_cbe_bb; - -llvm_cbe_bb196: - llvm_cbe_tmp199 = *(&llvm_cbe_cc_0[((unsigned int )34)]); - llvm_cbe_tmp204 = *(&llvm_cbe_cc_0[((unsigned int )35)]); - llvm_cbe_tmp206 = ((((unsigned int )(unsigned char )llvm_cbe_tmp199)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp204)); - llvm_cbe_tmp209 = *(&llvm_cbe_cc_0[((unsigned int )36)]); - llvm_cbe_tmp214 = *(&llvm_cbe_cc_0[((unsigned int )37)]); - if ((llvm_cbe_tmp206 == (((((unsigned int )(unsigned char )llvm_cbe_tmp209)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp214))))) { - goto llvm_cbe_cond_next222; - } else { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_return; - } - -llvm_cbe_bb184: - llvm_cbe_tmp186 = &llvm_cbe_cc_0[((unsigned int )33)]; - llvm_cbe_tmp188 = *llvm_cbe_tmp186; - switch ((((unsigned int )(unsigned char )llvm_cbe_tmp188))) { - default: - goto llvm_cbe_bb237; -; - case ((unsigned int )69): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )70): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )73): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )74): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )75): - goto llvm_cbe_bb196; - break; - case ((unsigned int )76): - goto llvm_cbe_bb196; - break; - } -llvm_cbe_bb237: - llvm_cbe_tmp239 = llvm_cbe_branchlength_0 + ((unsigned int )1); - llvm_cbe_cc_0__PHI_TEMPORARY = llvm_cbe_tmp186; /* for PHI node */ - llvm_cbe_branchlength_0__PHI_TEMPORARY = llvm_cbe_tmp239; /* for PHI node */ - llvm_cbe_length_1__PHI_TEMPORARY = llvm_cbe_length_1; /* for PHI node */ - goto llvm_cbe_bb; - - } while (1); /* end of syntactic loop 'bb' */ -llvm_cbe_return: - llvm_cbe_retval_0 = llvm_cbe_retval_0__PHI_TEMPORARY; - return llvm_cbe_retval_0; -llvm_cbe_UnifiedReturnBlock: - return ((unsigned int )-1); -} - - -static unsigned char *find_bracket(unsigned char *llvm_cbe_code, unsigned int llvm_cbe_number) { - unsigned char llvm_cbe_tmp2; - unsigned int llvm_cbe_tmp23; - unsigned char *llvm_cbe_code_addr_01_0_ph_ph; - unsigned char *llvm_cbe_code_addr_01_0_ph_ph__PHI_TEMPORARY; - unsigned int llvm_cbe_code_addr_01_0_rec; - unsigned int llvm_cbe_code_addr_01_0_rec__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp15; - unsigned char llvm_cbe_tmp20; - unsigned int llvm_cbe_tmp25_rec; - unsigned char *llvm_cbe_tmp25; - unsigned char llvm_cbe_tmp213; - unsigned int llvm_cbe_tmp2314_le6; - unsigned char *llvm_cbe_code_addr_01_1_ph; - unsigned char *llvm_cbe_code_addr_01_1_ph__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp2310_1_ph; - unsigned int llvm_cbe_tmp2310_1_ph__PHI_TEMPORARY; - unsigned int llvm_cbe_code_addr_01_1_rec; - unsigned int llvm_cbe_code_addr_01_1_rec__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp2310_1; - unsigned int llvm_cbe_tmp2310_1__PHI_TEMPORARY; - unsigned char *llvm_cbe_code_addr_01_1; - unsigned char llvm_cbe_tmp33; - unsigned char llvm_cbe_tmp38; - unsigned char llvm_cbe_tmp52; - unsigned int llvm_cbe_tmp55_rec; - unsigned char *llvm_cbe_tmp55; - unsigned char llvm_cbe_tmp216; - unsigned int llvm_cbe_tmp2317; - unsigned int llvm_cbe_tmp2314; - unsigned char *llvm_cbe_code_addr_01_2_ph_ph; - unsigned char *llvm_cbe_code_addr_01_2_ph_ph__PHI_TEMPORARY; - unsigned int llvm_cbe_code_addr_01_2_rec; - unsigned int llvm_cbe_code_addr_01_2_rec__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp2310_2; - unsigned int llvm_cbe_tmp2310_2__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp59; - unsigned int llvm_cbe_tmp62_rec; - unsigned char *llvm_cbe_tmp62; - unsigned char llvm_cbe_tmp219; - unsigned int llvm_cbe_tmp2320; - unsigned char *llvm_cbe_retval_0; - unsigned char *llvm_cbe_retval_0__PHI_TEMPORARY; - - llvm_cbe_tmp2 = *llvm_cbe_code; - llvm_cbe_tmp23 = ((unsigned int )(unsigned char )llvm_cbe_tmp2); - switch (llvm_cbe_tmp2) { - default: - llvm_cbe_code_addr_01_2_ph_ph__PHI_TEMPORARY = llvm_cbe_code; /* for PHI node */ - llvm_cbe_code_addr_01_2_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_tmp2310_2__PHI_TEMPORARY = llvm_cbe_tmp23; /* for PHI node */ - goto llvm_cbe_cond_false56; -; - case ((unsigned char )0): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned char *)/*NULL*/0); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned char )79): - llvm_cbe_code_addr_01_0_ph_ph__PHI_TEMPORARY = llvm_cbe_code; /* for PHI node */ - llvm_cbe_code_addr_01_0_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_cond_true12; - break; - case ((unsigned char )94): - llvm_cbe_code_addr_01_1_ph__PHI_TEMPORARY = llvm_cbe_code; /* for PHI node */ - llvm_cbe_tmp2310_1_ph__PHI_TEMPORARY = llvm_cbe_tmp23; /* for PHI node */ - goto llvm_cbe_cond_true30_preheader; - } - do { /* Syntactic loop 'cond_true12' to make GCC happy */ -llvm_cbe_cond_true12: - llvm_cbe_code_addr_01_0_ph_ph = llvm_cbe_code_addr_01_0_ph_ph__PHI_TEMPORARY; - llvm_cbe_code_addr_01_0_rec = llvm_cbe_code_addr_01_0_rec__PHI_TEMPORARY; - llvm_cbe_tmp15 = *(&llvm_cbe_code_addr_01_0_ph_ph[(llvm_cbe_code_addr_01_0_rec + ((unsigned int )1))]); - llvm_cbe_tmp20 = *(&llvm_cbe_code_addr_01_0_ph_ph[(llvm_cbe_code_addr_01_0_rec + ((unsigned int )2))]); - llvm_cbe_tmp25_rec = llvm_cbe_code_addr_01_0_rec + (((((unsigned int )(unsigned char )llvm_cbe_tmp15)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp20))); - llvm_cbe_tmp25 = &llvm_cbe_code_addr_01_0_ph_ph[llvm_cbe_tmp25_rec]; - llvm_cbe_tmp213 = *llvm_cbe_tmp25; - switch (llvm_cbe_tmp213) { - default: - goto llvm_cbe_cond_false56_preheader_loopexit; -; - case ((unsigned char )0): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned char *)/*NULL*/0); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned char )79): - llvm_cbe_code_addr_01_0_ph_ph__PHI_TEMPORARY = llvm_cbe_code_addr_01_0_ph_ph; /* for PHI node */ - llvm_cbe_code_addr_01_0_rec__PHI_TEMPORARY = llvm_cbe_tmp25_rec; /* for PHI node */ - goto llvm_cbe_cond_true12; - case ((unsigned char )94): - goto llvm_cbe_cond_true30_preheader_loopexit2; - break; - } - } while (1); /* end of syntactic loop 'cond_true12' */ -llvm_cbe_cond_true30_preheader_loopexit2: - llvm_cbe_tmp2314_le6 = ((unsigned int )(unsigned char )llvm_cbe_tmp213); - llvm_cbe_code_addr_01_1_ph__PHI_TEMPORARY = llvm_cbe_tmp25; /* for PHI node */ - llvm_cbe_tmp2310_1_ph__PHI_TEMPORARY = llvm_cbe_tmp2314_le6; /* for PHI node */ - goto llvm_cbe_cond_true30_preheader; - -llvm_cbe_cond_true30_preheader: - llvm_cbe_code_addr_01_1_ph = llvm_cbe_code_addr_01_1_ph__PHI_TEMPORARY; - llvm_cbe_tmp2310_1_ph = llvm_cbe_tmp2310_1_ph__PHI_TEMPORARY; - llvm_cbe_code_addr_01_1_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_tmp2310_1__PHI_TEMPORARY = llvm_cbe_tmp2310_1_ph; /* for PHI node */ - goto llvm_cbe_cond_true30; - - do { /* Syntactic loop 'cond_true30' to make GCC happy */ -llvm_cbe_cond_true30: - llvm_cbe_code_addr_01_1_rec = llvm_cbe_code_addr_01_1_rec__PHI_TEMPORARY; - llvm_cbe_tmp2310_1 = llvm_cbe_tmp2310_1__PHI_TEMPORARY; - llvm_cbe_code_addr_01_1 = &llvm_cbe_code_addr_01_1_ph[llvm_cbe_code_addr_01_1_rec]; - llvm_cbe_tmp33 = *(&llvm_cbe_code_addr_01_1_ph[(llvm_cbe_code_addr_01_1_rec + ((unsigned int )3))]); - llvm_cbe_tmp38 = *(&llvm_cbe_code_addr_01_1_ph[(llvm_cbe_code_addr_01_1_rec + ((unsigned int )4))]); - if (((((((unsigned int )(unsigned char )llvm_cbe_tmp33)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp38))) == llvm_cbe_number)) { - llvm_cbe_retval_0__PHI_TEMPORARY = llvm_cbe_code_addr_01_1; /* for PHI node */ - goto llvm_cbe_return; - } else { - goto llvm_cbe_cond_next49; - } - -llvm_cbe_cond_next49: - llvm_cbe_tmp52 = *(&_pcre_OP_lengths[llvm_cbe_tmp2310_1]); - llvm_cbe_tmp55_rec = llvm_cbe_code_addr_01_1_rec + (((unsigned int )(unsigned char )llvm_cbe_tmp52)); - llvm_cbe_tmp55 = &llvm_cbe_code_addr_01_1_ph[llvm_cbe_tmp55_rec]; - llvm_cbe_tmp216 = *llvm_cbe_tmp55; - llvm_cbe_tmp2317 = ((unsigned int )(unsigned char )llvm_cbe_tmp216); - switch (llvm_cbe_tmp216) { - default: - llvm_cbe_code_addr_01_2_ph_ph__PHI_TEMPORARY = llvm_cbe_tmp55; /* for PHI node */ - llvm_cbe_code_addr_01_2_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_tmp2310_2__PHI_TEMPORARY = llvm_cbe_tmp2317; /* for PHI node */ - goto llvm_cbe_cond_false56; -; - case ((unsigned char )0): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned char *)/*NULL*/0); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned char )79): - llvm_cbe_code_addr_01_0_ph_ph__PHI_TEMPORARY = llvm_cbe_tmp55; /* for PHI node */ - llvm_cbe_code_addr_01_0_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_cond_true12; - case ((unsigned char )94): - llvm_cbe_code_addr_01_1_rec__PHI_TEMPORARY = llvm_cbe_tmp55_rec; /* for PHI node */ - llvm_cbe_tmp2310_1__PHI_TEMPORARY = llvm_cbe_tmp2317; /* for PHI node */ - goto llvm_cbe_cond_true30; - } - } while (1); /* end of syntactic loop 'cond_true30' */ -llvm_cbe_cond_false56_preheader_loopexit: - llvm_cbe_tmp2314 = ((unsigned int )(unsigned char )llvm_cbe_tmp213); - llvm_cbe_code_addr_01_2_ph_ph__PHI_TEMPORARY = llvm_cbe_tmp25; /* for PHI node */ - llvm_cbe_code_addr_01_2_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_tmp2310_2__PHI_TEMPORARY = llvm_cbe_tmp2314; /* for PHI node */ - goto llvm_cbe_cond_false56; - - do { /* Syntactic loop 'cond_false56' to make GCC happy */ -llvm_cbe_cond_false56: - llvm_cbe_code_addr_01_2_ph_ph = llvm_cbe_code_addr_01_2_ph_ph__PHI_TEMPORARY; - llvm_cbe_code_addr_01_2_rec = llvm_cbe_code_addr_01_2_rec__PHI_TEMPORARY; - llvm_cbe_tmp2310_2 = llvm_cbe_tmp2310_2__PHI_TEMPORARY; - llvm_cbe_tmp59 = *(&_pcre_OP_lengths[llvm_cbe_tmp2310_2]); - llvm_cbe_tmp62_rec = llvm_cbe_code_addr_01_2_rec + (((unsigned int )(unsigned char )llvm_cbe_tmp59)); - llvm_cbe_tmp62 = &llvm_cbe_code_addr_01_2_ph_ph[llvm_cbe_tmp62_rec]; - llvm_cbe_tmp219 = *llvm_cbe_tmp62; - llvm_cbe_tmp2320 = ((unsigned int )(unsigned char )llvm_cbe_tmp219); - switch (llvm_cbe_tmp219) { - default: - llvm_cbe_code_addr_01_2_ph_ph__PHI_TEMPORARY = llvm_cbe_code_addr_01_2_ph_ph; /* for PHI node */ - llvm_cbe_code_addr_01_2_rec__PHI_TEMPORARY = llvm_cbe_tmp62_rec; /* for PHI node */ - llvm_cbe_tmp2310_2__PHI_TEMPORARY = llvm_cbe_tmp2320; /* for PHI node */ - goto llvm_cbe_cond_false56; -; - case ((unsigned char )0): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned char *)/*NULL*/0); /* for PHI node */ - goto llvm_cbe_return; - break; - case ((unsigned char )79): - llvm_cbe_code_addr_01_0_ph_ph__PHI_TEMPORARY = llvm_cbe_tmp62; /* for PHI node */ - llvm_cbe_code_addr_01_0_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_cond_true12; - case ((unsigned char )94): - llvm_cbe_code_addr_01_1_ph__PHI_TEMPORARY = llvm_cbe_tmp62; /* for PHI node */ - llvm_cbe_tmp2310_1_ph__PHI_TEMPORARY = llvm_cbe_tmp2320; /* for PHI node */ - goto llvm_cbe_cond_true30_preheader; - } - } while (1); /* end of syntactic loop 'cond_false56' */ -llvm_cbe_return: - llvm_cbe_retval_0 = llvm_cbe_retval_0__PHI_TEMPORARY; - return llvm_cbe_retval_0; -} - - -static unsigned int could_be_empty_branch(unsigned char *llvm_cbe_code, unsigned char *llvm_cbe_endcode) { - unsigned char llvm_cbe_tmp2; - unsigned char llvm_cbe_tmp5; - unsigned char *llvm_cbe_tmp9; - unsigned char *llvm_cbe_code_addr_18_0; - unsigned char *llvm_cbe_code_addr_18_0__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp11; - unsigned int llvm_cbe_tmp1112; - unsigned char llvm_cbe_tmp19; - unsigned int llvm_cbe_tmp1920; - unsigned int llvm_cbe_code_addr_2_rec; - unsigned int llvm_cbe_code_addr_2_rec__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp22_sum63; - unsigned char llvm_cbe_tmp26; - unsigned char llvm_cbe_tmp31; - unsigned int llvm_cbe_tmp33; - unsigned int llvm_cbe_tmp35_rec; - unsigned char llvm_cbe_tmp37; - unsigned char llvm_cbe_tmp18526; - unsigned char *llvm_cbe_tmp18929; - unsigned char llvm_cbe_tmp53; - unsigned char llvm_cbe_tmp59; - unsigned int llvm_cbe_empty_branch_4; - unsigned int llvm_cbe_empty_branch_4__PHI_TEMPORARY; - unsigned int llvm_cbe_code_addr_3_rec; - unsigned int llvm_cbe_code_addr_3_rec__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp77; - unsigned int llvm_cbe_empty_branch_3; - unsigned int llvm_cbe_empty_branch_3__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp86; - unsigned char llvm_cbe_tmp91; - unsigned int llvm_cbe_tmp95_rec; - unsigned char *llvm_cbe_tmp95; - unsigned char llvm_cbe_tmp97; - unsigned int llvm_cbe_tmp110111; - unsigned char llvm_cbe_tmp119; - unsigned char llvm_cbe_tmp133; - unsigned char llvm_cbe_tmp138; - unsigned int llvm_cbe_c_2; - unsigned int llvm_cbe_c_2__PHI_TEMPORARY; - unsigned char *llvm_cbe_code_addr_0; - unsigned char *llvm_cbe_code_addr_0__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp185; - unsigned char *llvm_cbe_tmp189; - unsigned char *llvm_cbe_storemerge; - unsigned char *llvm_cbe_storemerge__PHI_TEMPORARY; - unsigned int llvm_cbe_retval_0; - unsigned int llvm_cbe_retval_0__PHI_TEMPORARY; - - llvm_cbe_tmp2 = *llvm_cbe_code; - llvm_cbe_tmp5 = *(&_pcre_OP_lengths[(((unsigned int )(unsigned char )llvm_cbe_tmp2))]); - llvm_cbe_tmp9 = /*tail*/ first_significant_code((&llvm_cbe_code[(((unsigned int )(unsigned char )llvm_cbe_tmp5))]), ((unsigned int *)/*NULL*/0), ((unsigned int )0), ((unsigned int )1)); - if ((((unsigned char *)llvm_cbe_tmp9) < ((unsigned char *)llvm_cbe_endcode))) { - llvm_cbe_code_addr_18_0__PHI_TEMPORARY = llvm_cbe_tmp9; /* for PHI node */ - goto llvm_cbe_bb; - } else { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_return; - } - - do { /* Syntactic loop 'bb' to make GCC happy */ -llvm_cbe_bb: - llvm_cbe_code_addr_18_0 = llvm_cbe_code_addr_18_0__PHI_TEMPORARY; - llvm_cbe_tmp11 = *llvm_cbe_code_addr_18_0; - llvm_cbe_tmp1112 = ((unsigned int )(unsigned char )llvm_cbe_tmp11); - if ((((unsigned int )(llvm_cbe_tmp1112 + ((unsigned int )-102))) < ((unsigned int )((unsigned int )2)))) { - goto llvm_cbe_cond_true; - } else { - goto llvm_cbe_cond_next; - } - -llvm_cbe_bb190: - llvm_cbe_storemerge = llvm_cbe_storemerge__PHI_TEMPORARY; - if ((((unsigned char *)llvm_cbe_storemerge) < ((unsigned char *)llvm_cbe_endcode))) { - llvm_cbe_code_addr_18_0__PHI_TEMPORARY = llvm_cbe_storemerge; /* for PHI node */ - goto llvm_cbe_bb; - } else { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_return; - } - -llvm_cbe_bb41: - llvm_cbe_tmp18526 = *(&_pcre_OP_lengths[(((unsigned int )(unsigned char )llvm_cbe_tmp37))]); - llvm_cbe_tmp18929 = /*tail*/ first_significant_code((&llvm_cbe_code_addr_18_0[(llvm_cbe_tmp22_sum63 + ((((unsigned int )(unsigned char )llvm_cbe_tmp18526)) + llvm_cbe_tmp33))]), ((unsigned int *)/*NULL*/0), ((unsigned int )0), ((unsigned int )1)); - llvm_cbe_storemerge__PHI_TEMPORARY = llvm_cbe_tmp18929; /* for PHI node */ - goto llvm_cbe_bb190; - - do { /* Syntactic loop 'bb23' to make GCC happy */ -llvm_cbe_bb23: - llvm_cbe_code_addr_2_rec = llvm_cbe_code_addr_2_rec__PHI_TEMPORARY; - llvm_cbe_tmp22_sum63 = llvm_cbe_tmp1920 + llvm_cbe_code_addr_2_rec; - llvm_cbe_tmp26 = *(&llvm_cbe_code_addr_18_0[(llvm_cbe_tmp22_sum63 + ((unsigned int )1))]); - llvm_cbe_tmp31 = *(&llvm_cbe_code_addr_18_0[(llvm_cbe_tmp22_sum63 + ((unsigned int )2))]); - llvm_cbe_tmp33 = ((((unsigned int )(unsigned char )llvm_cbe_tmp26)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp31)); - llvm_cbe_tmp35_rec = llvm_cbe_code_addr_2_rec + llvm_cbe_tmp33; - llvm_cbe_tmp37 = *(&llvm_cbe_code_addr_18_0[(llvm_cbe_tmp1920 + llvm_cbe_tmp35_rec)]); - if ((llvm_cbe_tmp37 == ((unsigned char )83))) { - llvm_cbe_code_addr_2_rec__PHI_TEMPORARY = llvm_cbe_tmp35_rec; /* for PHI node */ - goto llvm_cbe_bb23; - } else { - goto llvm_cbe_bb41; - } - - } while (1); /* end of syntactic loop 'bb23' */ -llvm_cbe_cond_true: - llvm_cbe_tmp19 = *(&_pcre_OP_lengths[llvm_cbe_tmp1112]); - llvm_cbe_tmp1920 = ((unsigned int )(unsigned char )llvm_cbe_tmp19); - llvm_cbe_code_addr_2_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb23; - -llvm_cbe_bb182: - llvm_cbe_c_2 = llvm_cbe_c_2__PHI_TEMPORARY; - llvm_cbe_code_addr_0 = llvm_cbe_code_addr_0__PHI_TEMPORARY; - llvm_cbe_tmp185 = *(&_pcre_OP_lengths[llvm_cbe_c_2]); - llvm_cbe_tmp189 = /*tail*/ first_significant_code((&llvm_cbe_code_addr_0[(((unsigned int )(unsigned char )llvm_cbe_tmp185))]), ((unsigned int *)/*NULL*/0), ((unsigned int )0), ((unsigned int )1)); - llvm_cbe_storemerge__PHI_TEMPORARY = llvm_cbe_tmp189; /* for PHI node */ - goto llvm_cbe_bb190; - -llvm_cbe_cond_next108: - llvm_cbe_tmp110111 = ((unsigned int )(unsigned char )llvm_cbe_tmp97); - llvm_cbe_c_2__PHI_TEMPORARY = llvm_cbe_tmp110111; /* for PHI node */ - llvm_cbe_code_addr_0__PHI_TEMPORARY = llvm_cbe_tmp95; /* for PHI node */ - goto llvm_cbe_bb182; - -llvm_cbe_bb101: - if ((llvm_cbe_empty_branch_3 == ((unsigned int )0))) { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - } else { - goto llvm_cbe_cond_next108; - } - - do { /* Syntactic loop 'bb68' to make GCC happy */ -llvm_cbe_bb68: - llvm_cbe_empty_branch_4 = llvm_cbe_empty_branch_4__PHI_TEMPORARY; - llvm_cbe_code_addr_3_rec = llvm_cbe_code_addr_3_rec__PHI_TEMPORARY; - if ((llvm_cbe_empty_branch_4 == ((unsigned int )0))) { - goto llvm_cbe_cond_true73; - } else { - llvm_cbe_empty_branch_3__PHI_TEMPORARY = llvm_cbe_empty_branch_4; /* for PHI node */ - goto llvm_cbe_cond_next83; - } - -llvm_cbe_cond_next83: - llvm_cbe_empty_branch_3 = llvm_cbe_empty_branch_3__PHI_TEMPORARY; - llvm_cbe_tmp86 = *(&llvm_cbe_code_addr_18_0[(llvm_cbe_code_addr_3_rec + ((unsigned int )1))]); - llvm_cbe_tmp91 = *(&llvm_cbe_code_addr_18_0[(llvm_cbe_code_addr_3_rec + ((unsigned int )2))]); - llvm_cbe_tmp95_rec = llvm_cbe_code_addr_3_rec + (((((unsigned int )(unsigned char )llvm_cbe_tmp86)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp91))); - llvm_cbe_tmp95 = &llvm_cbe_code_addr_18_0[llvm_cbe_tmp95_rec]; - llvm_cbe_tmp97 = *llvm_cbe_tmp95; - if ((llvm_cbe_tmp97 == ((unsigned char )83))) { - llvm_cbe_empty_branch_4__PHI_TEMPORARY = llvm_cbe_empty_branch_3; /* for PHI node */ - llvm_cbe_code_addr_3_rec__PHI_TEMPORARY = llvm_cbe_tmp95_rec; /* for PHI node */ - goto llvm_cbe_bb68; - } else { - goto llvm_cbe_bb101; - } - -llvm_cbe_cond_true73: - llvm_cbe_tmp77 = /*tail*/ could_be_empty_branch((&llvm_cbe_code_addr_18_0[llvm_cbe_code_addr_3_rec]), llvm_cbe_endcode); - if ((llvm_cbe_tmp77 == ((unsigned int )0))) { - llvm_cbe_empty_branch_3__PHI_TEMPORARY = llvm_cbe_empty_branch_4; /* for PHI node */ - goto llvm_cbe_cond_next83; - } else { - goto llvm_cbe_cond_true81; - } - -llvm_cbe_cond_true81: - llvm_cbe_empty_branch_3__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_cond_next83; - - } while (1); /* end of syntactic loop 'bb68' */ -llvm_cbe_cond_true50: - llvm_cbe_tmp53 = *(&llvm_cbe_code_addr_18_0[((unsigned int )1)]); - llvm_cbe_tmp59 = *(&llvm_cbe_code_addr_18_0[((unsigned int )2)]); - if (((((((unsigned int )(unsigned char )llvm_cbe_tmp53)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp59))) == ((unsigned int )0))) { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_return; - } else { - llvm_cbe_empty_branch_4__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_code_addr_3_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb68; - } - -llvm_cbe_cond_next: - if ((((unsigned int )(llvm_cbe_tmp1112 + ((unsigned int )-92))) < ((unsigned int )((unsigned int )3)))) { - goto llvm_cbe_cond_true50; - } else { - goto llvm_cbe_cond_next112; - } - -llvm_cbe_cond_next112: - switch (llvm_cbe_tmp1112) { - default: - llvm_cbe_c_2__PHI_TEMPORARY = llvm_cbe_tmp1112; /* for PHI node */ - llvm_cbe_code_addr_0__PHI_TEMPORARY = llvm_cbe_code_addr_18_0; /* for PHI node */ - goto llvm_cbe_bb182; -; - case ((unsigned int )6): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )7): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )8): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )9): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )10): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )11): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )12): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )13): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )14): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )15): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )21): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )27): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )28): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )29): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )32): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )33): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )38): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )40): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )45): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )46): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )51): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )53): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )58): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )59): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )64): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )66): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )77): - goto llvm_cbe_bb115; - break; - case ((unsigned int )78): - goto llvm_cbe_bb115; - break; - case ((unsigned int )83): - goto llvm_cbe_UnifiedReturnBlock; - case ((unsigned int )84): - goto llvm_cbe_UnifiedReturnBlock; - case ((unsigned int )85): - goto llvm_cbe_UnifiedReturnBlock; - case ((unsigned int )86): - goto llvm_cbe_UnifiedReturnBlock; - } -llvm_cbe_bb115: - llvm_cbe_tmp119 = *(&llvm_cbe_code_addr_18_0[((unsigned int )33)]); - switch ((((unsigned int )(unsigned char )llvm_cbe_tmp119))) { - default: - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; -; - case ((unsigned int )69): - llvm_cbe_c_2__PHI_TEMPORARY = llvm_cbe_tmp1112; /* for PHI node */ - llvm_cbe_code_addr_0__PHI_TEMPORARY = llvm_cbe_code_addr_18_0; /* for PHI node */ - goto llvm_cbe_bb182; - case ((unsigned int )70): - llvm_cbe_c_2__PHI_TEMPORARY = llvm_cbe_tmp1112; /* for PHI node */ - llvm_cbe_code_addr_0__PHI_TEMPORARY = llvm_cbe_code_addr_18_0; /* for PHI node */ - goto llvm_cbe_bb182; - case ((unsigned int )73): - llvm_cbe_c_2__PHI_TEMPORARY = llvm_cbe_tmp1112; /* for PHI node */ - llvm_cbe_code_addr_0__PHI_TEMPORARY = llvm_cbe_code_addr_18_0; /* for PHI node */ - goto llvm_cbe_bb182; - case ((unsigned int )74): - llvm_cbe_c_2__PHI_TEMPORARY = llvm_cbe_tmp1112; /* for PHI node */ - llvm_cbe_code_addr_0__PHI_TEMPORARY = llvm_cbe_code_addr_18_0; /* for PHI node */ - goto llvm_cbe_bb182; - case ((unsigned int )75): - goto llvm_cbe_bb130; - break; - case ((unsigned int )76): - goto llvm_cbe_bb130; - break; - } -llvm_cbe_bb130: - llvm_cbe_tmp133 = *(&llvm_cbe_code_addr_18_0[((unsigned int )34)]); - llvm_cbe_tmp138 = *(&llvm_cbe_code_addr_18_0[((unsigned int )35)]); - if ((((signed int )(((((unsigned int )(unsigned char )llvm_cbe_tmp133)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp138)))) > ((signed int )((unsigned int )0)))) { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - } else { - llvm_cbe_c_2__PHI_TEMPORARY = llvm_cbe_tmp1112; /* for PHI node */ - llvm_cbe_code_addr_0__PHI_TEMPORARY = llvm_cbe_code_addr_18_0; /* for PHI node */ - goto llvm_cbe_bb182; - } - - } while (1); /* end of syntactic loop 'bb' */ -llvm_cbe_return: - llvm_cbe_retval_0 = llvm_cbe_retval_0__PHI_TEMPORARY; - return llvm_cbe_retval_0; -llvm_cbe_UnifiedReturnBlock: - return ((unsigned int )1); -} - - -static unsigned int check_posix_syntax(unsigned char *llvm_cbe_ptr, unsigned char **llvm_cbe_endptr, struct l_struct_2E_compile_data *llvm_cbe_cd) { - unsigned char llvm_cbe_tmp4; - unsigned char *llvm_cbe_tmp7; - unsigned char llvm_cbe_tmp9; - unsigned char *llvm_cbe_tmp13; - unsigned char *llvm_cbe_ptr_addr_0_ph; - unsigned char *llvm_cbe_ptr_addr_0_ph__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp1957; - unsigned char llvm_cbe_tmp2158; - unsigned char llvm_cbe_tmp2461; - unsigned int llvm_cbe_ptr_addr_055_rec; - unsigned int llvm_cbe_ptr_addr_055_rec__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp15_rec; - unsigned char *llvm_cbe_tmp15; - unsigned char llvm_cbe_tmp21; - unsigned char llvm_cbe_tmp24; - unsigned char *llvm_cbe_ptr_addr_0_lcssa; - unsigned char *llvm_cbe_ptr_addr_0_lcssa__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp32; - unsigned char llvm_cbe_tmp41; - - llvm_cbe_tmp4 = *(&llvm_cbe_ptr[((unsigned int )1)]); - llvm_cbe_tmp7 = &llvm_cbe_ptr[((unsigned int )2)]; - llvm_cbe_tmp9 = *llvm_cbe_tmp7; - if ((llvm_cbe_tmp9 == ((unsigned char )94))) { - goto llvm_cbe_cond_true; - } else { - llvm_cbe_ptr_addr_0_ph__PHI_TEMPORARY = llvm_cbe_tmp7; /* for PHI node */ - goto llvm_cbe_bb16_preheader; - } - -llvm_cbe_cond_true: - llvm_cbe_tmp13 = &llvm_cbe_ptr[((unsigned int )3)]; - llvm_cbe_ptr_addr_0_ph__PHI_TEMPORARY = llvm_cbe_tmp13; /* for PHI node */ - goto llvm_cbe_bb16_preheader; - -llvm_cbe_bb16_preheader: - llvm_cbe_ptr_addr_0_ph = llvm_cbe_ptr_addr_0_ph__PHI_TEMPORARY; - llvm_cbe_tmp1957 = *(&llvm_cbe_cd->field3); - llvm_cbe_tmp2158 = *llvm_cbe_ptr_addr_0_ph; - llvm_cbe_tmp2461 = *(&llvm_cbe_tmp1957[(((unsigned int )(unsigned char )llvm_cbe_tmp2158))]); - if (((((unsigned char )(llvm_cbe_tmp2461 & ((unsigned char )2)))) == ((unsigned char )0))) { - llvm_cbe_ptr_addr_0_lcssa__PHI_TEMPORARY = llvm_cbe_ptr_addr_0_ph; /* for PHI node */ - goto llvm_cbe_bb30; - } else { - llvm_cbe_ptr_addr_055_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb; - } - - do { /* Syntactic loop 'bb' to make GCC happy */ -llvm_cbe_bb: - llvm_cbe_ptr_addr_055_rec = llvm_cbe_ptr_addr_055_rec__PHI_TEMPORARY; - llvm_cbe_tmp15_rec = llvm_cbe_ptr_addr_055_rec + ((unsigned int )1); - llvm_cbe_tmp15 = &llvm_cbe_ptr_addr_0_ph[llvm_cbe_tmp15_rec]; - llvm_cbe_tmp21 = *llvm_cbe_tmp15; - llvm_cbe_tmp24 = *(&llvm_cbe_tmp1957[(((unsigned int )(unsigned char )llvm_cbe_tmp21))]); - if (((((unsigned char )(llvm_cbe_tmp24 & ((unsigned char )2)))) == ((unsigned char )0))) { - llvm_cbe_ptr_addr_0_lcssa__PHI_TEMPORARY = llvm_cbe_tmp15; /* for PHI node */ - goto llvm_cbe_bb30; - } else { - llvm_cbe_ptr_addr_055_rec__PHI_TEMPORARY = llvm_cbe_tmp15_rec; /* for PHI node */ - goto llvm_cbe_bb; - } - - } while (1); /* end of syntactic loop 'bb' */ -llvm_cbe_bb30: - llvm_cbe_ptr_addr_0_lcssa = llvm_cbe_ptr_addr_0_lcssa__PHI_TEMPORARY; - llvm_cbe_tmp32 = *llvm_cbe_ptr_addr_0_lcssa; - if ((llvm_cbe_tmp32 == llvm_cbe_tmp4)) { - goto llvm_cbe_cond_true38; - } else { - goto llvm_cbe_UnifiedReturnBlock; - } - -llvm_cbe_cond_true38: - llvm_cbe_tmp41 = *(&llvm_cbe_ptr_addr_0_lcssa[((unsigned int )1)]); - if ((llvm_cbe_tmp41 == ((unsigned char )93))) { - goto llvm_cbe_cond_true45; - } else { - goto llvm_cbe_UnifiedReturnBlock; - } - -llvm_cbe_cond_true45: - *llvm_cbe_endptr = llvm_cbe_ptr_addr_0_lcssa; - return ((unsigned int )1); -llvm_cbe_UnifiedReturnBlock: - return ((unsigned int )0); -} - - -static void adjust_recurse(unsigned char *llvm_cbe_group, unsigned int llvm_cbe_adjust, struct l_struct_2E_compile_data *llvm_cbe_cd, unsigned char *llvm_cbe_save_hwm) { - unsigned char llvm_cbe_tmp10410; - unsigned char llvm_cbe_tmp6; - unsigned char *llvm_cbe_tmp10; - unsigned char llvm_cbe_tmp11; - unsigned int llvm_cbe_tmp13; - unsigned char *llvm_cbe_tmp16; - unsigned char *llvm_cbe_tmp5113; - unsigned int llvm_cbe_indvar_next; - unsigned int llvm_cbe_indvar; - unsigned int llvm_cbe_indvar__PHI_TEMPORARY; - unsigned int llvm_cbe_hc_1_rec; - unsigned char *llvm_cbe_hc_1; - unsigned char llvm_cbe_tmp59; - unsigned char *llvm_cbe_tmp63; - unsigned char llvm_cbe_tmp64; - unsigned int llvm_cbe_tmp66; - unsigned char *llvm_cbe_tmp70; - unsigned char *llvm_cbe_tmp96; - unsigned char llvm_cbe_tmp104; - unsigned int llvm_cbe_indvar_next49; - unsigned char *llvm_cbe_code_11_0_ph; - unsigned char *llvm_cbe_code_11_0_ph__PHI_TEMPORARY; - unsigned char **llvm_cbe_tmp42; - unsigned char **llvm_cbe_tmp15; - unsigned char llvm_cbe_tmp3233; - unsigned int llvm_cbe_indvar48; - unsigned int llvm_cbe_indvar48__PHI_TEMPORARY; - unsigned int llvm_cbe_code_11_0_rec; - unsigned char *llvm_cbe_tmp43; - unsigned char *llvm_cbe_tmp20; - unsigned char *llvm_cbe_code_11_1_ph_ph; - unsigned char *llvm_cbe_code_11_1_ph_ph__PHI_TEMPORARY; - unsigned int llvm_cbe_code_11_1_rec; - unsigned int llvm_cbe_code_11_1_rec__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp128; - unsigned char llvm_cbe_tmp133; - unsigned int llvm_cbe_tmp137_rec; - unsigned char *llvm_cbe_tmp137; - unsigned char llvm_cbe_tmp10425; - unsigned char *llvm_cbe_code_11_2_ph_ph; - unsigned char *llvm_cbe_code_11_2_ph_ph__PHI_TEMPORARY; - unsigned int llvm_cbe_code_11_2_rec; - unsigned int llvm_cbe_code_11_2_rec__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp1047_2; - unsigned char llvm_cbe_tmp1047_2__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp140; - unsigned int llvm_cbe_tmp143_rec; - unsigned char *llvm_cbe_tmp143; - unsigned char llvm_cbe_tmp10428; - - llvm_cbe_tmp10410 = *llvm_cbe_group; - switch (llvm_cbe_tmp10410) { - default: - llvm_cbe_code_11_2_ph_ph__PHI_TEMPORARY = llvm_cbe_group; /* for PHI node */ - llvm_cbe_code_11_2_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_tmp1047_2__PHI_TEMPORARY = llvm_cbe_tmp10410; /* for PHI node */ - goto llvm_cbe_cond_false; -; - case ((unsigned char )0): - goto llvm_cbe_UnifiedReturnBlock; - case ((unsigned char )81): - llvm_cbe_code_11_0_ph__PHI_TEMPORARY = llvm_cbe_group; /* for PHI node */ - goto llvm_cbe_cond_true117_preheader; - case ((unsigned char )79): - llvm_cbe_code_11_1_ph_ph__PHI_TEMPORARY = llvm_cbe_group; /* for PHI node */ - llvm_cbe_code_11_1_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_cond_true125; - } -llvm_cbe_cond_true117_preheader: - llvm_cbe_code_11_0_ph = llvm_cbe_code_11_0_ph__PHI_TEMPORARY; - llvm_cbe_tmp42 = &llvm_cbe_cd->field8; - llvm_cbe_tmp15 = &llvm_cbe_cd->field5; - llvm_cbe_tmp3233 = ((unsigned char )llvm_cbe_adjust); - llvm_cbe_indvar48__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_cond_true117; - - do { /* Syntactic loop 'cond_true117' to make GCC happy */ -llvm_cbe_cond_true117: - llvm_cbe_indvar48 = llvm_cbe_indvar48__PHI_TEMPORARY; - llvm_cbe_code_11_0_rec = llvm_cbe_indvar48 * ((unsigned int )3); - if (((&llvm_cbe_code_11_0_ph[llvm_cbe_code_11_0_rec]) == ((unsigned char *)/*NULL*/0))) { - goto llvm_cbe_UnifiedReturnBlock; - } else { - goto llvm_cbe_bb40_preheader; - } - -llvm_cbe_cond_next94: - llvm_cbe_tmp96 = &llvm_cbe_code_11_0_ph[(llvm_cbe_code_11_0_rec + ((unsigned int )3))]; - llvm_cbe_tmp104 = *llvm_cbe_tmp96; - llvm_cbe_indvar_next49 = llvm_cbe_indvar48 + ((unsigned int )1); - switch (llvm_cbe_tmp104) { - default: - llvm_cbe_code_11_2_ph_ph__PHI_TEMPORARY = llvm_cbe_tmp96; /* for PHI node */ - llvm_cbe_code_11_2_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_tmp1047_2__PHI_TEMPORARY = llvm_cbe_tmp104; /* for PHI node */ - goto llvm_cbe_cond_false; -; - case ((unsigned char )0): - goto llvm_cbe_UnifiedReturnBlock; - case ((unsigned char )81): - llvm_cbe_indvar48__PHI_TEMPORARY = llvm_cbe_indvar_next49; /* for PHI node */ - goto llvm_cbe_cond_true117; - case ((unsigned char )79): - llvm_cbe_code_11_1_ph_ph__PHI_TEMPORARY = llvm_cbe_tmp96; /* for PHI node */ - llvm_cbe_code_11_1_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_cond_true125; - } -llvm_cbe_cond_true: - *llvm_cbe_hc_1 = (((unsigned char )(((unsigned int )(((unsigned int )(llvm_cbe_tmp13 + llvm_cbe_adjust)) >> ((unsigned int )((unsigned int )8))))))); - *llvm_cbe_tmp10 = (((unsigned char )((((unsigned char )llvm_cbe_tmp13)) + llvm_cbe_tmp3233))); - llvm_cbe_tmp5113 = *llvm_cbe_tmp42; - if ((((unsigned char *)llvm_cbe_tmp5113) > ((unsigned char *)llvm_cbe_hc_1))) { - goto llvm_cbe_cond_next94; - } else { - goto llvm_cbe_cond_true56; - } - - do { /* Syntactic loop 'bb40' to make GCC happy */ -llvm_cbe_bb40: - llvm_cbe_indvar = llvm_cbe_indvar__PHI_TEMPORARY; - llvm_cbe_hc_1_rec = llvm_cbe_indvar << ((unsigned int )1); - llvm_cbe_hc_1 = &llvm_cbe_save_hwm[llvm_cbe_hc_1_rec]; - if ((((unsigned char *)llvm_cbe_tmp43) > ((unsigned char *)llvm_cbe_hc_1))) { - goto llvm_cbe_bb3; - } else { - goto llvm_cbe_cond_true56; - } - -llvm_cbe_cond_next: - llvm_cbe_indvar_next = llvm_cbe_indvar + ((unsigned int )1); - llvm_cbe_indvar__PHI_TEMPORARY = llvm_cbe_indvar_next; /* for PHI node */ - goto llvm_cbe_bb40; - -llvm_cbe_bb3: - llvm_cbe_tmp6 = *llvm_cbe_hc_1; - llvm_cbe_tmp10 = &llvm_cbe_save_hwm[(llvm_cbe_hc_1_rec | ((unsigned int )1))]; - llvm_cbe_tmp11 = *llvm_cbe_tmp10; - llvm_cbe_tmp13 = ((((unsigned int )(unsigned char )llvm_cbe_tmp6)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp11)); - llvm_cbe_tmp16 = *llvm_cbe_tmp15; - if (((&llvm_cbe_tmp16[llvm_cbe_tmp13]) == llvm_cbe_tmp20)) { - goto llvm_cbe_cond_true; - } else { - goto llvm_cbe_cond_next; - } - - } while (1); /* end of syntactic loop 'bb40' */ -llvm_cbe_bb40_preheader: - llvm_cbe_tmp43 = *llvm_cbe_tmp42; - llvm_cbe_tmp20 = &llvm_cbe_code_11_0_ph[(llvm_cbe_code_11_0_rec + ((unsigned int )1))]; - llvm_cbe_indvar__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb40; - -llvm_cbe_cond_true56: - llvm_cbe_tmp59 = *llvm_cbe_tmp20; - llvm_cbe_tmp63 = &llvm_cbe_code_11_0_ph[(llvm_cbe_code_11_0_rec + ((unsigned int )2))]; - llvm_cbe_tmp64 = *llvm_cbe_tmp63; - llvm_cbe_tmp66 = ((((unsigned int )(unsigned char )llvm_cbe_tmp59)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp64)); - llvm_cbe_tmp70 = *llvm_cbe_tmp15; - if ((((unsigned char *)(&llvm_cbe_tmp70[llvm_cbe_tmp66])) < ((unsigned char *)llvm_cbe_group))) { - goto llvm_cbe_cond_next94; - } else { - goto llvm_cbe_cond_true77; - } - -llvm_cbe_cond_true77: - *llvm_cbe_tmp20 = (((unsigned char )(((unsigned int )(((unsigned int )(llvm_cbe_tmp66 + llvm_cbe_adjust)) >> ((unsigned int )((unsigned int )8))))))); - *llvm_cbe_tmp63 = (((unsigned char )((((unsigned char )llvm_cbe_tmp66)) + llvm_cbe_tmp3233))); - goto llvm_cbe_cond_next94; - - } while (1); /* end of syntactic loop 'cond_true117' */ - do { /* Syntactic loop 'cond_true125' to make GCC happy */ -llvm_cbe_cond_true125: - llvm_cbe_code_11_1_ph_ph = llvm_cbe_code_11_1_ph_ph__PHI_TEMPORARY; - llvm_cbe_code_11_1_rec = llvm_cbe_code_11_1_rec__PHI_TEMPORARY; - llvm_cbe_tmp128 = *(&llvm_cbe_code_11_1_ph_ph[(llvm_cbe_code_11_1_rec + ((unsigned int )1))]); - llvm_cbe_tmp133 = *(&llvm_cbe_code_11_1_ph_ph[(llvm_cbe_code_11_1_rec + ((unsigned int )2))]); - llvm_cbe_tmp137_rec = llvm_cbe_code_11_1_rec + (((((unsigned int )(unsigned char )llvm_cbe_tmp128)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp133))); - llvm_cbe_tmp137 = &llvm_cbe_code_11_1_ph_ph[llvm_cbe_tmp137_rec]; - llvm_cbe_tmp10425 = *llvm_cbe_tmp137; - switch (llvm_cbe_tmp10425) { - default: - llvm_cbe_code_11_2_ph_ph__PHI_TEMPORARY = llvm_cbe_tmp137; /* for PHI node */ - llvm_cbe_code_11_2_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_tmp1047_2__PHI_TEMPORARY = llvm_cbe_tmp10425; /* for PHI node */ - goto llvm_cbe_cond_false; -; - case ((unsigned char )0): - goto llvm_cbe_UnifiedReturnBlock; - case ((unsigned char )81): - llvm_cbe_code_11_0_ph__PHI_TEMPORARY = llvm_cbe_tmp137; /* for PHI node */ - goto llvm_cbe_cond_true117_preheader; - case ((unsigned char )79): - llvm_cbe_code_11_1_ph_ph__PHI_TEMPORARY = llvm_cbe_code_11_1_ph_ph; /* for PHI node */ - llvm_cbe_code_11_1_rec__PHI_TEMPORARY = llvm_cbe_tmp137_rec; /* for PHI node */ - goto llvm_cbe_cond_true125; - } - } while (1); /* end of syntactic loop 'cond_true125' */ - do { /* Syntactic loop 'cond_false' to make GCC happy */ -llvm_cbe_cond_false: - llvm_cbe_code_11_2_ph_ph = llvm_cbe_code_11_2_ph_ph__PHI_TEMPORARY; - llvm_cbe_code_11_2_rec = llvm_cbe_code_11_2_rec__PHI_TEMPORARY; - llvm_cbe_tmp1047_2 = llvm_cbe_tmp1047_2__PHI_TEMPORARY; - llvm_cbe_tmp140 = *(&_pcre_OP_lengths[(((unsigned int )(unsigned char )llvm_cbe_tmp1047_2))]); - llvm_cbe_tmp143_rec = llvm_cbe_code_11_2_rec + (((unsigned int )(unsigned char )llvm_cbe_tmp140)); - llvm_cbe_tmp143 = &llvm_cbe_code_11_2_ph_ph[llvm_cbe_tmp143_rec]; - llvm_cbe_tmp10428 = *llvm_cbe_tmp143; - switch (llvm_cbe_tmp10428) { - default: - llvm_cbe_code_11_2_ph_ph__PHI_TEMPORARY = llvm_cbe_code_11_2_ph_ph; /* for PHI node */ - llvm_cbe_code_11_2_rec__PHI_TEMPORARY = llvm_cbe_tmp143_rec; /* for PHI node */ - llvm_cbe_tmp1047_2__PHI_TEMPORARY = llvm_cbe_tmp10428; /* for PHI node */ - goto llvm_cbe_cond_false; -; - case ((unsigned char )0): - goto llvm_cbe_UnifiedReturnBlock; - break; - case ((unsigned char )81): - llvm_cbe_code_11_0_ph__PHI_TEMPORARY = llvm_cbe_tmp143; /* for PHI node */ - goto llvm_cbe_cond_true117_preheader; - case ((unsigned char )79): - llvm_cbe_code_11_1_ph_ph__PHI_TEMPORARY = llvm_cbe_tmp143; /* for PHI node */ - llvm_cbe_code_11_1_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_cond_true125; - } - } while (1); /* end of syntactic loop 'cond_false' */ -llvm_cbe_UnifiedReturnBlock: - return; -} - - -static unsigned int check_auto_possessive(unsigned int llvm_cbe_op_code, unsigned int llvm_cbe_item, unsigned char *llvm_cbe_ptr, unsigned int llvm_cbe_options, struct l_struct_2E_compile_data *llvm_cbe_cd) { - unsigned char *llvm_cbe_ptr_addr; /* Address-exposed local */ - unsigned int llvm_cbe_temperrorcode; /* Address-exposed local */ - unsigned char **llvm_cbe_tmp10161; - unsigned int *llvm_cbe_tmp30; - unsigned char **llvm_cbe_tmp37; - unsigned int *llvm_cbe_tmp45; - unsigned char *llvm_cbe_tmp83; - unsigned char *llvm_cbe_tmp103; - unsigned char *llvm_cbe_tmp6171; - unsigned char *llvm_cbe_tmp6171__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp7; - unsigned char llvm_cbe_tmp13; - unsigned char llvm_cbe_tmp16; - unsigned char *llvm_cbe_tmp11162; - unsigned char *llvm_cbe_tmp12163; - unsigned char llvm_cbe_tmp13164; - unsigned char llvm_cbe_tmp16167; - unsigned char *llvm_cbe_tmp6_lcssa; - unsigned char *llvm_cbe_tmp6_lcssa__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp23; - unsigned int llvm_cbe_tmp31; - unsigned char *llvm_cbe_tmp38; - unsigned int llvm_cbe_tmp54; - unsigned int llvm_cbe_tmp69; - unsigned char llvm_cbe_tmp84; - unsigned char llvm_cbe_tmp100; - unsigned char llvm_cbe_tmp104; - unsigned char *llvm_cbe_tmp117; - unsigned int llvm_cbe_tmp120; - unsigned char *llvm_cbe_tmp124; - unsigned char *llvm_cbe_tmp125; - unsigned char llvm_cbe_tmp127; - unsigned char *llvm_cbe_tmp136; - unsigned char llvm_cbe_tmp137; - unsigned int llvm_cbe_tmp144; - unsigned int llvm_cbe_tmp146; - unsigned int llvm_cbe_tmp147; - unsigned char *llvm_cbe_tmp154; - unsigned char *llvm_cbe_tmp159; - unsigned int llvm_cbe_tmp161162; - unsigned char llvm_cbe_tmp164; - unsigned int llvm_cbe_next_018_0_ph; - unsigned int llvm_cbe_next_018_0_ph__PHI_TEMPORARY; - unsigned char **llvm_cbe_tmp189172; - unsigned int *llvm_cbe_tmp209; - unsigned char **llvm_cbe_tmp216; - unsigned int *llvm_cbe_tmp225; - unsigned char *llvm_cbe_tmp264; - unsigned char *llvm_cbe_tmp284; - unsigned char *llvm_cbe_tmp185182; - unsigned char *llvm_cbe_tmp185182__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp186; - unsigned char llvm_cbe_tmp192; - unsigned char llvm_cbe_tmp195; - unsigned char *llvm_cbe_tmp190173; - unsigned char *llvm_cbe_tmp191174; - unsigned char llvm_cbe_tmp192175; - unsigned char llvm_cbe_tmp195178; - unsigned char *llvm_cbe_tmp185_lcssa; - unsigned char *llvm_cbe_tmp185_lcssa__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp202; - unsigned int llvm_cbe_tmp210; - unsigned char *llvm_cbe_tmp217; - unsigned int llvm_cbe_tmp234; - unsigned int llvm_cbe_tmp250; - unsigned char llvm_cbe_tmp265; - unsigned char llvm_cbe_tmp281; - unsigned char llvm_cbe_tmp285; - unsigned char *llvm_cbe_tmp298; - unsigned int llvm_cbe_tmp301; - unsigned char *llvm_cbe_tmp305; - unsigned char *llvm_cbe_tmp306; - unsigned char llvm_cbe_tmp308; - unsigned int llvm_cbe_next_018_1; - unsigned int llvm_cbe_next_018_1__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp317; - unsigned char llvm_cbe_tmp318; - unsigned int llvm_cbe_tmp334; - unsigned char *llvm_cbe_tmp364; - unsigned char llvm_cbe_tmp367; - unsigned char *llvm_cbe_tmp399; - unsigned char llvm_cbe_tmp402; - unsigned char *llvm_cbe_tmp417; - unsigned char llvm_cbe_tmp420; - unsigned char *llvm_cbe_tmp441; - unsigned char llvm_cbe_tmp444; - unsigned char *llvm_cbe_tmp467; - unsigned char llvm_cbe_tmp470; - unsigned char *llvm_cbe_tmp490; - unsigned char llvm_cbe_tmp493; - unsigned char *llvm_cbe_tmp515; - unsigned char llvm_cbe_tmp518; - unsigned char *llvm_cbe_tmp539; - unsigned char llvm_cbe_tmp542; - unsigned char *llvm_cbe_tmp623; - unsigned char llvm_cbe_tmp626; - unsigned char *llvm_cbe_tmp647; - unsigned char llvm_cbe_tmp650; - unsigned char *llvm_cbe_tmp673; - unsigned char llvm_cbe_tmp676; - unsigned char *llvm_cbe_tmp696; - unsigned char llvm_cbe_tmp699; - unsigned char *llvm_cbe_tmp721; - unsigned char llvm_cbe_tmp724; - unsigned char *llvm_cbe_tmp745; - unsigned char llvm_cbe_tmp748; - unsigned int llvm_cbe_retval_0; - unsigned int llvm_cbe_retval_0__PHI_TEMPORARY; - - *(&llvm_cbe_ptr_addr) = llvm_cbe_ptr; - if (((llvm_cbe_options & ((unsigned int )8)) == ((unsigned int )0))) { - goto llvm_cbe_cond_next135; - } else { - goto llvm_cbe_bb8_preheader; - } - -llvm_cbe_bb8_preheader: - llvm_cbe_tmp10161 = &llvm_cbe_cd->field3; - llvm_cbe_tmp30 = &llvm_cbe_cd->field18; - llvm_cbe_tmp37 = &llvm_cbe_cd->field7; - llvm_cbe_tmp45 = &llvm_cbe_cd->field19; - llvm_cbe_tmp83 = &llvm_cbe_cd->field20[((unsigned int )0)]; - llvm_cbe_tmp103 = &llvm_cbe_cd->field20[((unsigned int )1)]; - goto llvm_cbe_bb8_outer; - - do { /* Syntactic loop 'bb8.outer' to make GCC happy */ -llvm_cbe_bb8_outer: - llvm_cbe_tmp11162 = *llvm_cbe_tmp10161; - llvm_cbe_tmp12163 = *(&llvm_cbe_ptr_addr); - llvm_cbe_tmp13164 = *llvm_cbe_tmp12163; - llvm_cbe_tmp16167 = *(&llvm_cbe_tmp11162[(((unsigned int )(unsigned char )llvm_cbe_tmp13164))]); - if (((((unsigned char )(llvm_cbe_tmp16167 & ((unsigned char )1)))) == ((unsigned char )0))) { - llvm_cbe_tmp6_lcssa__PHI_TEMPORARY = llvm_cbe_tmp12163; /* for PHI node */ - goto llvm_cbe_bb21; - } else { - llvm_cbe_tmp6171__PHI_TEMPORARY = llvm_cbe_tmp12163; /* for PHI node */ - goto llvm_cbe_bb5; - } - -llvm_cbe_cond_true116: - llvm_cbe_tmp117 = *(&llvm_cbe_ptr_addr); - llvm_cbe_tmp120 = *llvm_cbe_tmp45; - *(&llvm_cbe_ptr_addr) = (&llvm_cbe_tmp117[llvm_cbe_tmp120]); - goto llvm_cbe_bb8_outer; - - do { /* Syntactic loop 'bb123' to make GCC happy */ -llvm_cbe_bb123: - llvm_cbe_tmp124 = *(&llvm_cbe_ptr_addr); - llvm_cbe_tmp125 = &llvm_cbe_tmp124[((unsigned int )1)]; - *(&llvm_cbe_ptr_addr) = llvm_cbe_tmp125; - llvm_cbe_tmp127 = *llvm_cbe_tmp125; - if ((llvm_cbe_tmp127 == ((unsigned char )0))) { - goto llvm_cbe_bb8_outer; - } else { - goto llvm_cbe_bb28; - } - -llvm_cbe_cond_true35: - if ((((unsigned char *)llvm_cbe_tmp38) > ((unsigned char *)llvm_cbe_tmp125))) { - goto llvm_cbe_cond_next; - } else { - goto llvm_cbe_bb123; - } - -llvm_cbe_bb28: - llvm_cbe_tmp31 = *llvm_cbe_tmp30; - llvm_cbe_tmp38 = *llvm_cbe_tmp37; - if ((llvm_cbe_tmp31 == ((unsigned int )0))) { - goto llvm_cbe_cond_false; - } else { - goto llvm_cbe_cond_true35; - } - -llvm_cbe_cond_next: - llvm_cbe_tmp54 = _pcre_is_newline(llvm_cbe_tmp125, llvm_cbe_tmp31, llvm_cbe_tmp38, llvm_cbe_tmp45); - if ((llvm_cbe_tmp54 == ((unsigned int )0))) { - goto llvm_cbe_bb123; - } else { - goto llvm_cbe_cond_true116; - } - -llvm_cbe_cond_false: - llvm_cbe_tmp69 = *llvm_cbe_tmp45; - if ((((unsigned char *)(&llvm_cbe_tmp38[(-(llvm_cbe_tmp69))])) < ((unsigned char *)llvm_cbe_tmp125))) { - goto llvm_cbe_bb123; - } else { - goto llvm_cbe_cond_next77; - } - -llvm_cbe_cond_next77: - llvm_cbe_tmp84 = *llvm_cbe_tmp83; - if ((llvm_cbe_tmp127 == llvm_cbe_tmp84)) { - goto llvm_cbe_cond_next89; - } else { - goto llvm_cbe_bb123; - } - -llvm_cbe_cond_next97: - llvm_cbe_tmp100 = *(&llvm_cbe_tmp124[((unsigned int )2)]); - llvm_cbe_tmp104 = *llvm_cbe_tmp103; - if ((llvm_cbe_tmp100 == llvm_cbe_tmp104)) { - goto llvm_cbe_cond_true116; - } else { - goto llvm_cbe_bb123; - } - -llvm_cbe_cond_next89: - if ((llvm_cbe_tmp69 == ((unsigned int )1))) { - goto llvm_cbe_cond_true116; - } else { - goto llvm_cbe_cond_next97; - } - - } while (1); /* end of syntactic loop 'bb123' */ -llvm_cbe_bb21: - llvm_cbe_tmp6_lcssa = llvm_cbe_tmp6_lcssa__PHI_TEMPORARY; - llvm_cbe_tmp23 = *llvm_cbe_tmp6_lcssa; - if ((llvm_cbe_tmp23 == ((unsigned char )35))) { - goto llvm_cbe_bb123; - } else { - goto llvm_cbe_cond_next135; - } - - do { /* Syntactic loop 'bb5' to make GCC happy */ -llvm_cbe_bb5: - llvm_cbe_tmp6171 = llvm_cbe_tmp6171__PHI_TEMPORARY; - llvm_cbe_tmp7 = &llvm_cbe_tmp6171[((unsigned int )1)]; - *(&llvm_cbe_ptr_addr) = llvm_cbe_tmp7; - llvm_cbe_tmp13 = *llvm_cbe_tmp7; - llvm_cbe_tmp16 = *(&llvm_cbe_tmp11162[(((unsigned int )(unsigned char )llvm_cbe_tmp13))]); - if (((((unsigned char )(llvm_cbe_tmp16 & ((unsigned char )1)))) == ((unsigned char )0))) { - llvm_cbe_tmp6_lcssa__PHI_TEMPORARY = llvm_cbe_tmp7; /* for PHI node */ - goto llvm_cbe_bb21; - } else { - llvm_cbe_tmp6171__PHI_TEMPORARY = llvm_cbe_tmp7; /* for PHI node */ - goto llvm_cbe_bb5; - } - - } while (1); /* end of syntactic loop 'bb5' */ - } while (1); /* end of syntactic loop 'bb8.outer' */ -llvm_cbe_cond_next135: - llvm_cbe_tmp136 = *(&llvm_cbe_ptr_addr); - llvm_cbe_tmp137 = *llvm_cbe_tmp136; - if ((llvm_cbe_tmp137 == ((unsigned char )92))) { - goto llvm_cbe_cond_true141; - } else { - goto llvm_cbe_cond_false156; - } - -llvm_cbe_cond_true141: - *(&llvm_cbe_temperrorcode) = ((unsigned int )0); - llvm_cbe_tmp144 = *(&llvm_cbe_cd->field12); - llvm_cbe_tmp146 = check_escape((&llvm_cbe_ptr_addr), (&llvm_cbe_temperrorcode), llvm_cbe_tmp144, llvm_cbe_options, ((unsigned int )0)); - llvm_cbe_tmp147 = *(&llvm_cbe_temperrorcode); - if ((llvm_cbe_tmp147 == ((unsigned int )0))) { - goto llvm_cbe_cond_next153; - } else { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - } - -llvm_cbe_cond_next153: - llvm_cbe_tmp154 = *(&llvm_cbe_ptr_addr); - *(&llvm_cbe_ptr_addr) = (&llvm_cbe_tmp154[((unsigned int )1)]); - if (((llvm_cbe_options & ((unsigned int )8)) == ((unsigned int )0))) { - llvm_cbe_next_018_1__PHI_TEMPORARY = llvm_cbe_tmp146; /* for PHI node */ - goto llvm_cbe_cond_next316; - } else { - llvm_cbe_next_018_0_ph__PHI_TEMPORARY = llvm_cbe_tmp146; /* for PHI node */ - goto llvm_cbe_bb187_preheader; - } - -llvm_cbe_cond_false156: - llvm_cbe_tmp159 = *(&llvm_cbe_cd->field3); - llvm_cbe_tmp161162 = ((unsigned int )(unsigned char )llvm_cbe_tmp137); - llvm_cbe_tmp164 = *(&llvm_cbe_tmp159[llvm_cbe_tmp161162]); - if ((((signed char )llvm_cbe_tmp164) > ((signed char )((unsigned char )-1)))) { - goto llvm_cbe_cond_true168; - } else { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - } - -llvm_cbe_cond_true168: - *(&llvm_cbe_ptr_addr) = (&llvm_cbe_tmp136[((unsigned int )1)]); - if (((llvm_cbe_options & ((unsigned int )8)) == ((unsigned int )0))) { - llvm_cbe_next_018_1__PHI_TEMPORARY = llvm_cbe_tmp161162; /* for PHI node */ - goto llvm_cbe_cond_next316; - } else { - llvm_cbe_next_018_0_ph__PHI_TEMPORARY = llvm_cbe_tmp161162; /* for PHI node */ - goto llvm_cbe_bb187_preheader; - } - -llvm_cbe_bb187_preheader: - llvm_cbe_next_018_0_ph = llvm_cbe_next_018_0_ph__PHI_TEMPORARY; - llvm_cbe_tmp189172 = &llvm_cbe_cd->field3; - llvm_cbe_tmp209 = &llvm_cbe_cd->field18; - llvm_cbe_tmp216 = &llvm_cbe_cd->field7; - llvm_cbe_tmp225 = &llvm_cbe_cd->field19; - llvm_cbe_tmp264 = &llvm_cbe_cd->field20[((unsigned int )0)]; - llvm_cbe_tmp284 = &llvm_cbe_cd->field20[((unsigned int )1)]; - goto llvm_cbe_bb187_outer; - - do { /* Syntactic loop 'bb187.outer' to make GCC happy */ -llvm_cbe_bb187_outer: - llvm_cbe_tmp190173 = *llvm_cbe_tmp189172; - llvm_cbe_tmp191174 = *(&llvm_cbe_ptr_addr); - llvm_cbe_tmp192175 = *llvm_cbe_tmp191174; - llvm_cbe_tmp195178 = *(&llvm_cbe_tmp190173[(((unsigned int )(unsigned char )llvm_cbe_tmp192175))]); - if (((((unsigned char )(llvm_cbe_tmp195178 & ((unsigned char )1)))) == ((unsigned char )0))) { - llvm_cbe_tmp185_lcssa__PHI_TEMPORARY = llvm_cbe_tmp191174; /* for PHI node */ - goto llvm_cbe_bb200; - } else { - llvm_cbe_tmp185182__PHI_TEMPORARY = llvm_cbe_tmp191174; /* for PHI node */ - goto llvm_cbe_bb184; - } - -llvm_cbe_cond_true297: - llvm_cbe_tmp298 = *(&llvm_cbe_ptr_addr); - llvm_cbe_tmp301 = *llvm_cbe_tmp225; - *(&llvm_cbe_ptr_addr) = (&llvm_cbe_tmp298[llvm_cbe_tmp301]); - goto llvm_cbe_bb187_outer; - - do { /* Syntactic loop 'bb304' to make GCC happy */ -llvm_cbe_bb304: - llvm_cbe_tmp305 = *(&llvm_cbe_ptr_addr); - llvm_cbe_tmp306 = &llvm_cbe_tmp305[((unsigned int )1)]; - *(&llvm_cbe_ptr_addr) = llvm_cbe_tmp306; - llvm_cbe_tmp308 = *llvm_cbe_tmp306; - if ((llvm_cbe_tmp308 == ((unsigned char )0))) { - goto llvm_cbe_bb187_outer; - } else { - goto llvm_cbe_bb207; - } - -llvm_cbe_cond_true214: - if ((((unsigned char *)llvm_cbe_tmp217) > ((unsigned char *)llvm_cbe_tmp306))) { - goto llvm_cbe_cond_next223; - } else { - goto llvm_cbe_bb304; - } - -llvm_cbe_bb207: - llvm_cbe_tmp210 = *llvm_cbe_tmp209; - llvm_cbe_tmp217 = *llvm_cbe_tmp216; - if ((llvm_cbe_tmp210 == ((unsigned int )0))) { - goto llvm_cbe_cond_false244; - } else { - goto llvm_cbe_cond_true214; - } - -llvm_cbe_cond_next223: - llvm_cbe_tmp234 = _pcre_is_newline(llvm_cbe_tmp306, llvm_cbe_tmp210, llvm_cbe_tmp217, llvm_cbe_tmp225); - if ((llvm_cbe_tmp234 == ((unsigned int )0))) { - goto llvm_cbe_bb304; - } else { - goto llvm_cbe_cond_true297; - } - -llvm_cbe_cond_false244: - llvm_cbe_tmp250 = *llvm_cbe_tmp225; - if ((((unsigned char *)(&llvm_cbe_tmp217[(-(llvm_cbe_tmp250))])) < ((unsigned char *)llvm_cbe_tmp306))) { - goto llvm_cbe_bb304; - } else { - goto llvm_cbe_cond_next258; - } - -llvm_cbe_cond_next258: - llvm_cbe_tmp265 = *llvm_cbe_tmp264; - if ((llvm_cbe_tmp308 == llvm_cbe_tmp265)) { - goto llvm_cbe_cond_next270; - } else { - goto llvm_cbe_bb304; - } - -llvm_cbe_cond_next278: - llvm_cbe_tmp281 = *(&llvm_cbe_tmp305[((unsigned int )2)]); - llvm_cbe_tmp285 = *llvm_cbe_tmp284; - if ((llvm_cbe_tmp281 == llvm_cbe_tmp285)) { - goto llvm_cbe_cond_true297; - } else { - goto llvm_cbe_bb304; - } - -llvm_cbe_cond_next270: - if ((llvm_cbe_tmp250 == ((unsigned int )1))) { - goto llvm_cbe_cond_true297; - } else { - goto llvm_cbe_cond_next278; - } - - } while (1); /* end of syntactic loop 'bb304' */ -llvm_cbe_bb200: - llvm_cbe_tmp185_lcssa = llvm_cbe_tmp185_lcssa__PHI_TEMPORARY; - llvm_cbe_tmp202 = *llvm_cbe_tmp185_lcssa; - if ((llvm_cbe_tmp202 == ((unsigned char )35))) { - goto llvm_cbe_bb304; - } else { - llvm_cbe_next_018_1__PHI_TEMPORARY = llvm_cbe_next_018_0_ph; /* for PHI node */ - goto llvm_cbe_cond_next316; - } - - do { /* Syntactic loop 'bb184' to make GCC happy */ -llvm_cbe_bb184: - llvm_cbe_tmp185182 = llvm_cbe_tmp185182__PHI_TEMPORARY; - llvm_cbe_tmp186 = &llvm_cbe_tmp185182[((unsigned int )1)]; - *(&llvm_cbe_ptr_addr) = llvm_cbe_tmp186; - llvm_cbe_tmp192 = *llvm_cbe_tmp186; - llvm_cbe_tmp195 = *(&llvm_cbe_tmp190173[(((unsigned int )(unsigned char )llvm_cbe_tmp192))]); - if (((((unsigned char )(llvm_cbe_tmp195 & ((unsigned char )1)))) == ((unsigned char )0))) { - llvm_cbe_tmp185_lcssa__PHI_TEMPORARY = llvm_cbe_tmp186; /* for PHI node */ - goto llvm_cbe_bb200; - } else { - llvm_cbe_tmp185182__PHI_TEMPORARY = llvm_cbe_tmp186; /* for PHI node */ - goto llvm_cbe_bb184; - } - - } while (1); /* end of syntactic loop 'bb184' */ - } while (1); /* end of syntactic loop 'bb187.outer' */ -llvm_cbe_cond_next316: - llvm_cbe_next_018_1 = llvm_cbe_next_018_1__PHI_TEMPORARY; - llvm_cbe_tmp317 = *(&llvm_cbe_ptr_addr); - llvm_cbe_tmp318 = *llvm_cbe_tmp317; - switch (llvm_cbe_tmp318) { - default: - goto llvm_cbe_cond_next331; -; - case ((unsigned char )42): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned char )63): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - } -llvm_cbe_cond_next331: - llvm_cbe_tmp334 = strncmp(llvm_cbe_tmp317, (&(_2E_str73[((unsigned int )0)])), ((unsigned int )3)); - if ((llvm_cbe_tmp334 == ((unsigned int )0))) { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - } else { - goto llvm_cbe_bb340; - } - -llvm_cbe_bb340: - if ((((signed int )llvm_cbe_next_018_1) > ((signed int )((unsigned int )-1)))) { - goto llvm_cbe_cond_true345; - } else { - goto llvm_cbe_cond_next608; - } - -llvm_cbe_cond_true345: - switch (llvm_cbe_op_code) { - default: - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; -; - case ((unsigned int )6): - goto llvm_cbe_bb432; - case ((unsigned int )7): - goto llvm_cbe_bb408; - case ((unsigned int )8): - goto llvm_cbe_bb481; - case ((unsigned int )9): - goto llvm_cbe_bb458; - case ((unsigned int )10): - goto llvm_cbe_bb530; - case ((unsigned int )11): - goto llvm_cbe_bb506; - case ((unsigned int )17): - goto llvm_cbe_bb557; - case ((unsigned int )18): - goto llvm_cbe_bb557; - case ((unsigned int )19): - goto llvm_cbe_bb588; - case ((unsigned int )20): - goto llvm_cbe_bb588; - case ((unsigned int )27): - goto llvm_cbe_bb347; - break; - case ((unsigned int )28): - goto llvm_cbe_bb353; - case ((unsigned int )29): - goto llvm_cbe_bb373; - } -llvm_cbe_bb347: - return (((unsigned int )(bool )(llvm_cbe_next_018_1 != llvm_cbe_item))); -llvm_cbe_bb353: - if ((llvm_cbe_next_018_1 == llvm_cbe_item)) { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - } else { - goto llvm_cbe_cond_next361; - } - -llvm_cbe_cond_next361: - llvm_cbe_tmp364 = *(&llvm_cbe_cd->field1); - llvm_cbe_tmp367 = *(&llvm_cbe_tmp364[llvm_cbe_next_018_1]); - return (((unsigned int )(bool )((((unsigned int )(unsigned char )llvm_cbe_tmp367)) != llvm_cbe_item))); -llvm_cbe_bb373: - if ((((signed int )llvm_cbe_next_018_1) < ((signed int )((unsigned int )0)))) { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - } else { - goto llvm_cbe_cond_next380; - } - -llvm_cbe_cond_next380: - if ((llvm_cbe_next_018_1 == llvm_cbe_item)) { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_return; - } else { - goto llvm_cbe_cond_next388; - } - -llvm_cbe_cond_next388: - if (((llvm_cbe_options & ((unsigned int )1)) == ((unsigned int )0))) { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - } else { - goto llvm_cbe_cond_next396; - } - -llvm_cbe_cond_next396: - llvm_cbe_tmp399 = *(&llvm_cbe_cd->field1); - llvm_cbe_tmp402 = *(&llvm_cbe_tmp399[llvm_cbe_next_018_1]); - return (((unsigned int )(bool )((((unsigned int )(unsigned char )llvm_cbe_tmp402)) == llvm_cbe_item))); -llvm_cbe_bb408: - if ((((signed int )llvm_cbe_next_018_1) > ((signed int )((unsigned int )127)))) { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_return; - } else { - goto llvm_cbe_cond_next414; - } - -llvm_cbe_cond_next414: - llvm_cbe_tmp417 = *(&llvm_cbe_cd->field3); - llvm_cbe_tmp420 = *(&llvm_cbe_tmp417[llvm_cbe_next_018_1]); - return (((unsigned int )(unsigned char )(((unsigned char )((((unsigned char )((((unsigned char )(((unsigned char )(((unsigned char )llvm_cbe_tmp420) >> ((unsigned char )((unsigned char )2))))))) & ((unsigned char )1)))) ^ ((unsigned char )1)))))); -llvm_cbe_bb432: - if ((((signed int )llvm_cbe_next_018_1) > ((signed int )((unsigned int )127)))) { - goto llvm_cbe_UnifiedReturnBlock; - } else { - goto llvm_cbe_cond_next438; - } - -llvm_cbe_cond_next438: - llvm_cbe_tmp441 = *(&llvm_cbe_cd->field3); - llvm_cbe_tmp444 = *(&llvm_cbe_tmp441[llvm_cbe_next_018_1]); - return (((unsigned int )(unsigned char )(((unsigned char )((((unsigned char )(((unsigned char )(((unsigned char )llvm_cbe_tmp444) >> ((unsigned char )((unsigned char )2))))))) & ((unsigned char )1)))))); -llvm_cbe_bb458: - if ((((signed int )llvm_cbe_next_018_1) > ((signed int )((unsigned int )127)))) { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_return; - } else { - goto llvm_cbe_cond_next464; - } - -llvm_cbe_cond_next464: - llvm_cbe_tmp467 = *(&llvm_cbe_cd->field3); - llvm_cbe_tmp470 = *(&llvm_cbe_tmp467[llvm_cbe_next_018_1]); - return (((unsigned int )(unsigned char )(((unsigned char )((((unsigned char )(llvm_cbe_tmp470 & ((unsigned char )1)))) ^ ((unsigned char )1)))))); -llvm_cbe_bb481: - if ((((signed int )llvm_cbe_next_018_1) > ((signed int )((unsigned int )127)))) { - goto llvm_cbe_UnifiedReturnBlock; - } else { - goto llvm_cbe_cond_next487; - } - -llvm_cbe_cond_next487: - llvm_cbe_tmp490 = *(&llvm_cbe_cd->field3); - llvm_cbe_tmp493 = *(&llvm_cbe_tmp490[llvm_cbe_next_018_1]); - return (((unsigned int )(unsigned char )(((unsigned char )(llvm_cbe_tmp493 & ((unsigned char )1)))))); -llvm_cbe_bb506: - if ((((signed int )llvm_cbe_next_018_1) > ((signed int )((unsigned int )127)))) { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_return; - } else { - goto llvm_cbe_cond_next512; - } - -llvm_cbe_cond_next512: - llvm_cbe_tmp515 = *(&llvm_cbe_cd->field3); - llvm_cbe_tmp518 = *(&llvm_cbe_tmp515[llvm_cbe_next_018_1]); - return (((unsigned int )(unsigned char )(((unsigned char )((((unsigned char )((((unsigned char )(((unsigned char )(((unsigned char )llvm_cbe_tmp518) >> ((unsigned char )((unsigned char )4))))))) & ((unsigned char )1)))) ^ ((unsigned char )1)))))); -llvm_cbe_bb530: - if ((((signed int )llvm_cbe_next_018_1) > ((signed int )((unsigned int )127)))) { - goto llvm_cbe_UnifiedReturnBlock; - } else { - goto llvm_cbe_cond_next536; - } - -llvm_cbe_cond_next536: - llvm_cbe_tmp539 = *(&llvm_cbe_cd->field3); - llvm_cbe_tmp542 = *(&llvm_cbe_tmp539[llvm_cbe_next_018_1]); - return (((unsigned int )(unsigned char )(((unsigned char )((((unsigned char )(((unsigned char )(((unsigned char )llvm_cbe_tmp542) >> ((unsigned char )((unsigned char )4))))))) & ((unsigned char )1)))))); -llvm_cbe_bb557: - switch (llvm_cbe_next_018_1) { - default: - goto llvm_cbe_bb582; -; - case ((unsigned int )9): - goto llvm_cbe_bb577; - break; - case ((unsigned int )32): - goto llvm_cbe_bb577; - break; - case ((unsigned int )160): - goto llvm_cbe_bb577; - break; - case ((unsigned int )5760): - goto llvm_cbe_bb577; - break; - case ((unsigned int )6158): - goto llvm_cbe_bb577; - break; - case ((unsigned int )8192): - goto llvm_cbe_bb577; - break; - case ((unsigned int )8193): - goto llvm_cbe_bb577; - break; - case ((unsigned int )8194): - goto llvm_cbe_bb577; - break; - case ((unsigned int )8195): - goto llvm_cbe_bb577; - break; - case ((unsigned int )8196): - goto llvm_cbe_bb577; - break; - case ((unsigned int )8197): - goto llvm_cbe_bb577; - break; - case ((unsigned int )8198): - goto llvm_cbe_bb577; - break; - case ((unsigned int )8199): - goto llvm_cbe_bb577; - break; - case ((unsigned int )8200): - goto llvm_cbe_bb577; - break; - case ((unsigned int )8201): - goto llvm_cbe_bb577; - break; - case ((unsigned int )8202): - goto llvm_cbe_bb577; - break; - case ((unsigned int )8239): - goto llvm_cbe_bb577; - break; - case ((unsigned int )8287): - goto llvm_cbe_bb577; - break; - case ((unsigned int )12288): - goto llvm_cbe_bb577; - break; - } -llvm_cbe_bb577: - return (((unsigned int )(bool )(llvm_cbe_op_code != ((unsigned int )18)))); -llvm_cbe_bb582: - return (((unsigned int )(bool )(llvm_cbe_op_code == ((unsigned int )18)))); -llvm_cbe_bb588: - switch (llvm_cbe_next_018_1) { - default: - goto llvm_cbe_bb601; -; - case ((unsigned int )10): - goto llvm_cbe_bb596; - break; - case ((unsigned int )11): - goto llvm_cbe_bb596; - break; - case ((unsigned int )12): - goto llvm_cbe_bb596; - break; - case ((unsigned int )13): - goto llvm_cbe_bb596; - break; - case ((unsigned int )133): - goto llvm_cbe_bb596; - break; - case ((unsigned int )8232): - goto llvm_cbe_bb596; - break; - case ((unsigned int )8233): - goto llvm_cbe_bb596; - break; - } -llvm_cbe_bb596: - return (((unsigned int )(bool )(llvm_cbe_op_code != ((unsigned int )20)))); -llvm_cbe_bb601: - return (((unsigned int )(bool )(llvm_cbe_op_code == ((unsigned int )20)))); -llvm_cbe_cond_next608: - switch (llvm_cbe_op_code) { - default: - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; -; - case ((unsigned int )6): - goto llvm_cbe_bb850; - case ((unsigned int )7): - goto llvm_cbe_bb814; - case ((unsigned int )8): - goto llvm_cbe_bb868; - case ((unsigned int )9): - goto llvm_cbe_bb855; - case ((unsigned int )10): - goto llvm_cbe_bb978; - case ((unsigned int )11): - goto llvm_cbe_bb954; - case ((unsigned int )17): - goto llvm_cbe_bb921; - case ((unsigned int )18): - goto llvm_cbe_bb891; - case ((unsigned int )19): - goto llvm_cbe_bb949; - case ((unsigned int )20): - goto llvm_cbe_bb926; - case ((unsigned int )27): - goto llvm_cbe_bb611; - break; - case ((unsigned int )28): - goto llvm_cbe_bb611; - break; - } -llvm_cbe_bb611: - switch ((-(llvm_cbe_next_018_1))) { - default: - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; -; - case ((unsigned int )6): - goto llvm_cbe_bb638; - case ((unsigned int )7): - goto llvm_cbe_bb614; - break; - case ((unsigned int )8): - goto llvm_cbe_bb687; - case ((unsigned int )9): - goto llvm_cbe_bb664; - case ((unsigned int )10): - goto llvm_cbe_bb736; - case ((unsigned int )11): - goto llvm_cbe_bb712; - case ((unsigned int )17): - goto llvm_cbe_bb763; - case ((unsigned int )18): - goto llvm_cbe_bb763; - case ((unsigned int )19): - goto llvm_cbe_bb794; - case ((unsigned int )20): - goto llvm_cbe_bb794; - } -llvm_cbe_bb614: - if ((((signed int )llvm_cbe_item) > ((signed int )((unsigned int )127)))) { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_return; - } else { - goto llvm_cbe_cond_next620; - } - -llvm_cbe_cond_next620: - llvm_cbe_tmp623 = *(&llvm_cbe_cd->field3); - llvm_cbe_tmp626 = *(&llvm_cbe_tmp623[llvm_cbe_item]); - return (((unsigned int )(unsigned char )(((unsigned char )((((unsigned char )((((unsigned char )(((unsigned char )(((unsigned char )llvm_cbe_tmp626) >> ((unsigned char )((unsigned char )2))))))) & ((unsigned char )1)))) ^ ((unsigned char )1)))))); -llvm_cbe_bb638: - if ((((signed int )llvm_cbe_item) > ((signed int )((unsigned int )127)))) { - goto llvm_cbe_UnifiedReturnBlock; - } else { - goto llvm_cbe_cond_next644; - } - -llvm_cbe_cond_next644: - llvm_cbe_tmp647 = *(&llvm_cbe_cd->field3); - llvm_cbe_tmp650 = *(&llvm_cbe_tmp647[llvm_cbe_item]); - return (((unsigned int )(unsigned char )(((unsigned char )((((unsigned char )(((unsigned char )(((unsigned char )llvm_cbe_tmp650) >> ((unsigned char )((unsigned char )2))))))) & ((unsigned char )1)))))); -llvm_cbe_bb664: - if ((((signed int )llvm_cbe_item) > ((signed int )((unsigned int )127)))) { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_return; - } else { - goto llvm_cbe_cond_next670; - } - -llvm_cbe_cond_next670: - llvm_cbe_tmp673 = *(&llvm_cbe_cd->field3); - llvm_cbe_tmp676 = *(&llvm_cbe_tmp673[llvm_cbe_item]); - return (((unsigned int )(unsigned char )(((unsigned char )((((unsigned char )(llvm_cbe_tmp676 & ((unsigned char )1)))) ^ ((unsigned char )1)))))); -llvm_cbe_bb687: - if ((((signed int )llvm_cbe_item) > ((signed int )((unsigned int )127)))) { - goto llvm_cbe_UnifiedReturnBlock; - } else { - goto llvm_cbe_cond_next693; - } - -llvm_cbe_cond_next693: - llvm_cbe_tmp696 = *(&llvm_cbe_cd->field3); - llvm_cbe_tmp699 = *(&llvm_cbe_tmp696[llvm_cbe_item]); - return (((unsigned int )(unsigned char )(((unsigned char )(llvm_cbe_tmp699 & ((unsigned char )1)))))); -llvm_cbe_bb712: - if ((((signed int )llvm_cbe_item) > ((signed int )((unsigned int )127)))) { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_return; - } else { - goto llvm_cbe_cond_next718; - } - -llvm_cbe_cond_next718: - llvm_cbe_tmp721 = *(&llvm_cbe_cd->field3); - llvm_cbe_tmp724 = *(&llvm_cbe_tmp721[llvm_cbe_item]); - return (((unsigned int )(unsigned char )(((unsigned char )((((unsigned char )((((unsigned char )(((unsigned char )(((unsigned char )llvm_cbe_tmp724) >> ((unsigned char )((unsigned char )4))))))) & ((unsigned char )1)))) ^ ((unsigned char )1)))))); -llvm_cbe_bb736: - if ((((signed int )llvm_cbe_item) > ((signed int )((unsigned int )127)))) { - goto llvm_cbe_UnifiedReturnBlock; - } else { - goto llvm_cbe_cond_next742; - } - -llvm_cbe_cond_next742: - llvm_cbe_tmp745 = *(&llvm_cbe_cd->field3); - llvm_cbe_tmp748 = *(&llvm_cbe_tmp745[llvm_cbe_item]); - return (((unsigned int )(unsigned char )(((unsigned char )((((unsigned char )(((unsigned char )(((unsigned char )llvm_cbe_tmp748) >> ((unsigned char )((unsigned char )4))))))) & ((unsigned char )1)))))); -llvm_cbe_bb763: - switch (llvm_cbe_item) { - default: - goto llvm_cbe_bb788; -; - case ((unsigned int )9): - goto llvm_cbe_bb783; - break; - case ((unsigned int )32): - goto llvm_cbe_bb783; - break; - case ((unsigned int )160): - goto llvm_cbe_bb783; - break; - case ((unsigned int )5760): - goto llvm_cbe_bb783; - break; - case ((unsigned int )6158): - goto llvm_cbe_bb783; - break; - case ((unsigned int )8192): - goto llvm_cbe_bb783; - break; - case ((unsigned int )8193): - goto llvm_cbe_bb783; - break; - case ((unsigned int )8194): - goto llvm_cbe_bb783; - break; - case ((unsigned int )8195): - goto llvm_cbe_bb783; - break; - case ((unsigned int )8196): - goto llvm_cbe_bb783; - break; - case ((unsigned int )8197): - goto llvm_cbe_bb783; - break; - case ((unsigned int )8198): - goto llvm_cbe_bb783; - break; - case ((unsigned int )8199): - goto llvm_cbe_bb783; - break; - case ((unsigned int )8200): - goto llvm_cbe_bb783; - break; - case ((unsigned int )8201): - goto llvm_cbe_bb783; - break; - case ((unsigned int )8202): - goto llvm_cbe_bb783; - break; - case ((unsigned int )8239): - goto llvm_cbe_bb783; - break; - case ((unsigned int )8287): - goto llvm_cbe_bb783; - break; - case ((unsigned int )12288): - goto llvm_cbe_bb783; - break; - } -llvm_cbe_bb783: - return (((unsigned int )(bool )(llvm_cbe_next_018_1 != ((unsigned int )-18)))); -llvm_cbe_bb788: - return (((unsigned int )(bool )(llvm_cbe_next_018_1 == ((unsigned int )-18)))); -llvm_cbe_bb794: - switch (llvm_cbe_item) { - default: - goto llvm_cbe_bb807; -; - case ((unsigned int )10): - goto llvm_cbe_bb802; - break; - case ((unsigned int )11): - goto llvm_cbe_bb802; - break; - case ((unsigned int )12): - goto llvm_cbe_bb802; - break; - case ((unsigned int )13): - goto llvm_cbe_bb802; - break; - case ((unsigned int )133): - goto llvm_cbe_bb802; - break; - case ((unsigned int )8232): - goto llvm_cbe_bb802; - break; - case ((unsigned int )8233): - goto llvm_cbe_bb802; - break; - } -llvm_cbe_bb802: - return (((unsigned int )(bool )(llvm_cbe_next_018_1 != ((unsigned int )-20)))); -llvm_cbe_bb807: - return (((unsigned int )(bool )(llvm_cbe_next_018_1 == ((unsigned int )-20)))); -llvm_cbe_bb814: - switch (llvm_cbe_next_018_1) { - default: - goto llvm_cbe_UnifiedReturnBlock; -; - case ((unsigned int )-9): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )-6): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )-20): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )-18): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )-10): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_return; - } -llvm_cbe_bb850: - return (((unsigned int )(bool )(llvm_cbe_next_018_1 == ((unsigned int )-7)))); -llvm_cbe_bb855: - return (((unsigned int )(bool )((((unsigned int )(llvm_cbe_next_018_1 + ((unsigned int )8))) < ((unsigned int )((unsigned int )2))) | (llvm_cbe_next_018_1 == ((unsigned int )-11))))); -llvm_cbe_bb868: - switch (llvm_cbe_next_018_1) { - default: - goto llvm_cbe_UnifiedReturnBlock; -; - case ((unsigned int )-20): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )-18): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )-9): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_return; - } -llvm_cbe_bb891: - switch (llvm_cbe_next_018_1) { - default: - goto llvm_cbe_UnifiedReturnBlock; -; - case ((unsigned int )-17): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )-8): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )-11): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )-7): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_return; - } -llvm_cbe_bb921: - return (((unsigned int )(bool )(llvm_cbe_next_018_1 == ((unsigned int )-18)))); -llvm_cbe_bb926: - switch (llvm_cbe_next_018_1) { - default: - goto llvm_cbe_UnifiedReturnBlock; -; - case ((unsigned int )-19): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )-11): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_return; - case ((unsigned int )-7): - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_return; - } -llvm_cbe_bb949: - return (((unsigned int )(bool )(llvm_cbe_next_018_1 == ((unsigned int )-20)))); -llvm_cbe_bb954: - return (((unsigned int )(bool )(((llvm_cbe_next_018_1 == ((unsigned int )-18)) | (llvm_cbe_next_018_1 == ((unsigned int )-20))) | (((unsigned int )(llvm_cbe_next_018_1 + ((unsigned int )10))) < ((unsigned int )((unsigned int )2)))))); -llvm_cbe_bb978: - return (((unsigned int )(bool )((llvm_cbe_next_018_1 == ((unsigned int )-11)) | (llvm_cbe_next_018_1 == ((unsigned int )-7))))); -llvm_cbe_return: - llvm_cbe_retval_0 = llvm_cbe_retval_0__PHI_TEMPORARY; - return llvm_cbe_retval_0; -llvm_cbe_UnifiedReturnBlock: - return ((unsigned int )0); -} - - -static unsigned int _pcre_is_newline(unsigned char *llvm_cbe_ptr, unsigned int llvm_cbe_type, unsigned char *llvm_cbe_endptr, unsigned int *llvm_cbe_lenptr) { - unsigned char llvm_cbe_tmp5; - unsigned int llvm_cbe_tmp56; - unsigned char llvm_cbe_tmp29; - unsigned char llvm_cbe_tmp60; - - llvm_cbe_tmp5 = *llvm_cbe_ptr; - llvm_cbe_tmp56 = ((unsigned int )(unsigned char )llvm_cbe_tmp5); - if ((llvm_cbe_type == ((unsigned int )2))) { - goto llvm_cbe_cond_true14; - } else { - goto llvm_cbe_cond_false42; - } - -llvm_cbe_cond_true14: - switch (llvm_cbe_tmp56) { - default: - goto llvm_cbe_UnifiedReturnBlock; -; - case ((unsigned int )10): - goto llvm_cbe_bb; - break; - case ((unsigned int )13): - goto llvm_cbe_bb18; - } -llvm_cbe_bb: - *llvm_cbe_lenptr = ((unsigned int )1); - return ((unsigned int )1); -llvm_cbe_bb18: - if ((((unsigned char *)(&llvm_cbe_endptr[((unsigned int )-1)])) > ((unsigned char *)llvm_cbe_ptr))) { - goto llvm_cbe_cond_next26; - } else { - goto llvm_cbe_bb35; - } - -llvm_cbe_cond_next26: - llvm_cbe_tmp29 = *(&llvm_cbe_ptr[((unsigned int )1)]); - if ((llvm_cbe_tmp29 == ((unsigned char )10))) { - goto llvm_cbe_bb36; - } else { - goto llvm_cbe_bb35; - } - -llvm_cbe_bb35: - *llvm_cbe_lenptr = ((unsigned int )1); - return ((unsigned int )1); -llvm_cbe_bb36: - *llvm_cbe_lenptr = ((unsigned int )2); - return ((unsigned int )1); -llvm_cbe_cond_false42: - switch (llvm_cbe_tmp56) { - default: - goto llvm_cbe_UnifiedReturnBlock; -; - case ((unsigned int )10): - goto llvm_cbe_bb46; - break; - case ((unsigned int )11): - goto llvm_cbe_bb46; - break; - case ((unsigned int )12): - goto llvm_cbe_bb46; - break; - case ((unsigned int )13): - goto llvm_cbe_bb49; - case ((unsigned int )133): - goto llvm_cbe_bb71; - case ((unsigned int )8232): - goto llvm_cbe_bb83; - case ((unsigned int )8233): - goto llvm_cbe_bb83; - } -llvm_cbe_bb46: - *llvm_cbe_lenptr = ((unsigned int )1); - return ((unsigned int )1); -llvm_cbe_bb49: - if ((((unsigned char *)(&llvm_cbe_endptr[((unsigned int )-1)])) > ((unsigned char *)llvm_cbe_ptr))) { - goto llvm_cbe_cond_next57; - } else { - goto llvm_cbe_bb66; - } - -llvm_cbe_cond_next57: - llvm_cbe_tmp60 = *(&llvm_cbe_ptr[((unsigned int )1)]); - if ((llvm_cbe_tmp60 == ((unsigned char )10))) { - goto llvm_cbe_bb67; - } else { - goto llvm_cbe_bb66; - } - -llvm_cbe_bb66: - *llvm_cbe_lenptr = ((unsigned int )1); - return ((unsigned int )1); -llvm_cbe_bb67: - *llvm_cbe_lenptr = ((unsigned int )2); - return ((unsigned int )1); -llvm_cbe_bb71: - *llvm_cbe_lenptr = ((unsigned int )1); - return ((unsigned int )1); -llvm_cbe_bb83: - *llvm_cbe_lenptr = ((unsigned int )3); - return ((unsigned int )1); -llvm_cbe_UnifiedReturnBlock: - return ((unsigned int )0); -} - - -static unsigned int compile_regex(unsigned int llvm_cbe_options, unsigned int llvm_cbe_oldims, unsigned char **llvm_cbe_codeptr, unsigned char **llvm_cbe_ptrptr, unsigned int *llvm_cbe_errorcodeptr, unsigned int llvm_cbe_lookbehind, unsigned int llvm_cbe_reset_bracount, unsigned int llvm_cbe_skipbytes, unsigned int *llvm_cbe_firstbyteptr, unsigned int *llvm_cbe_reqbyteptr, struct l_struct_2E_branch_chain *llvm_cbe_bcptr, struct l_struct_2E_compile_data *llvm_cbe_cd, unsigned int *llvm_cbe_lengthptr) { - unsigned int llvm_cbe_length; /* Address-exposed local */ - struct l_struct_2E_branch_chain llvm_cbe_bc; /* Address-exposed local */ - unsigned int llvm_cbe_length_prevgroup; /* Address-exposed local */ - unsigned char *llvm_cbe_tempcode; /* Address-exposed local */ - unsigned char *llvm_cbe_ptr106; /* Address-exposed local */ - unsigned char *llvm_cbe_tempptr; /* Address-exposed local */ - unsigned char llvm_cbe_classbits[32]; /* Address-exposed local */ - unsigned int llvm_cbe_subreqbyte; /* Address-exposed local */ - unsigned int llvm_cbe_subfirstbyte; /* Address-exposed local */ - unsigned char llvm_cbe_mcbuffer[8]; /* Address-exposed local */ - unsigned char llvm_cbe_pbits[32]; /* Address-exposed local */ - unsigned int llvm_cbe_set; /* Address-exposed local */ - unsigned int llvm_cbe_unset; /* Address-exposed local */ - unsigned char *llvm_cbe_tmp3; - unsigned char *llvm_cbe_tmp5; - unsigned char **llvm_cbe_tmp11; - unsigned int *llvm_cbe_tmp24; - unsigned int llvm_cbe_tmp25; - unsigned int llvm_cbe_tmp21; - unsigned char *llvm_cbe_tmp22; - unsigned char *llvm_cbe_slot_913437_0_us61_8; - unsigned char *llvm_cbe_slot_913437_0_us61_8__PHI_TEMPORARY; - unsigned char *llvm_cbe_slot_913437_059_8; - unsigned char *llvm_cbe_slot_913437_059_8__PHI_TEMPORARY; - unsigned int llvm_cbe_branchreqbyte_413514_0; - unsigned int llvm_cbe_branchreqbyte_413514_0__PHI_TEMPORARY; - unsigned int llvm_cbe_branchfirstbyte_113557_0; - unsigned int llvm_cbe_branchfirstbyte_113557_0__PHI_TEMPORARY; - unsigned char *llvm_cbe_code_113600_0; - unsigned char *llvm_cbe_code_113600_0__PHI_TEMPORARY; - unsigned char *llvm_cbe_ptr_013604_0; - unsigned char *llvm_cbe_ptr_013604_0__PHI_TEMPORARY; - unsigned int llvm_cbe_options_addr_313605_0; - unsigned int llvm_cbe_options_addr_313605_0__PHI_TEMPORARY; - unsigned int llvm_cbe_max_bracount_113905_0; - unsigned int llvm_cbe_max_bracount_113905_0__PHI_TEMPORARY; - unsigned int llvm_cbe_reqbyte_313907_0; - unsigned int llvm_cbe_reqbyte_313907_0__PHI_TEMPORARY; - unsigned int llvm_cbe_firstbyte_313911_0; - unsigned int llvm_cbe_firstbyte_313911_0__PHI_TEMPORARY; - unsigned char *llvm_cbe_reverse_count_113916_0; - unsigned char *llvm_cbe_reverse_count_113916_0__PHI_TEMPORARY; - unsigned char *llvm_cbe_last_branch_413917_0; - unsigned char *llvm_cbe_last_branch_413917_0__PHI_TEMPORARY; - unsigned char *llvm_cbe_slot_913437_0_us61_11; - unsigned char *llvm_cbe_slot_913437_0_us61_11__PHI_TEMPORARY; - unsigned char *llvm_cbe_slot_913437_059_11; - unsigned char *llvm_cbe_slot_913437_059_11__PHI_TEMPORARY; - unsigned int llvm_cbe_branchreqbyte_413514_1_ph; - unsigned int llvm_cbe_branchreqbyte_413514_1_ph__PHI_TEMPORARY; - unsigned int llvm_cbe_branchfirstbyte_113557_1_ph; - unsigned int llvm_cbe_branchfirstbyte_113557_1_ph__PHI_TEMPORARY; - unsigned char *llvm_cbe_code_113600_1_ph; - unsigned char *llvm_cbe_code_113600_1_ph__PHI_TEMPORARY; - unsigned char *llvm_cbe_ptr_013604_1_ph; - unsigned char *llvm_cbe_ptr_013604_1_ph__PHI_TEMPORARY; - unsigned int llvm_cbe_options_addr_313605_1_ph; - unsigned int llvm_cbe_options_addr_313605_1_ph__PHI_TEMPORARY; - unsigned int llvm_cbe_max_bracount_113905_1_ph; - unsigned int llvm_cbe_max_bracount_113905_1_ph__PHI_TEMPORARY; - unsigned int llvm_cbe_reqbyte_313907_1_ph; - unsigned int llvm_cbe_reqbyte_313907_1_ph__PHI_TEMPORARY; - unsigned int llvm_cbe_firstbyte_313911_1_ph; - unsigned int llvm_cbe_firstbyte_313911_1_ph__PHI_TEMPORARY; - unsigned char *llvm_cbe_reverse_count_113916_1_ph; - unsigned char *llvm_cbe_reverse_count_113916_1_ph__PHI_TEMPORARY; - unsigned char *llvm_cbe_last_branch_413917_1_ph; - unsigned char *llvm_cbe_last_branch_413917_1_ph__PHI_TEMPORARY; - unsigned int *llvm_cbe_iftmp_509_0; - unsigned char **llvm_cbe_tmp143; - unsigned char **llvm_cbe_tmp203; - unsigned char **llvm_cbe_tmp435; - unsigned int *llvm_cbe_tmp453; - unsigned char **llvm_cbe_tmp460; - unsigned int *llvm_cbe_tmp469; - unsigned char *llvm_cbe_tmp508; - unsigned char *llvm_cbe_tmp528; - unsigned char *llvm_cbe_classbits711; - unsigned char **llvm_cbe_tmp776; - unsigned char *llvm_cbe_pbits885; - unsigned char *llvm_cbe_tmp962; - unsigned char *llvm_cbe_tmp972; - unsigned char *llvm_cbe_tmp1237; - unsigned char *llvm_cbe_tmp1288; - unsigned char *llvm_cbe_tmp1292; - unsigned char *llvm_cbe_tmp1353; - unsigned char **llvm_cbe_tmp1623; - unsigned char *llvm_cbe_tmp1755; - unsigned int *llvm_cbe_tmp1993; - unsigned int *llvm_cbe_tmp2377; - unsigned char **llvm_cbe_tmp3478; - unsigned int *llvm_cbe_tmp351413356; - unsigned int *llvm_cbe_tmp3506; - unsigned char **llvm_cbe_tmp3783; - unsigned int *llvm_cbe_tmp4496; - unsigned char **llvm_cbe_tmp4563; - unsigned int *llvm_cbe_iftmp_468_0; - unsigned int *llvm_cbe_tmp5026; - unsigned int *llvm_cbe_tmp5042; - bool llvm_cbe_tmp138_not; - unsigned char *llvm_cbe_slot_913437_0_us61_9; - unsigned char *llvm_cbe_slot_913437_0_us61_9__PHI_TEMPORARY; - unsigned char *llvm_cbe_slot_913437_059_9; - unsigned char *llvm_cbe_slot_913437_059_9__PHI_TEMPORARY; - unsigned int llvm_cbe_branchreqbyte_413514_1; - unsigned int llvm_cbe_branchreqbyte_413514_1__PHI_TEMPORARY; - unsigned int llvm_cbe_branchfirstbyte_113557_1; - unsigned int llvm_cbe_branchfirstbyte_113557_1__PHI_TEMPORARY; - unsigned char *llvm_cbe_code_113600_1; - unsigned char *llvm_cbe_code_113600_1__PHI_TEMPORARY; - unsigned char *llvm_cbe_ptr_013604_1; - unsigned char *llvm_cbe_ptr_013604_1__PHI_TEMPORARY; - unsigned int llvm_cbe_options_addr_313605_1; - unsigned int llvm_cbe_options_addr_313605_1__PHI_TEMPORARY; - unsigned int llvm_cbe_max_bracount_113905_1; - unsigned int llvm_cbe_max_bracount_113905_1__PHI_TEMPORARY; - unsigned int llvm_cbe_reqbyte_313907_1; - unsigned int llvm_cbe_reqbyte_313907_1__PHI_TEMPORARY; - unsigned int llvm_cbe_firstbyte_313911_1; - unsigned int llvm_cbe_firstbyte_313911_1__PHI_TEMPORARY; - unsigned char *llvm_cbe_reverse_count_113916_1; - unsigned char *llvm_cbe_reverse_count_113916_1__PHI_TEMPORARY; - unsigned char *llvm_cbe_last_branch_413917_1; - unsigned char *llvm_cbe_last_branch_413917_1__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp46; - unsigned int llvm_cbe_tmp47; - unsigned char *llvm_cbe_code_0; - unsigned char *llvm_cbe_code_0__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp56; - unsigned char *llvm_cbe_tmp63; - unsigned int llvm_cbe_tmp64; - unsigned char *llvm_cbe_code_2; - unsigned char *llvm_cbe_code_2__PHI_TEMPORARY; - unsigned char *llvm_cbe_reverse_count_0; - unsigned char *llvm_cbe_reverse_count_0__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp117; - unsigned int llvm_cbe_tmp119; - unsigned int llvm_cbe_req_caseopt_3_ph; - unsigned int llvm_cbe_tmp188189; - unsigned char *llvm_cbe_slot_913437_0_us61_13; - unsigned char *llvm_cbe_slot_913437_0_us61_13__PHI_TEMPORARY; - unsigned char *llvm_cbe_slot_913437_059_13; - unsigned char *llvm_cbe_slot_913437_059_13__PHI_TEMPORARY; - unsigned int llvm_cbe_repeat_max_10; - unsigned int llvm_cbe_repeat_max_10__PHI_TEMPORARY; - unsigned int llvm_cbe_repeat_min_10; - unsigned int llvm_cbe_repeat_min_10__PHI_TEMPORARY; - unsigned int llvm_cbe_options_addr_2; - unsigned int llvm_cbe_options_addr_2__PHI_TEMPORARY; - unsigned char *llvm_cbe_save_hwm_7; - unsigned char *llvm_cbe_save_hwm_7__PHI_TEMPORARY; - unsigned char *llvm_cbe_previous_callout_5; - unsigned char *llvm_cbe_previous_callout_5__PHI_TEMPORARY; - unsigned char *llvm_cbe_previous_3; - unsigned char *llvm_cbe_previous_3__PHI_TEMPORARY; - unsigned int llvm_cbe_groupsetfirstbyte_2; - unsigned int llvm_cbe_groupsetfirstbyte_2__PHI_TEMPORARY; - unsigned int llvm_cbe_inescq_2; - unsigned int llvm_cbe_inescq_2__PHI_TEMPORARY; - unsigned char *llvm_cbe_last_code_2; - unsigned char *llvm_cbe_last_code_2__PHI_TEMPORARY; - unsigned char *llvm_cbe_code105_3; - unsigned char *llvm_cbe_code105_3__PHI_TEMPORARY; - unsigned int llvm_cbe_after_manual_callout_7; - unsigned int llvm_cbe_after_manual_callout_7__PHI_TEMPORARY; - unsigned int llvm_cbe_options104_3; - unsigned int llvm_cbe_options104_3__PHI_TEMPORARY; - unsigned int llvm_cbe_req_caseopt_3; - unsigned int llvm_cbe_req_caseopt_3__PHI_TEMPORARY; - unsigned int llvm_cbe_zerofirstbyte_2; - unsigned int llvm_cbe_zerofirstbyte_2__PHI_TEMPORARY; - unsigned int llvm_cbe_zeroreqbyte_2; - unsigned int llvm_cbe_zeroreqbyte_2__PHI_TEMPORARY; - unsigned int llvm_cbe_reqbyte103_5; - unsigned int llvm_cbe_reqbyte103_5__PHI_TEMPORARY; - unsigned int llvm_cbe_firstbyte102_3; - unsigned int llvm_cbe_firstbyte102_3__PHI_TEMPORARY; - unsigned int llvm_cbe_greedy_non_default_3; - unsigned int llvm_cbe_greedy_non_default_3__PHI_TEMPORARY; - unsigned int llvm_cbe_greedy_default_3; - unsigned int llvm_cbe_greedy_default_3__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp134; - unsigned char llvm_cbe_tmp135; - unsigned int llvm_cbe_tmp135136; - unsigned int llvm_cbe_options_addr_25789_3; - unsigned int llvm_cbe_options_addr_25789_3__PHI_TEMPORARY; - unsigned char *llvm_cbe_save_hwm_79347_3; - unsigned char *llvm_cbe_save_hwm_79347_3__PHI_TEMPORARY; - unsigned char *llvm_cbe_previous_callout_59381_3; - unsigned char *llvm_cbe_previous_callout_59381_3__PHI_TEMPORARY; - unsigned char *llvm_cbe_previous_39389_3; - unsigned char *llvm_cbe_previous_39389_3__PHI_TEMPORARY; - unsigned int llvm_cbe_groupsetfirstbyte_29395_3; - unsigned int llvm_cbe_groupsetfirstbyte_29395_3__PHI_TEMPORARY; - unsigned int llvm_cbe_inescq_29422_3; - unsigned int llvm_cbe_inescq_29422_3__PHI_TEMPORARY; - unsigned char *llvm_cbe_last_code_29452_3; - unsigned char *llvm_cbe_last_code_29452_3__PHI_TEMPORARY; - unsigned char *llvm_cbe_code105_39456_3; - unsigned char *llvm_cbe_code105_39456_3__PHI_TEMPORARY; - unsigned int llvm_cbe_after_manual_callout_79460_3; - unsigned int llvm_cbe_after_manual_callout_79460_3__PHI_TEMPORARY; - unsigned int llvm_cbe_options104_39466_3; - unsigned int llvm_cbe_options104_39466_3__PHI_TEMPORARY; - unsigned int llvm_cbe_req_caseopt_39708_3; - unsigned int llvm_cbe_req_caseopt_39708_3__PHI_TEMPORARY; - unsigned int llvm_cbe_zerofirstbyte_29740_3; - unsigned int llvm_cbe_zerofirstbyte_29740_3__PHI_TEMPORARY; - unsigned int llvm_cbe_zeroreqbyte_29762_3; - unsigned int llvm_cbe_zeroreqbyte_29762_3__PHI_TEMPORARY; - unsigned int llvm_cbe_reqbyte103_59784_3; - unsigned int llvm_cbe_reqbyte103_59784_3__PHI_TEMPORARY; - unsigned int llvm_cbe_firstbyte102_39829_3; - unsigned int llvm_cbe_firstbyte102_39829_3__PHI_TEMPORARY; - unsigned int llvm_cbe_greedy_non_default_39879_3; - unsigned int llvm_cbe_greedy_non_default_39879_3__PHI_TEMPORARY; - unsigned int llvm_cbe_greedy_default_39909_3; - unsigned int llvm_cbe_greedy_default_39909_3__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp13512351_3; - unsigned char llvm_cbe_tmp13512351_3__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp13513612358_3; - unsigned int llvm_cbe_tmp13513612358_3__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp144; - unsigned char *llvm_cbe_tmp51985596; - unsigned char *llvm_cbe_code105_1; - unsigned int llvm_cbe_tmp162; - unsigned int llvm_cbe_tmp163164; - unsigned int llvm_cbe_tmp183184; - unsigned char *ltmp_4_1; - unsigned char *llvm_cbe_tmp194; - unsigned int llvm_cbe_options_addr_25789_4; - unsigned int llvm_cbe_options_addr_25789_4__PHI_TEMPORARY; - unsigned char *llvm_cbe_save_hwm_79347_4; - unsigned char *llvm_cbe_save_hwm_79347_4__PHI_TEMPORARY; - unsigned char *llvm_cbe_previous_callout_59381_4; - unsigned char *llvm_cbe_previous_callout_59381_4__PHI_TEMPORARY; - unsigned char *llvm_cbe_previous_39389_4; - unsigned char *llvm_cbe_previous_39389_4__PHI_TEMPORARY; - unsigned int llvm_cbe_groupsetfirstbyte_29395_4; - unsigned int llvm_cbe_groupsetfirstbyte_29395_4__PHI_TEMPORARY; - unsigned int llvm_cbe_inescq_29422_4; - unsigned int llvm_cbe_inescq_29422_4__PHI_TEMPORARY; - unsigned char *llvm_cbe_last_code_29452_4; - unsigned char *llvm_cbe_last_code_29452_4__PHI_TEMPORARY; - unsigned char *llvm_cbe_code105_39456_4; - unsigned char *llvm_cbe_code105_39456_4__PHI_TEMPORARY; - unsigned int llvm_cbe_after_manual_callout_79460_4; - unsigned int llvm_cbe_after_manual_callout_79460_4__PHI_TEMPORARY; - unsigned int llvm_cbe_options104_39466_4; - unsigned int llvm_cbe_options104_39466_4__PHI_TEMPORARY; - unsigned int llvm_cbe_req_caseopt_39708_4; - unsigned int llvm_cbe_req_caseopt_39708_4__PHI_TEMPORARY; - unsigned int llvm_cbe_zerofirstbyte_29740_4; - unsigned int llvm_cbe_zerofirstbyte_29740_4__PHI_TEMPORARY; - unsigned int llvm_cbe_zeroreqbyte_29762_4; - unsigned int llvm_cbe_zeroreqbyte_29762_4__PHI_TEMPORARY; - unsigned int llvm_cbe_reqbyte103_59784_4; - unsigned int llvm_cbe_reqbyte103_59784_4__PHI_TEMPORARY; - unsigned int llvm_cbe_firstbyte102_39829_4; - unsigned int llvm_cbe_firstbyte102_39829_4__PHI_TEMPORARY; - unsigned int llvm_cbe_greedy_non_default_39879_4; - unsigned int llvm_cbe_greedy_non_default_39879_4__PHI_TEMPORARY; - unsigned int llvm_cbe_greedy_default_39909_4; - unsigned int llvm_cbe_greedy_default_39909_4__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp13512351_4; - unsigned char llvm_cbe_tmp13512351_4__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp13513612358_4; - unsigned int llvm_cbe_tmp13513612358_4__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp204; - unsigned char *llvm_cbe_tmp207; - unsigned char *llvm_cbe_tmp51985785; - unsigned int llvm_cbe_options_addr_25789_5; - unsigned int llvm_cbe_options_addr_25789_5__PHI_TEMPORARY; - unsigned char *llvm_cbe_save_hwm_79347_5; - unsigned char *llvm_cbe_save_hwm_79347_5__PHI_TEMPORARY; - unsigned char *llvm_cbe_previous_callout_59381_5; - unsigned char *llvm_cbe_previous_callout_59381_5__PHI_TEMPORARY; - unsigned char *llvm_cbe_previous_39389_5; - unsigned char *llvm_cbe_previous_39389_5__PHI_TEMPORARY; - unsigned int llvm_cbe_groupsetfirstbyte_29395_5; - unsigned int llvm_cbe_groupsetfirstbyte_29395_5__PHI_TEMPORARY; - unsigned int llvm_cbe_inescq_29422_5; - unsigned int llvm_cbe_inescq_29422_5__PHI_TEMPORARY; - unsigned int llvm_cbe_after_manual_callout_79460_5; - unsigned int llvm_cbe_after_manual_callout_79460_5__PHI_TEMPORARY; - unsigned int llvm_cbe_options104_39466_5; - unsigned int llvm_cbe_options104_39466_5__PHI_TEMPORARY; - unsigned int llvm_cbe_req_caseopt_39708_5; - unsigned int llvm_cbe_req_caseopt_39708_5__PHI_TEMPORARY; - unsigned int llvm_cbe_zerofirstbyte_29740_5; - unsigned int llvm_cbe_zerofirstbyte_29740_5__PHI_TEMPORARY; - unsigned int llvm_cbe_zeroreqbyte_29762_5; - unsigned int llvm_cbe_zeroreqbyte_29762_5__PHI_TEMPORARY; - unsigned int llvm_cbe_reqbyte103_59784_5; - unsigned int llvm_cbe_reqbyte103_59784_5__PHI_TEMPORARY; - unsigned int llvm_cbe_firstbyte102_39829_5; - unsigned int llvm_cbe_firstbyte102_39829_5__PHI_TEMPORARY; - unsigned int llvm_cbe_greedy_non_default_39879_5; - unsigned int llvm_cbe_greedy_non_default_39879_5__PHI_TEMPORARY; - unsigned int llvm_cbe_greedy_default_39909_5; - unsigned int llvm_cbe_greedy_default_39909_5__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp13512351_5; - unsigned char llvm_cbe_tmp13512351_5__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp13513612358_5; - unsigned int llvm_cbe_tmp13513612358_5__PHI_TEMPORARY; - unsigned char *llvm_cbe_last_code_1; - unsigned char *llvm_cbe_last_code_1__PHI_TEMPORARY; - unsigned char *llvm_cbe_code105_2; - unsigned char *llvm_cbe_code105_2__PHI_TEMPORARY; - unsigned char *llvm_cbe_previous_25708_0; - unsigned char *llvm_cbe_previous_25708_0__PHI_TEMPORARY; - unsigned char *llvm_cbe_last_code_15771_0; - unsigned char *llvm_cbe_last_code_15771_0__PHI_TEMPORARY; - unsigned char *llvm_cbe_code105_25773_0; - unsigned char *llvm_cbe_code105_25773_0__PHI_TEMPORARY; - unsigned int llvm_cbe_options_addr_25789_8; - unsigned int llvm_cbe_options_addr_25789_8__PHI_TEMPORARY; - unsigned char *llvm_cbe_save_hwm_79347_8; - unsigned char *llvm_cbe_save_hwm_79347_8__PHI_TEMPORARY; - unsigned char *llvm_cbe_previous_callout_59381_8; - unsigned char *llvm_cbe_previous_callout_59381_8__PHI_TEMPORARY; - unsigned int llvm_cbe_groupsetfirstbyte_29395_8; - unsigned int llvm_cbe_groupsetfirstbyte_29395_8__PHI_TEMPORARY; - unsigned int llvm_cbe_inescq_29422_8; - unsigned int llvm_cbe_inescq_29422_8__PHI_TEMPORARY; - unsigned int llvm_cbe_after_manual_callout_79460_8; - unsigned int llvm_cbe_after_manual_callout_79460_8__PHI_TEMPORARY; - unsigned int llvm_cbe_options104_39466_8; - unsigned int llvm_cbe_options104_39466_8__PHI_TEMPORARY; - unsigned int llvm_cbe_req_caseopt_39708_8; - unsigned int llvm_cbe_req_caseopt_39708_8__PHI_TEMPORARY; - unsigned int llvm_cbe_zerofirstbyte_29740_8; - unsigned int llvm_cbe_zerofirstbyte_29740_8__PHI_TEMPORARY; - unsigned int llvm_cbe_zeroreqbyte_29762_8; - unsigned int llvm_cbe_zeroreqbyte_29762_8__PHI_TEMPORARY; - unsigned int llvm_cbe_reqbyte103_59784_8; - unsigned int llvm_cbe_reqbyte103_59784_8__PHI_TEMPORARY; - unsigned int llvm_cbe_firstbyte102_39829_8; - unsigned int llvm_cbe_firstbyte102_39829_8__PHI_TEMPORARY; - unsigned int llvm_cbe_greedy_non_default_39879_8; - unsigned int llvm_cbe_greedy_non_default_39879_8__PHI_TEMPORARY; - unsigned int llvm_cbe_greedy_default_39909_8; - unsigned int llvm_cbe_greedy_default_39909_8__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp13512351_8; - unsigned char llvm_cbe_tmp13512351_8__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp13513612358_8; - unsigned int llvm_cbe_tmp13513612358_8__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp234; - unsigned char llvm_cbe_tmp236; - unsigned char *llvm_cbe_tmp51975787; - unsigned char llvm_cbe_tmp13512365; - unsigned int llvm_cbe_tmp13513612367; - unsigned char *llvm_cbe_tmp255; - unsigned char *llvm_cbe_tmp4_i; - unsigned char llvm_cbe_tmp9_i; - unsigned char llvm_cbe_tmp14_i; - unsigned int llvm_cbe_tmp17_i; - unsigned char *llvm_cbe_tmp267; - unsigned char *llvm_cbe_tmp11_i4; - unsigned char *llvm_cbe_tmp23_i; - unsigned char *llvm_cbe_tmp35_i; - unsigned char *llvm_cbe_previous_25708_1; - unsigned char *llvm_cbe_previous_25708_1__PHI_TEMPORARY; - unsigned char *llvm_cbe_last_code_15771_1; - unsigned char *llvm_cbe_last_code_15771_1__PHI_TEMPORARY; - unsigned char *llvm_cbe_code105_25773_1; - unsigned char *llvm_cbe_code105_25773_1__PHI_TEMPORARY; - unsigned int llvm_cbe_options_addr_25789_9; - unsigned int llvm_cbe_options_addr_25789_9__PHI_TEMPORARY; - unsigned char *llvm_cbe_save_hwm_79347_9; - unsigned char *llvm_cbe_save_hwm_79347_9__PHI_TEMPORARY; - unsigned char *llvm_cbe_previous_callout_59381_9; - unsigned char *llvm_cbe_previous_callout_59381_9__PHI_TEMPORARY; - unsigned int llvm_cbe_groupsetfirstbyte_29395_9; - unsigned int llvm_cbe_groupsetfirstbyte_29395_9__PHI_TEMPORARY; - unsigned int llvm_cbe_inescq_29422_9; - unsigned int llvm_cbe_inescq_29422_9__PHI_TEMPORARY; - unsigned int llvm_cbe_after_manual_callout_79460_9; - unsigned int llvm_cbe_after_manual_callout_79460_9__PHI_TEMPORARY; - unsigned int llvm_cbe_options104_39466_9; - unsigned int llvm_cbe_options104_39466_9__PHI_TEMPORARY; - unsigned int llvm_cbe_req_caseopt_39708_9; - unsigned int llvm_cbe_req_caseopt_39708_9__PHI_TEMPORARY; - unsigned int llvm_cbe_zerofirstbyte_29740_9; - unsigned int llvm_cbe_zerofirstbyte_29740_9__PHI_TEMPORARY; - unsigned int llvm_cbe_zeroreqbyte_29762_9; - unsigned int llvm_cbe_zeroreqbyte_29762_9__PHI_TEMPORARY; - unsigned int llvm_cbe_reqbyte103_59784_9; - unsigned int llvm_cbe_reqbyte103_59784_9__PHI_TEMPORARY; - unsigned int llvm_cbe_firstbyte102_39829_9; - unsigned int llvm_cbe_firstbyte102_39829_9__PHI_TEMPORARY; - unsigned int llvm_cbe_greedy_non_default_39879_9; - unsigned int llvm_cbe_greedy_non_default_39879_9__PHI_TEMPORARY; - unsigned int llvm_cbe_greedy_default_39909_9; - unsigned int llvm_cbe_greedy_default_39909_9__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp13512351_9; - unsigned char llvm_cbe_tmp13512351_9__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp13513612358_9; - unsigned int llvm_cbe_tmp13513612358_9__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp293; - unsigned char llvm_cbe_tmp297; - unsigned char llvm_cbe_tmp300; - unsigned char *llvm_cbe_tmp307; - unsigned char llvm_cbe_tmp31726562; - unsigned char llvm_cbe_tmp32026565; - unsigned int llvm_cbe_p_1026561_rec; - unsigned int llvm_cbe_p_1026561_rec__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp314; - unsigned char llvm_cbe_tmp317; - unsigned char llvm_cbe_tmp320; - unsigned char *llvm_cbe_p_10_lcssa; - unsigned char *llvm_cbe_p_10_lcssa__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp328; - unsigned char llvm_cbe_tmp346; - unsigned char llvm_cbe_tmp357; - unsigned char *llvm_cbe_tmp364; - unsigned char llvm_cbe_tmp37426570; - unsigned char llvm_cbe_tmp37726573; - unsigned int llvm_cbe_p_1226569_rec; - unsigned int llvm_cbe_p_1226569_rec__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp371; - unsigned char llvm_cbe_tmp374; - unsigned char llvm_cbe_tmp377; - unsigned char *llvm_cbe_p_12_lcssa; - unsigned char *llvm_cbe_p_12_lcssa__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp385; - bool llvm_cbe_iftmp_136_0; - bool llvm_cbe_iftmp_136_0__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp414; - unsigned char *llvm_cbe_previous_callout_59381_9_mux; - unsigned char *llvm_cbe_tmp422; - unsigned char *llvm_cbe_tmp4_i9; - unsigned char llvm_cbe_tmp9_i13; - unsigned char llvm_cbe_tmp14_i17; - unsigned int llvm_cbe_tmp17_i20; - unsigned char *llvm_cbe_previous_callout_6; - unsigned char *llvm_cbe_previous_callout_6__PHI_TEMPORARY; - unsigned int llvm_cbe_after_manual_callout_1; - unsigned int llvm_cbe_after_manual_callout_1__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp436; - unsigned char llvm_cbe_tmp439; - unsigned int llvm_cbe_tmp454; - unsigned char *llvm_cbe_tmp461; - unsigned int llvm_cbe_tmp478; - unsigned int llvm_cbe_tmp494; - unsigned char llvm_cbe_tmp509; - unsigned char llvm_cbe_tmp525; - unsigned char llvm_cbe_tmp529; - unsigned char *llvm_cbe_tmp542; - unsigned int llvm_cbe_tmp545; - unsigned char *llvm_cbe_tmp550; - unsigned char *llvm_cbe_tmp551; - unsigned char llvm_cbe_tmp553; - unsigned char *llvm_cbe_tmp558; - unsigned char llvm_cbe_tmp559; - unsigned int llvm_cbe_c_2; - unsigned int llvm_cbe_c_2__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp582; - unsigned char *llvm_cbe_tmp11_i30; - unsigned char *llvm_cbe_tmp23_i36; - unsigned char *llvm_cbe_tmp35_i42; - unsigned char *llvm_cbe_previous_callout_9; - unsigned char *llvm_cbe_previous_callout_9__PHI_TEMPORARY; - unsigned char *llvm_cbe_code105_10; - unsigned char *llvm_cbe_code105_10__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp597; - unsigned int llvm_cbe_tmp605; - unsigned int llvm_cbe_firstbyte102_1; - unsigned char *llvm_cbe_tmp631; - unsigned char *llvm_cbe_tmp519612381; - unsigned char *llvm_cbe_tmp635; - unsigned char *llvm_cbe_tmp519612384; - unsigned int llvm_cbe_firstbyte102_4; - unsigned char *llvm_cbe_tmp648; - unsigned char *llvm_cbe_tmp519612387; - unsigned char *llvm_cbe_tmp651; - unsigned char llvm_cbe_tmp653; - unsigned int llvm_cbe_tmp676; - unsigned char *llvm_cbe_tmp681; - unsigned char llvm_cbe_tmp683; - unsigned char *llvm_cbe_tmp694; - unsigned char *llvm_cbe_tmp695; - unsigned char llvm_cbe_tmp697; - unsigned char *llvm_cbe_tmp705; - unsigned char llvm_cbe_tmp707; - unsigned int llvm_cbe_negate_class_0; - unsigned int llvm_cbe_negate_class_0__PHI_TEMPORARY; - unsigned char llvm_cbe_c_8_in; - unsigned char llvm_cbe_c_8_in__PHI_TEMPORARY; - unsigned int llvm_cbe_c_8; - unsigned char *ltmp_5_1; - unsigned int llvm_cbe_tmp865; - unsigned int llvm_cbe_class_lastchar_7; - unsigned int llvm_cbe_class_lastchar_7__PHI_TEMPORARY; - unsigned int llvm_cbe_class_charcount_7; - unsigned int llvm_cbe_class_charcount_7__PHI_TEMPORARY; - unsigned int llvm_cbe_inescq_4; - unsigned int llvm_cbe_inescq_4__PHI_TEMPORARY; - unsigned int llvm_cbe_c_11; - unsigned int llvm_cbe_c_11__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp728; - unsigned char *llvm_cbe_tmp729; - unsigned char llvm_cbe_tmp730; - unsigned char *llvm_cbe_tmp745; - unsigned char llvm_cbe_tmp747; - unsigned int llvm_cbe_tmp770; - unsigned char *llvm_cbe_tmp777; - unsigned char *llvm_cbe_tmp778; - unsigned char llvm_cbe_tmp780; - unsigned char *llvm_cbe_tmp788; - unsigned char llvm_cbe_tmp790; - bool llvm_cbe_local_negate_9; - bool llvm_cbe_local_negate_9__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp798; - unsigned char *llvm_cbe_tmp800; - unsigned int llvm_cbe_tmp802; - unsigned int llvm_cbe_yield_912392_0; - unsigned int llvm_cbe_yield_912392_0__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp810; - unsigned char *llvm_cbe_tmp831; - unsigned int llvm_cbe_tmp833; - unsigned int llvm_cbe_tmp845; - unsigned char llvm_cbe_tmp849; - unsigned int llvm_cbe_tmp88_0; - unsigned int llvm_cbe_tmp88_0__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp879; - unsigned int llvm_cbe_tmp882; - unsigned char *ltmp_6_1; - unsigned int llvm_cbe_tmp889; - unsigned int llvm_cbe_tmp893; - unsigned int llvm_cbe_c_1312408_13; - unsigned int llvm_cbe_c_1312408_13__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp907; - unsigned char llvm_cbe_tmp908; - unsigned char llvm_cbe_tmp914; - unsigned int llvm_cbe_indvar_next26678; - unsigned int llvm_cbe_c_1426586; - unsigned int llvm_cbe_c_1426586__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp929; - unsigned char llvm_cbe_tmp930; - unsigned char llvm_cbe_tmp936; - unsigned int llvm_cbe_tmp940; - unsigned char llvm_cbe_tmp963; - unsigned char llvm_cbe_tmp973; - unsigned int llvm_cbe_c_1512416_13; - unsigned int llvm_cbe_c_1512416_13__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp986; - unsigned char llvm_cbe_tmp987; - unsigned char llvm_cbe_tmp990; - unsigned int llvm_cbe_indvar_next26683; - unsigned int llvm_cbe_c_1726583; - unsigned int llvm_cbe_c_1726583__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp1005; - unsigned char llvm_cbe_tmp1006; - unsigned char llvm_cbe_tmp1009; - unsigned int llvm_cbe_tmp1013; - unsigned char *llvm_cbe_tmp1021; - unsigned int llvm_cbe_tmp1033; - unsigned int llvm_cbe_tmp1036; - unsigned int llvm_cbe_tmp1038; - unsigned char *llvm_cbe_tmp1067; - unsigned char llvm_cbe_tmp1069; - unsigned char *llvm_cbe_tmp1076; - unsigned char llvm_cbe_tmp1077; - unsigned int llvm_cbe_c_19; - unsigned int llvm_cbe_c_19__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp1099; - unsigned int llvm_cbe_tmp1101; - unsigned int llvm_cbe_c_2012437_12; - unsigned int llvm_cbe_c_2012437_12__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp1113; - unsigned char llvm_cbe_tmp1114; - unsigned char llvm_cbe_tmp1119; - unsigned int llvm_cbe_indvar_next26667; - unsigned int llvm_cbe_c_2112444_12; - unsigned int llvm_cbe_c_2112444_12__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp1134; - unsigned char llvm_cbe_tmp1135; - unsigned char llvm_cbe_tmp1140; - unsigned int llvm_cbe_indvar_next26664; - unsigned int llvm_cbe_c_2212451_12; - unsigned int llvm_cbe_c_2212451_12__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp1155; - unsigned char llvm_cbe_tmp1156; - unsigned char llvm_cbe_tmp1161; - unsigned int llvm_cbe_indvar_next26661; - unsigned int llvm_cbe_c_2312458_12; - unsigned int llvm_cbe_c_2312458_12__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp1176; - unsigned char llvm_cbe_tmp1177; - unsigned char llvm_cbe_tmp1182; - unsigned int llvm_cbe_indvar_next26658; - unsigned int llvm_cbe_c_2426580; - unsigned int llvm_cbe_c_2426580__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp1197; - unsigned char llvm_cbe_tmp1198; - unsigned char llvm_cbe_tmp1202; - unsigned int llvm_cbe_tmp1206; - unsigned char llvm_cbe_tmp1214; - unsigned int llvm_cbe_c_2526577; - unsigned int llvm_cbe_c_2526577__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp1221; - unsigned char llvm_cbe_tmp1222; - unsigned char llvm_cbe_tmp1226; - unsigned int llvm_cbe_tmp1230; - unsigned char llvm_cbe_tmp1238; - unsigned char llvm_cbe_tmp1285; - unsigned char llvm_cbe_tmp1289; - unsigned char llvm_cbe_tmp1293; - unsigned int llvm_cbe_c_2612465_12; - unsigned int llvm_cbe_c_2612465_12__PHI_TEMPORARY; - unsigned char llvm_cbe_x_10; - unsigned char llvm_cbe_x_10__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp1317; - unsigned char llvm_cbe_tmp1318; - unsigned int llvm_cbe_indvar_next26655; - unsigned char llvm_cbe_tmp1338; - unsigned char llvm_cbe_tmp1354; - unsigned int llvm_cbe_c_2712472_12; - unsigned int llvm_cbe_c_2712472_12__PHI_TEMPORARY; - unsigned char llvm_cbe_x1364_10; - unsigned char llvm_cbe_x1364_10__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp1382; - unsigned char llvm_cbe_tmp1383; - unsigned int llvm_cbe_indvar_next26652; - unsigned char *llvm_cbe_tmp519812479; - unsigned char *llvm_cbe_tmp1407; - unsigned char llvm_cbe_tmp1408; - unsigned int llvm_cbe_tmp14081409; - unsigned char llvm_cbe_tmp141812502; - unsigned int llvm_cbe_inescq_9; - unsigned int llvm_cbe_inescq_9__PHI_TEMPORARY; - unsigned int llvm_cbe_c_18; - unsigned int llvm_cbe_c_18__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp1416; - unsigned char llvm_cbe_tmp1418; - unsigned int llvm_cbe_inescq_912486_0; - unsigned int llvm_cbe_inescq_912486_0__PHI_TEMPORARY; - unsigned int llvm_cbe_c_1812491_0; - unsigned int llvm_cbe_c_1812491_0__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp1424; - unsigned char *llvm_cbe_tmp1425; - unsigned char llvm_cbe_tmp1426; - unsigned int llvm_cbe_inescq_912486_1; - unsigned int llvm_cbe_inescq_912486_1__PHI_TEMPORARY; - unsigned int llvm_cbe_c_1812491_1; - unsigned int llvm_cbe_c_1812491_1__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp1431; - unsigned char llvm_cbe_tmp1439; - unsigned char *llvm_cbe_tmp1447_pn; - unsigned char *llvm_cbe_storemerge5533; - unsigned char llvm_cbe_tmp1451; - unsigned char llvm_cbe_tmp1459; - unsigned char *llvm_cbe_tmp1466; - unsigned char llvm_cbe_tmp1468; - unsigned char llvm_cbe_tmp1475; - unsigned char *llvm_cbe_tmp1485; - unsigned char llvm_cbe_tmp1486; - unsigned char llvm_cbe_tmp1494; - unsigned int llvm_cbe_inescq_10; - unsigned int llvm_cbe_inescq_10__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp1499; - unsigned char llvm_cbe_tmp1500; - unsigned int llvm_cbe_tmp15211522; - unsigned int llvm_cbe_tmp1537; - unsigned int llvm_cbe_tmp1540; - unsigned int llvm_cbe_tmp1542; - unsigned int llvm_cbe_d_10; - unsigned int llvm_cbe_d_10__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp519812520; - unsigned int llvm_cbe_d_1012504_1; - unsigned int llvm_cbe_d_1012504_1__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp1597; - unsigned int llvm_cbe_indvar26648; - unsigned int llvm_cbe_indvar26648__PHI_TEMPORARY; - unsigned int llvm_cbe_c_2812521_12; - unsigned char *llvm_cbe_tmp1609; - unsigned char llvm_cbe_tmp1610; - unsigned char *llvm_cbe_tmp1624; - unsigned char llvm_cbe_tmp1627; - unsigned int llvm_cbe_tmp16271628; - unsigned char *llvm_cbe_tmp1633; - unsigned char llvm_cbe_tmp1634; - unsigned int llvm_cbe_indvar26645; - unsigned int llvm_cbe_indvar26645__PHI_TEMPORARY; - unsigned int llvm_cbe_c_2812521_12_us; - unsigned char *llvm_cbe_tmp1609_us; - unsigned char llvm_cbe_tmp1610_us; - unsigned int llvm_cbe_inescq_11; - unsigned int llvm_cbe_inescq_11__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp1658; - unsigned char llvm_cbe_tmp1659; - unsigned char *llvm_cbe_tmp1673; - unsigned char llvm_cbe_tmp1676; - unsigned int llvm_cbe_tmp16761677; - unsigned char *llvm_cbe_tmp1682; - unsigned char llvm_cbe_tmp1683; - unsigned int llvm_cbe_c_29; - unsigned int llvm_cbe_c_29__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp1692; - unsigned int llvm_cbe_class_lastchar_6; - unsigned int llvm_cbe_class_lastchar_6__PHI_TEMPORARY; - unsigned int llvm_cbe_class_charcount_6; - unsigned int llvm_cbe_class_charcount_6__PHI_TEMPORARY; - unsigned int llvm_cbe_inescq_3; - unsigned int llvm_cbe_inescq_3__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp1695; - unsigned char *llvm_cbe_tmp1696; - unsigned char llvm_cbe_tmp1698; - unsigned int llvm_cbe_tmp16981699; - unsigned int llvm_cbe_class_lastchar_8; - unsigned int llvm_cbe_class_lastchar_8__PHI_TEMPORARY; - unsigned int llvm_cbe_class_charcount_8; - unsigned int llvm_cbe_class_charcount_8__PHI_TEMPORARY; - unsigned int llvm_cbe_inescq_5; - unsigned int llvm_cbe_inescq_5__PHI_TEMPORARY; - unsigned int llvm_cbe_c_12; - unsigned int llvm_cbe_c_12__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp519812532; - unsigned int llvm_cbe_firstbyte102_5; - unsigned char *llvm_cbe_tmp1751; - unsigned char *llvm_cbe_tmp519612533; - unsigned char *llvm_cbe_code105_2712620; - unsigned int llvm_cbe_firstbyte102_6; - unsigned char *llvm_cbe_tmp1772; - unsigned int llvm_cbe_c_3112623_4; - unsigned int llvm_cbe_c_3112623_4__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp1781; - unsigned int llvm_cbe_tmp1772_sum; - unsigned char *llvm_cbe_tmp1797; - unsigned char *ltmp_7_1; - unsigned char *llvm_cbe_code105_11; - unsigned char *llvm_cbe_code105_11__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp1802; - unsigned char *llvm_cbe_tmp519612629; - unsigned char *llvm_cbe_tmp1810; - unsigned char *llvm_cbe_p1813_626504; - unsigned char llvm_cbe_tmp182826506; - unsigned char llvm_cbe_tmp183126509; - unsigned char *llvm_cbe_p1813_626505; - unsigned char *llvm_cbe_p1813_626505__PHI_TEMPORARY; - unsigned int llvm_cbe_min_626502; - unsigned int llvm_cbe_min_626502__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp1820; - unsigned int llvm_cbe_tmp1823; - unsigned char *llvm_cbe_p1813_6; - unsigned char llvm_cbe_tmp1828; - unsigned char llvm_cbe_tmp1831; - unsigned char *llvm_cbe_p1813_6_lcssa; - unsigned char *llvm_cbe_p1813_6_lcssa__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp1810_pn_lcssa; - unsigned char *llvm_cbe_tmp1810_pn_lcssa__PHI_TEMPORARY; - unsigned int llvm_cbe_min_6_lcssa; - unsigned int llvm_cbe_min_6_lcssa__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp1848; - unsigned char *llvm_cbe_tmp1856; - unsigned char llvm_cbe_tmp1858; - unsigned char llvm_cbe_tmp187826498; - unsigned int llvm_cbe_p1813_926494_rec; - unsigned int llvm_cbe_p1813_926494_rec__PHI_TEMPORARY; - unsigned int llvm_cbe_max_826493; - unsigned int llvm_cbe_max_826493__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp1867; - unsigned int llvm_cbe_tmp1870; - unsigned char *llvm_cbe_tmp1872; - unsigned char llvm_cbe_tmp1875; - unsigned char llvm_cbe_tmp1878; - unsigned char *llvm_cbe_p1813_9_lcssa; - unsigned char *llvm_cbe_p1813_9_lcssa__PHI_TEMPORARY; - unsigned int llvm_cbe_max_8_lcssa; - unsigned int llvm_cbe_max_8_lcssa__PHI_TEMPORARY; - unsigned int llvm_cbe_repeat_max_3; - unsigned int llvm_cbe_repeat_max_3__PHI_TEMPORARY; - unsigned int llvm_cbe_repeat_min_3; - unsigned int llvm_cbe_repeat_min_3__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp93_0; - unsigned char *llvm_cbe_tmp93_0__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp1915; - unsigned int llvm_cbe_repeat_max_4; - unsigned int llvm_cbe_repeat_max_4__PHI_TEMPORARY; - unsigned int llvm_cbe_repeat_min_4; - unsigned int llvm_cbe_repeat_min_4__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp519812674; - unsigned int llvm_cbe_repeat_max_9; - unsigned int llvm_cbe_repeat_max_9__PHI_TEMPORARY; - unsigned int llvm_cbe_repeat_min_9; - unsigned int llvm_cbe_repeat_min_9__PHI_TEMPORARY; - unsigned int llvm_cbe_reqbyte103_1; - unsigned int llvm_cbe_firstbyte102_7; - unsigned int llvm_cbe_iftmp_236_0; - unsigned char *llvm_cbe_tmp1949; - unsigned char *llvm_cbe_tmp1950; - unsigned char llvm_cbe_tmp1951; - unsigned char llvm_cbe_tmp197412733; - unsigned int llvm_cbe_repeat_type_0; - unsigned int llvm_cbe_repeat_type_0__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp1974; - unsigned int llvm_cbe_possessive_quantifier_512675_0; - unsigned int llvm_cbe_possessive_quantifier_512675_0__PHI_TEMPORARY; - unsigned int llvm_cbe_repeat_type_012701_0; - unsigned int llvm_cbe_repeat_type_012701_0__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp1982; - unsigned int llvm_cbe_tmp19821983; - unsigned int llvm_cbe_tmp1994; - unsigned int llvm_cbe_tmp1995; - unsigned int llvm_cbe_reqbyte103_6; - unsigned int llvm_cbe_reqbyte103_6__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp2007; - unsigned char llvm_cbe_tmp2010; - unsigned int llvm_cbe_tmp2017; - unsigned char llvm_cbe_tmp209512753; - unsigned int llvm_cbe_possessive_quantifier_512675_1; - unsigned int llvm_cbe_possessive_quantifier_512675_1__PHI_TEMPORARY; - unsigned int llvm_cbe_repeat_type_012701_1; - unsigned int llvm_cbe_repeat_type_012701_1__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp2027; - unsigned char llvm_cbe_tmp2034; - unsigned int llvm_cbe_tmp20342035; - unsigned char *llvm_cbe_tmp2046; - unsigned int llvm_cbe_tmp2052; - unsigned int llvm_cbe_tmp20682069; - unsigned char *llvm_cbe_tmp2080; - unsigned int llvm_cbe_tmp2086; - unsigned int llvm_cbe_possessive_quantifier_6; - unsigned int llvm_cbe_possessive_quantifier_6__PHI_TEMPORARY; - unsigned int llvm_cbe_c_32; - unsigned int llvm_cbe_c_32__PHI_TEMPORARY; - unsigned int llvm_cbe_reqbyte103_7; - unsigned int llvm_cbe_reqbyte103_7__PHI_TEMPORARY; - unsigned int llvm_cbe_op_type_5; - unsigned int llvm_cbe_op_type_5__PHI_TEMPORARY; - unsigned int llvm_cbe_repeat_type_6; - unsigned int llvm_cbe_repeat_type_6__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp2095; - unsigned int llvm_cbe_possessive_quantifier_612736_0; - unsigned int llvm_cbe_possessive_quantifier_612736_0__PHI_TEMPORARY; - unsigned int llvm_cbe_c_3212739_0; - unsigned int llvm_cbe_c_3212739_0__PHI_TEMPORARY; - unsigned int llvm_cbe_reqbyte103_712742_0; - unsigned int llvm_cbe_reqbyte103_712742_0__PHI_TEMPORARY; - unsigned int llvm_cbe_op_type_512745_0; - unsigned int llvm_cbe_op_type_512745_0__PHI_TEMPORARY; - unsigned int llvm_cbe_repeat_type_612750_0; - unsigned int llvm_cbe_repeat_type_612750_0__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp2103; - unsigned int llvm_cbe_tmp21032104; - unsigned char llvm_cbe_tmp2107; - unsigned int llvm_cbe_tmp21072108; - unsigned int llvm_cbe_possessive_quantifier_612736_1; - unsigned int llvm_cbe_possessive_quantifier_612736_1__PHI_TEMPORARY; - unsigned int llvm_cbe_c_3212739_1; - unsigned int llvm_cbe_c_3212739_1__PHI_TEMPORARY; - unsigned int llvm_cbe_reqbyte103_712742_1; - unsigned int llvm_cbe_reqbyte103_712742_1__PHI_TEMPORARY; - unsigned int llvm_cbe_op_type_512745_1; - unsigned int llvm_cbe_op_type_512745_1__PHI_TEMPORARY; - unsigned int llvm_cbe_repeat_type_612750_1; - unsigned int llvm_cbe_repeat_type_612750_1__PHI_TEMPORARY; - unsigned int llvm_cbe_prop_value_0; - unsigned int llvm_cbe_prop_value_0__PHI_TEMPORARY; - unsigned int llvm_cbe_prop_type_0; - unsigned int llvm_cbe_prop_type_0__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp2130; - unsigned char llvm_cbe_tmp21412142; - unsigned char *llvm_cbe_tmp2146; - unsigned char *llvm_cbe_tmp2158; - unsigned char *llvm_cbe_tmp2177; - unsigned char *llvm_cbe_tmp2196; - unsigned char *llvm_cbe_tmp2224; - unsigned char *llvm_cbe_tmp2244; - unsigned char *llvm_cbe_tmp2254; - unsigned char llvm_cbe_tmp2273; - unsigned char *llvm_cbe_tmp227612756; - unsigned char *llvm_cbe_tmp2276; - unsigned char *llvm_cbe_tmp2288; - unsigned char *llvm_cbe_tmp2303; - unsigned char *llvm_cbe_code105_16; - unsigned char *llvm_cbe_code105_16__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp2307; - unsigned char llvm_cbe_tmp23132314; - unsigned char *llvm_cbe_tmp2318; - unsigned char *llvm_cbe_tmp2337; - unsigned int llvm_cbe_repeat_max_11; - unsigned int llvm_cbe_repeat_max_11__PHI_TEMPORARY; - unsigned char *llvm_cbe_code105_14; - unsigned char *llvm_cbe_code105_14__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp2347; - unsigned char *llvm_cbe_tmp2396; - unsigned char *llvm_cbe_tmp2415; - unsigned char llvm_cbe_tmp24362437; - unsigned char *llvm_cbe_tmp2434; - unsigned int llvm_cbe_repeat_max_14; - unsigned char *llvm_cbe_tmp2471; - unsigned int llvm_cbe_tmp24842485; - unsigned int llvm_cbe_tmp2488; - unsigned char llvm_cbe_tmp2497; - unsigned char *llvm_cbe_tmp519813229; - unsigned char *llvm_cbe_tmp519813230; - unsigned int llvm_cbe_ket_6_rec; - unsigned int llvm_cbe_ket_6_rec__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp2521; - unsigned char llvm_cbe_tmp2526; - unsigned int llvm_cbe_tmp2530_rec; - unsigned char *llvm_cbe_tmp2530; - unsigned char llvm_cbe_tmp2532; - unsigned int llvm_cbe_tmp2541; - unsigned int llvm_cbe_ketoffset_7; - unsigned int llvm_cbe_ketoffset_7__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp2567; - unsigned char *ltmp_8_1; - unsigned char *llvm_cbe_tmp2570; - unsigned char *llvm_cbe_tmp2586; - unsigned char *ltmp_9_1; - unsigned char *llvm_cbe_tmp2589; - unsigned char *llvm_cbe_tmp2598; - unsigned char *llvm_cbe_bralink_7; - unsigned char *llvm_cbe_bralink_7__PHI_TEMPORARY; - unsigned char *llvm_cbe_previous_8; - unsigned char *llvm_cbe_previous_8__PHI_TEMPORARY; - unsigned char *llvm_cbe_code105_17; - unsigned char *llvm_cbe_code105_17__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp2627; - unsigned int llvm_cbe_tmp2640; - unsigned int llvm_cbe_tmp2643; - unsigned int llvm_cbe_reqbyte103_10; - unsigned char llvm_cbe_tmp27022703; - unsigned int llvm_cbe_indvar26622; - unsigned int llvm_cbe_indvar26622__PHI_TEMPORARY; - unsigned char *llvm_cbe_save_hwm_113294_0; - unsigned char *llvm_cbe_save_hwm_113294_0__PHI_TEMPORARY; - unsigned int llvm_cbe_code105_1913296_0_rec; - unsigned char *llvm_cbe_tmp2665; - unsigned char *ltmp_10_1; - unsigned int llvm_cbe_indvar26619; - unsigned int llvm_cbe_indvar26619__PHI_TEMPORARY; - unsigned int llvm_cbe_hc_813305_0_rec; - unsigned char *llvm_cbe_tmp2673; - unsigned char llvm_cbe_tmp2676; - unsigned char *llvm_cbe_tmp2680; - unsigned char llvm_cbe_tmp2681; - unsigned char *llvm_cbe_tmp2691; - unsigned char llvm_cbe_tmp2700; - unsigned char *llvm_cbe_tmp2709; - unsigned int llvm_cbe_indvar_next26623; - unsigned char *llvm_cbe_tmp2725; - unsigned char *llvm_cbe_save_hwm_2; - unsigned char *llvm_cbe_save_hwm_2__PHI_TEMPORARY; - unsigned char *llvm_cbe_code105_20; - unsigned char *llvm_cbe_code105_20__PHI_TEMPORARY; - unsigned int llvm_cbe_reqbyte103_11; - unsigned int llvm_cbe_reqbyte103_11__PHI_TEMPORARY; - unsigned char *llvm_cbe_save_hwm_213284_0; - unsigned char *llvm_cbe_save_hwm_213284_0__PHI_TEMPORARY; - unsigned char *llvm_cbe_code105_2013285_0; - unsigned char *llvm_cbe_code105_2013285_0__PHI_TEMPORARY; - unsigned int llvm_cbe_reqbyte103_1113286_0; - unsigned int llvm_cbe_reqbyte103_1113286_0__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp2744; - unsigned int llvm_cbe_repeat_max_18; - unsigned int llvm_cbe_repeat_max_18__PHI_TEMPORARY; - unsigned char *llvm_cbe_save_hwm_213284_1; - unsigned char *llvm_cbe_save_hwm_213284_1__PHI_TEMPORARY; - unsigned char *llvm_cbe_code105_2013285_1; - unsigned char *llvm_cbe_code105_2013285_1__PHI_TEMPORARY; - unsigned int llvm_cbe_reqbyte103_1113286_1; - unsigned int llvm_cbe_reqbyte103_1113286_1__PHI_TEMPORARY; - unsigned int llvm_cbe_repeat_max_16; - unsigned int llvm_cbe_repeat_max_16__PHI_TEMPORARY; - unsigned char *llvm_cbe_bralink_813241_0; - unsigned char *llvm_cbe_bralink_813241_0__PHI_TEMPORARY; - unsigned char *llvm_cbe_save_hwm_313252_0; - unsigned char *llvm_cbe_save_hwm_313252_0__PHI_TEMPORARY; - unsigned char *llvm_cbe_previous_913258_0; - unsigned char *llvm_cbe_previous_913258_0__PHI_TEMPORARY; - unsigned char *llvm_cbe_code105_1813259_0; - unsigned char *llvm_cbe_code105_1813259_0__PHI_TEMPORARY; - unsigned int llvm_cbe_reqbyte103_1213269_0; - unsigned int llvm_cbe_reqbyte103_1213269_0__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp2765; - unsigned int llvm_cbe_tmp2766; - unsigned char llvm_cbe_tmp2784; - unsigned char llvm_cbe_tmp28702871; - unsigned char *llvm_cbe_tmp2781; - unsigned char *llvm_cbe_tmp2787; - unsigned char *llvm_cbe_tmp2796; - unsigned int llvm_cbe_tmp2806; - unsigned int llvm_cbe_iftmp_312_0; - unsigned int llvm_cbe_iftmp_312_0__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp2822; - unsigned char *ltmp_11_1; - unsigned char *ltmp_12_1; - unsigned char *llvm_cbe_bralink_913313_0_ph; - unsigned char *llvm_cbe_bralink_913313_0_ph__PHI_TEMPORARY; - unsigned char *llvm_cbe_code105_2313314_0_ph; - unsigned char *llvm_cbe_code105_2313314_0_ph__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp2844; - unsigned char llvm_cbe_tmp2872; - unsigned int llvm_cbe_indvar; - unsigned int llvm_cbe_indvar__PHI_TEMPORARY; - unsigned int llvm_cbe_hc2777_713319_0_rec; - unsigned char *llvm_cbe_tmp2832; - unsigned char llvm_cbe_tmp2835; - unsigned char *llvm_cbe_tmp2839; - unsigned char llvm_cbe_tmp2840; - unsigned char *llvm_cbe_tmp2859; - unsigned char llvm_cbe_tmp2868; - unsigned char *llvm_cbe_tmp2886; - unsigned char *llvm_cbe_bralink_913313_1; - unsigned char *llvm_cbe_bralink_913313_1__PHI_TEMPORARY; - unsigned char *llvm_cbe_code105_2313314_1; - unsigned char *llvm_cbe_code105_2313314_1__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp2902; - unsigned int llvm_cbe_indvar_next26614; - unsigned int llvm_cbe_indvar26613; - unsigned int llvm_cbe_indvar26613__PHI_TEMPORARY; - unsigned char *llvm_cbe_bralink_10; - unsigned char *llvm_cbe_bralink_10__PHI_TEMPORARY; - unsigned char *llvm_cbe_save_hwm_8; - unsigned char *llvm_cbe_save_hwm_8__PHI_TEMPORARY; - unsigned char *llvm_cbe_code105_21; - unsigned char *llvm_cbe_code105_21__PHI_TEMPORARY; - unsigned int llvm_cbe_i_9; - unsigned char *llvm_cbe_bralink_11_ph; - unsigned char *llvm_cbe_bralink_11_ph__PHI_TEMPORARY; - unsigned char *llvm_cbe_save_hwm_9_ph; - unsigned char *llvm_cbe_save_hwm_9_ph__PHI_TEMPORARY; - unsigned char *llvm_cbe_code105_22_ph; - unsigned char *llvm_cbe_code105_22_ph__PHI_TEMPORARY; - unsigned int llvm_cbe_indvar26616; - unsigned int llvm_cbe_indvar26616__PHI_TEMPORARY; - unsigned char *llvm_cbe_bralink_1126488; - unsigned char *llvm_cbe_bralink_1126488__PHI_TEMPORARY; - unsigned int llvm_cbe_code105_2226489_rec; - unsigned char *llvm_cbe_code105_2226489; - unsigned int llvm_cbe_tmp2917; - unsigned int llvm_cbe_tmp2918; - unsigned char *llvm_cbe_tmp2924; - unsigned char llvm_cbe_tmp2925; - unsigned char *llvm_cbe_tmp2929; - unsigned char llvm_cbe_tmp2930; - unsigned int llvm_cbe_tmp2932; - unsigned char *llvm_cbe_tmp2941; - unsigned char *llvm_cbe_iftmp_320_0; - unsigned char *llvm_cbe_iftmp_320_0__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp29492950; - unsigned char llvm_cbe_tmp29532954; - unsigned int llvm_cbe_indvar_next26617; - unsigned int llvm_cbe_repeat_max_17; - unsigned int llvm_cbe_repeat_max_17__PHI_TEMPORARY; - unsigned char *llvm_cbe_save_hwm_313252_1; - unsigned char *llvm_cbe_save_hwm_313252_1__PHI_TEMPORARY; - unsigned char *llvm_cbe_code105_1813259_1; - unsigned char *llvm_cbe_code105_1813259_1__PHI_TEMPORARY; - unsigned int llvm_cbe_reqbyte103_1213269_1; - unsigned int llvm_cbe_reqbyte103_1213269_1__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp2980; - unsigned char llvm_cbe_tmp2983; - unsigned char llvm_cbe_tmp2988; - unsigned int llvm_cbe_tmp2980_sum; - unsigned char *llvm_cbe_tmp2993; - unsigned char llvm_cbe_tmp3004; - unsigned int llvm_cbe_scode_5_rec; - unsigned int llvm_cbe_scode_5_rec__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp2993_sum26701; - unsigned int llvm_cbe_tmp3014; - unsigned char llvm_cbe_tmp3020; - unsigned char llvm_cbe_tmp3026; - unsigned char llvm_cbe_tmp3031; - unsigned int llvm_cbe_tmp3035_rec; - unsigned char llvm_cbe_tmp3037; - unsigned char *llvm_cbe_tmp519813331; - unsigned char *llvm_cbe_tmp2959; - unsigned int llvm_cbe_repeat_max_15; - unsigned int llvm_cbe_repeat_max_15__PHI_TEMPORARY; - unsigned char *llvm_cbe_save_hwm_4; - unsigned char *llvm_cbe_save_hwm_4__PHI_TEMPORARY; - unsigned char *llvm_cbe_code105_12; - unsigned char *llvm_cbe_code105_12__PHI_TEMPORARY; - unsigned int llvm_cbe_reqbyte103_8; - unsigned int llvm_cbe_reqbyte103_8__PHI_TEMPORARY; - unsigned int llvm_cbe_repeat_max_12; - unsigned int llvm_cbe_repeat_max_12__PHI_TEMPORARY; - unsigned char *llvm_cbe_save_hwm_413043_0; - unsigned char *llvm_cbe_save_hwm_413043_0__PHI_TEMPORARY; - unsigned char *llvm_cbe_code105_1213058_0; - unsigned char *llvm_cbe_code105_1213058_0__PHI_TEMPORARY; - unsigned int llvm_cbe_reqbyte103_813077_0; - unsigned int llvm_cbe_reqbyte103_813077_0__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp3058; - unsigned char llvm_cbe_tmp3059; - unsigned char llvm_cbe_tmp3084; - unsigned char *llvm_cbe_tmp3090; - unsigned int llvm_cbe_tmp3092; - unsigned char llvm_cbe_tmp3099; - unsigned char *ltmp_13_1; - unsigned int llvm_cbe_tmp3134; - unsigned char *llvm_cbe_tmp3135; - unsigned char llvm_cbe_tmp31413142; - unsigned char llvm_cbe_tmp31453146; - unsigned char *llvm_cbe_tmp3151; - unsigned char *llvm_cbe_tmp3152; - unsigned char *llvm_cbe_tmp3157; - unsigned int llvm_cbe_repeat_max_13; - unsigned int llvm_cbe_repeat_max_13__PHI_TEMPORARY; - unsigned char *llvm_cbe_save_hwm_5; - unsigned char *llvm_cbe_save_hwm_5__PHI_TEMPORARY; - unsigned char *llvm_cbe_code105_13; - unsigned char *llvm_cbe_code105_13__PHI_TEMPORARY; - unsigned int llvm_cbe_reqbyte103_9; - unsigned int llvm_cbe_reqbyte103_9__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp3167; - unsigned char *llvm_cbe_tmp519613332; - unsigned char *llvm_cbe_tmp3176; - unsigned char *llvm_cbe_tmp3177; - unsigned char *llvm_cbe_tmp3178; - unsigned char llvm_cbe_tmp3180; - unsigned char *llvm_cbe_tmp3187; - unsigned char llvm_cbe_tmp3189; - unsigned char *llvm_cbe_tmp3195_pn; - unsigned char *llvm_cbe_tmp3195_pn__PHI_TEMPORARY; - unsigned char *llvm_cbe_storemerge; - unsigned char llvm_cbe_tmp3199; - unsigned int llvm_cbe_reset_bracount132_8; - unsigned int llvm_cbe_reset_bracount132_8__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp3227; - unsigned char llvm_cbe_tmp3234; - unsigned char *llvm_cbe_tmp3258; - unsigned char *llvm_cbe_tmp3259; - unsigned char *llvm_cbe_tmp3260; - unsigned char llvm_cbe_tmp3261; - unsigned char *llvm_cbe_tmp3268; - unsigned char llvm_cbe_tmp3269; - unsigned char llvm_cbe_tmp3318; - unsigned int llvm_cbe_tmp33183319; - unsigned int llvm_cbe_terminator_0; - unsigned int llvm_cbe_terminator_0__PHI_TEMPORARY; - unsigned int llvm_cbe_refsign_6; - unsigned int llvm_cbe_refsign_6__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp3326; - unsigned char *llvm_cbe_tmp3327; - unsigned char *llvm_cbe_tmp3328; - unsigned char llvm_cbe_tmp3329; - unsigned char llvm_cbe_tmp3332; - unsigned char llvm_cbe_tmp338226532; - unsigned char llvm_cbe_tmp338526535; - unsigned int llvm_cbe_recno_726527; - unsigned int llvm_cbe_recno_726527__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp3353; - unsigned char llvm_cbe_tmp3354; - unsigned int llvm_cbe_tmp33543355; - unsigned char llvm_cbe_tmp3357; - unsigned int llvm_cbe_tmp3370; - unsigned int llvm_cbe_recno_6; - unsigned int llvm_cbe_recno_6__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp3375; - unsigned char *llvm_cbe_tmp3376; - unsigned char llvm_cbe_tmp3382; - unsigned char llvm_cbe_tmp3385; - unsigned int llvm_cbe_recno_7_lcssa; - unsigned int llvm_cbe_recno_7_lcssa__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp3392; - unsigned int llvm_cbe_tmp3396; - unsigned char llvm_cbe_tmp3404; - unsigned char *llvm_cbe_tmp3412; - unsigned char llvm_cbe_tmp3413; - unsigned char *llvm_cbe_tmp3416; - unsigned char *llvm_cbe_tmp3419; - unsigned char *llvm_cbe_tmp3420; - unsigned int llvm_cbe_tmp3448; - unsigned int llvm_cbe_tmp3451; - unsigned int llvm_cbe_tmp3464; - unsigned int llvm_cbe_recno_8; - unsigned int llvm_cbe_recno_8__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp3479; - unsigned int llvm_cbe_tmp351513357; - unsigned int llvm_cbe_i3185_613340_0; - unsigned int llvm_cbe_i3185_613340_0__PHI_TEMPORARY; - unsigned int llvm_cbe_slot_613344_0_rec; - unsigned int llvm_cbe_slot_613344_0_rec__PHI_TEMPORARY; - unsigned char *llvm_cbe_slot_613344_0; - unsigned int llvm_cbe_tmp3497; - unsigned int llvm_cbe_tmp3507; - unsigned int llvm_cbe_tmp3509_rec; - unsigned char *llvm_cbe_tmp3509; - unsigned int llvm_cbe_tmp3511; - unsigned int llvm_cbe_i3185_613340_1; - unsigned int llvm_cbe_i3185_613340_1__PHI_TEMPORARY; - unsigned char *llvm_cbe_slot_613344_1; - unsigned char *llvm_cbe_slot_613344_1__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp3531; - unsigned char llvm_cbe_tmp3536; - unsigned int llvm_cbe_tmp3538; - unsigned int llvm_cbe_tmp3555; - unsigned int llvm_cbe_tmp3559; - unsigned char *llvm_cbe_tmp519813360; - unsigned char llvm_cbe_tmp3584; - unsigned char llvm_cbe_tmp3593; - unsigned int llvm_cbe_tmp35933594; - unsigned char llvm_cbe_tmp3596; - unsigned char *llvm_cbe_tmp519813361; - unsigned int llvm_cbe_tmp3614; - unsigned int llvm_cbe_indvar26632; - unsigned int llvm_cbe_indvar26632__PHI_TEMPORARY; - unsigned int llvm_cbe_recno_9; - unsigned int llvm_cbe_recno_9__PHI_TEMPORARY; - unsigned int llvm_cbe_i3185_7; - unsigned int llvm_cbe_recno_10; - unsigned int llvm_cbe_tmp3652; - unsigned char *llvm_cbe_tmp519813362; - unsigned char *llvm_cbe_tmp3700; - unsigned char llvm_cbe_tmp3701; - unsigned int llvm_cbe_tmp37013702; - unsigned char *llvm_cbe_tmp3712; - unsigned char llvm_cbe_tmp3718; - unsigned char *llvm_cbe_tmp3737; - unsigned char *llvm_cbe_tmp374726477; - unsigned char *llvm_cbe_tmp374826478; - unsigned char llvm_cbe_tmp375026479; - unsigned char llvm_cbe_tmp375326482; - unsigned int llvm_cbe_n_526476; - unsigned int llvm_cbe_n_526476__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp3741; - unsigned char llvm_cbe_tmp3742; - unsigned int llvm_cbe_tmp3745; - unsigned char *llvm_cbe_tmp3748; - unsigned char llvm_cbe_tmp3750; - unsigned char llvm_cbe_tmp3753; - unsigned int llvm_cbe_n_5_lcssa; - unsigned int llvm_cbe_n_5_lcssa__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp3760; - unsigned char llvm_cbe_tmp3761; - unsigned char *llvm_cbe_tmp3780; - unsigned char *llvm_cbe_tmp3784; - unsigned char *llvm_cbe_tmp3792; - unsigned char *llvm_cbe_tmp3797; - unsigned char *llvm_cbe_tmp3810; - unsigned char *llvm_cbe_tmp519613366; - unsigned char *llvm_cbe_tmp3813; - unsigned char llvm_cbe_tmp3815; - unsigned int llvm_cbe_tmp38293830; - unsigned char *llvm_cbe_tmp402913426; - unsigned char *llvm_cbe_tmp3841; - unsigned char llvm_cbe_tmp3842; - unsigned int llvm_cbe_iftmp_415_0; - unsigned char *llvm_cbe_tmp3851; - unsigned char *llvm_cbe_tmp385926515; - unsigned char llvm_cbe_tmp386126517; - unsigned char llvm_cbe_tmp386426520; - unsigned char *llvm_cbe_tmp385426524; - unsigned char *llvm_cbe_tmp385426524__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp3855; - unsigned char llvm_cbe_tmp3861; - unsigned char llvm_cbe_tmp3864; - unsigned char *llvm_cbe_tmp3854_lcssa; - unsigned char *llvm_cbe_tmp3854_lcssa__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp3875; - unsigned char *llvm_cbe_tmp3881; - unsigned char llvm_cbe_tmp3882; - unsigned int llvm_cbe_tmp3893; - unsigned int llvm_cbe_tmp3901; - unsigned int llvm_cbe_tmp3904; - unsigned char *llvm_cbe_tmp3924; - unsigned int llvm_cbe_tmp398813449; - unsigned int llvm_cbe_tmp3937; - unsigned int llvm_cbe_i3185_1013432_0_us; - unsigned int llvm_cbe_i3185_1013432_0_us__PHI_TEMPORARY; - unsigned int llvm_cbe_slot_913437_0_us_rec; - unsigned int llvm_cbe_slot_913437_0_us_rec__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp3930_us; - unsigned int llvm_cbe_tmp3980_us; - unsigned int llvm_cbe_tmp3982_us_rec; - unsigned int llvm_cbe_tmp3984_us; - unsigned int llvm_cbe_crc_10_us; - unsigned int llvm_cbe_crc_10_us__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp3940_us; - unsigned int llvm_cbe_i3185_1013432_0; - unsigned int llvm_cbe_i3185_1013432_0__PHI_TEMPORARY; - unsigned int llvm_cbe_slot_913437_0_rec; - unsigned int llvm_cbe_slot_913437_0_rec__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp3930; - unsigned char llvm_cbe_tmp3940; - unsigned char *llvm_cbe_slot_913437_0_us_le62; - unsigned char *llvm_cbe_tmp519813452; - unsigned int llvm_cbe_crc_10; - unsigned int llvm_cbe_crc_10__PHI_TEMPORARY; - unsigned char *llvm_cbe_slot_913437_0_us_le; - unsigned char *llvm_cbe_slot_913437_0_le; - unsigned char *llvm_cbe_slot_913437_0_us61_14; - unsigned char *llvm_cbe_slot_913437_0_us61_14__PHI_TEMPORARY; - unsigned char *llvm_cbe_slot_913437_059_14; - unsigned char *llvm_cbe_slot_913437_059_14__PHI_TEMPORARY; - unsigned char *llvm_cbe_slot_913437_0_lcssa14144_us_lcssa; - unsigned char *llvm_cbe_slot_913437_0_lcssa14144_us_lcssa__PHI_TEMPORARY; - unsigned int llvm_cbe_i3185_1013432_0_lcssa14142_us_lcssa; - unsigned int llvm_cbe_i3185_1013432_0_lcssa14142_us_lcssa__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp3969; - unsigned char *ltmp_14_1; - unsigned int llvm_cbe_tmp3980; - unsigned int llvm_cbe_tmp3982_rec; - unsigned int llvm_cbe_tmp3984; - unsigned char *llvm_cbe_slot_913437_0_us; - unsigned char *llvm_cbe_tmp3982_us; - unsigned char *llvm_cbe_slot_913437_0; - unsigned char *llvm_cbe_tmp3982; - unsigned char *llvm_cbe_slot_913437_0_us61_0; - unsigned char *llvm_cbe_slot_913437_0_us61_0__PHI_TEMPORARY; - unsigned char *llvm_cbe_slot_913437_059_0; - unsigned char *llvm_cbe_slot_913437_059_0__PHI_TEMPORARY; - unsigned char *llvm_cbe_slot_913437_1; - unsigned char *llvm_cbe_slot_913437_1__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp3996; - unsigned int llvm_cbe_tmp4004; - unsigned char *ltmp_15_1; - unsigned char *llvm_cbe_slot_913437_0_us61_1; - unsigned char *llvm_cbe_slot_913437_0_us61_1__PHI_TEMPORARY; - unsigned char *llvm_cbe_slot_913437_059_1; - unsigned char *llvm_cbe_slot_913437_059_1__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp4019; - unsigned int llvm_cbe_tmp4023; - unsigned int llvm_cbe_terminator_7; - unsigned int llvm_cbe_terminator_7__PHI_TEMPORARY; - unsigned int llvm_cbe_is_recurse_0; - unsigned int llvm_cbe_is_recurse_0__PHI_TEMPORARY; - unsigned char *llvm_cbe_save_hwm_10; - unsigned char *llvm_cbe_save_hwm_10__PHI_TEMPORARY; - unsigned int llvm_cbe_zerofirstbyte_4; - unsigned int llvm_cbe_zerofirstbyte_4__PHI_TEMPORARY; - unsigned int llvm_cbe_zeroreqbyte_4; - unsigned int llvm_cbe_zeroreqbyte_4__PHI_TEMPORARY; - unsigned int llvm_cbe_firstbyte102_13; - unsigned int llvm_cbe_firstbyte102_13__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp4028; - unsigned char *llvm_cbe_tmp4029; - unsigned int llvm_cbe_terminator_713369_0_ph; - unsigned int llvm_cbe_terminator_713369_0_ph__PHI_TEMPORARY; - unsigned int llvm_cbe_is_recurse_013390_0_ph; - unsigned int llvm_cbe_is_recurse_013390_0_ph__PHI_TEMPORARY; - unsigned char *llvm_cbe_save_hwm_1013396_0_ph; - unsigned char *llvm_cbe_save_hwm_1013396_0_ph__PHI_TEMPORARY; - unsigned int llvm_cbe_zerofirstbyte_413398_0_ph; - unsigned int llvm_cbe_zerofirstbyte_413398_0_ph__PHI_TEMPORARY; - unsigned int llvm_cbe_zeroreqbyte_413400_0_ph; - unsigned int llvm_cbe_zeroreqbyte_413400_0_ph__PHI_TEMPORARY; - unsigned int llvm_cbe_firstbyte102_1313402_0_ph; - unsigned int llvm_cbe_firstbyte102_1313402_0_ph__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp402913416_0_ph; - unsigned char *llvm_cbe_tmp402913416_0_ph__PHI_TEMPORARY; - unsigned char *llvm_cbe_storemerge5542_ph; - unsigned char *llvm_cbe_storemerge5542_ph__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp403726541; - unsigned char llvm_cbe_tmp403926543; - unsigned char llvm_cbe_tmp404226546; - unsigned char *llvm_cbe_tmp403226550; - unsigned char *llvm_cbe_tmp403226550__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp4033; - unsigned char llvm_cbe_tmp4039; - unsigned char llvm_cbe_tmp4042; - unsigned char *llvm_cbe_tmp4032_lcssa; - unsigned char *llvm_cbe_tmp4032_lcssa__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp4053; - unsigned char *llvm_cbe_tmp4059; - unsigned char llvm_cbe_tmp4060; - unsigned char *llvm_cbe_tmp4079; - unsigned int llvm_cbe_tmp411513469; - unsigned int llvm_cbe_i3185_1413455_0; - unsigned int llvm_cbe_i3185_1413455_0__PHI_TEMPORARY; - unsigned int llvm_cbe_slot_1313461_0_rec; - unsigned int llvm_cbe_slot_1313461_0_rec__PHI_TEMPORARY; - unsigned char *llvm_cbe_slot_1313461_0; - unsigned int llvm_cbe_tmp4097; - unsigned int llvm_cbe_tmp4107; - unsigned int llvm_cbe_tmp4109_rec; - unsigned char *llvm_cbe_tmp4109; - unsigned int llvm_cbe_tmp4111; - unsigned int llvm_cbe_i3185_1413455_1; - unsigned int llvm_cbe_i3185_1413455_1__PHI_TEMPORARY; - unsigned char *llvm_cbe_slot_1313461_1; - unsigned char *llvm_cbe_slot_1313461_1__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp4131; - unsigned char llvm_cbe_tmp4136; - unsigned int llvm_cbe_tmp4138; - unsigned int llvm_cbe_tmp4145; - unsigned char *llvm_cbe_tmp4146; - unsigned int llvm_cbe_tmp4149; - unsigned char *llvm_cbe_tmp519813472; - unsigned int llvm_cbe_recno_11; - unsigned int llvm_cbe_recno_11__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp4178; - unsigned char llvm_cbe_tmp4179; - unsigned char *llvm_cbe_tmp4195; - unsigned char llvm_cbe_tmp4196; - unsigned char llvm_cbe_tmp4199; - unsigned char *llvm_cbe_tmp422226553; - unsigned char llvm_cbe_tmp422326554; - unsigned char llvm_cbe_tmp422626557; - unsigned int llvm_cbe_recno_1426552; - unsigned int llvm_cbe_recno_1426552__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp4215; - unsigned char llvm_cbe_tmp4216; - unsigned int llvm_cbe_tmp4219; - unsigned char *llvm_cbe_tmp4220; - unsigned char llvm_cbe_tmp4223; - unsigned char llvm_cbe_tmp4226; - unsigned int llvm_cbe_recno_14_lcssa; - unsigned int llvm_cbe_recno_14_lcssa__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp4233; - unsigned char llvm_cbe_tmp4234; - unsigned int llvm_cbe_tmp4255; - unsigned int llvm_cbe_tmp4258; - unsigned int llvm_cbe_tmp4281; - unsigned int llvm_cbe_tmp4283; - unsigned int llvm_cbe_recno_12; - unsigned int llvm_cbe_recno_12__PHI_TEMPORARY; - unsigned char *llvm_cbe_save_hwm_11; - unsigned char *llvm_cbe_save_hwm_11__PHI_TEMPORARY; - unsigned int llvm_cbe_zerofirstbyte_8; - unsigned int llvm_cbe_zerofirstbyte_8__PHI_TEMPORARY; - unsigned int llvm_cbe_zeroreqbyte_8; - unsigned int llvm_cbe_zeroreqbyte_8__PHI_TEMPORARY; - unsigned int llvm_cbe_firstbyte102_15; - unsigned int llvm_cbe_firstbyte102_15__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp4289; - unsigned char *llvm_cbe_tmp4303; - unsigned char *llvm_cbe_tmp4306; - unsigned char *llvm_cbe_called_5; - unsigned char *llvm_cbe_called_5__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp4318; - unsigned char *llvm_cbe_tmp4319; - unsigned int llvm_cbe_tmp4321; - unsigned char *llvm_cbe_tmp519813477; - unsigned char *llvm_cbe_tmp4330; - unsigned char *llvm_cbe_tmp4332; - unsigned char *llvm_cbe_tmp4335; - unsigned char *llvm_cbe_tmp4338; - unsigned char *llvm_cbe_tmp4350; - unsigned char *llvm_cbe_tmp4358; - unsigned char *llvm_cbe_tmp4366; - unsigned char llvm_cbe_tmp4373; - unsigned char llvm_cbe_tmp4378; - unsigned int llvm_cbe_tmp4399; - struct l_struct_2E_branch_chain *llvm_cbe_tmp4408; - struct l_struct_2E_branch_chain *llvm_cbe_bcptr4386_6; - struct l_struct_2E_branch_chain *llvm_cbe_bcptr4386_6__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp4418; - unsigned char *llvm_cbe_tmp519813478; - unsigned char *llvm_cbe_called_6; - unsigned char *llvm_cbe_called_6__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp4448; - unsigned char *llvm_cbe_tmp4460; - unsigned char *llvm_cbe_tmp4475; - unsigned char *llvm_cbe_tmp519613479; - unsigned int llvm_cbe_tmp4492; - unsigned int llvm_cbe_tmp4497; - unsigned int llvm_cbe_tmp4503; - unsigned int llvm_cbe_tmp4508; - unsigned int llvm_cbe_tmp4513; - unsigned int llvm_cbe_tmp4518; - unsigned int llvm_cbe_tmp4523; - unsigned int llvm_cbe_tmp4528; - unsigned int *llvm_cbe_optset_6; - unsigned int *llvm_cbe_optset_6__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp4537; - unsigned char llvm_cbe_tmp4538; - unsigned int llvm_cbe_tmp4551; - unsigned int llvm_cbe_tmp4554; - unsigned int llvm_cbe_tmp4555; - unsigned char *llvm_cbe_tmp4564; - unsigned int llvm_cbe_tmp4580; - unsigned char *llvm_cbe_tmp4606; - unsigned char *llvm_cbe_code105_24; - unsigned char *llvm_cbe_code105_24__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp4613; - unsigned int llvm_cbe_tmp4615; - unsigned char *llvm_cbe_tmp519613486; - unsigned char *llvm_cbe_slot_913437_0_us61_2; - unsigned char *llvm_cbe_slot_913437_0_us61_2__PHI_TEMPORARY; - unsigned char *llvm_cbe_slot_913437_059_2; - unsigned char *llvm_cbe_slot_913437_059_2__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp4639; - unsigned int llvm_cbe_tmp4640; - unsigned int llvm_cbe_tmp4652; - unsigned char *llvm_cbe_slot_913437_0_us61_3; - unsigned char *llvm_cbe_slot_913437_0_us61_3__PHI_TEMPORARY; - unsigned char *llvm_cbe_slot_913437_059_3; - unsigned char *llvm_cbe_slot_913437_059_3__PHI_TEMPORARY; - unsigned int llvm_cbe_skipbytes133_8; - unsigned int llvm_cbe_skipbytes133_8__PHI_TEMPORARY; - unsigned int llvm_cbe_newoptions_8; - unsigned int llvm_cbe_newoptions_8__PHI_TEMPORARY; - unsigned int llvm_cbe_reset_bracount132_9; - unsigned int llvm_cbe_reset_bracount132_9__PHI_TEMPORARY; - unsigned int llvm_cbe_bravalue_8; - unsigned int llvm_cbe_bravalue_8__PHI_TEMPORARY; - unsigned char *llvm_cbe_iftmp_467_0; - unsigned int llvm_cbe_tmp4674; - unsigned int llvm_cbe_tmp4695; - unsigned int llvm_cbe_condcount_6; - unsigned int llvm_cbe_condcount_6__PHI_TEMPORARY; - unsigned int llvm_cbe_tc_6_rec; - unsigned int llvm_cbe_tc_6_rec__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp4716; - unsigned char llvm_cbe_tmp4719; - unsigned char llvm_cbe_tmp4724; - unsigned int llvm_cbe_tmp4728_rec; - unsigned char llvm_cbe_tmp4730; - unsigned char llvm_cbe_tmp4737; - unsigned char *llvm_cbe_tmp519813489; - unsigned char *llvm_cbe_tmp519813490; - unsigned int llvm_cbe_bravalue_9; - unsigned int llvm_cbe_bravalue_9__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp4766; - unsigned char llvm_cbe_tmp4767; - unsigned int llvm_cbe_tmp4780; - unsigned int llvm_cbe_tmp4781; - unsigned char *llvm_cbe_tmp4801; - unsigned char *llvm_cbe_tmp4803; - unsigned char *llvm_cbe_code105_26; - unsigned char *llvm_cbe_code105_26__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp4823; - unsigned int llvm_cbe_tmp4837; - unsigned int llvm_cbe_groupsetfirstbyte_4; - unsigned int llvm_cbe_groupsetfirstbyte_4__PHI_TEMPORARY; - unsigned int llvm_cbe_zerofirstbyte_3; - unsigned int llvm_cbe_zerofirstbyte_3__PHI_TEMPORARY; - unsigned int llvm_cbe_firstbyte102_11; - unsigned int llvm_cbe_firstbyte102_11__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp4848; - unsigned char *llvm_cbe_tmp519613492; - unsigned int llvm_cbe_tmp4861; - unsigned char *llvm_cbe_tmp519613495; - unsigned char *llvm_cbe_tmp4871; - unsigned int llvm_cbe_tmp4874; - unsigned int llvm_cbe_tmp4877; - unsigned int llvm_cbe_tmp4879; - unsigned char *llvm_cbe_tmp4895; - unsigned char llvm_cbe_tmp4897; - unsigned char llvm_cbe_tmp4905; - unsigned int llvm_cbe_firstbyte102_12; - unsigned int llvm_cbe_firstbyte102_12__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp4949; - unsigned char *llvm_cbe_tmp4950; - unsigned char llvm_cbe_tmp4951; - unsigned char llvm_cbe_tmp4975; - unsigned int llvm_cbe_tmp5002; - unsigned int llvm_cbe_recno_13; - unsigned int llvm_cbe_recno_13__PHI_TEMPORARY; - unsigned char *llvm_cbe_save_hwm_14; - unsigned char *llvm_cbe_save_hwm_14__PHI_TEMPORARY; - unsigned int llvm_cbe_zerofirstbyte_5; - unsigned int llvm_cbe_zerofirstbyte_5__PHI_TEMPORARY; - unsigned int llvm_cbe_zeroreqbyte_5; - unsigned int llvm_cbe_zeroreqbyte_5__PHI_TEMPORARY; - unsigned int llvm_cbe_firstbyte102_14; - unsigned int llvm_cbe_firstbyte102_14__PHI_TEMPORARY; - unsigned int llvm_cbe_firstbyte102_16; - unsigned char *llvm_cbe_tmp5024; - unsigned int llvm_cbe_tmp5027; - unsigned int llvm_cbe_tmp5043; - unsigned char *llvm_cbe_tmp519613501; - unsigned char *llvm_cbe_tmp519813504; - unsigned char *llvm_cbe_iftmp_490_0; - unsigned char *llvm_cbe_tmp5089; - unsigned char *llvm_cbe_tmp519613505; - unsigned int llvm_cbe_storemerge26707_in; - unsigned int llvm_cbe_storemerge26707_in__PHI_TEMPORARY; - unsigned char *llvm_cbe_last_code_15771_4; - unsigned char *llvm_cbe_last_code_15771_4__PHI_TEMPORARY; - unsigned int llvm_cbe_options_addr_25789_11; - unsigned int llvm_cbe_options_addr_25789_11__PHI_TEMPORARY; - unsigned char *llvm_cbe_save_hwm_79347_11; - unsigned char *llvm_cbe_save_hwm_79347_11__PHI_TEMPORARY; - unsigned int llvm_cbe_groupsetfirstbyte_29395_11; - unsigned int llvm_cbe_groupsetfirstbyte_29395_11__PHI_TEMPORARY; - unsigned int llvm_cbe_options104_39466_11; - unsigned int llvm_cbe_options104_39466_11__PHI_TEMPORARY; - unsigned int llvm_cbe_req_caseopt_39708_11; - unsigned int llvm_cbe_req_caseopt_39708_11__PHI_TEMPORARY; - unsigned int llvm_cbe_reqbyte103_59784_11; - unsigned int llvm_cbe_reqbyte103_59784_11__PHI_TEMPORARY; - unsigned int llvm_cbe_firstbyte102_39829_11; - unsigned int llvm_cbe_firstbyte102_39829_11__PHI_TEMPORARY; - unsigned int llvm_cbe_greedy_non_default_39879_11; - unsigned int llvm_cbe_greedy_non_default_39879_11__PHI_TEMPORARY; - unsigned int llvm_cbe_greedy_default_39909_11; - unsigned int llvm_cbe_greedy_default_39909_11__PHI_TEMPORARY; - unsigned char *llvm_cbe_previous_callout_3; - unsigned char *llvm_cbe_previous_callout_3__PHI_TEMPORARY; - unsigned int llvm_cbe_inescq_6; - unsigned int llvm_cbe_inescq_6__PHI_TEMPORARY; - unsigned char *llvm_cbe_code105_8; - unsigned char *llvm_cbe_code105_8__PHI_TEMPORARY; - unsigned int llvm_cbe_after_manual_callout_3; - unsigned int llvm_cbe_after_manual_callout_3__PHI_TEMPORARY; - unsigned char *llvm_cbe_last_code_15771_5; - unsigned char *llvm_cbe_last_code_15771_5__PHI_TEMPORARY; - unsigned int llvm_cbe_options_addr_25789_12; - unsigned int llvm_cbe_options_addr_25789_12__PHI_TEMPORARY; - unsigned char *llvm_cbe_save_hwm_79347_12; - unsigned char *llvm_cbe_save_hwm_79347_12__PHI_TEMPORARY; - unsigned int llvm_cbe_groupsetfirstbyte_29395_12; - unsigned int llvm_cbe_groupsetfirstbyte_29395_12__PHI_TEMPORARY; - unsigned int llvm_cbe_options104_39466_12; - unsigned int llvm_cbe_options104_39466_12__PHI_TEMPORARY; - unsigned int llvm_cbe_req_caseopt_39708_12; - unsigned int llvm_cbe_req_caseopt_39708_12__PHI_TEMPORARY; - unsigned int llvm_cbe_reqbyte103_59784_12; - unsigned int llvm_cbe_reqbyte103_59784_12__PHI_TEMPORARY; - unsigned int llvm_cbe_firstbyte102_39829_12; - unsigned int llvm_cbe_firstbyte102_39829_12__PHI_TEMPORARY; - unsigned int llvm_cbe_greedy_non_default_39879_12; - unsigned int llvm_cbe_greedy_non_default_39879_12__PHI_TEMPORARY; - unsigned int llvm_cbe_greedy_default_39909_12; - unsigned int llvm_cbe_greedy_default_39909_12__PHI_TEMPORARY; - unsigned char *llvm_cbe_previous_callout_312578_1; - unsigned char *llvm_cbe_previous_callout_312578_1__PHI_TEMPORARY; - unsigned int llvm_cbe_inescq_612580_1; - unsigned int llvm_cbe_inescq_612580_1__PHI_TEMPORARY; - unsigned char *llvm_cbe_code105_812582_1; - unsigned char *llvm_cbe_code105_812582_1__PHI_TEMPORARY; - unsigned int llvm_cbe_after_manual_callout_312586_1; - unsigned int llvm_cbe_after_manual_callout_312586_1__PHI_TEMPORARY; - unsigned int llvm_cbe_c_3812612_0; - unsigned int llvm_cbe_c_3812612_0__PHI_TEMPORARY; - unsigned char *llvm_cbe_code105_2712615_0; - unsigned char *llvm_cbe_code105_2712615_0__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp5114; - unsigned int llvm_cbe_tmp5119; - unsigned char *llvm_cbe_last_code_15771_11; - unsigned char *llvm_cbe_last_code_15771_11__PHI_TEMPORARY; - unsigned int llvm_cbe_options_addr_25789_14; - unsigned int llvm_cbe_options_addr_25789_14__PHI_TEMPORARY; - unsigned char *llvm_cbe_save_hwm_79347_14; - unsigned char *llvm_cbe_save_hwm_79347_14__PHI_TEMPORARY; - unsigned int llvm_cbe_groupsetfirstbyte_29395_14; - unsigned int llvm_cbe_groupsetfirstbyte_29395_14__PHI_TEMPORARY; - unsigned int llvm_cbe_options104_39466_14; - unsigned int llvm_cbe_options104_39466_14__PHI_TEMPORARY; - unsigned int llvm_cbe_req_caseopt_39708_14; - unsigned int llvm_cbe_req_caseopt_39708_14__PHI_TEMPORARY; - unsigned int llvm_cbe_reqbyte103_59784_14; - unsigned int llvm_cbe_reqbyte103_59784_14__PHI_TEMPORARY; - unsigned int llvm_cbe_firstbyte102_39829_14; - unsigned int llvm_cbe_firstbyte102_39829_14__PHI_TEMPORARY; - unsigned int llvm_cbe_greedy_non_default_39879_14; - unsigned int llvm_cbe_greedy_non_default_39879_14__PHI_TEMPORARY; - unsigned int llvm_cbe_greedy_default_39909_14; - unsigned int llvm_cbe_greedy_default_39909_14__PHI_TEMPORARY; - unsigned char *llvm_cbe_previous_callout_312578_0; - unsigned char *llvm_cbe_previous_callout_312578_0__PHI_TEMPORARY; - unsigned int llvm_cbe_inescq_612580_0; - unsigned int llvm_cbe_inescq_612580_0__PHI_TEMPORARY; - unsigned char *llvm_cbe_code105_812582_0; - unsigned char *llvm_cbe_code105_812582_0__PHI_TEMPORARY; - unsigned int llvm_cbe_after_manual_callout_312586_0; - unsigned int llvm_cbe_after_manual_callout_312586_0__PHI_TEMPORARY; - unsigned char *llvm_cbe_code105_8_pn; - unsigned char *llvm_cbe_code105_8_pn__PHI_TEMPORARY; - unsigned int llvm_cbe_c_38; - unsigned int llvm_cbe_c_38__PHI_TEMPORARY; - unsigned char *llvm_cbe_code105_27; - unsigned char llvm_cbe_tmp5146; - unsigned int llvm_cbe_tmp5149; - unsigned char *llvm_cbe_tmp519613508; - unsigned char llvm_cbe_tmp5184; - unsigned int llvm_cbe_tmp5190; - unsigned int llvm_cbe_tmp5191; - unsigned char *llvm_cbe_tmp519613511; - unsigned char *llvm_cbe_slot_913437_0_us61_5; - unsigned char *llvm_cbe_slot_913437_0_us61_5__PHI_TEMPORARY; - unsigned char *llvm_cbe_slot_913437_059_5; - unsigned char *llvm_cbe_slot_913437_059_5__PHI_TEMPORARY; - unsigned int llvm_cbe_options_addr_1; - unsigned int llvm_cbe_options_addr_1__PHI_TEMPORARY; - unsigned char *llvm_cbe_save_hwm_6; - unsigned char *llvm_cbe_save_hwm_6__PHI_TEMPORARY; - unsigned char *llvm_cbe_previous_callout_4; - unsigned char *llvm_cbe_previous_callout_4__PHI_TEMPORARY; - unsigned char *llvm_cbe_previous_6; - unsigned char *llvm_cbe_previous_6__PHI_TEMPORARY; - unsigned int llvm_cbe_groupsetfirstbyte_1; - unsigned int llvm_cbe_groupsetfirstbyte_1__PHI_TEMPORARY; - unsigned int llvm_cbe_inescq_1; - unsigned int llvm_cbe_inescq_1__PHI_TEMPORARY; - unsigned char *llvm_cbe_code105_9; - unsigned char *llvm_cbe_code105_9__PHI_TEMPORARY; - unsigned int llvm_cbe_options104_2; - unsigned int llvm_cbe_options104_2__PHI_TEMPORARY; - unsigned int llvm_cbe_req_caseopt_2; - unsigned int llvm_cbe_req_caseopt_2__PHI_TEMPORARY; - unsigned int llvm_cbe_zerofirstbyte_1; - unsigned int llvm_cbe_zerofirstbyte_1__PHI_TEMPORARY; - unsigned int llvm_cbe_zeroreqbyte_1; - unsigned int llvm_cbe_zeroreqbyte_1__PHI_TEMPORARY; - unsigned int llvm_cbe_firstbyte102_2; - unsigned int llvm_cbe_firstbyte102_2__PHI_TEMPORARY; - unsigned int llvm_cbe_greedy_non_default_2; - unsigned int llvm_cbe_greedy_non_default_2__PHI_TEMPORARY; - unsigned int llvm_cbe_greedy_default_2; - unsigned int llvm_cbe_greedy_default_2__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp5196; - unsigned char *llvm_cbe_slot_913437_0_us61_12; - unsigned char *llvm_cbe_slot_913437_0_us61_12__PHI_TEMPORARY; - unsigned char *llvm_cbe_slot_913437_059_12; - unsigned char *llvm_cbe_slot_913437_059_12__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp5198; - unsigned char *llvm_cbe_slot_913437_0_us61_7; - unsigned char *llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY; - unsigned char *llvm_cbe_slot_913437_059_7; - unsigned char *llvm_cbe_slot_913437_059_7__PHI_TEMPORARY; - unsigned int llvm_cbe_options_addr_25789_6; - unsigned int llvm_cbe_options_addr_25789_6__PHI_TEMPORARY; - unsigned int llvm_cbe_branchreqbyte_5; - unsigned int llvm_cbe_branchreqbyte_5__PHI_TEMPORARY; - unsigned int llvm_cbe_branchfirstbyte_0; - unsigned int llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY; - unsigned char *llvm_cbe_code_6; - unsigned char *llvm_cbe_code_6__PHI_TEMPORARY; - unsigned char *llvm_cbe_ptr_1; - unsigned char *llvm_cbe_ptr_1__PHI_TEMPORARY; - bool llvm_cbe_tmp_0; - bool llvm_cbe_tmp_0__PHI_TEMPORARY; - unsigned char *llvm_cbe_ptr_15625_2; - unsigned char *llvm_cbe_ptr_15625_2__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp5213; - unsigned int llvm_cbe_max_bracount_0; - unsigned char llvm_cbe_tmp5229; - unsigned int llvm_cbe_reqbyte_5; - unsigned int llvm_cbe_reqbyte_5__PHI_TEMPORARY; - unsigned int llvm_cbe_firstbyte_4; - unsigned int llvm_cbe_firstbyte_4__PHI_TEMPORARY; - unsigned int llvm_cbe_branchreqbyte_0; - unsigned int llvm_cbe_tmp5287; - unsigned int llvm_cbe_branchreqbyte_1; - unsigned int llvm_cbe_branchreqbyte_1__PHI_TEMPORARY; - unsigned int llvm_cbe_reqbyte_0; - unsigned int llvm_cbe_reqbyte_0__PHI_TEMPORARY; - unsigned int llvm_cbe_firstbyte_0; - unsigned int llvm_cbe_firstbyte_0__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp5298; - unsigned int llvm_cbe_branchreqbyte_2; - unsigned int llvm_cbe_branchreqbyte_2__PHI_TEMPORARY; - unsigned int llvm_cbe_reqbyte_1; - unsigned int llvm_cbe_reqbyte_1__PHI_TEMPORARY; - unsigned int llvm_cbe_firstbyte_1; - unsigned int llvm_cbe_firstbyte_1__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp5330; - unsigned int llvm_cbe_tmp5344; - unsigned int llvm_cbe_last_branch_0_rec; - unsigned int llvm_cbe_last_branch_0_rec__PHI_TEMPORARY; - unsigned int llvm_cbe_branch_length_2; - unsigned int llvm_cbe_branch_length_2__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp5347; - unsigned char llvm_cbe_tmp5348; - unsigned char *llvm_cbe_tmp5352; - unsigned char llvm_cbe_tmp5353; - unsigned int llvm_cbe_tmp5355; - unsigned char *llvm_cbe_tmp5398; - unsigned char llvm_cbe_tmp5407; - unsigned char *llvm_cbe_tmp5417; - unsigned int llvm_cbe_tmp5418; - unsigned char *llvm_cbe_code_4; - unsigned char *llvm_cbe_code_4__PHI_TEMPORARY; - unsigned int llvm_cbe_tmp5439; - unsigned int llvm_cbe_tmp5440; - unsigned char *llvm_cbe_tmp5452; - unsigned char *llvm_cbe_tmp5456; - unsigned int llvm_cbe_tmp5457; - unsigned char *llvm_cbe_tmp5484; - unsigned char *llvm_cbe_code_5; - unsigned char *llvm_cbe_code_5__PHI_TEMPORARY; - unsigned char *llvm_cbe_last_branch_3; - unsigned char *llvm_cbe_last_branch_3__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp5487; - - llvm_cbe_tmp3 = *llvm_cbe_ptrptr; - llvm_cbe_tmp5 = *llvm_cbe_codeptr; - *(&llvm_cbe_bc.field0) = llvm_cbe_bcptr; - llvm_cbe_tmp11 = &llvm_cbe_bc.field1; - *llvm_cbe_tmp11 = llvm_cbe_tmp5; - *(&llvm_cbe_length) = (llvm_cbe_skipbytes + ((unsigned int )6)); - *(&llvm_cbe_tmp5[((unsigned int )1)]) = ((unsigned char )0); - *(&llvm_cbe_tmp5[((unsigned int )2)]) = ((unsigned char )0); - llvm_cbe_tmp24 = &llvm_cbe_cd->field12; - llvm_cbe_tmp25 = *llvm_cbe_tmp24; - llvm_cbe_tmp21 = llvm_cbe_skipbytes + ((unsigned int )3); - llvm_cbe_tmp22 = &llvm_cbe_tmp5[llvm_cbe_tmp21]; - if ((llvm_cbe_reset_bracount == ((unsigned int )0))) { - llvm_cbe_code_113600_1_ph__PHI_TEMPORARY = llvm_cbe_tmp22; /* for PHI node */ - llvm_cbe_ptr_013604_1_ph__PHI_TEMPORARY = llvm_cbe_tmp3; /* for PHI node */ - llvm_cbe_options_addr_313605_1_ph__PHI_TEMPORARY = llvm_cbe_options; /* for PHI node */ - llvm_cbe_max_bracount_113905_1_ph__PHI_TEMPORARY = llvm_cbe_tmp25; /* for PHI node */ - llvm_cbe_reqbyte_313907_1_ph__PHI_TEMPORARY = ((unsigned int )-2); /* for PHI node */ - llvm_cbe_firstbyte_313911_1_ph__PHI_TEMPORARY = ((unsigned int )-2); /* for PHI node */ - llvm_cbe_reverse_count_113916_1_ph__PHI_TEMPORARY = ((unsigned char *)/*NULL*/0); /* for PHI node */ - llvm_cbe_last_branch_413917_1_ph__PHI_TEMPORARY = llvm_cbe_tmp5; /* for PHI node */ - goto llvm_cbe_cond_next_preheader; - } else { - llvm_cbe_code_113600_0__PHI_TEMPORARY = llvm_cbe_tmp22; /* for PHI node */ - llvm_cbe_ptr_013604_0__PHI_TEMPORARY = llvm_cbe_tmp3; /* for PHI node */ - llvm_cbe_options_addr_313605_0__PHI_TEMPORARY = llvm_cbe_options; /* for PHI node */ - llvm_cbe_max_bracount_113905_0__PHI_TEMPORARY = llvm_cbe_tmp25; /* for PHI node */ - llvm_cbe_reqbyte_313907_0__PHI_TEMPORARY = ((unsigned int )-2); /* for PHI node */ - llvm_cbe_firstbyte_313911_0__PHI_TEMPORARY = ((unsigned int )-2); /* for PHI node */ - llvm_cbe_reverse_count_113916_0__PHI_TEMPORARY = ((unsigned char *)/*NULL*/0); /* for PHI node */ - llvm_cbe_last_branch_413917_0__PHI_TEMPORARY = llvm_cbe_tmp5; /* for PHI node */ - goto llvm_cbe_cond_true; - } - -llvm_cbe_cond_true: - llvm_cbe_slot_913437_0_us61_8 = llvm_cbe_slot_913437_0_us61_8__PHI_TEMPORARY; - llvm_cbe_slot_913437_059_8 = llvm_cbe_slot_913437_059_8__PHI_TEMPORARY; - llvm_cbe_branchreqbyte_413514_0 = llvm_cbe_branchreqbyte_413514_0__PHI_TEMPORARY; - llvm_cbe_branchfirstbyte_113557_0 = llvm_cbe_branchfirstbyte_113557_0__PHI_TEMPORARY; - llvm_cbe_code_113600_0 = llvm_cbe_code_113600_0__PHI_TEMPORARY; - llvm_cbe_ptr_013604_0 = llvm_cbe_ptr_013604_0__PHI_TEMPORARY; - llvm_cbe_options_addr_313605_0 = llvm_cbe_options_addr_313605_0__PHI_TEMPORARY; - llvm_cbe_max_bracount_113905_0 = llvm_cbe_max_bracount_113905_0__PHI_TEMPORARY; - llvm_cbe_reqbyte_313907_0 = llvm_cbe_reqbyte_313907_0__PHI_TEMPORARY; - llvm_cbe_firstbyte_313911_0 = llvm_cbe_firstbyte_313911_0__PHI_TEMPORARY; - llvm_cbe_reverse_count_113916_0 = llvm_cbe_reverse_count_113916_0__PHI_TEMPORARY; - llvm_cbe_last_branch_413917_0 = llvm_cbe_last_branch_413917_0__PHI_TEMPORARY; - *llvm_cbe_tmp24 = llvm_cbe_tmp25; - llvm_cbe_slot_913437_0_us61_11__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_8; /* for PHI node */ - llvm_cbe_slot_913437_059_11__PHI_TEMPORARY = llvm_cbe_slot_913437_059_8; /* for PHI node */ - llvm_cbe_branchreqbyte_413514_1_ph__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_0; /* for PHI node */ - llvm_cbe_branchfirstbyte_113557_1_ph__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_0; /* for PHI node */ - llvm_cbe_code_113600_1_ph__PHI_TEMPORARY = llvm_cbe_code_113600_0; /* for PHI node */ - llvm_cbe_ptr_013604_1_ph__PHI_TEMPORARY = llvm_cbe_ptr_013604_0; /* for PHI node */ - llvm_cbe_options_addr_313605_1_ph__PHI_TEMPORARY = llvm_cbe_options_addr_313605_0; /* for PHI node */ - llvm_cbe_max_bracount_113905_1_ph__PHI_TEMPORARY = llvm_cbe_max_bracount_113905_0; /* for PHI node */ - llvm_cbe_reqbyte_313907_1_ph__PHI_TEMPORARY = llvm_cbe_reqbyte_313907_0; /* for PHI node */ - llvm_cbe_firstbyte_313911_1_ph__PHI_TEMPORARY = llvm_cbe_firstbyte_313911_0; /* for PHI node */ - llvm_cbe_reverse_count_113916_1_ph__PHI_TEMPORARY = llvm_cbe_reverse_count_113916_0; /* for PHI node */ - llvm_cbe_last_branch_413917_1_ph__PHI_TEMPORARY = llvm_cbe_last_branch_413917_0; /* for PHI node */ - goto llvm_cbe_cond_next_preheader; - -llvm_cbe_cond_next_preheader: - llvm_cbe_slot_913437_0_us61_11 = llvm_cbe_slot_913437_0_us61_11__PHI_TEMPORARY; - llvm_cbe_slot_913437_059_11 = llvm_cbe_slot_913437_059_11__PHI_TEMPORARY; - llvm_cbe_branchreqbyte_413514_1_ph = llvm_cbe_branchreqbyte_413514_1_ph__PHI_TEMPORARY; - llvm_cbe_branchfirstbyte_113557_1_ph = llvm_cbe_branchfirstbyte_113557_1_ph__PHI_TEMPORARY; - llvm_cbe_code_113600_1_ph = llvm_cbe_code_113600_1_ph__PHI_TEMPORARY; - llvm_cbe_ptr_013604_1_ph = llvm_cbe_ptr_013604_1_ph__PHI_TEMPORARY; - llvm_cbe_options_addr_313605_1_ph = llvm_cbe_options_addr_313605_1_ph__PHI_TEMPORARY; - llvm_cbe_max_bracount_113905_1_ph = llvm_cbe_max_bracount_113905_1_ph__PHI_TEMPORARY; - llvm_cbe_reqbyte_313907_1_ph = llvm_cbe_reqbyte_313907_1_ph__PHI_TEMPORARY; - llvm_cbe_firstbyte_313911_1_ph = llvm_cbe_firstbyte_313911_1_ph__PHI_TEMPORARY; - llvm_cbe_reverse_count_113916_1_ph = llvm_cbe_reverse_count_113916_1_ph__PHI_TEMPORARY; - llvm_cbe_last_branch_413917_1_ph = llvm_cbe_last_branch_413917_1_ph__PHI_TEMPORARY; - llvm_cbe_iftmp_509_0 = (((llvm_cbe_lengthptr == ((unsigned int *)/*NULL*/0))) ? (((unsigned int *)/*NULL*/0)) : ((&llvm_cbe_length))); - llvm_cbe_tmp143 = &llvm_cbe_cd->field4; - llvm_cbe_tmp203 = &llvm_cbe_cd->field8; - llvm_cbe_tmp435 = &llvm_cbe_cd->field3; - llvm_cbe_tmp453 = &llvm_cbe_cd->field18; - llvm_cbe_tmp460 = &llvm_cbe_cd->field7; - llvm_cbe_tmp469 = &llvm_cbe_cd->field19; - llvm_cbe_tmp508 = &llvm_cbe_cd->field20[((unsigned int )0)]; - llvm_cbe_tmp528 = &llvm_cbe_cd->field20[((unsigned int )1)]; - llvm_cbe_classbits711 = &llvm_cbe_classbits[((unsigned int )0)]; - llvm_cbe_tmp776 = &llvm_cbe_cd->field2; - llvm_cbe_pbits885 = &llvm_cbe_pbits[((unsigned int )0)]; - llvm_cbe_tmp962 = &llvm_cbe_pbits[((unsigned int )1)]; - llvm_cbe_tmp972 = &llvm_cbe_pbits[((unsigned int )11)]; - llvm_cbe_tmp1237 = &llvm_cbe_classbits[((unsigned int )1)]; - llvm_cbe_tmp1288 = &llvm_cbe_classbits[((unsigned int )4)]; - llvm_cbe_tmp1292 = &llvm_cbe_classbits[((unsigned int )20)]; - llvm_cbe_tmp1353 = &llvm_cbe_classbits[((unsigned int )16)]; - llvm_cbe_tmp1623 = &llvm_cbe_cd->field1; - llvm_cbe_tmp1755 = &llvm_cbe_mcbuffer[((unsigned int )0)]; - llvm_cbe_tmp1993 = &llvm_cbe_cd->field16; - llvm_cbe_tmp2377 = &llvm_cbe_cd->field17; - llvm_cbe_tmp3478 = &llvm_cbe_cd->field9; - llvm_cbe_tmp351413356 = &llvm_cbe_cd->field10; - llvm_cbe_tmp3506 = &llvm_cbe_cd->field11; - llvm_cbe_tmp3783 = &llvm_cbe_cd->field6; - llvm_cbe_tmp4496 = &llvm_cbe_cd->field15; - llvm_cbe_tmp4563 = &llvm_cbe_cd->field5; - llvm_cbe_iftmp_468_0 = (((llvm_cbe_iftmp_509_0 == ((unsigned int *)/*NULL*/0))) ? (((unsigned int *)/*NULL*/0)) : ((&llvm_cbe_length_prevgroup))); - llvm_cbe_tmp5026 = &llvm_cbe_cd->field14; - llvm_cbe_tmp5042 = &llvm_cbe_cd->field13; - llvm_cbe_tmp138_not = (llvm_cbe_iftmp_509_0 == ((unsigned int *)/*NULL*/0)) ^ 1; - llvm_cbe_slot_913437_0_us61_9__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_11; /* for PHI node */ - llvm_cbe_slot_913437_059_9__PHI_TEMPORARY = llvm_cbe_slot_913437_059_11; /* for PHI node */ - llvm_cbe_branchreqbyte_413514_1__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1_ph; /* for PHI node */ - llvm_cbe_branchfirstbyte_113557_1__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1_ph; /* for PHI node */ - llvm_cbe_code_113600_1__PHI_TEMPORARY = llvm_cbe_code_113600_1_ph; /* for PHI node */ - llvm_cbe_ptr_013604_1__PHI_TEMPORARY = llvm_cbe_ptr_013604_1_ph; /* for PHI node */ - llvm_cbe_options_addr_313605_1__PHI_TEMPORARY = llvm_cbe_options_addr_313605_1_ph; /* for PHI node */ - llvm_cbe_max_bracount_113905_1__PHI_TEMPORARY = llvm_cbe_max_bracount_113905_1_ph; /* for PHI node */ - llvm_cbe_reqbyte_313907_1__PHI_TEMPORARY = llvm_cbe_reqbyte_313907_1_ph; /* for PHI node */ - llvm_cbe_firstbyte_313911_1__PHI_TEMPORARY = llvm_cbe_firstbyte_313911_1_ph; /* for PHI node */ - llvm_cbe_reverse_count_113916_1__PHI_TEMPORARY = llvm_cbe_reverse_count_113916_1_ph; /* for PHI node */ - llvm_cbe_last_branch_413917_1__PHI_TEMPORARY = llvm_cbe_last_branch_413917_1_ph; /* for PHI node */ - goto llvm_cbe_cond_next; - - do { /* Syntactic loop 'cond_next' to make GCC happy */ -llvm_cbe_cond_next: - llvm_cbe_slot_913437_0_us61_9 = llvm_cbe_slot_913437_0_us61_9__PHI_TEMPORARY; - llvm_cbe_slot_913437_059_9 = llvm_cbe_slot_913437_059_9__PHI_TEMPORARY; - llvm_cbe_branchreqbyte_413514_1 = llvm_cbe_branchreqbyte_413514_1__PHI_TEMPORARY; - llvm_cbe_branchfirstbyte_113557_1 = llvm_cbe_branchfirstbyte_113557_1__PHI_TEMPORARY; - llvm_cbe_code_113600_1 = llvm_cbe_code_113600_1__PHI_TEMPORARY; - llvm_cbe_ptr_013604_1 = llvm_cbe_ptr_013604_1__PHI_TEMPORARY; - llvm_cbe_options_addr_313605_1 = llvm_cbe_options_addr_313605_1__PHI_TEMPORARY; - llvm_cbe_max_bracount_113905_1 = llvm_cbe_max_bracount_113905_1__PHI_TEMPORARY; - llvm_cbe_reqbyte_313907_1 = llvm_cbe_reqbyte_313907_1__PHI_TEMPORARY; - llvm_cbe_firstbyte_313911_1 = llvm_cbe_firstbyte_313911_1__PHI_TEMPORARY; - llvm_cbe_reverse_count_113916_1 = llvm_cbe_reverse_count_113916_1__PHI_TEMPORARY; - llvm_cbe_last_branch_413917_1 = llvm_cbe_last_branch_413917_1__PHI_TEMPORARY; - if (((llvm_cbe_options_addr_313605_1 & ((unsigned int )7)) == llvm_cbe_oldims)) { - llvm_cbe_code_0__PHI_TEMPORARY = llvm_cbe_code_113600_1; /* for PHI node */ - goto llvm_cbe_cond_next49; - } else { - goto llvm_cbe_cond_true39; - } - -llvm_cbe_cond_next5485: - llvm_cbe_code_5 = llvm_cbe_code_5__PHI_TEMPORARY; - llvm_cbe_last_branch_3 = llvm_cbe_last_branch_3__PHI_TEMPORARY; - llvm_cbe_tmp5487 = &llvm_cbe_ptr_1[((unsigned int )1)]; - if ((llvm_cbe_reset_bracount == ((unsigned int )0))) { - llvm_cbe_slot_913437_0_us61_9__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_7; /* for PHI node */ - llvm_cbe_slot_913437_059_9__PHI_TEMPORARY = llvm_cbe_slot_913437_059_7; /* for PHI node */ - llvm_cbe_branchreqbyte_413514_1__PHI_TEMPORARY = llvm_cbe_branchreqbyte_2; /* for PHI node */ - llvm_cbe_branchfirstbyte_113557_1__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_0; /* for PHI node */ - llvm_cbe_code_113600_1__PHI_TEMPORARY = llvm_cbe_code_5; /* for PHI node */ - llvm_cbe_ptr_013604_1__PHI_TEMPORARY = llvm_cbe_tmp5487; /* for PHI node */ - llvm_cbe_options_addr_313605_1__PHI_TEMPORARY = llvm_cbe_options_addr_25789_6; /* for PHI node */ - llvm_cbe_max_bracount_113905_1__PHI_TEMPORARY = llvm_cbe_max_bracount_0; /* for PHI node */ - llvm_cbe_reqbyte_313907_1__PHI_TEMPORARY = llvm_cbe_reqbyte_1; /* for PHI node */ - llvm_cbe_firstbyte_313911_1__PHI_TEMPORARY = llvm_cbe_firstbyte_1; /* for PHI node */ - llvm_cbe_reverse_count_113916_1__PHI_TEMPORARY = llvm_cbe_reverse_count_0; /* for PHI node */ - llvm_cbe_last_branch_413917_1__PHI_TEMPORARY = llvm_cbe_last_branch_3; /* for PHI node */ - goto llvm_cbe_cond_next; - } else { - llvm_cbe_slot_913437_0_us61_8__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_7; /* for PHI node */ - llvm_cbe_slot_913437_059_8__PHI_TEMPORARY = llvm_cbe_slot_913437_059_7; /* for PHI node */ - llvm_cbe_branchreqbyte_413514_0__PHI_TEMPORARY = llvm_cbe_branchreqbyte_2; /* for PHI node */ - llvm_cbe_branchfirstbyte_113557_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_0; /* for PHI node */ - llvm_cbe_code_113600_0__PHI_TEMPORARY = llvm_cbe_code_5; /* for PHI node */ - llvm_cbe_ptr_013604_0__PHI_TEMPORARY = llvm_cbe_tmp5487; /* for PHI node */ - llvm_cbe_options_addr_313605_0__PHI_TEMPORARY = llvm_cbe_options_addr_25789_6; /* for PHI node */ - llvm_cbe_max_bracount_113905_0__PHI_TEMPORARY = llvm_cbe_max_bracount_0; /* for PHI node */ - llvm_cbe_reqbyte_313907_0__PHI_TEMPORARY = llvm_cbe_reqbyte_1; /* for PHI node */ - llvm_cbe_firstbyte_313911_0__PHI_TEMPORARY = llvm_cbe_firstbyte_1; /* for PHI node */ - llvm_cbe_reverse_count_113916_0__PHI_TEMPORARY = llvm_cbe_reverse_count_0; /* for PHI node */ - llvm_cbe_last_branch_413917_0__PHI_TEMPORARY = llvm_cbe_last_branch_3; /* for PHI node */ - goto llvm_cbe_cond_true; - } - -llvm_cbe_cond_true5450: - llvm_cbe_tmp5452 = *llvm_cbe_codeptr; - llvm_cbe_tmp5456 = &llvm_cbe_tmp5452[llvm_cbe_tmp21]; - llvm_cbe_tmp5457 = *(&llvm_cbe_length); - *(&llvm_cbe_length) = (llvm_cbe_tmp5457 + ((unsigned int )3)); - llvm_cbe_code_5__PHI_TEMPORARY = llvm_cbe_tmp5456; /* for PHI node */ - llvm_cbe_last_branch_3__PHI_TEMPORARY = llvm_cbe_last_branch_413917_1; /* for PHI node */ - goto llvm_cbe_cond_next5485; - -llvm_cbe_cond_next5445: - if ((llvm_cbe_lengthptr == ((unsigned int *)/*NULL*/0))) { - goto llvm_cbe_cond_false5459; - } else { - goto llvm_cbe_cond_true5450; - } - -llvm_cbe_cond_next5328: - llvm_cbe_branchreqbyte_2 = llvm_cbe_branchreqbyte_2__PHI_TEMPORARY; - llvm_cbe_reqbyte_1 = llvm_cbe_reqbyte_1__PHI_TEMPORARY; - llvm_cbe_firstbyte_1 = llvm_cbe_firstbyte_1__PHI_TEMPORARY; - llvm_cbe_tmp5330 = *llvm_cbe_ptr_1; - if ((llvm_cbe_tmp5330 == ((unsigned char )124))) { - goto llvm_cbe_cond_next5445; - } else { - goto llvm_cbe_cond_true5334; - } - -llvm_cbe_cond_next5210: - llvm_cbe_tmp5213 = *llvm_cbe_tmp24; - llvm_cbe_max_bracount_0 = (((((signed int )llvm_cbe_tmp5213) > ((signed int )llvm_cbe_max_bracount_113905_1))) ? (llvm_cbe_tmp5213) : (llvm_cbe_max_bracount_113905_1)); - if ((llvm_cbe_lengthptr == ((unsigned int *)/*NULL*/0))) { - goto llvm_cbe_cond_true5227; - } else { - llvm_cbe_branchreqbyte_2__PHI_TEMPORARY = llvm_cbe_branchreqbyte_5; /* for PHI node */ - llvm_cbe_reqbyte_1__PHI_TEMPORARY = llvm_cbe_reqbyte_313907_1; /* for PHI node */ - llvm_cbe_firstbyte_1__PHI_TEMPORARY = llvm_cbe_firstbyte_313911_1; /* for PHI node */ - goto llvm_cbe_cond_next5328; - } - -llvm_cbe_bb5201: - llvm_cbe_slot_913437_0_us61_7 = llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY; - llvm_cbe_slot_913437_059_7 = llvm_cbe_slot_913437_059_7__PHI_TEMPORARY; - llvm_cbe_options_addr_25789_6 = llvm_cbe_options_addr_25789_6__PHI_TEMPORARY; - llvm_cbe_branchreqbyte_5 = llvm_cbe_branchreqbyte_5__PHI_TEMPORARY; - llvm_cbe_branchfirstbyte_0 = llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY; - llvm_cbe_code_6 = llvm_cbe_code_6__PHI_TEMPORARY; - llvm_cbe_ptr_1 = llvm_cbe_ptr_1__PHI_TEMPORARY; - llvm_cbe_tmp_0 = llvm_cbe_tmp_0__PHI_TEMPORARY; - if (llvm_cbe_tmp_0) { - llvm_cbe_ptr_15625_2__PHI_TEMPORARY = llvm_cbe_ptr_1; /* for PHI node */ - goto llvm_cbe_cond_true5206; - } else { - goto llvm_cbe_cond_next5210; - } - -llvm_cbe_cond_true212: - *llvm_cbe_errorcodeptr = ((unsigned int )52); - llvm_cbe_tmp51985785 = *(&llvm_cbe_ptr106); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_4; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp51985785; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - - do { /* Syntactic loop 'bb131' to make GCC happy */ -llvm_cbe_bb131: - llvm_cbe_slot_913437_0_us61_13 = llvm_cbe_slot_913437_0_us61_13__PHI_TEMPORARY; - llvm_cbe_slot_913437_059_13 = llvm_cbe_slot_913437_059_13__PHI_TEMPORARY; - llvm_cbe_repeat_max_10 = llvm_cbe_repeat_max_10__PHI_TEMPORARY; - llvm_cbe_repeat_min_10 = llvm_cbe_repeat_min_10__PHI_TEMPORARY; - llvm_cbe_options_addr_2 = llvm_cbe_options_addr_2__PHI_TEMPORARY; - llvm_cbe_save_hwm_7 = llvm_cbe_save_hwm_7__PHI_TEMPORARY; - llvm_cbe_previous_callout_5 = llvm_cbe_previous_callout_5__PHI_TEMPORARY; - llvm_cbe_previous_3 = llvm_cbe_previous_3__PHI_TEMPORARY; - llvm_cbe_groupsetfirstbyte_2 = llvm_cbe_groupsetfirstbyte_2__PHI_TEMPORARY; - llvm_cbe_inescq_2 = llvm_cbe_inescq_2__PHI_TEMPORARY; - llvm_cbe_last_code_2 = llvm_cbe_last_code_2__PHI_TEMPORARY; - llvm_cbe_code105_3 = llvm_cbe_code105_3__PHI_TEMPORARY; - llvm_cbe_after_manual_callout_7 = llvm_cbe_after_manual_callout_7__PHI_TEMPORARY; - llvm_cbe_options104_3 = llvm_cbe_options104_3__PHI_TEMPORARY; - llvm_cbe_req_caseopt_3 = llvm_cbe_req_caseopt_3__PHI_TEMPORARY; - llvm_cbe_zerofirstbyte_2 = llvm_cbe_zerofirstbyte_2__PHI_TEMPORARY; - llvm_cbe_zeroreqbyte_2 = llvm_cbe_zeroreqbyte_2__PHI_TEMPORARY; - llvm_cbe_reqbyte103_5 = llvm_cbe_reqbyte103_5__PHI_TEMPORARY; - llvm_cbe_firstbyte102_3 = llvm_cbe_firstbyte102_3__PHI_TEMPORARY; - llvm_cbe_greedy_non_default_3 = llvm_cbe_greedy_non_default_3__PHI_TEMPORARY; - llvm_cbe_greedy_default_3 = llvm_cbe_greedy_default_3__PHI_TEMPORARY; - llvm_cbe_tmp134 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp135 = *llvm_cbe_tmp134; - llvm_cbe_tmp135136 = ((unsigned int )(unsigned char )llvm_cbe_tmp135); - if ((llvm_cbe_iftmp_509_0 == ((unsigned int *)/*NULL*/0))) { - llvm_cbe_options_addr_25789_4__PHI_TEMPORARY = llvm_cbe_options_addr_2; /* for PHI node */ - llvm_cbe_save_hwm_79347_4__PHI_TEMPORARY = llvm_cbe_save_hwm_7; /* for PHI node */ - llvm_cbe_previous_callout_59381_4__PHI_TEMPORARY = llvm_cbe_previous_callout_5; /* for PHI node */ - llvm_cbe_previous_39389_4__PHI_TEMPORARY = llvm_cbe_previous_3; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_29395_4__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_2; /* for PHI node */ - llvm_cbe_inescq_29422_4__PHI_TEMPORARY = llvm_cbe_inescq_2; /* for PHI node */ - llvm_cbe_last_code_29452_4__PHI_TEMPORARY = llvm_cbe_last_code_2; /* for PHI node */ - llvm_cbe_code105_39456_4__PHI_TEMPORARY = llvm_cbe_code105_3; /* for PHI node */ - llvm_cbe_after_manual_callout_79460_4__PHI_TEMPORARY = llvm_cbe_after_manual_callout_7; /* for PHI node */ - llvm_cbe_options104_39466_4__PHI_TEMPORARY = llvm_cbe_options104_3; /* for PHI node */ - llvm_cbe_req_caseopt_39708_4__PHI_TEMPORARY = llvm_cbe_req_caseopt_3; /* for PHI node */ - llvm_cbe_zerofirstbyte_29740_4__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_2; /* for PHI node */ - llvm_cbe_zeroreqbyte_29762_4__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_2; /* for PHI node */ - llvm_cbe_reqbyte103_59784_4__PHI_TEMPORARY = llvm_cbe_reqbyte103_5; /* for PHI node */ - llvm_cbe_firstbyte102_39829_4__PHI_TEMPORARY = llvm_cbe_firstbyte102_3; /* for PHI node */ - llvm_cbe_greedy_non_default_39879_4__PHI_TEMPORARY = llvm_cbe_greedy_non_default_3; /* for PHI node */ - llvm_cbe_greedy_default_39909_4__PHI_TEMPORARY = llvm_cbe_greedy_default_3; /* for PHI node */ - llvm_cbe_tmp13512351_4__PHI_TEMPORARY = llvm_cbe_tmp135; /* for PHI node */ - llvm_cbe_tmp13513612358_4__PHI_TEMPORARY = llvm_cbe_tmp135136; /* for PHI node */ - goto llvm_cbe_cond_false201; - } else { - llvm_cbe_options_addr_25789_3__PHI_TEMPORARY = llvm_cbe_options_addr_2; /* for PHI node */ - llvm_cbe_save_hwm_79347_3__PHI_TEMPORARY = llvm_cbe_save_hwm_7; /* for PHI node */ - llvm_cbe_previous_callout_59381_3__PHI_TEMPORARY = llvm_cbe_previous_callout_5; /* for PHI node */ - llvm_cbe_previous_39389_3__PHI_TEMPORARY = llvm_cbe_previous_3; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_29395_3__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_2; /* for PHI node */ - llvm_cbe_inescq_29422_3__PHI_TEMPORARY = llvm_cbe_inescq_2; /* for PHI node */ - llvm_cbe_last_code_29452_3__PHI_TEMPORARY = llvm_cbe_last_code_2; /* for PHI node */ - llvm_cbe_code105_39456_3__PHI_TEMPORARY = llvm_cbe_code105_3; /* for PHI node */ - llvm_cbe_after_manual_callout_79460_3__PHI_TEMPORARY = llvm_cbe_after_manual_callout_7; /* for PHI node */ - llvm_cbe_options104_39466_3__PHI_TEMPORARY = llvm_cbe_options104_3; /* for PHI node */ - llvm_cbe_req_caseopt_39708_3__PHI_TEMPORARY = llvm_cbe_req_caseopt_3; /* for PHI node */ - llvm_cbe_zerofirstbyte_29740_3__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_2; /* for PHI node */ - llvm_cbe_zeroreqbyte_29762_3__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_2; /* for PHI node */ - llvm_cbe_reqbyte103_59784_3__PHI_TEMPORARY = llvm_cbe_reqbyte103_5; /* for PHI node */ - llvm_cbe_firstbyte102_39829_3__PHI_TEMPORARY = llvm_cbe_firstbyte102_3; /* for PHI node */ - llvm_cbe_greedy_non_default_39879_3__PHI_TEMPORARY = llvm_cbe_greedy_non_default_3; /* for PHI node */ - llvm_cbe_greedy_default_39909_3__PHI_TEMPORARY = llvm_cbe_greedy_default_3; /* for PHI node */ - llvm_cbe_tmp13512351_3__PHI_TEMPORARY = llvm_cbe_tmp135; /* for PHI node */ - llvm_cbe_tmp13513612358_3__PHI_TEMPORARY = llvm_cbe_tmp135136; /* for PHI node */ - goto llvm_cbe_cond_true141; - } - -llvm_cbe_bb615: - llvm_cbe_firstbyte102_1 = ((((llvm_cbe_firstbyte102_39829_9 == ((unsigned int )-2)) & ((llvm_cbe_options104_39466_9 & ((unsigned int )2)) != ((unsigned int )0)))) ? (((unsigned int )-1)) : (llvm_cbe_firstbyte102_39829_9)); - *llvm_cbe_code105_10 = ((unsigned char )25); - llvm_cbe_tmp631 = &llvm_cbe_code105_10[((unsigned int )1)]; - llvm_cbe_tmp519612381 = *(&llvm_cbe_ptr106); - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp519612381[((unsigned int )1)]); - llvm_cbe_slot_913437_0_us61_13__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_13__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_repeat_max_10__PHI_TEMPORARY = llvm_cbe_repeat_max_10; /* for PHI node */ - llvm_cbe_repeat_min_10__PHI_TEMPORARY = llvm_cbe_repeat_min_10; /* for PHI node */ - llvm_cbe_options_addr_2__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_save_hwm_7__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_previous_callout_5__PHI_TEMPORARY = llvm_cbe_previous_callout_9; /* for PHI node */ - llvm_cbe_previous_3__PHI_TEMPORARY = ((unsigned char *)/*NULL*/0); /* for PHI node */ - llvm_cbe_groupsetfirstbyte_2__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_9; /* for PHI node */ - llvm_cbe_inescq_2__PHI_TEMPORARY = llvm_cbe_inescq_29422_9; /* for PHI node */ - llvm_cbe_last_code_2__PHI_TEMPORARY = llvm_cbe_last_code_15771_1; /* for PHI node */ - llvm_cbe_code105_3__PHI_TEMPORARY = llvm_cbe_tmp631; /* for PHI node */ - llvm_cbe_after_manual_callout_7__PHI_TEMPORARY = llvm_cbe_after_manual_callout_1; /* for PHI node */ - llvm_cbe_options104_3__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_req_caseopt_3__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_9; /* for PHI node */ - llvm_cbe_zerofirstbyte_2__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_29740_9; /* for PHI node */ - llvm_cbe_zeroreqbyte_2__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_29762_9; /* for PHI node */ - llvm_cbe_reqbyte103_5__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_9; /* for PHI node */ - llvm_cbe_firstbyte102_3__PHI_TEMPORARY = llvm_cbe_firstbyte102_1; /* for PHI node */ - llvm_cbe_greedy_non_default_3__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_9; /* for PHI node */ - llvm_cbe_greedy_default_3__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_9; /* for PHI node */ - goto llvm_cbe_bb131; - -llvm_cbe_cond_next586: - llvm_cbe_previous_callout_9 = llvm_cbe_previous_callout_9__PHI_TEMPORARY; - llvm_cbe_code105_10 = llvm_cbe_code105_10__PHI_TEMPORARY; - switch (llvm_cbe_c_2) { - default: - llvm_cbe_storemerge26707_in__PHI_TEMPORARY = llvm_cbe_c_2; /* for PHI node */ - llvm_cbe_last_code_15771_4__PHI_TEMPORARY = llvm_cbe_last_code_15771_1; /* for PHI node */ - llvm_cbe_options_addr_25789_11__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_save_hwm_79347_11__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_29395_11__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_9; /* for PHI node */ - llvm_cbe_options104_39466_11__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_req_caseopt_39708_11__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_9; /* for PHI node */ - llvm_cbe_reqbyte103_59784_11__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_9; /* for PHI node */ - llvm_cbe_firstbyte102_39829_11__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - llvm_cbe_greedy_non_default_39879_11__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_9; /* for PHI node */ - llvm_cbe_greedy_default_39909_11__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_9; /* for PHI node */ - llvm_cbe_previous_callout_3__PHI_TEMPORARY = llvm_cbe_previous_callout_9; /* for PHI node */ - llvm_cbe_inescq_6__PHI_TEMPORARY = llvm_cbe_inescq_29422_9; /* for PHI node */ - llvm_cbe_code105_8__PHI_TEMPORARY = llvm_cbe_code105_10; /* for PHI node */ - llvm_cbe_after_manual_callout_3__PHI_TEMPORARY = llvm_cbe_after_manual_callout_1; /* for PHI node */ - goto llvm_cbe_ONE_CHAR; -; - case ((unsigned int )0): - goto llvm_cbe_bb590; - break; - case ((unsigned int )36): - goto llvm_cbe_bb632; - case ((unsigned int )40): - goto llvm_cbe_bb3172; - case ((unsigned int )41): - goto llvm_cbe_bb590; - break; - case ((unsigned int )42): - goto llvm_cbe_bb1921; - case ((unsigned int )43): - llvm_cbe_repeat_max_4__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - llvm_cbe_repeat_min_4__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_REPEAT; - case ((unsigned int )46): - goto llvm_cbe_bb636; - case ((unsigned int )63): - goto llvm_cbe_bb1923; - case ((unsigned int )91): - goto llvm_cbe_bb649; - case ((unsigned int )92): - goto llvm_cbe_bb4870; - case ((unsigned int )94): - goto llvm_cbe_bb615; - case ((unsigned int )123): - goto llvm_cbe_bb1803; - case ((unsigned int )124): - goto llvm_cbe_bb590; - break; - } -llvm_cbe_cond_next566: - llvm_cbe_c_2 = llvm_cbe_c_2__PHI_TEMPORARY; - if ((llvm_cbe_iftmp_136_0 & ((llvm_cbe_options104_39466_9 & ((unsigned int )16384)) != ((unsigned int )0)))) { - goto llvm_cbe_cond_true580; - } else { - llvm_cbe_previous_callout_9__PHI_TEMPORARY = llvm_cbe_previous_callout_6; /* for PHI node */ - llvm_cbe_code105_10__PHI_TEMPORARY = llvm_cbe_code105_25773_1; /* for PHI node */ - goto llvm_cbe_cond_next586; - } - -llvm_cbe_cond_next427: - llvm_cbe_previous_callout_6 = llvm_cbe_previous_callout_6__PHI_TEMPORARY; - llvm_cbe_after_manual_callout_1 = llvm_cbe_after_manual_callout_1__PHI_TEMPORARY; - if (((llvm_cbe_options104_39466_9 & ((unsigned int )8)) == ((unsigned int )0))) { - llvm_cbe_c_2__PHI_TEMPORARY = llvm_cbe_tmp13513612358_9; /* for PHI node */ - goto llvm_cbe_cond_next566; - } else { - goto llvm_cbe_cond_true433; - } - -llvm_cbe_bb396: - llvm_cbe_iftmp_136_0 = llvm_cbe_iftmp_136_0__PHI_TEMPORARY; - if ((llvm_cbe_iftmp_136_0 & (llvm_cbe_previous_callout_59381_9 != ((unsigned char *)/*NULL*/0)))) { - goto llvm_cbe_cond_true409; - } else { - llvm_cbe_previous_callout_6__PHI_TEMPORARY = llvm_cbe_previous_callout_59381_9; /* for PHI node */ - llvm_cbe_after_manual_callout_1__PHI_TEMPORARY = llvm_cbe_after_manual_callout_79460_9; /* for PHI node */ - goto llvm_cbe_cond_next427; - } - -llvm_cbe_cond_next272: - llvm_cbe_previous_25708_1 = llvm_cbe_previous_25708_1__PHI_TEMPORARY; - llvm_cbe_last_code_15771_1 = llvm_cbe_last_code_15771_1__PHI_TEMPORARY; - llvm_cbe_code105_25773_1 = llvm_cbe_code105_25773_1__PHI_TEMPORARY; - llvm_cbe_options_addr_25789_9 = llvm_cbe_options_addr_25789_9__PHI_TEMPORARY; - llvm_cbe_save_hwm_79347_9 = llvm_cbe_save_hwm_79347_9__PHI_TEMPORARY; - llvm_cbe_previous_callout_59381_9 = llvm_cbe_previous_callout_59381_9__PHI_TEMPORARY; - llvm_cbe_groupsetfirstbyte_29395_9 = llvm_cbe_groupsetfirstbyte_29395_9__PHI_TEMPORARY; - llvm_cbe_inescq_29422_9 = llvm_cbe_inescq_29422_9__PHI_TEMPORARY; - llvm_cbe_after_manual_callout_79460_9 = llvm_cbe_after_manual_callout_79460_9__PHI_TEMPORARY; - llvm_cbe_options104_39466_9 = llvm_cbe_options104_39466_9__PHI_TEMPORARY; - llvm_cbe_req_caseopt_39708_9 = llvm_cbe_req_caseopt_39708_9__PHI_TEMPORARY; - llvm_cbe_zerofirstbyte_29740_9 = llvm_cbe_zerofirstbyte_29740_9__PHI_TEMPORARY; - llvm_cbe_zeroreqbyte_29762_9 = llvm_cbe_zeroreqbyte_29762_9__PHI_TEMPORARY; - llvm_cbe_reqbyte103_59784_9 = llvm_cbe_reqbyte103_59784_9__PHI_TEMPORARY; - llvm_cbe_firstbyte102_39829_9 = llvm_cbe_firstbyte102_39829_9__PHI_TEMPORARY; - llvm_cbe_greedy_non_default_39879_9 = llvm_cbe_greedy_non_default_39879_9__PHI_TEMPORARY; - llvm_cbe_greedy_default_39909_9 = llvm_cbe_greedy_default_39909_9__PHI_TEMPORARY; - llvm_cbe_tmp13512351_9 = llvm_cbe_tmp13512351_9__PHI_TEMPORARY; - llvm_cbe_tmp13513612358_9 = llvm_cbe_tmp13513612358_9__PHI_TEMPORARY; - if (((((unsigned int )(llvm_cbe_tmp13513612358_9 + ((unsigned int )-42))) < ((unsigned int )((unsigned int )2))) | (llvm_cbe_tmp13512351_9 == ((unsigned char )63)))) { - llvm_cbe_iftmp_136_0__PHI_TEMPORARY = 0; /* for PHI node */ - goto llvm_cbe_bb396; - } else { - goto llvm_cbe_cond_next286; - } - -llvm_cbe_cond_true180: - llvm_cbe_tmp183184 = ((unsigned int )(unsigned long)llvm_cbe_previous_39389_3); - ltmp_4_1 = memmove(llvm_cbe_code_2, llvm_cbe_previous_39389_3, (llvm_cbe_tmp163164 - llvm_cbe_tmp183184)); - llvm_cbe_tmp194 = &llvm_cbe_code105_1[(llvm_cbe_tmp188189 - llvm_cbe_tmp183184)]; - if (((llvm_cbe_tmp13512351_3 != ((unsigned char )0)) & (llvm_cbe_inescq_29422_3 != ((unsigned int )0)))) { - llvm_cbe_previous_25708_0__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_last_code_15771_0__PHI_TEMPORARY = llvm_cbe_tmp194; /* for PHI node */ - llvm_cbe_code105_25773_0__PHI_TEMPORARY = llvm_cbe_tmp194; /* for PHI node */ - llvm_cbe_options_addr_25789_8__PHI_TEMPORARY = llvm_cbe_options_addr_25789_3; /* for PHI node */ - llvm_cbe_save_hwm_79347_8__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_3; /* for PHI node */ - llvm_cbe_previous_callout_59381_8__PHI_TEMPORARY = llvm_cbe_previous_callout_59381_3; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_29395_8__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_3; /* for PHI node */ - llvm_cbe_inescq_29422_8__PHI_TEMPORARY = llvm_cbe_inescq_29422_3; /* for PHI node */ - llvm_cbe_after_manual_callout_79460_8__PHI_TEMPORARY = llvm_cbe_after_manual_callout_79460_3; /* for PHI node */ - llvm_cbe_options104_39466_8__PHI_TEMPORARY = llvm_cbe_options104_39466_3; /* for PHI node */ - llvm_cbe_req_caseopt_39708_8__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_3; /* for PHI node */ - llvm_cbe_zerofirstbyte_29740_8__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_29740_3; /* for PHI node */ - llvm_cbe_zeroreqbyte_29762_8__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_29762_3; /* for PHI node */ - llvm_cbe_reqbyte103_59784_8__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_3; /* for PHI node */ - llvm_cbe_firstbyte102_39829_8__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_3; /* for PHI node */ - llvm_cbe_greedy_non_default_39879_8__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_3; /* for PHI node */ - llvm_cbe_greedy_default_39909_8__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_3; /* for PHI node */ - llvm_cbe_tmp13512351_8__PHI_TEMPORARY = llvm_cbe_tmp13512351_3; /* for PHI node */ - llvm_cbe_tmp13513612358_8__PHI_TEMPORARY = llvm_cbe_tmp13513612358_3; /* for PHI node */ - goto llvm_cbe_cond_true227; - } else { - llvm_cbe_previous_25708_1__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_last_code_15771_1__PHI_TEMPORARY = llvm_cbe_tmp194; /* for PHI node */ - llvm_cbe_code105_25773_1__PHI_TEMPORARY = llvm_cbe_tmp194; /* for PHI node */ - llvm_cbe_options_addr_25789_9__PHI_TEMPORARY = llvm_cbe_options_addr_25789_3; /* for PHI node */ - llvm_cbe_save_hwm_79347_9__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_3; /* for PHI node */ - llvm_cbe_previous_callout_59381_9__PHI_TEMPORARY = llvm_cbe_previous_callout_59381_3; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_29395_9__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_3; /* for PHI node */ - llvm_cbe_inescq_29422_9__PHI_TEMPORARY = llvm_cbe_inescq_29422_3; /* for PHI node */ - llvm_cbe_after_manual_callout_79460_9__PHI_TEMPORARY = llvm_cbe_after_manual_callout_79460_3; /* for PHI node */ - llvm_cbe_options104_39466_9__PHI_TEMPORARY = llvm_cbe_options104_39466_3; /* for PHI node */ - llvm_cbe_req_caseopt_39708_9__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_3; /* for PHI node */ - llvm_cbe_zerofirstbyte_29740_9__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_29740_3; /* for PHI node */ - llvm_cbe_zeroreqbyte_29762_9__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_29762_3; /* for PHI node */ - llvm_cbe_reqbyte103_59784_9__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_3; /* for PHI node */ - llvm_cbe_firstbyte102_39829_9__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_3; /* for PHI node */ - llvm_cbe_greedy_non_default_39879_9__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_3; /* for PHI node */ - llvm_cbe_greedy_default_39909_9__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_3; /* for PHI node */ - llvm_cbe_tmp13512351_9__PHI_TEMPORARY = llvm_cbe_tmp13512351_3; /* for PHI node */ - llvm_cbe_tmp13513612358_9__PHI_TEMPORARY = llvm_cbe_tmp13513612358_3; /* for PHI node */ - goto llvm_cbe_cond_next272; - } - -llvm_cbe_cond_true174: - if ((((unsigned char *)llvm_cbe_previous_39389_3) > ((unsigned char *)llvm_cbe_code_2))) { - goto llvm_cbe_cond_true180; - } else { - llvm_cbe_options_addr_25789_5__PHI_TEMPORARY = llvm_cbe_options_addr_25789_3; /* for PHI node */ - llvm_cbe_save_hwm_79347_5__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_3; /* for PHI node */ - llvm_cbe_previous_callout_59381_5__PHI_TEMPORARY = llvm_cbe_previous_callout_59381_3; /* for PHI node */ - llvm_cbe_previous_39389_5__PHI_TEMPORARY = llvm_cbe_previous_39389_3; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_29395_5__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_3; /* for PHI node */ - llvm_cbe_inescq_29422_5__PHI_TEMPORARY = llvm_cbe_inescq_29422_3; /* for PHI node */ - llvm_cbe_after_manual_callout_79460_5__PHI_TEMPORARY = llvm_cbe_after_manual_callout_79460_3; /* for PHI node */ - llvm_cbe_options104_39466_5__PHI_TEMPORARY = llvm_cbe_options104_39466_3; /* for PHI node */ - llvm_cbe_req_caseopt_39708_5__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_3; /* for PHI node */ - llvm_cbe_zerofirstbyte_29740_5__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_29740_3; /* for PHI node */ - llvm_cbe_zeroreqbyte_29762_5__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_29762_3; /* for PHI node */ - llvm_cbe_reqbyte103_59784_5__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_3; /* for PHI node */ - llvm_cbe_firstbyte102_39829_5__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_3; /* for PHI node */ - llvm_cbe_greedy_non_default_39879_5__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_3; /* for PHI node */ - llvm_cbe_greedy_default_39909_5__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_3; /* for PHI node */ - llvm_cbe_tmp13512351_5__PHI_TEMPORARY = llvm_cbe_tmp13512351_3; /* for PHI node */ - llvm_cbe_tmp13513612358_5__PHI_TEMPORARY = llvm_cbe_tmp13513612358_3; /* for PHI node */ - llvm_cbe_last_code_1__PHI_TEMPORARY = llvm_cbe_code105_1; /* for PHI node */ - llvm_cbe_code105_2__PHI_TEMPORARY = llvm_cbe_code105_1; /* for PHI node */ - goto llvm_cbe_cond_next215; - } - -llvm_cbe_cond_next152: - llvm_cbe_code105_1 = (((((unsigned char *)llvm_cbe_code105_39456_3) < ((unsigned char *)llvm_cbe_last_code_29452_3))) ? (llvm_cbe_last_code_29452_3) : (llvm_cbe_code105_39456_3)); - llvm_cbe_tmp162 = *llvm_cbe_iftmp_509_0; - llvm_cbe_tmp163164 = ((unsigned int )(unsigned long)llvm_cbe_code105_1); - *llvm_cbe_iftmp_509_0 = ((llvm_cbe_tmp163164 - (((unsigned int )(unsigned long)llvm_cbe_last_code_29452_3))) + llvm_cbe_tmp162); - if ((llvm_cbe_previous_39389_3 == ((unsigned char *)/*NULL*/0))) { - llvm_cbe_options_addr_25789_5__PHI_TEMPORARY = llvm_cbe_options_addr_25789_3; /* for PHI node */ - llvm_cbe_save_hwm_79347_5__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_3; /* for PHI node */ - llvm_cbe_previous_callout_59381_5__PHI_TEMPORARY = llvm_cbe_previous_callout_59381_3; /* for PHI node */ - llvm_cbe_previous_39389_5__PHI_TEMPORARY = llvm_cbe_previous_39389_3; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_29395_5__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_3; /* for PHI node */ - llvm_cbe_inescq_29422_5__PHI_TEMPORARY = llvm_cbe_inescq_29422_3; /* for PHI node */ - llvm_cbe_after_manual_callout_79460_5__PHI_TEMPORARY = llvm_cbe_after_manual_callout_79460_3; /* for PHI node */ - llvm_cbe_options104_39466_5__PHI_TEMPORARY = llvm_cbe_options104_39466_3; /* for PHI node */ - llvm_cbe_req_caseopt_39708_5__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_3; /* for PHI node */ - llvm_cbe_zerofirstbyte_29740_5__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_29740_3; /* for PHI node */ - llvm_cbe_zeroreqbyte_29762_5__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_29762_3; /* for PHI node */ - llvm_cbe_reqbyte103_59784_5__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_3; /* for PHI node */ - llvm_cbe_firstbyte102_39829_5__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_3; /* for PHI node */ - llvm_cbe_greedy_non_default_39879_5__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_3; /* for PHI node */ - llvm_cbe_greedy_default_39909_5__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_3; /* for PHI node */ - llvm_cbe_tmp13512351_5__PHI_TEMPORARY = llvm_cbe_tmp13512351_3; /* for PHI node */ - llvm_cbe_tmp13513612358_5__PHI_TEMPORARY = llvm_cbe_tmp13513612358_3; /* for PHI node */ - llvm_cbe_last_code_1__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_code105_2__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - goto llvm_cbe_cond_next215; - } else { - goto llvm_cbe_cond_true174; - } - -llvm_cbe_cond_true141: - llvm_cbe_options_addr_25789_3 = llvm_cbe_options_addr_25789_3__PHI_TEMPORARY; - llvm_cbe_save_hwm_79347_3 = llvm_cbe_save_hwm_79347_3__PHI_TEMPORARY; - llvm_cbe_previous_callout_59381_3 = llvm_cbe_previous_callout_59381_3__PHI_TEMPORARY; - llvm_cbe_previous_39389_3 = llvm_cbe_previous_39389_3__PHI_TEMPORARY; - llvm_cbe_groupsetfirstbyte_29395_3 = llvm_cbe_groupsetfirstbyte_29395_3__PHI_TEMPORARY; - llvm_cbe_inescq_29422_3 = llvm_cbe_inescq_29422_3__PHI_TEMPORARY; - llvm_cbe_last_code_29452_3 = llvm_cbe_last_code_29452_3__PHI_TEMPORARY; - llvm_cbe_code105_39456_3 = llvm_cbe_code105_39456_3__PHI_TEMPORARY; - llvm_cbe_after_manual_callout_79460_3 = llvm_cbe_after_manual_callout_79460_3__PHI_TEMPORARY; - llvm_cbe_options104_39466_3 = llvm_cbe_options104_39466_3__PHI_TEMPORARY; - llvm_cbe_req_caseopt_39708_3 = llvm_cbe_req_caseopt_39708_3__PHI_TEMPORARY; - llvm_cbe_zerofirstbyte_29740_3 = llvm_cbe_zerofirstbyte_29740_3__PHI_TEMPORARY; - llvm_cbe_zeroreqbyte_29762_3 = llvm_cbe_zeroreqbyte_29762_3__PHI_TEMPORARY; - llvm_cbe_reqbyte103_59784_3 = llvm_cbe_reqbyte103_59784_3__PHI_TEMPORARY; - llvm_cbe_firstbyte102_39829_3 = llvm_cbe_firstbyte102_39829_3__PHI_TEMPORARY; - llvm_cbe_greedy_non_default_39879_3 = llvm_cbe_greedy_non_default_39879_3__PHI_TEMPORARY; - llvm_cbe_greedy_default_39909_3 = llvm_cbe_greedy_default_39909_3__PHI_TEMPORARY; - llvm_cbe_tmp13512351_3 = llvm_cbe_tmp13512351_3__PHI_TEMPORARY; - llvm_cbe_tmp13513612358_3 = llvm_cbe_tmp13513612358_3__PHI_TEMPORARY; - llvm_cbe_tmp144 = *llvm_cbe_tmp143; - if ((((unsigned char *)(&llvm_cbe_tmp144[((unsigned int )4096)])) < ((unsigned char *)llvm_cbe_code105_39456_3))) { - goto llvm_cbe_cond_true150; - } else { - goto llvm_cbe_cond_next152; - } - -llvm_cbe_cond_next241: - llvm_cbe_tmp51975787 = &llvm_cbe_tmp234[((unsigned int )2)]; - *(&llvm_cbe_ptr106) = llvm_cbe_tmp51975787; - llvm_cbe_tmp13512365 = *llvm_cbe_tmp51975787; - llvm_cbe_tmp13513612367 = ((unsigned int )(unsigned char )llvm_cbe_tmp13512365); - if ((llvm_cbe_iftmp_509_0 == ((unsigned int *)/*NULL*/0))) { - llvm_cbe_options_addr_25789_4__PHI_TEMPORARY = llvm_cbe_options_addr_25789_8; /* for PHI node */ - llvm_cbe_save_hwm_79347_4__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_8; /* for PHI node */ - llvm_cbe_previous_callout_59381_4__PHI_TEMPORARY = llvm_cbe_previous_callout_59381_8; /* for PHI node */ - llvm_cbe_previous_39389_4__PHI_TEMPORARY = llvm_cbe_previous_25708_0; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_29395_4__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_8; /* for PHI node */ - llvm_cbe_inescq_29422_4__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_last_code_29452_4__PHI_TEMPORARY = llvm_cbe_last_code_15771_0; /* for PHI node */ - llvm_cbe_code105_39456_4__PHI_TEMPORARY = llvm_cbe_code105_25773_0; /* for PHI node */ - llvm_cbe_after_manual_callout_79460_4__PHI_TEMPORARY = llvm_cbe_after_manual_callout_79460_8; /* for PHI node */ - llvm_cbe_options104_39466_4__PHI_TEMPORARY = llvm_cbe_options104_39466_8; /* for PHI node */ - llvm_cbe_req_caseopt_39708_4__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_8; /* for PHI node */ - llvm_cbe_zerofirstbyte_29740_4__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_29740_8; /* for PHI node */ - llvm_cbe_zeroreqbyte_29762_4__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_29762_8; /* for PHI node */ - llvm_cbe_reqbyte103_59784_4__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_8; /* for PHI node */ - llvm_cbe_firstbyte102_39829_4__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_8; /* for PHI node */ - llvm_cbe_greedy_non_default_39879_4__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_8; /* for PHI node */ - llvm_cbe_greedy_default_39909_4__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_8; /* for PHI node */ - llvm_cbe_tmp13512351_4__PHI_TEMPORARY = llvm_cbe_tmp13512365; /* for PHI node */ - llvm_cbe_tmp13513612358_4__PHI_TEMPORARY = llvm_cbe_tmp13513612367; /* for PHI node */ - goto llvm_cbe_cond_false201; - } else { - llvm_cbe_options_addr_25789_3__PHI_TEMPORARY = llvm_cbe_options_addr_25789_8; /* for PHI node */ - llvm_cbe_save_hwm_79347_3__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_8; /* for PHI node */ - llvm_cbe_previous_callout_59381_3__PHI_TEMPORARY = llvm_cbe_previous_callout_59381_8; /* for PHI node */ - llvm_cbe_previous_39389_3__PHI_TEMPORARY = llvm_cbe_previous_25708_0; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_29395_3__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_8; /* for PHI node */ - llvm_cbe_inescq_29422_3__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_last_code_29452_3__PHI_TEMPORARY = llvm_cbe_last_code_15771_0; /* for PHI node */ - llvm_cbe_code105_39456_3__PHI_TEMPORARY = llvm_cbe_code105_25773_0; /* for PHI node */ - llvm_cbe_after_manual_callout_79460_3__PHI_TEMPORARY = llvm_cbe_after_manual_callout_79460_8; /* for PHI node */ - llvm_cbe_options104_39466_3__PHI_TEMPORARY = llvm_cbe_options104_39466_8; /* for PHI node */ - llvm_cbe_req_caseopt_39708_3__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_8; /* for PHI node */ - llvm_cbe_zerofirstbyte_29740_3__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_29740_8; /* for PHI node */ - llvm_cbe_zeroreqbyte_29762_3__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_29762_8; /* for PHI node */ - llvm_cbe_reqbyte103_59784_3__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_8; /* for PHI node */ - llvm_cbe_firstbyte102_39829_3__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_8; /* for PHI node */ - llvm_cbe_greedy_non_default_39879_3__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_8; /* for PHI node */ - llvm_cbe_greedy_default_39909_3__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_8; /* for PHI node */ - llvm_cbe_tmp13512351_3__PHI_TEMPORARY = llvm_cbe_tmp13512365; /* for PHI node */ - llvm_cbe_tmp13513612358_3__PHI_TEMPORARY = llvm_cbe_tmp13513612367; /* for PHI node */ - goto llvm_cbe_cond_true141; - } - -llvm_cbe_cond_next233: - llvm_cbe_tmp234 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp236 = *(&llvm_cbe_tmp234[((unsigned int )1)]); - if ((llvm_cbe_tmp236 == ((unsigned char )69))) { - goto llvm_cbe_cond_next241; - } else { - goto llvm_cbe_bb244; - } - -llvm_cbe_cond_true227: - llvm_cbe_previous_25708_0 = llvm_cbe_previous_25708_0__PHI_TEMPORARY; - llvm_cbe_last_code_15771_0 = llvm_cbe_last_code_15771_0__PHI_TEMPORARY; - llvm_cbe_code105_25773_0 = llvm_cbe_code105_25773_0__PHI_TEMPORARY; - llvm_cbe_options_addr_25789_8 = llvm_cbe_options_addr_25789_8__PHI_TEMPORARY; - llvm_cbe_save_hwm_79347_8 = llvm_cbe_save_hwm_79347_8__PHI_TEMPORARY; - llvm_cbe_previous_callout_59381_8 = llvm_cbe_previous_callout_59381_8__PHI_TEMPORARY; - llvm_cbe_groupsetfirstbyte_29395_8 = llvm_cbe_groupsetfirstbyte_29395_8__PHI_TEMPORARY; - llvm_cbe_inescq_29422_8 = llvm_cbe_inescq_29422_8__PHI_TEMPORARY; - llvm_cbe_after_manual_callout_79460_8 = llvm_cbe_after_manual_callout_79460_8__PHI_TEMPORARY; - llvm_cbe_options104_39466_8 = llvm_cbe_options104_39466_8__PHI_TEMPORARY; - llvm_cbe_req_caseopt_39708_8 = llvm_cbe_req_caseopt_39708_8__PHI_TEMPORARY; - llvm_cbe_zerofirstbyte_29740_8 = llvm_cbe_zerofirstbyte_29740_8__PHI_TEMPORARY; - llvm_cbe_zeroreqbyte_29762_8 = llvm_cbe_zeroreqbyte_29762_8__PHI_TEMPORARY; - llvm_cbe_reqbyte103_59784_8 = llvm_cbe_reqbyte103_59784_8__PHI_TEMPORARY; - llvm_cbe_firstbyte102_39829_8 = llvm_cbe_firstbyte102_39829_8__PHI_TEMPORARY; - llvm_cbe_greedy_non_default_39879_8 = llvm_cbe_greedy_non_default_39879_8__PHI_TEMPORARY; - llvm_cbe_greedy_default_39909_8 = llvm_cbe_greedy_default_39909_8__PHI_TEMPORARY; - llvm_cbe_tmp13512351_8 = llvm_cbe_tmp13512351_8__PHI_TEMPORARY; - llvm_cbe_tmp13513612358_8 = llvm_cbe_tmp13513612358_8__PHI_TEMPORARY; - if ((llvm_cbe_tmp13512351_8 == ((unsigned char )92))) { - goto llvm_cbe_cond_next233; - } else { - goto llvm_cbe_bb244; - } - -llvm_cbe_cond_next215: - llvm_cbe_options_addr_25789_5 = llvm_cbe_options_addr_25789_5__PHI_TEMPORARY; - llvm_cbe_save_hwm_79347_5 = llvm_cbe_save_hwm_79347_5__PHI_TEMPORARY; - llvm_cbe_previous_callout_59381_5 = llvm_cbe_previous_callout_59381_5__PHI_TEMPORARY; - llvm_cbe_previous_39389_5 = llvm_cbe_previous_39389_5__PHI_TEMPORARY; - llvm_cbe_groupsetfirstbyte_29395_5 = llvm_cbe_groupsetfirstbyte_29395_5__PHI_TEMPORARY; - llvm_cbe_inescq_29422_5 = llvm_cbe_inescq_29422_5__PHI_TEMPORARY; - llvm_cbe_after_manual_callout_79460_5 = llvm_cbe_after_manual_callout_79460_5__PHI_TEMPORARY; - llvm_cbe_options104_39466_5 = llvm_cbe_options104_39466_5__PHI_TEMPORARY; - llvm_cbe_req_caseopt_39708_5 = llvm_cbe_req_caseopt_39708_5__PHI_TEMPORARY; - llvm_cbe_zerofirstbyte_29740_5 = llvm_cbe_zerofirstbyte_29740_5__PHI_TEMPORARY; - llvm_cbe_zeroreqbyte_29762_5 = llvm_cbe_zeroreqbyte_29762_5__PHI_TEMPORARY; - llvm_cbe_reqbyte103_59784_5 = llvm_cbe_reqbyte103_59784_5__PHI_TEMPORARY; - llvm_cbe_firstbyte102_39829_5 = llvm_cbe_firstbyte102_39829_5__PHI_TEMPORARY; - llvm_cbe_greedy_non_default_39879_5 = llvm_cbe_greedy_non_default_39879_5__PHI_TEMPORARY; - llvm_cbe_greedy_default_39909_5 = llvm_cbe_greedy_default_39909_5__PHI_TEMPORARY; - llvm_cbe_tmp13512351_5 = llvm_cbe_tmp13512351_5__PHI_TEMPORARY; - llvm_cbe_tmp13513612358_5 = llvm_cbe_tmp13513612358_5__PHI_TEMPORARY; - llvm_cbe_last_code_1 = llvm_cbe_last_code_1__PHI_TEMPORARY; - llvm_cbe_code105_2 = llvm_cbe_code105_2__PHI_TEMPORARY; - if (((llvm_cbe_tmp13512351_5 != ((unsigned char )0)) & (llvm_cbe_inescq_29422_5 != ((unsigned int )0)))) { - llvm_cbe_previous_25708_0__PHI_TEMPORARY = llvm_cbe_previous_39389_5; /* for PHI node */ - llvm_cbe_last_code_15771_0__PHI_TEMPORARY = llvm_cbe_last_code_1; /* for PHI node */ - llvm_cbe_code105_25773_0__PHI_TEMPORARY = llvm_cbe_code105_2; /* for PHI node */ - llvm_cbe_options_addr_25789_8__PHI_TEMPORARY = llvm_cbe_options_addr_25789_5; /* for PHI node */ - llvm_cbe_save_hwm_79347_8__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_5; /* for PHI node */ - llvm_cbe_previous_callout_59381_8__PHI_TEMPORARY = llvm_cbe_previous_callout_59381_5; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_29395_8__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_5; /* for PHI node */ - llvm_cbe_inescq_29422_8__PHI_TEMPORARY = llvm_cbe_inescq_29422_5; /* for PHI node */ - llvm_cbe_after_manual_callout_79460_8__PHI_TEMPORARY = llvm_cbe_after_manual_callout_79460_5; /* for PHI node */ - llvm_cbe_options104_39466_8__PHI_TEMPORARY = llvm_cbe_options104_39466_5; /* for PHI node */ - llvm_cbe_req_caseopt_39708_8__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_5; /* for PHI node */ - llvm_cbe_zerofirstbyte_29740_8__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_29740_5; /* for PHI node */ - llvm_cbe_zeroreqbyte_29762_8__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_29762_5; /* for PHI node */ - llvm_cbe_reqbyte103_59784_8__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_5; /* for PHI node */ - llvm_cbe_firstbyte102_39829_8__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_5; /* for PHI node */ - llvm_cbe_greedy_non_default_39879_8__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_5; /* for PHI node */ - llvm_cbe_greedy_default_39909_8__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_5; /* for PHI node */ - llvm_cbe_tmp13512351_8__PHI_TEMPORARY = llvm_cbe_tmp13512351_5; /* for PHI node */ - llvm_cbe_tmp13513612358_8__PHI_TEMPORARY = llvm_cbe_tmp13513612358_5; /* for PHI node */ - goto llvm_cbe_cond_true227; - } else { - llvm_cbe_previous_25708_1__PHI_TEMPORARY = llvm_cbe_previous_39389_5; /* for PHI node */ - llvm_cbe_last_code_15771_1__PHI_TEMPORARY = llvm_cbe_last_code_1; /* for PHI node */ - llvm_cbe_code105_25773_1__PHI_TEMPORARY = llvm_cbe_code105_2; /* for PHI node */ - llvm_cbe_options_addr_25789_9__PHI_TEMPORARY = llvm_cbe_options_addr_25789_5; /* for PHI node */ - llvm_cbe_save_hwm_79347_9__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_5; /* for PHI node */ - llvm_cbe_previous_callout_59381_9__PHI_TEMPORARY = llvm_cbe_previous_callout_59381_5; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_29395_9__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_5; /* for PHI node */ - llvm_cbe_inescq_29422_9__PHI_TEMPORARY = llvm_cbe_inescq_29422_5; /* for PHI node */ - llvm_cbe_after_manual_callout_79460_9__PHI_TEMPORARY = llvm_cbe_after_manual_callout_79460_5; /* for PHI node */ - llvm_cbe_options104_39466_9__PHI_TEMPORARY = llvm_cbe_options104_39466_5; /* for PHI node */ - llvm_cbe_req_caseopt_39708_9__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_5; /* for PHI node */ - llvm_cbe_zerofirstbyte_29740_9__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_29740_5; /* for PHI node */ - llvm_cbe_zeroreqbyte_29762_9__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_29762_5; /* for PHI node */ - llvm_cbe_reqbyte103_59784_9__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_5; /* for PHI node */ - llvm_cbe_firstbyte102_39829_9__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_5; /* for PHI node */ - llvm_cbe_greedy_non_default_39879_9__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_5; /* for PHI node */ - llvm_cbe_greedy_default_39909_9__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_5; /* for PHI node */ - llvm_cbe_tmp13512351_9__PHI_TEMPORARY = llvm_cbe_tmp13512351_5; /* for PHI node */ - llvm_cbe_tmp13513612358_9__PHI_TEMPORARY = llvm_cbe_tmp13513612358_5; /* for PHI node */ - goto llvm_cbe_cond_next272; - } - -llvm_cbe_cond_false201: - llvm_cbe_options_addr_25789_4 = llvm_cbe_options_addr_25789_4__PHI_TEMPORARY; - llvm_cbe_save_hwm_79347_4 = llvm_cbe_save_hwm_79347_4__PHI_TEMPORARY; - llvm_cbe_previous_callout_59381_4 = llvm_cbe_previous_callout_59381_4__PHI_TEMPORARY; - llvm_cbe_previous_39389_4 = llvm_cbe_previous_39389_4__PHI_TEMPORARY; - llvm_cbe_groupsetfirstbyte_29395_4 = llvm_cbe_groupsetfirstbyte_29395_4__PHI_TEMPORARY; - llvm_cbe_inescq_29422_4 = llvm_cbe_inescq_29422_4__PHI_TEMPORARY; - llvm_cbe_last_code_29452_4 = llvm_cbe_last_code_29452_4__PHI_TEMPORARY; - llvm_cbe_code105_39456_4 = llvm_cbe_code105_39456_4__PHI_TEMPORARY; - llvm_cbe_after_manual_callout_79460_4 = llvm_cbe_after_manual_callout_79460_4__PHI_TEMPORARY; - llvm_cbe_options104_39466_4 = llvm_cbe_options104_39466_4__PHI_TEMPORARY; - llvm_cbe_req_caseopt_39708_4 = llvm_cbe_req_caseopt_39708_4__PHI_TEMPORARY; - llvm_cbe_zerofirstbyte_29740_4 = llvm_cbe_zerofirstbyte_29740_4__PHI_TEMPORARY; - llvm_cbe_zeroreqbyte_29762_4 = llvm_cbe_zeroreqbyte_29762_4__PHI_TEMPORARY; - llvm_cbe_reqbyte103_59784_4 = llvm_cbe_reqbyte103_59784_4__PHI_TEMPORARY; - llvm_cbe_firstbyte102_39829_4 = llvm_cbe_firstbyte102_39829_4__PHI_TEMPORARY; - llvm_cbe_greedy_non_default_39879_4 = llvm_cbe_greedy_non_default_39879_4__PHI_TEMPORARY; - llvm_cbe_greedy_default_39909_4 = llvm_cbe_greedy_default_39909_4__PHI_TEMPORARY; - llvm_cbe_tmp13512351_4 = llvm_cbe_tmp13512351_4__PHI_TEMPORARY; - llvm_cbe_tmp13513612358_4 = llvm_cbe_tmp13513612358_4__PHI_TEMPORARY; - llvm_cbe_tmp204 = *llvm_cbe_tmp203; - llvm_cbe_tmp207 = *llvm_cbe_tmp143; - if ((((unsigned char *)llvm_cbe_tmp204) > ((unsigned char *)(&llvm_cbe_tmp207[((unsigned int )4096)])))) { - goto llvm_cbe_cond_true212; - } else { - llvm_cbe_options_addr_25789_5__PHI_TEMPORARY = llvm_cbe_options_addr_25789_4; /* for PHI node */ - llvm_cbe_save_hwm_79347_5__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_4; /* for PHI node */ - llvm_cbe_previous_callout_59381_5__PHI_TEMPORARY = llvm_cbe_previous_callout_59381_4; /* for PHI node */ - llvm_cbe_previous_39389_5__PHI_TEMPORARY = llvm_cbe_previous_39389_4; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_29395_5__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_4; /* for PHI node */ - llvm_cbe_inescq_29422_5__PHI_TEMPORARY = llvm_cbe_inescq_29422_4; /* for PHI node */ - llvm_cbe_after_manual_callout_79460_5__PHI_TEMPORARY = llvm_cbe_after_manual_callout_79460_4; /* for PHI node */ - llvm_cbe_options104_39466_5__PHI_TEMPORARY = llvm_cbe_options104_39466_4; /* for PHI node */ - llvm_cbe_req_caseopt_39708_5__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_4; /* for PHI node */ - llvm_cbe_zerofirstbyte_29740_5__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_29740_4; /* for PHI node */ - llvm_cbe_zeroreqbyte_29762_5__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_29762_4; /* for PHI node */ - llvm_cbe_reqbyte103_59784_5__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_4; /* for PHI node */ - llvm_cbe_firstbyte102_39829_5__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_4; /* for PHI node */ - llvm_cbe_greedy_non_default_39879_5__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_4; /* for PHI node */ - llvm_cbe_greedy_default_39909_5__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_4; /* for PHI node */ - llvm_cbe_tmp13512351_5__PHI_TEMPORARY = llvm_cbe_tmp13512351_4; /* for PHI node */ - llvm_cbe_tmp13513612358_5__PHI_TEMPORARY = llvm_cbe_tmp13513612358_4; /* for PHI node */ - llvm_cbe_last_code_1__PHI_TEMPORARY = llvm_cbe_last_code_29452_4; /* for PHI node */ - llvm_cbe_code105_2__PHI_TEMPORARY = llvm_cbe_code105_39456_4; /* for PHI node */ - goto llvm_cbe_cond_next215; - } - -llvm_cbe_bb326: - llvm_cbe_p_10_lcssa = llvm_cbe_p_10_lcssa__PHI_TEMPORARY; - llvm_cbe_tmp328 = *llvm_cbe_p_10_lcssa; - switch (llvm_cbe_tmp328) { - default: - goto llvm_cbe_bb395; -; - case ((unsigned char )125): - llvm_cbe_iftmp_136_0__PHI_TEMPORARY = 0; /* for PHI node */ - goto llvm_cbe_bb396; - case ((unsigned char )44): - goto llvm_cbe_cond_next344; - break; - } -llvm_cbe_bb315_preheader: - llvm_cbe_tmp31726562 = *llvm_cbe_tmp307; - llvm_cbe_tmp32026565 = *(&digitab[(((unsigned int )(unsigned char )llvm_cbe_tmp31726562))]); - if (((((unsigned char )(llvm_cbe_tmp32026565 & ((unsigned char )4)))) == ((unsigned char )0))) { - llvm_cbe_p_10_lcssa__PHI_TEMPORARY = llvm_cbe_tmp307; /* for PHI node */ - goto llvm_cbe_bb326; - } else { - llvm_cbe_p_1026561_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb312; - } - -llvm_cbe_cond_next292: - llvm_cbe_tmp293 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp297 = *(&llvm_cbe_tmp293[((unsigned int )1)]); - llvm_cbe_tmp300 = *(&digitab[(((unsigned int )(unsigned char )llvm_cbe_tmp297))]); - llvm_cbe_tmp307 = &llvm_cbe_tmp293[((unsigned int )2)]; - if (((((unsigned char )(llvm_cbe_tmp300 & ((unsigned char )4)))) == ((unsigned char )0))) { - goto llvm_cbe_bb395; - } else { - goto llvm_cbe_bb315_preheader; - } - -llvm_cbe_cond_next286: - if ((llvm_cbe_tmp13512351_9 == ((unsigned char )123))) { - goto llvm_cbe_cond_next292; - } else { - goto llvm_cbe_bb395; - } - - do { /* Syntactic loop 'bb312' to make GCC happy */ -llvm_cbe_bb312: - llvm_cbe_p_1026561_rec = llvm_cbe_p_1026561_rec__PHI_TEMPORARY; - llvm_cbe_tmp314 = &llvm_cbe_tmp293[(llvm_cbe_p_1026561_rec + ((unsigned int )3))]; - llvm_cbe_tmp317 = *llvm_cbe_tmp314; - llvm_cbe_tmp320 = *(&digitab[(((unsigned int )(unsigned char )llvm_cbe_tmp317))]); - if (((((unsigned char )(llvm_cbe_tmp320 & ((unsigned char )4)))) == ((unsigned char )0))) { - llvm_cbe_p_10_lcssa__PHI_TEMPORARY = llvm_cbe_tmp314; /* for PHI node */ - goto llvm_cbe_bb326; - } else { - llvm_cbe_p_1026561_rec__PHI_TEMPORARY = (llvm_cbe_p_1026561_rec + ((unsigned int )1)); /* for PHI node */ - goto llvm_cbe_bb312; - } - - } while (1); /* end of syntactic loop 'bb312' */ -llvm_cbe_cond_next344: - llvm_cbe_tmp346 = *(&llvm_cbe_p_10_lcssa[((unsigned int )1)]); - if ((llvm_cbe_tmp346 == ((unsigned char )125))) { - llvm_cbe_iftmp_136_0__PHI_TEMPORARY = 0; /* for PHI node */ - goto llvm_cbe_bb396; - } else { - goto llvm_cbe_cond_next352; - } - -llvm_cbe_bb383: - llvm_cbe_p_12_lcssa = llvm_cbe_p_12_lcssa__PHI_TEMPORARY; - llvm_cbe_tmp385 = *llvm_cbe_p_12_lcssa; - if ((llvm_cbe_tmp385 == ((unsigned char )125))) { - llvm_cbe_iftmp_136_0__PHI_TEMPORARY = 0; /* for PHI node */ - goto llvm_cbe_bb396; - } else { - goto llvm_cbe_bb395; - } - -llvm_cbe_bb372_preheader: - llvm_cbe_tmp37426570 = *llvm_cbe_tmp364; - llvm_cbe_tmp37726573 = *(&digitab[(((unsigned int )(unsigned char )llvm_cbe_tmp37426570))]); - if (((((unsigned char )(llvm_cbe_tmp37726573 & ((unsigned char )4)))) == ((unsigned char )0))) { - llvm_cbe_p_12_lcssa__PHI_TEMPORARY = llvm_cbe_tmp364; /* for PHI node */ - goto llvm_cbe_bb383; - } else { - llvm_cbe_p_1226569_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb369; - } - -llvm_cbe_cond_next352: - llvm_cbe_tmp357 = *(&digitab[(((unsigned int )(unsigned char )llvm_cbe_tmp346))]); - llvm_cbe_tmp364 = &llvm_cbe_p_10_lcssa[((unsigned int )2)]; - if (((((unsigned char )(llvm_cbe_tmp357 & ((unsigned char )4)))) == ((unsigned char )0))) { - goto llvm_cbe_bb395; - } else { - goto llvm_cbe_bb372_preheader; - } - - do { /* Syntactic loop 'bb369' to make GCC happy */ -llvm_cbe_bb369: - llvm_cbe_p_1226569_rec = llvm_cbe_p_1226569_rec__PHI_TEMPORARY; - llvm_cbe_tmp371 = &llvm_cbe_p_10_lcssa[(llvm_cbe_p_1226569_rec + ((unsigned int )3))]; - llvm_cbe_tmp374 = *llvm_cbe_tmp371; - llvm_cbe_tmp377 = *(&digitab[(((unsigned int )(unsigned char )llvm_cbe_tmp374))]); - if (((((unsigned char )(llvm_cbe_tmp377 & ((unsigned char )4)))) == ((unsigned char )0))) { - llvm_cbe_p_12_lcssa__PHI_TEMPORARY = llvm_cbe_tmp371; /* for PHI node */ - goto llvm_cbe_bb383; - } else { - llvm_cbe_p_1226569_rec__PHI_TEMPORARY = (llvm_cbe_p_1226569_rec + ((unsigned int )1)); /* for PHI node */ - goto llvm_cbe_bb369; - } - - } while (1); /* end of syntactic loop 'bb369' */ -llvm_cbe_bb395: - llvm_cbe_iftmp_136_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb396; - -llvm_cbe_cond_true409: - llvm_cbe_tmp414 = llvm_cbe_after_manual_callout_79460_9 + ((unsigned int )-1); - llvm_cbe_previous_callout_59381_9_mux = (((((signed int )llvm_cbe_after_manual_callout_79460_9) < ((signed int )((unsigned int )1)))) ? (((unsigned char *)/*NULL*/0)) : (llvm_cbe_previous_callout_59381_9)); - if (((((signed int )llvm_cbe_after_manual_callout_79460_9) < ((signed int )((unsigned int )1))) & (llvm_cbe_iftmp_509_0 == ((unsigned int *)/*NULL*/0)))) { - goto llvm_cbe_cond_true421; - } else { - llvm_cbe_previous_callout_6__PHI_TEMPORARY = llvm_cbe_previous_callout_59381_9_mux; /* for PHI node */ - llvm_cbe_after_manual_callout_1__PHI_TEMPORARY = llvm_cbe_tmp414; /* for PHI node */ - goto llvm_cbe_cond_next427; - } - -llvm_cbe_cond_true421: - llvm_cbe_tmp422 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp4_i9 = *llvm_cbe_tmp3783; - llvm_cbe_tmp9_i13 = *(&llvm_cbe_previous_callout_59381_9[((unsigned int )2)]); - llvm_cbe_tmp14_i17 = *(&llvm_cbe_previous_callout_59381_9[((unsigned int )3)]); - llvm_cbe_tmp17_i20 = ((((unsigned int )(unsigned long)llvm_cbe_tmp422)) - (((unsigned int )(unsigned long)llvm_cbe_tmp4_i9))) - (((((unsigned int )(unsigned char )llvm_cbe_tmp9_i13)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp14_i17))); - *(&llvm_cbe_previous_callout_59381_9[((unsigned int )4)]) = (((unsigned char )(((unsigned int )(((unsigned int )llvm_cbe_tmp17_i20) >> ((unsigned int )((unsigned int )8))))))); - *(&llvm_cbe_previous_callout_59381_9[((unsigned int )5)]) = (((unsigned char )llvm_cbe_tmp17_i20)); - llvm_cbe_previous_callout_6__PHI_TEMPORARY = ((unsigned char *)/*NULL*/0); /* for PHI node */ - llvm_cbe_after_manual_callout_1__PHI_TEMPORARY = llvm_cbe_tmp414; /* for PHI node */ - goto llvm_cbe_cond_next427; - -llvm_cbe_cond_next445: - if ((llvm_cbe_tmp13512351_9 == ((unsigned char )35))) { - goto llvm_cbe_bb549; - } else { - llvm_cbe_c_2__PHI_TEMPORARY = llvm_cbe_tmp13513612358_9; /* for PHI node */ - goto llvm_cbe_cond_next566; - } - -llvm_cbe_cond_true433: - llvm_cbe_tmp436 = *llvm_cbe_tmp435; - llvm_cbe_tmp439 = *(&llvm_cbe_tmp436[llvm_cbe_tmp13513612358_9]); - if (((((unsigned char )(llvm_cbe_tmp439 & ((unsigned char )1)))) == ((unsigned char )0))) { - goto llvm_cbe_cond_next445; - } else { - llvm_cbe_slot_913437_0_us61_5__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_5__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_1__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_save_hwm_6__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_previous_callout_4__PHI_TEMPORARY = llvm_cbe_previous_callout_6; /* for PHI node */ - llvm_cbe_previous_6__PHI_TEMPORARY = llvm_cbe_previous_25708_1; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_1__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_9; /* for PHI node */ - llvm_cbe_inescq_1__PHI_TEMPORARY = llvm_cbe_inescq_29422_9; /* for PHI node */ - llvm_cbe_code105_9__PHI_TEMPORARY = llvm_cbe_code105_25773_1; /* for PHI node */ - llvm_cbe_options104_2__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_req_caseopt_2__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_9; /* for PHI node */ - llvm_cbe_zerofirstbyte_1__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_29740_9; /* for PHI node */ - llvm_cbe_zeroreqbyte_1__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_29762_9; /* for PHI node */ - llvm_cbe_firstbyte102_2__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - llvm_cbe_greedy_non_default_2__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_9; /* for PHI node */ - llvm_cbe_greedy_default_2__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_9; /* for PHI node */ - goto llvm_cbe_bb5195; - } - -llvm_cbe_bb557: - llvm_cbe_tmp558 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp559 = *llvm_cbe_tmp558; - if ((llvm_cbe_tmp559 == ((unsigned char )0))) { - llvm_cbe_c_2__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_cond_next566; - } else { - llvm_cbe_slot_913437_0_us61_5__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_5__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_1__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_save_hwm_6__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_previous_callout_4__PHI_TEMPORARY = llvm_cbe_previous_callout_6; /* for PHI node */ - llvm_cbe_previous_6__PHI_TEMPORARY = llvm_cbe_previous_25708_1; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_1__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_9; /* for PHI node */ - llvm_cbe_inescq_1__PHI_TEMPORARY = llvm_cbe_inescq_29422_9; /* for PHI node */ - llvm_cbe_code105_9__PHI_TEMPORARY = llvm_cbe_code105_25773_1; /* for PHI node */ - llvm_cbe_options104_2__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_req_caseopt_2__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_9; /* for PHI node */ - llvm_cbe_zerofirstbyte_1__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_29740_9; /* for PHI node */ - llvm_cbe_zeroreqbyte_1__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_29762_9; /* for PHI node */ - llvm_cbe_firstbyte102_2__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - llvm_cbe_greedy_non_default_2__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_9; /* for PHI node */ - llvm_cbe_greedy_default_2__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_9; /* for PHI node */ - goto llvm_cbe_bb5195; - } - -llvm_cbe_cond_true541: - llvm_cbe_tmp542 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp545 = *llvm_cbe_tmp469; - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp542[(llvm_cbe_tmp545 + ((unsigned int )-1))]); - goto llvm_cbe_bb557; - - do { /* Syntactic loop 'bb549' to make GCC happy */ -llvm_cbe_bb549: - llvm_cbe_tmp550 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp551 = &llvm_cbe_tmp550[((unsigned int )1)]; - *(&llvm_cbe_ptr106) = llvm_cbe_tmp551; - llvm_cbe_tmp553 = *llvm_cbe_tmp551; - if ((llvm_cbe_tmp553 == ((unsigned char )0))) { - goto llvm_cbe_bb557; - } else { - goto llvm_cbe_bb451; - } - -llvm_cbe_cond_true458: - if ((((unsigned char *)llvm_cbe_tmp461) > ((unsigned char *)llvm_cbe_tmp551))) { - goto llvm_cbe_cond_next467; - } else { - goto llvm_cbe_bb549; - } - -llvm_cbe_bb451: - llvm_cbe_tmp454 = *llvm_cbe_tmp453; - llvm_cbe_tmp461 = *llvm_cbe_tmp460; - if ((llvm_cbe_tmp454 == ((unsigned int )0))) { - goto llvm_cbe_cond_false488; - } else { - goto llvm_cbe_cond_true458; - } - -llvm_cbe_cond_next467: - llvm_cbe_tmp478 = _pcre_is_newline(llvm_cbe_tmp551, llvm_cbe_tmp454, llvm_cbe_tmp461, llvm_cbe_tmp469); - if ((llvm_cbe_tmp478 == ((unsigned int )0))) { - goto llvm_cbe_bb549; - } else { - goto llvm_cbe_cond_true541; - } - -llvm_cbe_cond_false488: - llvm_cbe_tmp494 = *llvm_cbe_tmp469; - if ((((unsigned char *)(&llvm_cbe_tmp461[(-(llvm_cbe_tmp494))])) < ((unsigned char *)llvm_cbe_tmp551))) { - goto llvm_cbe_bb549; - } else { - goto llvm_cbe_cond_next502; - } - -llvm_cbe_cond_next502: - llvm_cbe_tmp509 = *llvm_cbe_tmp508; - if ((llvm_cbe_tmp553 == llvm_cbe_tmp509)) { - goto llvm_cbe_cond_next514; - } else { - goto llvm_cbe_bb549; - } - -llvm_cbe_cond_next522: - llvm_cbe_tmp525 = *(&llvm_cbe_tmp550[((unsigned int )2)]); - llvm_cbe_tmp529 = *llvm_cbe_tmp528; - if ((llvm_cbe_tmp525 == llvm_cbe_tmp529)) { - goto llvm_cbe_cond_true541; - } else { - goto llvm_cbe_bb549; - } - -llvm_cbe_cond_next514: - if ((llvm_cbe_tmp494 == ((unsigned int )1))) { - goto llvm_cbe_cond_true541; - } else { - goto llvm_cbe_cond_next522; - } - - } while (1); /* end of syntactic loop 'bb549' */ -llvm_cbe_cond_true580: - llvm_cbe_tmp582 = *(&llvm_cbe_ptr106); - *llvm_cbe_code105_25773_1 = ((unsigned char )82); - *(&llvm_cbe_code105_25773_1[((unsigned int )1)]) = ((unsigned char )-1); - llvm_cbe_tmp11_i30 = *llvm_cbe_tmp3783; - *(&llvm_cbe_code105_25773_1[((unsigned int )2)]) = (((unsigned char )(((unsigned int )(((unsigned int )((((unsigned int )(unsigned long)llvm_cbe_tmp582)) - (((unsigned int )(unsigned long)llvm_cbe_tmp11_i30)))) >> ((unsigned int )((unsigned int )8))))))); - llvm_cbe_tmp23_i36 = *llvm_cbe_tmp3783; - *(&llvm_cbe_code105_25773_1[((unsigned int )3)]) = (((unsigned char )((((unsigned char )(unsigned long)llvm_cbe_tmp582)) - (((unsigned char )(unsigned long)llvm_cbe_tmp23_i36))))); - *(&llvm_cbe_code105_25773_1[((unsigned int )4)]) = ((unsigned char )0); - *(&llvm_cbe_code105_25773_1[((unsigned int )5)]) = ((unsigned char )0); - llvm_cbe_tmp35_i42 = &llvm_cbe_code105_25773_1[((unsigned int )6)]; - llvm_cbe_previous_callout_9__PHI_TEMPORARY = llvm_cbe_code105_25773_1; /* for PHI node */ - llvm_cbe_code105_10__PHI_TEMPORARY = llvm_cbe_tmp35_i42; /* for PHI node */ - goto llvm_cbe_cond_next586; - -llvm_cbe_bb632: - *llvm_cbe_code105_10 = ((unsigned char )26); - llvm_cbe_tmp635 = &llvm_cbe_code105_10[((unsigned int )1)]; - llvm_cbe_tmp519612384 = *(&llvm_cbe_ptr106); - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp519612384[((unsigned int )1)]); - llvm_cbe_slot_913437_0_us61_13__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_13__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_repeat_max_10__PHI_TEMPORARY = llvm_cbe_repeat_max_10; /* for PHI node */ - llvm_cbe_repeat_min_10__PHI_TEMPORARY = llvm_cbe_repeat_min_10; /* for PHI node */ - llvm_cbe_options_addr_2__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_save_hwm_7__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_previous_callout_5__PHI_TEMPORARY = llvm_cbe_previous_callout_9; /* for PHI node */ - llvm_cbe_previous_3__PHI_TEMPORARY = ((unsigned char *)/*NULL*/0); /* for PHI node */ - llvm_cbe_groupsetfirstbyte_2__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_9; /* for PHI node */ - llvm_cbe_inescq_2__PHI_TEMPORARY = llvm_cbe_inescq_29422_9; /* for PHI node */ - llvm_cbe_last_code_2__PHI_TEMPORARY = llvm_cbe_last_code_15771_1; /* for PHI node */ - llvm_cbe_code105_3__PHI_TEMPORARY = llvm_cbe_tmp635; /* for PHI node */ - llvm_cbe_after_manual_callout_7__PHI_TEMPORARY = llvm_cbe_after_manual_callout_1; /* for PHI node */ - llvm_cbe_options104_3__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_req_caseopt_3__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_9; /* for PHI node */ - llvm_cbe_zerofirstbyte_2__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_29740_9; /* for PHI node */ - llvm_cbe_zeroreqbyte_2__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_29762_9; /* for PHI node */ - llvm_cbe_reqbyte103_5__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_9; /* for PHI node */ - llvm_cbe_firstbyte102_3__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - llvm_cbe_greedy_non_default_3__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_9; /* for PHI node */ - llvm_cbe_greedy_default_3__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_9; /* for PHI node */ - goto llvm_cbe_bb131; - -llvm_cbe_bb636: - llvm_cbe_firstbyte102_4 = (((llvm_cbe_firstbyte102_39829_9 == ((unsigned int )-2))) ? (((unsigned int )-1)) : (llvm_cbe_firstbyte102_39829_9)); - *llvm_cbe_code105_10 = ((unsigned char )12); - llvm_cbe_tmp648 = &llvm_cbe_code105_10[((unsigned int )1)]; - llvm_cbe_tmp519612387 = *(&llvm_cbe_ptr106); - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp519612387[((unsigned int )1)]); - llvm_cbe_slot_913437_0_us61_13__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_13__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_repeat_max_10__PHI_TEMPORARY = llvm_cbe_repeat_max_10; /* for PHI node */ - llvm_cbe_repeat_min_10__PHI_TEMPORARY = llvm_cbe_repeat_min_10; /* for PHI node */ - llvm_cbe_options_addr_2__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_save_hwm_7__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_previous_callout_5__PHI_TEMPORARY = llvm_cbe_previous_callout_9; /* for PHI node */ - llvm_cbe_previous_3__PHI_TEMPORARY = llvm_cbe_code105_10; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_2__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_9; /* for PHI node */ - llvm_cbe_inescq_2__PHI_TEMPORARY = llvm_cbe_inescq_29422_9; /* for PHI node */ - llvm_cbe_last_code_2__PHI_TEMPORARY = llvm_cbe_last_code_15771_1; /* for PHI node */ - llvm_cbe_code105_3__PHI_TEMPORARY = llvm_cbe_tmp648; /* for PHI node */ - llvm_cbe_after_manual_callout_7__PHI_TEMPORARY = llvm_cbe_after_manual_callout_1; /* for PHI node */ - llvm_cbe_options104_3__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_req_caseopt_3__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_9; /* for PHI node */ - llvm_cbe_zerofirstbyte_2__PHI_TEMPORARY = llvm_cbe_firstbyte102_4; /* for PHI node */ - llvm_cbe_zeroreqbyte_2__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_9; /* for PHI node */ - llvm_cbe_reqbyte103_5__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_9; /* for PHI node */ - llvm_cbe_firstbyte102_3__PHI_TEMPORARY = llvm_cbe_firstbyte102_4; /* for PHI node */ - llvm_cbe_greedy_non_default_3__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_9; /* for PHI node */ - llvm_cbe_greedy_default_3__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_9; /* for PHI node */ - goto llvm_cbe_bb131; - -llvm_cbe_cond_true1736: - llvm_cbe_firstbyte102_5 = (((llvm_cbe_firstbyte102_39829_9 == ((unsigned int )-2))) ? (((unsigned int )-1)) : (llvm_cbe_firstbyte102_39829_9)); - *llvm_cbe_code105_10 = ((unsigned char )29); - *(&llvm_cbe_code105_10[((unsigned int )1)]) = (((unsigned char )llvm_cbe_class_lastchar_8)); - llvm_cbe_tmp1751 = &llvm_cbe_code105_10[((unsigned int )2)]; - llvm_cbe_tmp519612533 = *(&llvm_cbe_ptr106); - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp519612533[((unsigned int )1)]); - llvm_cbe_slot_913437_0_us61_13__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_13__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_repeat_max_10__PHI_TEMPORARY = llvm_cbe_repeat_max_10; /* for PHI node */ - llvm_cbe_repeat_min_10__PHI_TEMPORARY = llvm_cbe_repeat_min_10; /* for PHI node */ - llvm_cbe_options_addr_2__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_save_hwm_7__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_previous_callout_5__PHI_TEMPORARY = llvm_cbe_previous_callout_9; /* for PHI node */ - llvm_cbe_previous_3__PHI_TEMPORARY = llvm_cbe_code105_10; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_2__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_9; /* for PHI node */ - llvm_cbe_inescq_2__PHI_TEMPORARY = llvm_cbe_inescq_5; /* for PHI node */ - llvm_cbe_last_code_2__PHI_TEMPORARY = llvm_cbe_last_code_15771_1; /* for PHI node */ - llvm_cbe_code105_3__PHI_TEMPORARY = llvm_cbe_tmp1751; /* for PHI node */ - llvm_cbe_after_manual_callout_7__PHI_TEMPORARY = llvm_cbe_after_manual_callout_1; /* for PHI node */ - llvm_cbe_options104_3__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_req_caseopt_3__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_9; /* for PHI node */ - llvm_cbe_zerofirstbyte_2__PHI_TEMPORARY = llvm_cbe_firstbyte102_5; /* for PHI node */ - llvm_cbe_zeroreqbyte_2__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_9; /* for PHI node */ - llvm_cbe_reqbyte103_5__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_9; /* for PHI node */ - llvm_cbe_firstbyte102_3__PHI_TEMPORARY = llvm_cbe_firstbyte102_5; /* for PHI node */ - llvm_cbe_greedy_non_default_3__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_9; /* for PHI node */ - llvm_cbe_greedy_default_3__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_9; /* for PHI node */ - goto llvm_cbe_bb131; - -llvm_cbe_cond_true1730: - if ((llvm_cbe_negate_class_0 == ((unsigned int )0))) { - goto llvm_cbe_cond_next1752; - } else { - goto llvm_cbe_cond_true1736; - } - -llvm_cbe_cond_next1725: - if ((llvm_cbe_class_charcount_8 == ((unsigned int )1))) { - goto llvm_cbe_cond_true1730; - } else { - goto llvm_cbe_cond_next1756; - } - -llvm_cbe_cond_next1718: - llvm_cbe_class_lastchar_8 = llvm_cbe_class_lastchar_8__PHI_TEMPORARY; - llvm_cbe_class_charcount_8 = llvm_cbe_class_charcount_8__PHI_TEMPORARY; - llvm_cbe_inescq_5 = llvm_cbe_inescq_5__PHI_TEMPORARY; - llvm_cbe_c_12 = llvm_cbe_c_12__PHI_TEMPORARY; - if ((llvm_cbe_c_12 == ((unsigned int )0))) { - goto llvm_cbe_cond_true1723; - } else { - goto llvm_cbe_cond_next1725; - } - -llvm_cbe_cond_next710: - llvm_cbe_negate_class_0 = llvm_cbe_negate_class_0__PHI_TEMPORARY; - llvm_cbe_c_8_in = llvm_cbe_c_8_in__PHI_TEMPORARY; - llvm_cbe_c_8 = ((unsigned int )(unsigned char )llvm_cbe_c_8_in); - ltmp_5_1 = memset(llvm_cbe_classbits711, (((unsigned int )(unsigned char )((unsigned char )0))), ((unsigned int )32)); - if ((llvm_cbe_c_8_in == ((unsigned char )0))) { - llvm_cbe_class_lastchar_8__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - llvm_cbe_class_charcount_8__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_inescq_5__PHI_TEMPORARY = llvm_cbe_inescq_29422_9; /* for PHI node */ - llvm_cbe_c_12__PHI_TEMPORARY = llvm_cbe_c_8; /* for PHI node */ - goto llvm_cbe_cond_next1718; - } else { - goto llvm_cbe_bb717_preheader; - } - -llvm_cbe_bb693: - llvm_cbe_tmp694 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp695 = &llvm_cbe_tmp694[((unsigned int )1)]; - *(&llvm_cbe_ptr106) = llvm_cbe_tmp695; - llvm_cbe_tmp697 = *llvm_cbe_tmp695; - if ((llvm_cbe_tmp697 == ((unsigned char )94))) { - goto llvm_cbe_cond_true703; - } else { - llvm_cbe_negate_class_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_c_8_in__PHI_TEMPORARY = llvm_cbe_tmp697; /* for PHI node */ - goto llvm_cbe_cond_next710; - } - -llvm_cbe_bb649: - llvm_cbe_tmp651 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp653 = *(&llvm_cbe_tmp651[((unsigned int )1)]); - switch (llvm_cbe_tmp653) { - default: - goto llvm_cbe_bb693; -; - case ((unsigned char )46): - goto llvm_cbe_bb673; - break; - case ((unsigned char )58): - goto llvm_cbe_bb673; - break; - case ((unsigned char )61): - goto llvm_cbe_bb673; - break; - } -llvm_cbe_bb673: - llvm_cbe_tmp676 = check_posix_syntax(llvm_cbe_tmp651, (&llvm_cbe_tempptr), llvm_cbe_cd); - if ((llvm_cbe_tmp676 == ((unsigned int )0))) { - goto llvm_cbe_bb693; - } else { - goto llvm_cbe_cond_true680; - } - -llvm_cbe_cond_true703: - llvm_cbe_tmp705 = &llvm_cbe_tmp694[((unsigned int )2)]; - *(&llvm_cbe_ptr106) = llvm_cbe_tmp705; - llvm_cbe_tmp707 = *llvm_cbe_tmp705; - llvm_cbe_negate_class_0__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - llvm_cbe_c_8_in__PHI_TEMPORARY = llvm_cbe_tmp707; /* for PHI node */ - goto llvm_cbe_cond_next710; - - do { /* Syntactic loop 'bb717' to make GCC happy */ -llvm_cbe_bb717: - llvm_cbe_class_lastchar_7 = llvm_cbe_class_lastchar_7__PHI_TEMPORARY; - llvm_cbe_class_charcount_7 = llvm_cbe_class_charcount_7__PHI_TEMPORARY; - llvm_cbe_inescq_4 = llvm_cbe_inescq_4__PHI_TEMPORARY; - llvm_cbe_c_11 = llvm_cbe_c_11__PHI_TEMPORARY; - if ((llvm_cbe_inescq_4 == ((unsigned int )0))) { - goto llvm_cbe_cond_next739; - } else { - goto llvm_cbe_cond_true722; - } - -llvm_cbe_cond_next1705: - if (((llvm_cbe_tmp1698 != ((unsigned char )93)) | (llvm_cbe_inescq_3 != ((unsigned int )0)))) { - llvm_cbe_class_lastchar_7__PHI_TEMPORARY = llvm_cbe_class_lastchar_6; /* for PHI node */ - llvm_cbe_class_charcount_7__PHI_TEMPORARY = llvm_cbe_class_charcount_6; /* for PHI node */ - llvm_cbe_inescq_4__PHI_TEMPORARY = llvm_cbe_inescq_3; /* for PHI node */ - llvm_cbe_c_11__PHI_TEMPORARY = llvm_cbe_tmp16981699; /* for PHI node */ - goto llvm_cbe_bb717; - } else { - llvm_cbe_class_lastchar_8__PHI_TEMPORARY = llvm_cbe_class_lastchar_6; /* for PHI node */ - llvm_cbe_class_charcount_8__PHI_TEMPORARY = llvm_cbe_class_charcount_6; /* for PHI node */ - llvm_cbe_inescq_5__PHI_TEMPORARY = llvm_cbe_inescq_3; /* for PHI node */ - llvm_cbe_c_12__PHI_TEMPORARY = llvm_cbe_tmp16981699; /* for PHI node */ - goto llvm_cbe_cond_next1718; - } - -llvm_cbe_bb1694: - llvm_cbe_class_lastchar_6 = llvm_cbe_class_lastchar_6__PHI_TEMPORARY; - llvm_cbe_class_charcount_6 = llvm_cbe_class_charcount_6__PHI_TEMPORARY; - llvm_cbe_inescq_3 = llvm_cbe_inescq_3__PHI_TEMPORARY; - llvm_cbe_tmp1695 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp1696 = &llvm_cbe_tmp1695[((unsigned int )1)]; - *(&llvm_cbe_ptr106) = llvm_cbe_tmp1696; - llvm_cbe_tmp1698 = *llvm_cbe_tmp1696; - llvm_cbe_tmp16981699 = ((unsigned int )(unsigned char )llvm_cbe_tmp1698); - if ((llvm_cbe_tmp1698 == ((unsigned char )0))) { - llvm_cbe_class_lastchar_8__PHI_TEMPORARY = llvm_cbe_class_lastchar_6; /* for PHI node */ - llvm_cbe_class_charcount_8__PHI_TEMPORARY = llvm_cbe_class_charcount_6; /* for PHI node */ - llvm_cbe_inescq_5__PHI_TEMPORARY = llvm_cbe_inescq_3; /* for PHI node */ - llvm_cbe_c_12__PHI_TEMPORARY = llvm_cbe_tmp16981699; /* for PHI node */ - goto llvm_cbe_cond_next1718; - } else { - goto llvm_cbe_cond_next1705; - } - -llvm_cbe_cond_true734: - *(&llvm_cbe_ptr106) = llvm_cbe_tmp729; - llvm_cbe_class_lastchar_6__PHI_TEMPORARY = llvm_cbe_class_lastchar_7; /* for PHI node */ - llvm_cbe_class_charcount_6__PHI_TEMPORARY = llvm_cbe_class_charcount_7; /* for PHI node */ - llvm_cbe_inescq_3__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb1694; - -llvm_cbe_cond_true727: - llvm_cbe_tmp728 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp729 = &llvm_cbe_tmp728[((unsigned int )1)]; - llvm_cbe_tmp730 = *llvm_cbe_tmp729; - if ((llvm_cbe_tmp730 == ((unsigned char )69))) { - goto llvm_cbe_cond_true734; - } else { - llvm_cbe_inescq_9__PHI_TEMPORARY = llvm_cbe_inescq_4; /* for PHI node */ - llvm_cbe_c_18__PHI_TEMPORARY = llvm_cbe_c_11; /* for PHI node */ - goto llvm_cbe_bb1415; - } - -llvm_cbe_cond_true722: - if ((llvm_cbe_c_11 == ((unsigned int )92))) { - goto llvm_cbe_cond_true727; - } else { - llvm_cbe_inescq_9__PHI_TEMPORARY = llvm_cbe_inescq_4; /* for PHI node */ - llvm_cbe_c_18__PHI_TEMPORARY = llvm_cbe_c_11; /* for PHI node */ - goto llvm_cbe_bb1415; - } - -llvm_cbe_cond_next1020: - llvm_cbe_tmp1021 = *(&llvm_cbe_tempptr); - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp1021[((unsigned int )1)]); - llvm_cbe_class_lastchar_6__PHI_TEMPORARY = llvm_cbe_class_lastchar_7; /* for PHI node */ - llvm_cbe_class_charcount_6__PHI_TEMPORARY = ((unsigned int )10); /* for PHI node */ - llvm_cbe_inescq_3__PHI_TEMPORARY = llvm_cbe_inescq_4; /* for PHI node */ - goto llvm_cbe_bb1694; - - do { /* Syntactic loop 'bb983' to make GCC happy */ -llvm_cbe_bb983: - llvm_cbe_c_1512416_13 = llvm_cbe_c_1512416_13__PHI_TEMPORARY; - llvm_cbe_tmp986 = &llvm_cbe_classbits[llvm_cbe_c_1512416_13]; - llvm_cbe_tmp987 = *llvm_cbe_tmp986; - llvm_cbe_tmp990 = *(&llvm_cbe_pbits[llvm_cbe_c_1512416_13]); - *llvm_cbe_tmp986 = (((unsigned char )(llvm_cbe_tmp987 | (((unsigned char )(llvm_cbe_tmp990 ^ ((unsigned char )-1))))))); - llvm_cbe_indvar_next26683 = llvm_cbe_c_1512416_13 + ((unsigned int )1); - if ((llvm_cbe_indvar_next26683 == ((unsigned int )32))) { - goto llvm_cbe_cond_next1020; - } else { - llvm_cbe_c_1512416_13__PHI_TEMPORARY = llvm_cbe_indvar_next26683; /* for PHI node */ - goto llvm_cbe_bb983; - } - - } while (1); /* end of syntactic loop 'bb983' */ -llvm_cbe_cond_true961: - llvm_cbe_tmp963 = *llvm_cbe_tmp962; - *llvm_cbe_tmp962 = (((unsigned char )(llvm_cbe_tmp963 & ((unsigned char )-61)))); - if (llvm_cbe_local_negate_9) { - llvm_cbe_c_1726583__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb1002; - } else { - llvm_cbe_c_1512416_13__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb983; - } - -llvm_cbe_cond_next948: - switch (((((((signed int )llvm_cbe_tmp893) < ((signed int )((unsigned int )0)))) ? ((-(llvm_cbe_tmp893))) : (llvm_cbe_tmp893)))) { - default: - goto llvm_cbe_cond_next977; -; - case ((unsigned int )1): - goto llvm_cbe_cond_true961; - break; - case ((unsigned int )2): - goto llvm_cbe_cond_true971; - } -llvm_cbe_cond_next863: - llvm_cbe_tmp879 = ((((((signed int )llvm_cbe_tmp88_0) < ((signed int )((unsigned int )3))) & (llvm_cbe_tmp865 != ((unsigned int )0)))) ? (((unsigned int )0)) : ((llvm_cbe_tmp88_0 * ((unsigned int )3)))); - llvm_cbe_tmp882 = *(&posix_class_maps[llvm_cbe_tmp879]); - ltmp_6_1 = memcpy(llvm_cbe_pbits885, (&llvm_cbe_tmp777[llvm_cbe_tmp882]), ((unsigned int )32)); - llvm_cbe_tmp889 = *(&posix_class_maps[(llvm_cbe_tmp879 + ((unsigned int )1))]); - llvm_cbe_tmp893 = *(&posix_class_maps[(llvm_cbe_tmp879 + ((unsigned int )2))]); - if ((((signed int )llvm_cbe_tmp889) > ((signed int )((unsigned int )-1)))) { - goto llvm_cbe_cond_true898; - } else { - goto llvm_cbe_cond_next948; - } - -llvm_cbe_bb855: - llvm_cbe_tmp88_0 = llvm_cbe_tmp88_0__PHI_TEMPORARY; - if ((((signed int )llvm_cbe_tmp88_0) < ((signed int )((unsigned int )0)))) { - goto llvm_cbe_cond_true861; - } else { - goto llvm_cbe_cond_next863; - } - - do { /* Syntactic loop 'bb807' to make GCC happy */ -llvm_cbe_bb807: - llvm_cbe_yield_912392_0 = llvm_cbe_yield_912392_0__PHI_TEMPORARY; - llvm_cbe_tmp810 = *(&posix_name_lengths[llvm_cbe_yield_912392_0]); - if (((((unsigned int )(unsigned char )llvm_cbe_tmp810)) == llvm_cbe_tmp802)) { - goto llvm_cbe_cond_false827; - } else { - goto llvm_cbe_cond_next843; - } - -llvm_cbe_cond_next843: - llvm_cbe_tmp845 = llvm_cbe_yield_912392_0 + ((unsigned int )1); - llvm_cbe_tmp849 = *(&posix_name_lengths[llvm_cbe_tmp845]); - if ((llvm_cbe_tmp849 == ((unsigned char )0))) { - llvm_cbe_tmp88_0__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_bb855; - } else { - llvm_cbe_yield_912392_0__PHI_TEMPORARY = llvm_cbe_tmp845; /* for PHI node */ - goto llvm_cbe_bb807; - } - -llvm_cbe_cond_false827: - llvm_cbe_tmp831 = *(&posix_names[llvm_cbe_yield_912392_0]); - llvm_cbe_tmp833 = strncmp(llvm_cbe_tmp800, llvm_cbe_tmp831, llvm_cbe_tmp802); - if ((llvm_cbe_tmp833 == ((unsigned int )0))) { - llvm_cbe_tmp88_0__PHI_TEMPORARY = llvm_cbe_yield_912392_0; /* for PHI node */ - goto llvm_cbe_bb855; - } else { - goto llvm_cbe_cond_next843; - } - - } while (1); /* end of syntactic loop 'bb807' */ -llvm_cbe_cond_next797: - llvm_cbe_local_negate_9 = llvm_cbe_local_negate_9__PHI_TEMPORARY; - llvm_cbe_tmp798 = *(&llvm_cbe_tempptr); - llvm_cbe_tmp800 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp802 = (((unsigned int )(unsigned long)llvm_cbe_tmp798)) - (((unsigned int )(unsigned long)llvm_cbe_tmp800)); - llvm_cbe_yield_912392_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb807; - -llvm_cbe_cond_next786: - llvm_cbe_tmp788 = &llvm_cbe_tmp778[((unsigned int )2)]; - *(&llvm_cbe_ptr106) = llvm_cbe_tmp788; - llvm_cbe_tmp790 = *llvm_cbe_tmp788; - if ((llvm_cbe_tmp790 == ((unsigned char )94))) { - goto llvm_cbe_cond_true794; - } else { - llvm_cbe_local_negate_9__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_cond_next797; - } - -llvm_cbe_cond_true774: - llvm_cbe_tmp777 = *llvm_cbe_tmp776; - llvm_cbe_tmp778 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp780 = *(&llvm_cbe_tmp778[((unsigned int )1)]); - if ((llvm_cbe_tmp780 == ((unsigned char )58))) { - goto llvm_cbe_cond_next786; - } else { - goto llvm_cbe_cond_true784; - } - -llvm_cbe_bb767: - llvm_cbe_tmp770 = check_posix_syntax(llvm_cbe_tmp745, (&llvm_cbe_tempptr), llvm_cbe_cd); - if ((llvm_cbe_tmp770 == ((unsigned int )0))) { - goto llvm_cbe_cond_next1025; - } else { - goto llvm_cbe_cond_true774; - } - -llvm_cbe_cond_true744: - llvm_cbe_tmp745 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp747 = *(&llvm_cbe_tmp745[((unsigned int )1)]); - switch (llvm_cbe_tmp747) { - default: - goto llvm_cbe_cond_next1025; -; - case ((unsigned char )46): - goto llvm_cbe_bb767; - break; - case ((unsigned char )58): - goto llvm_cbe_bb767; - break; - case ((unsigned char )61): - goto llvm_cbe_bb767; - break; - } -llvm_cbe_cond_next739: - switch (llvm_cbe_c_11) { - default: - llvm_cbe_inescq_9__PHI_TEMPORARY = llvm_cbe_inescq_4; /* for PHI node */ - llvm_cbe_c_18__PHI_TEMPORARY = llvm_cbe_c_11; /* for PHI node */ - goto llvm_cbe_bb1415; -; - case ((unsigned int )91): - goto llvm_cbe_cond_true744; - break; - case ((unsigned int )92): - goto llvm_cbe_cond_true1030; - } -llvm_cbe_cond_true794: - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp778[((unsigned int )3)]); - llvm_cbe_local_negate_9__PHI_TEMPORARY = 0; /* for PHI node */ - goto llvm_cbe_cond_next797; - - do { /* Syntactic loop 'bb904' to make GCC happy */ -llvm_cbe_bb904: - llvm_cbe_c_1312408_13 = llvm_cbe_c_1312408_13__PHI_TEMPORARY; - llvm_cbe_tmp907 = &llvm_cbe_pbits[llvm_cbe_c_1312408_13]; - llvm_cbe_tmp908 = *llvm_cbe_tmp907; - llvm_cbe_tmp914 = *(&llvm_cbe_tmp777[(llvm_cbe_c_1312408_13 + llvm_cbe_tmp889)]); - *llvm_cbe_tmp907 = (((unsigned char )(llvm_cbe_tmp914 | llvm_cbe_tmp908))); - llvm_cbe_indvar_next26678 = llvm_cbe_c_1312408_13 + ((unsigned int )1); - if ((llvm_cbe_indvar_next26678 == ((unsigned int )32))) { - goto llvm_cbe_cond_next948; - } else { - llvm_cbe_c_1312408_13__PHI_TEMPORARY = llvm_cbe_indvar_next26678; /* for PHI node */ - goto llvm_cbe_bb904; - } - - } while (1); /* end of syntactic loop 'bb904' */ -llvm_cbe_cond_true898: - if ((((signed int )llvm_cbe_tmp893) > ((signed int )((unsigned int )-1)))) { - llvm_cbe_c_1312408_13__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb904; - } else { - llvm_cbe_c_1426586__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb926; - } - - do { /* Syntactic loop 'bb926' to make GCC happy */ -llvm_cbe_bb926: - llvm_cbe_c_1426586 = llvm_cbe_c_1426586__PHI_TEMPORARY; - llvm_cbe_tmp929 = &llvm_cbe_pbits[llvm_cbe_c_1426586]; - llvm_cbe_tmp930 = *llvm_cbe_tmp929; - llvm_cbe_tmp936 = *(&llvm_cbe_tmp777[(llvm_cbe_c_1426586 + llvm_cbe_tmp889)]); - *llvm_cbe_tmp929 = (((unsigned char )(llvm_cbe_tmp930 & (((unsigned char )(llvm_cbe_tmp936 ^ ((unsigned char )-1))))))); - llvm_cbe_tmp940 = llvm_cbe_c_1426586 + ((unsigned int )1); - if ((((signed int )llvm_cbe_tmp940) < ((signed int )((unsigned int )32)))) { - llvm_cbe_c_1426586__PHI_TEMPORARY = llvm_cbe_tmp940; /* for PHI node */ - goto llvm_cbe_bb926; - } else { - goto llvm_cbe_cond_next948; - } - - } while (1); /* end of syntactic loop 'bb926' */ -llvm_cbe_cond_true971: - llvm_cbe_tmp973 = *llvm_cbe_tmp972; - *llvm_cbe_tmp972 = (((unsigned char )(llvm_cbe_tmp973 & ((unsigned char )127)))); - if (llvm_cbe_local_negate_9) { - llvm_cbe_c_1726583__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb1002; - } else { - llvm_cbe_c_1512416_13__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb983; - } - -llvm_cbe_cond_next977: - if (llvm_cbe_local_negate_9) { - llvm_cbe_c_1726583__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb1002; - } else { - llvm_cbe_c_1512416_13__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb983; - } - - do { /* Syntactic loop 'bb1002' to make GCC happy */ -llvm_cbe_bb1002: - llvm_cbe_c_1726583 = llvm_cbe_c_1726583__PHI_TEMPORARY; - llvm_cbe_tmp1005 = &llvm_cbe_classbits[llvm_cbe_c_1726583]; - llvm_cbe_tmp1006 = *llvm_cbe_tmp1005; - llvm_cbe_tmp1009 = *(&llvm_cbe_pbits[llvm_cbe_c_1726583]); - *llvm_cbe_tmp1005 = (((unsigned char )(llvm_cbe_tmp1009 | llvm_cbe_tmp1006))); - llvm_cbe_tmp1013 = llvm_cbe_c_1726583 + ((unsigned int )1); - if ((((signed int )llvm_cbe_tmp1013) < ((signed int )((unsigned int )32)))) { - llvm_cbe_c_1726583__PHI_TEMPORARY = llvm_cbe_tmp1013; /* for PHI node */ - goto llvm_cbe_bb1002; - } else { - goto llvm_cbe_cond_next1020; - } - - } while (1); /* end of syntactic loop 'bb1002' */ -llvm_cbe_cond_true1066: - llvm_cbe_tmp1067 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp1069 = *(&llvm_cbe_tmp1067[((unsigned int )1)]); - if ((llvm_cbe_tmp1069 == ((unsigned char )92))) { - goto llvm_cbe_cond_next1074; - } else { - llvm_cbe_class_lastchar_6__PHI_TEMPORARY = llvm_cbe_class_lastchar_7; /* for PHI node */ - llvm_cbe_class_charcount_6__PHI_TEMPORARY = llvm_cbe_class_charcount_7; /* for PHI node */ - llvm_cbe_inescq_3__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_bb1694; - } - -llvm_cbe_cond_next1043: - switch (llvm_cbe_tmp1036) { - default: - goto llvm_cbe_cond_false1061_cond_next1090_crit_edge; -; - case ((unsigned int )-5): - llvm_cbe_c_19__PHI_TEMPORARY = ((unsigned int )8); /* for PHI node */ - goto llvm_cbe_cond_next1090; - case ((unsigned int )-21): - llvm_cbe_inescq_9__PHI_TEMPORARY = llvm_cbe_inescq_4; /* for PHI node */ - llvm_cbe_c_18__PHI_TEMPORARY = ((unsigned int )88); /* for PHI node */ - goto llvm_cbe_bb1415; - case ((unsigned int )-16): - goto llvm_cbe_cond_true1060; - break; - case ((unsigned int )-25): - goto llvm_cbe_cond_true1066; - } -llvm_cbe_cond_true1030: - llvm_cbe_tmp1033 = *llvm_cbe_tmp24; - llvm_cbe_tmp1036 = check_escape((&llvm_cbe_ptr106), llvm_cbe_errorcodeptr, llvm_cbe_tmp1033, llvm_cbe_options104_39466_9, ((unsigned int )1)); - llvm_cbe_tmp1038 = *llvm_cbe_errorcodeptr; - if ((llvm_cbe_tmp1038 == ((unsigned int )0))) { - goto llvm_cbe_cond_next1043; - } else { - llvm_cbe_slot_913437_0_us61_12__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_12__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - goto llvm_cbe_FAILED; - } - -llvm_cbe_cond_next1025: - if ((llvm_cbe_c_11 == ((unsigned int )92))) { - goto llvm_cbe_cond_true1030; - } else { - llvm_cbe_inescq_9__PHI_TEMPORARY = llvm_cbe_inescq_4; /* for PHI node */ - llvm_cbe_c_18__PHI_TEMPORARY = llvm_cbe_c_11; /* for PHI node */ - goto llvm_cbe_bb1415; - } - -llvm_cbe_cond_next1074: - llvm_cbe_tmp1076 = &llvm_cbe_tmp1067[((unsigned int )2)]; - llvm_cbe_tmp1077 = *llvm_cbe_tmp1076; - if ((llvm_cbe_tmp1077 == ((unsigned char )69))) { - goto llvm_cbe_cond_next1082; - } else { - llvm_cbe_class_lastchar_6__PHI_TEMPORARY = llvm_cbe_class_lastchar_7; /* for PHI node */ - llvm_cbe_class_charcount_6__PHI_TEMPORARY = llvm_cbe_class_charcount_7; /* for PHI node */ - llvm_cbe_inescq_3__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_bb1694; - } - -llvm_cbe_cond_next1082: - *(&llvm_cbe_ptr106) = llvm_cbe_tmp1076; - llvm_cbe_class_lastchar_6__PHI_TEMPORARY = llvm_cbe_class_lastchar_7; /* for PHI node */ - llvm_cbe_class_charcount_6__PHI_TEMPORARY = llvm_cbe_class_charcount_7; /* for PHI node */ - llvm_cbe_inescq_3__PHI_TEMPORARY = llvm_cbe_inescq_4; /* for PHI node */ - goto llvm_cbe_bb1694; - -llvm_cbe_cond_true1106: - switch ((-(llvm_cbe_c_19))) { - default: - goto llvm_cbe_cond_next1278; -; - case ((unsigned int )6): - llvm_cbe_c_2112444_12__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb1131; - case ((unsigned int )7): - llvm_cbe_c_2012437_12__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb1110; - break; - case ((unsigned int )8): - llvm_cbe_c_2526577__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb1218; - case ((unsigned int )9): - llvm_cbe_c_2426580__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb1194; - case ((unsigned int )10): - llvm_cbe_c_2312458_12__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb1173; - case ((unsigned int )11): - llvm_cbe_c_2212451_12__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb1152; - case ((unsigned int )24): - llvm_cbe_class_lastchar_6__PHI_TEMPORARY = llvm_cbe_class_lastchar_7; /* for PHI node */ - llvm_cbe_class_charcount_6__PHI_TEMPORARY = llvm_cbe_tmp1101; /* for PHI node */ - llvm_cbe_inescq_3__PHI_TEMPORARY = llvm_cbe_inescq_4; /* for PHI node */ - goto llvm_cbe_bb1694; - } -llvm_cbe_cond_true1095: - llvm_cbe_tmp1099 = *llvm_cbe_tmp776; - llvm_cbe_tmp1101 = llvm_cbe_class_charcount_7 + ((unsigned int )2); - if ((llvm_cbe_iftmp_509_0 == ((unsigned int *)/*NULL*/0))) { - goto llvm_cbe_cond_true1106; - } else { - goto llvm_cbe_cond_false1244; - } - -llvm_cbe_cond_next1090: - llvm_cbe_c_19 = llvm_cbe_c_19__PHI_TEMPORARY; - if ((((signed int )llvm_cbe_c_19) < ((signed int )((unsigned int )0)))) { - goto llvm_cbe_cond_true1095; - } else { - llvm_cbe_inescq_9__PHI_TEMPORARY = llvm_cbe_inescq_4; /* for PHI node */ - llvm_cbe_c_18__PHI_TEMPORARY = llvm_cbe_c_19; /* for PHI node */ - goto llvm_cbe_bb1415; - } - -llvm_cbe_cond_false1061_cond_next1090_crit_edge: - llvm_cbe_c_19__PHI_TEMPORARY = llvm_cbe_tmp1036; /* for PHI node */ - goto llvm_cbe_cond_next1090; - - do { /* Syntactic loop 'bb1110' to make GCC happy */ -llvm_cbe_bb1110: - llvm_cbe_c_2012437_12 = llvm_cbe_c_2012437_12__PHI_TEMPORARY; - llvm_cbe_tmp1113 = &llvm_cbe_classbits[llvm_cbe_c_2012437_12]; - llvm_cbe_tmp1114 = *llvm_cbe_tmp1113; - llvm_cbe_tmp1119 = *(&llvm_cbe_tmp1099[(llvm_cbe_c_2012437_12 + ((unsigned int )64))]); - *llvm_cbe_tmp1113 = (((unsigned char )(llvm_cbe_tmp1119 | llvm_cbe_tmp1114))); - llvm_cbe_indvar_next26667 = llvm_cbe_c_2012437_12 + ((unsigned int )1); - if ((llvm_cbe_indvar_next26667 == ((unsigned int )32))) { - llvm_cbe_class_lastchar_6__PHI_TEMPORARY = llvm_cbe_class_lastchar_7; /* for PHI node */ - llvm_cbe_class_charcount_6__PHI_TEMPORARY = llvm_cbe_tmp1101; /* for PHI node */ - llvm_cbe_inescq_3__PHI_TEMPORARY = llvm_cbe_inescq_4; /* for PHI node */ - goto llvm_cbe_bb1694; - } else { - llvm_cbe_c_2012437_12__PHI_TEMPORARY = llvm_cbe_indvar_next26667; /* for PHI node */ - goto llvm_cbe_bb1110; - } - - } while (1); /* end of syntactic loop 'bb1110' */ - do { /* Syntactic loop 'bb1131' to make GCC happy */ -llvm_cbe_bb1131: - llvm_cbe_c_2112444_12 = llvm_cbe_c_2112444_12__PHI_TEMPORARY; - llvm_cbe_tmp1134 = &llvm_cbe_classbits[llvm_cbe_c_2112444_12]; - llvm_cbe_tmp1135 = *llvm_cbe_tmp1134; - llvm_cbe_tmp1140 = *(&llvm_cbe_tmp1099[(llvm_cbe_c_2112444_12 + ((unsigned int )64))]); - *llvm_cbe_tmp1134 = (((unsigned char )(llvm_cbe_tmp1135 | (((unsigned char )(llvm_cbe_tmp1140 ^ ((unsigned char )-1))))))); - llvm_cbe_indvar_next26664 = llvm_cbe_c_2112444_12 + ((unsigned int )1); - if ((llvm_cbe_indvar_next26664 == ((unsigned int )32))) { - llvm_cbe_class_lastchar_6__PHI_TEMPORARY = llvm_cbe_class_lastchar_7; /* for PHI node */ - llvm_cbe_class_charcount_6__PHI_TEMPORARY = llvm_cbe_tmp1101; /* for PHI node */ - llvm_cbe_inescq_3__PHI_TEMPORARY = llvm_cbe_inescq_4; /* for PHI node */ - goto llvm_cbe_bb1694; - } else { - llvm_cbe_c_2112444_12__PHI_TEMPORARY = llvm_cbe_indvar_next26664; /* for PHI node */ - goto llvm_cbe_bb1131; - } - - } while (1); /* end of syntactic loop 'bb1131' */ - do { /* Syntactic loop 'bb1152' to make GCC happy */ -llvm_cbe_bb1152: - llvm_cbe_c_2212451_12 = llvm_cbe_c_2212451_12__PHI_TEMPORARY; - llvm_cbe_tmp1155 = &llvm_cbe_classbits[llvm_cbe_c_2212451_12]; - llvm_cbe_tmp1156 = *llvm_cbe_tmp1155; - llvm_cbe_tmp1161 = *(&llvm_cbe_tmp1099[(llvm_cbe_c_2212451_12 + ((unsigned int )160))]); - *llvm_cbe_tmp1155 = (((unsigned char )(llvm_cbe_tmp1161 | llvm_cbe_tmp1156))); - llvm_cbe_indvar_next26661 = llvm_cbe_c_2212451_12 + ((unsigned int )1); - if ((llvm_cbe_indvar_next26661 == ((unsigned int )32))) { - llvm_cbe_class_lastchar_6__PHI_TEMPORARY = llvm_cbe_class_lastchar_7; /* for PHI node */ - llvm_cbe_class_charcount_6__PHI_TEMPORARY = llvm_cbe_tmp1101; /* for PHI node */ - llvm_cbe_inescq_3__PHI_TEMPORARY = llvm_cbe_inescq_4; /* for PHI node */ - goto llvm_cbe_bb1694; - } else { - llvm_cbe_c_2212451_12__PHI_TEMPORARY = llvm_cbe_indvar_next26661; /* for PHI node */ - goto llvm_cbe_bb1152; - } - - } while (1); /* end of syntactic loop 'bb1152' */ - do { /* Syntactic loop 'bb1173' to make GCC happy */ -llvm_cbe_bb1173: - llvm_cbe_c_2312458_12 = llvm_cbe_c_2312458_12__PHI_TEMPORARY; - llvm_cbe_tmp1176 = &llvm_cbe_classbits[llvm_cbe_c_2312458_12]; - llvm_cbe_tmp1177 = *llvm_cbe_tmp1176; - llvm_cbe_tmp1182 = *(&llvm_cbe_tmp1099[(llvm_cbe_c_2312458_12 + ((unsigned int )160))]); - *llvm_cbe_tmp1176 = (((unsigned char )(llvm_cbe_tmp1177 | (((unsigned char )(llvm_cbe_tmp1182 ^ ((unsigned char )-1))))))); - llvm_cbe_indvar_next26658 = llvm_cbe_c_2312458_12 + ((unsigned int )1); - if ((llvm_cbe_indvar_next26658 == ((unsigned int )32))) { - llvm_cbe_class_lastchar_6__PHI_TEMPORARY = llvm_cbe_class_lastchar_7; /* for PHI node */ - llvm_cbe_class_charcount_6__PHI_TEMPORARY = llvm_cbe_tmp1101; /* for PHI node */ - llvm_cbe_inescq_3__PHI_TEMPORARY = llvm_cbe_inescq_4; /* for PHI node */ - goto llvm_cbe_bb1694; - } else { - llvm_cbe_c_2312458_12__PHI_TEMPORARY = llvm_cbe_indvar_next26658; /* for PHI node */ - goto llvm_cbe_bb1173; - } - - } while (1); /* end of syntactic loop 'bb1173' */ -llvm_cbe_bb1212: - llvm_cbe_tmp1214 = *llvm_cbe_tmp1237; - *llvm_cbe_tmp1237 = (((unsigned char )(llvm_cbe_tmp1214 & ((unsigned char )-9)))); - llvm_cbe_class_lastchar_6__PHI_TEMPORARY = llvm_cbe_class_lastchar_7; /* for PHI node */ - llvm_cbe_class_charcount_6__PHI_TEMPORARY = llvm_cbe_tmp1101; /* for PHI node */ - llvm_cbe_inescq_3__PHI_TEMPORARY = llvm_cbe_inescq_4; /* for PHI node */ - goto llvm_cbe_bb1694; - - do { /* Syntactic loop 'bb1194' to make GCC happy */ -llvm_cbe_bb1194: - llvm_cbe_c_2426580 = llvm_cbe_c_2426580__PHI_TEMPORARY; - llvm_cbe_tmp1197 = &llvm_cbe_classbits[llvm_cbe_c_2426580]; - llvm_cbe_tmp1198 = *llvm_cbe_tmp1197; - llvm_cbe_tmp1202 = *(&llvm_cbe_tmp1099[llvm_cbe_c_2426580]); - *llvm_cbe_tmp1197 = (((unsigned char )(llvm_cbe_tmp1202 | llvm_cbe_tmp1198))); - llvm_cbe_tmp1206 = llvm_cbe_c_2426580 + ((unsigned int )1); - if ((((signed int )llvm_cbe_tmp1206) < ((signed int )((unsigned int )32)))) { - llvm_cbe_c_2426580__PHI_TEMPORARY = llvm_cbe_tmp1206; /* for PHI node */ - goto llvm_cbe_bb1194; - } else { - goto llvm_cbe_bb1212; - } - - } while (1); /* end of syntactic loop 'bb1194' */ -llvm_cbe_bb1236: - llvm_cbe_tmp1238 = *llvm_cbe_tmp1237; - *llvm_cbe_tmp1237 = (((unsigned char )(llvm_cbe_tmp1238 | ((unsigned char )8)))); - llvm_cbe_class_lastchar_6__PHI_TEMPORARY = llvm_cbe_class_lastchar_7; /* for PHI node */ - llvm_cbe_class_charcount_6__PHI_TEMPORARY = llvm_cbe_tmp1101; /* for PHI node */ - llvm_cbe_inescq_3__PHI_TEMPORARY = llvm_cbe_inescq_4; /* for PHI node */ - goto llvm_cbe_bb1694; - - do { /* Syntactic loop 'bb1218' to make GCC happy */ -llvm_cbe_bb1218: - llvm_cbe_c_2526577 = llvm_cbe_c_2526577__PHI_TEMPORARY; - llvm_cbe_tmp1221 = &llvm_cbe_classbits[llvm_cbe_c_2526577]; - llvm_cbe_tmp1222 = *llvm_cbe_tmp1221; - llvm_cbe_tmp1226 = *(&llvm_cbe_tmp1099[llvm_cbe_c_2526577]); - *llvm_cbe_tmp1221 = (((unsigned char )(llvm_cbe_tmp1222 | (((unsigned char )(llvm_cbe_tmp1226 ^ ((unsigned char )-1))))))); - llvm_cbe_tmp1230 = llvm_cbe_c_2526577 + ((unsigned int )1); - if ((((signed int )llvm_cbe_tmp1230) < ((signed int )((unsigned int )32)))) { - llvm_cbe_c_2526577__PHI_TEMPORARY = llvm_cbe_tmp1230; /* for PHI node */ - goto llvm_cbe_bb1218; - } else { - goto llvm_cbe_bb1236; - } - - } while (1); /* end of syntactic loop 'bb1218' */ -llvm_cbe_cond_false1244: - if (((((unsigned int )(llvm_cbe_c_19 + ((unsigned int )7))) < ((unsigned int )((unsigned int )2))) | (llvm_cbe_c_19 == ((unsigned int )-11)))) { - llvm_cbe_class_lastchar_6__PHI_TEMPORARY = llvm_cbe_class_lastchar_7; /* for PHI node */ - llvm_cbe_class_charcount_6__PHI_TEMPORARY = llvm_cbe_tmp1101; /* for PHI node */ - llvm_cbe_inescq_3__PHI_TEMPORARY = llvm_cbe_inescq_4; /* for PHI node */ - goto llvm_cbe_bb1694; - } else { - goto llvm_cbe_cond_next1258; - } - -llvm_cbe_cond_next1258: - if (((((unsigned int )(llvm_cbe_c_19 + ((unsigned int )10))) < ((unsigned int )((unsigned int )2))) | (llvm_cbe_c_19 == ((unsigned int )-8)))) { - llvm_cbe_class_lastchar_6__PHI_TEMPORARY = llvm_cbe_class_lastchar_7; /* for PHI node */ - llvm_cbe_class_charcount_6__PHI_TEMPORARY = llvm_cbe_tmp1101; /* for PHI node */ - llvm_cbe_inescq_3__PHI_TEMPORARY = llvm_cbe_inescq_4; /* for PHI node */ - goto llvm_cbe_bb1694; - } else { - goto llvm_cbe_cond_next1278; - } - -llvm_cbe_cond_true1283: - llvm_cbe_tmp1285 = *llvm_cbe_tmp1237; - *llvm_cbe_tmp1237 = (((unsigned char )(llvm_cbe_tmp1285 | ((unsigned char )2)))); - llvm_cbe_tmp1289 = *llvm_cbe_tmp1288; - *llvm_cbe_tmp1288 = (((unsigned char )(llvm_cbe_tmp1289 | ((unsigned char )1)))); - llvm_cbe_tmp1293 = *llvm_cbe_tmp1292; - *llvm_cbe_tmp1292 = (((unsigned char )(llvm_cbe_tmp1293 | ((unsigned char )1)))); - llvm_cbe_class_lastchar_6__PHI_TEMPORARY = llvm_cbe_class_lastchar_7; /* for PHI node */ - llvm_cbe_class_charcount_6__PHI_TEMPORARY = llvm_cbe_tmp1101; /* for PHI node */ - llvm_cbe_inescq_3__PHI_TEMPORARY = llvm_cbe_inescq_4; /* for PHI node */ - goto llvm_cbe_bb1694; - -llvm_cbe_cond_next1278: - switch (llvm_cbe_c_19) { - default: - goto llvm_cbe_cond_next1396; -; - case ((unsigned int )-18): - goto llvm_cbe_cond_true1283; - break; - case ((unsigned int )-17): - llvm_cbe_c_2612465_12__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb1302; - case ((unsigned int )-20): - goto llvm_cbe_cond_true1336; - case ((unsigned int )-19): - llvm_cbe_c_2712472_12__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb1363; - } - do { /* Syntactic loop 'bb1302' to make GCC happy */ -llvm_cbe_bb1302: - llvm_cbe_c_2612465_12 = llvm_cbe_c_2612465_12__PHI_TEMPORARY; - switch (llvm_cbe_c_2612465_12) { - default: - llvm_cbe_x_10__PHI_TEMPORARY = ((unsigned char )-1); /* for PHI node */ - goto llvm_cbe_bb1314; -; - case ((unsigned int )1): - goto llvm_cbe_bb1304; - break; - case ((unsigned int )4): - goto llvm_cbe_bb1307; - case ((unsigned int )20): - goto llvm_cbe_bb1310; - } -llvm_cbe_bb1314: - llvm_cbe_x_10 = llvm_cbe_x_10__PHI_TEMPORARY; - llvm_cbe_tmp1317 = &llvm_cbe_classbits[llvm_cbe_c_2612465_12]; - llvm_cbe_tmp1318 = *llvm_cbe_tmp1317; - *llvm_cbe_tmp1317 = (((unsigned char )(llvm_cbe_tmp1318 | llvm_cbe_x_10))); - llvm_cbe_indvar_next26655 = llvm_cbe_c_2612465_12 + ((unsigned int )1); - if ((llvm_cbe_indvar_next26655 == ((unsigned int )32))) { - llvm_cbe_class_lastchar_6__PHI_TEMPORARY = llvm_cbe_class_lastchar_7; /* for PHI node */ - llvm_cbe_class_charcount_6__PHI_TEMPORARY = llvm_cbe_tmp1101; /* for PHI node */ - llvm_cbe_inescq_3__PHI_TEMPORARY = llvm_cbe_inescq_4; /* for PHI node */ - goto llvm_cbe_bb1694; - } else { - llvm_cbe_c_2612465_12__PHI_TEMPORARY = llvm_cbe_indvar_next26655; /* for PHI node */ - goto llvm_cbe_bb1302; - } - -llvm_cbe_bb1304: - llvm_cbe_x_10__PHI_TEMPORARY = ((unsigned char )-3); /* for PHI node */ - goto llvm_cbe_bb1314; - -llvm_cbe_bb1307: - llvm_cbe_x_10__PHI_TEMPORARY = ((unsigned char )-2); /* for PHI node */ - goto llvm_cbe_bb1314; - -llvm_cbe_bb1310: - llvm_cbe_x_10__PHI_TEMPORARY = ((unsigned char )-2); /* for PHI node */ - goto llvm_cbe_bb1314; - - } while (1); /* end of syntactic loop 'bb1302' */ -llvm_cbe_cond_true1336: - llvm_cbe_tmp1338 = *llvm_cbe_tmp1237; - *llvm_cbe_tmp1237 = (((unsigned char )(llvm_cbe_tmp1338 | ((unsigned char )60)))); - llvm_cbe_tmp1354 = *llvm_cbe_tmp1353; - *llvm_cbe_tmp1353 = (((unsigned char )(llvm_cbe_tmp1354 | ((unsigned char )32)))); - llvm_cbe_class_lastchar_6__PHI_TEMPORARY = llvm_cbe_class_lastchar_7; /* for PHI node */ - llvm_cbe_class_charcount_6__PHI_TEMPORARY = llvm_cbe_tmp1101; /* for PHI node */ - llvm_cbe_inescq_3__PHI_TEMPORARY = llvm_cbe_inescq_4; /* for PHI node */ - goto llvm_cbe_bb1694; - - do { /* Syntactic loop 'bb1363' to make GCC happy */ -llvm_cbe_bb1363: - llvm_cbe_c_2712472_12 = llvm_cbe_c_2712472_12__PHI_TEMPORARY; - switch (llvm_cbe_c_2712472_12) { - default: - llvm_cbe_x1364_10__PHI_TEMPORARY = ((unsigned char )-1); /* for PHI node */ - goto llvm_cbe_bb1379; -; - case ((unsigned int )1): - goto llvm_cbe_bb1366; - break; - case ((unsigned int )16): - goto llvm_cbe_bb1375; - } -llvm_cbe_bb1379: - llvm_cbe_x1364_10 = llvm_cbe_x1364_10__PHI_TEMPORARY; - llvm_cbe_tmp1382 = &llvm_cbe_classbits[llvm_cbe_c_2712472_12]; - llvm_cbe_tmp1383 = *llvm_cbe_tmp1382; - *llvm_cbe_tmp1382 = (((unsigned char )(llvm_cbe_tmp1383 | llvm_cbe_x1364_10))); - llvm_cbe_indvar_next26652 = llvm_cbe_c_2712472_12 + ((unsigned int )1); - if ((llvm_cbe_indvar_next26652 == ((unsigned int )32))) { - llvm_cbe_class_lastchar_6__PHI_TEMPORARY = llvm_cbe_class_lastchar_7; /* for PHI node */ - llvm_cbe_class_charcount_6__PHI_TEMPORARY = llvm_cbe_tmp1101; /* for PHI node */ - llvm_cbe_inescq_3__PHI_TEMPORARY = llvm_cbe_inescq_4; /* for PHI node */ - goto llvm_cbe_bb1694; - } else { - llvm_cbe_c_2712472_12__PHI_TEMPORARY = llvm_cbe_indvar_next26652; /* for PHI node */ - goto llvm_cbe_bb1363; - } - -llvm_cbe_bb1366: - llvm_cbe_x1364_10__PHI_TEMPORARY = ((unsigned char )-61); /* for PHI node */ - goto llvm_cbe_bb1379; - -llvm_cbe_bb1375: - llvm_cbe_x1364_10__PHI_TEMPORARY = ((unsigned char )-33); /* for PHI node */ - goto llvm_cbe_bb1379; - - } while (1); /* end of syntactic loop 'bb1363' */ -llvm_cbe_cond_next1591: - llvm_cbe_tmp1597 = ((llvm_cbe_class_charcount_7 + ((unsigned int )1)) - llvm_cbe_c_1812491_1) + llvm_cbe_d_1012504_1; - if (((((signed int )llvm_cbe_c_1812491_1) > ((signed int )llvm_cbe_d_1012504_1)) | llvm_cbe_tmp138_not)) { - llvm_cbe_class_lastchar_6__PHI_TEMPORARY = llvm_cbe_d_1012504_1; /* for PHI node */ - llvm_cbe_class_charcount_6__PHI_TEMPORARY = llvm_cbe_tmp1597; /* for PHI node */ - llvm_cbe_inescq_3__PHI_TEMPORARY = llvm_cbe_inescq_10; /* for PHI node */ - goto llvm_cbe_bb1694; - } else { - goto llvm_cbe_bb1604_preheader; - } - -llvm_cbe_cond_next1584: - llvm_cbe_d_1012504_1 = llvm_cbe_d_1012504_1__PHI_TEMPORARY; - if ((llvm_cbe_d_1012504_1 == llvm_cbe_c_1812491_1)) { - llvm_cbe_inescq_11__PHI_TEMPORARY = llvm_cbe_inescq_10; /* for PHI node */ - goto llvm_cbe_LONE_SINGLE_CHARACTER; - } else { - goto llvm_cbe_cond_next1591; - } - -llvm_cbe_cond_true1563: - if ((((signed int )llvm_cbe_c_1812491_1) > ((signed int )((unsigned int )88)))) { - goto llvm_cbe_cond_true1582; - } else { - llvm_cbe_d_1012504_1__PHI_TEMPORARY = ((unsigned int )88); /* for PHI node */ - goto llvm_cbe_cond_next1584; - } - -llvm_cbe_cond_true1552: - switch (llvm_cbe_tmp1540) { - default: - goto llvm_cbe_cond_false1570; -; - case ((unsigned int )-5): - llvm_cbe_d_10__PHI_TEMPORARY = ((unsigned int )8); /* for PHI node */ - goto llvm_cbe_cond_next1576; - case ((unsigned int )-21): - goto llvm_cbe_cond_true1563; - break; - case ((unsigned int )-16): - goto llvm_cbe_cond_true1569; - } -llvm_cbe_cond_next1547: - if ((((signed int )llvm_cbe_tmp1540) < ((signed int )((unsigned int )0)))) { - goto llvm_cbe_cond_true1552; - } else { - llvm_cbe_d_10__PHI_TEMPORARY = llvm_cbe_tmp1540; /* for PHI node */ - goto llvm_cbe_cond_next1576; - } - -llvm_cbe_cond_true1534: - llvm_cbe_tmp1537 = *llvm_cbe_tmp24; - llvm_cbe_tmp1540 = check_escape((&llvm_cbe_ptr106), llvm_cbe_errorcodeptr, llvm_cbe_tmp1537, llvm_cbe_options104_39466_9, ((unsigned int )1)); - llvm_cbe_tmp1542 = *llvm_cbe_errorcodeptr; - if ((llvm_cbe_tmp1542 == ((unsigned int )0))) { - goto llvm_cbe_cond_next1547; - } else { - llvm_cbe_slot_913437_0_us61_12__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_12__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - goto llvm_cbe_FAILED; - } - -llvm_cbe_bb1519: - llvm_cbe_tmp15211522 = ((unsigned int )(unsigned char )llvm_cbe_tmp1500); - if (((llvm_cbe_tmp1500 == ((unsigned char )92)) & (llvm_cbe_inescq_10 == ((unsigned int )0)))) { - goto llvm_cbe_cond_true1534; - } else { - llvm_cbe_d_10__PHI_TEMPORARY = llvm_cbe_tmp15211522; /* for PHI node */ - goto llvm_cbe_cond_next1576; - } - -llvm_cbe_cond_next1505: - if (((llvm_cbe_inescq_10 == ((unsigned int )0)) & (llvm_cbe_tmp1500 == ((unsigned char )93)))) { - goto llvm_cbe_bb1517; - } else { - goto llvm_cbe_bb1519; - } - -llvm_cbe_bb1498: - llvm_cbe_inescq_10 = llvm_cbe_inescq_10__PHI_TEMPORARY; - llvm_cbe_tmp1499 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp1500 = *llvm_cbe_tmp1499; - if ((llvm_cbe_tmp1500 == ((unsigned char )0))) { - goto llvm_cbe_bb1517; - } else { - goto llvm_cbe_cond_next1505; - } - - do { /* Syntactic loop 'bb1484' to make GCC happy */ -llvm_cbe_bb1484: - llvm_cbe_tmp1485 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp1486 = *llvm_cbe_tmp1485; - if ((llvm_cbe_tmp1486 == ((unsigned char )92))) { - goto llvm_cbe_cond_next1491; - } else { - llvm_cbe_inescq_10__PHI_TEMPORARY = llvm_cbe_inescq_912486_1; /* for PHI node */ - goto llvm_cbe_bb1498; - } - -llvm_cbe_cond_true1479: - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp1485[((unsigned int )4)]); - goto llvm_cbe_bb1484; - -llvm_cbe_cond_true1472: - llvm_cbe_tmp1475 = *(&llvm_cbe_tmp1485[((unsigned int )3)]); - if ((llvm_cbe_tmp1475 == ((unsigned char )69))) { - goto llvm_cbe_cond_true1479; - } else { - llvm_cbe_inescq_10__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_bb1498; - } - -llvm_cbe_bb1464: - llvm_cbe_tmp1466 = &llvm_cbe_tmp1485[((unsigned int )2)]; - *(&llvm_cbe_ptr106) = llvm_cbe_tmp1466; - llvm_cbe_tmp1468 = *llvm_cbe_tmp1466; - if ((llvm_cbe_tmp1468 == ((unsigned char )92))) { - goto llvm_cbe_cond_true1472; - } else { - llvm_cbe_inescq_10__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_bb1498; - } - -llvm_cbe_cond_next1491: - llvm_cbe_tmp1494 = *(&llvm_cbe_tmp1485[((unsigned int )1)]); - if ((llvm_cbe_tmp1494 == ((unsigned char )81))) { - goto llvm_cbe_bb1464; - } else { - llvm_cbe_inescq_10__PHI_TEMPORARY = llvm_cbe_inescq_912486_1; /* for PHI node */ - goto llvm_cbe_bb1498; - } - - } while (1); /* end of syntactic loop 'bb1484' */ - do { /* Syntactic loop 'bb1449' to make GCC happy */ -llvm_cbe_bb1449: - llvm_cbe_tmp1447_pn = *(&llvm_cbe_ptr106); - llvm_cbe_storemerge5533 = &llvm_cbe_tmp1447_pn[((unsigned int )2)]; - *(&llvm_cbe_ptr106) = llvm_cbe_storemerge5533; - llvm_cbe_tmp1451 = *llvm_cbe_storemerge5533; - if ((llvm_cbe_tmp1451 == ((unsigned char )92))) { - goto llvm_cbe_cond_next1456; - } else { - goto llvm_cbe_bb1484; - } - -llvm_cbe_cond_next1456: - llvm_cbe_tmp1459 = *(&llvm_cbe_tmp1447_pn[((unsigned int )3)]); - if ((llvm_cbe_tmp1459 == ((unsigned char )69))) { - goto llvm_cbe_bb1449; - } else { - goto llvm_cbe_bb1484; - } - - } while (1); /* end of syntactic loop 'bb1449' */ -llvm_cbe_cond_true1436: - llvm_cbe_tmp1439 = *(&llvm_cbe_tmp1431[((unsigned int )1)]); - if ((llvm_cbe_tmp1439 == ((unsigned char )45))) { - goto llvm_cbe_bb1449; - } else { - llvm_cbe_inescq_11__PHI_TEMPORARY = llvm_cbe_inescq_912486_1; /* for PHI node */ - goto llvm_cbe_LONE_SINGLE_CHARACTER; - } - -llvm_cbe_bb1430: - llvm_cbe_inescq_912486_1 = llvm_cbe_inescq_912486_1__PHI_TEMPORARY; - llvm_cbe_c_1812491_1 = llvm_cbe_c_1812491_1__PHI_TEMPORARY; - llvm_cbe_tmp1431 = *(&llvm_cbe_ptr106); - if ((llvm_cbe_inescq_912486_1 == ((unsigned int )0))) { - goto llvm_cbe_cond_true1436; - } else { - llvm_cbe_inescq_11__PHI_TEMPORARY = llvm_cbe_inescq_912486_1; /* for PHI node */ - goto llvm_cbe_LONE_SINGLE_CHARACTER; - } - -llvm_cbe_cond_next1404: - llvm_cbe_tmp1407 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp1408 = *llvm_cbe_tmp1407; - llvm_cbe_tmp14081409 = ((unsigned int )(unsigned char )llvm_cbe_tmp1408); - llvm_cbe_tmp141812502 = *(&llvm_cbe_tmp1407[((unsigned int )1)]); - if ((llvm_cbe_tmp141812502 == ((unsigned char )92))) { - llvm_cbe_inescq_912486_0__PHI_TEMPORARY = llvm_cbe_inescq_4; /* for PHI node */ - llvm_cbe_c_1812491_0__PHI_TEMPORARY = llvm_cbe_tmp14081409; /* for PHI node */ - goto llvm_cbe_cond_next1423; - } else { - llvm_cbe_inescq_912486_1__PHI_TEMPORARY = llvm_cbe_inescq_4; /* for PHI node */ - llvm_cbe_c_1812491_1__PHI_TEMPORARY = llvm_cbe_tmp14081409; /* for PHI node */ - goto llvm_cbe_bb1430; - } - -llvm_cbe_cond_next1396: - if (((llvm_cbe_options104_39466_9 & ((unsigned int )64)) == ((unsigned int )0))) { - goto llvm_cbe_cond_next1404; - } else { - goto llvm_cbe_cond_true1402; - } - -llvm_cbe_bb1415: - llvm_cbe_inescq_9 = llvm_cbe_inescq_9__PHI_TEMPORARY; - llvm_cbe_c_18 = llvm_cbe_c_18__PHI_TEMPORARY; - llvm_cbe_tmp1416 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp1418 = *(&llvm_cbe_tmp1416[((unsigned int )1)]); - if ((llvm_cbe_tmp1418 == ((unsigned char )92))) { - llvm_cbe_inescq_912486_0__PHI_TEMPORARY = llvm_cbe_inescq_9; /* for PHI node */ - llvm_cbe_c_1812491_0__PHI_TEMPORARY = llvm_cbe_c_18; /* for PHI node */ - goto llvm_cbe_cond_next1423; - } else { - llvm_cbe_inescq_912486_1__PHI_TEMPORARY = llvm_cbe_inescq_9; /* for PHI node */ - llvm_cbe_c_1812491_1__PHI_TEMPORARY = llvm_cbe_c_18; /* for PHI node */ - goto llvm_cbe_bb1430; - } - -llvm_cbe_cond_true1060: - llvm_cbe_inescq_9__PHI_TEMPORARY = llvm_cbe_inescq_4; /* for PHI node */ - llvm_cbe_c_18__PHI_TEMPORARY = ((unsigned int )82); /* for PHI node */ - goto llvm_cbe_bb1415; - -llvm_cbe_bb1412: - *(&llvm_cbe_ptr106) = llvm_cbe_tmp1425; - llvm_cbe_inescq_9__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_c_18__PHI_TEMPORARY = llvm_cbe_c_1812491_0; /* for PHI node */ - goto llvm_cbe_bb1415; - -llvm_cbe_cond_next1423: - llvm_cbe_inescq_912486_0 = llvm_cbe_inescq_912486_0__PHI_TEMPORARY; - llvm_cbe_c_1812491_0 = llvm_cbe_c_1812491_0__PHI_TEMPORARY; - llvm_cbe_tmp1424 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp1425 = &llvm_cbe_tmp1424[((unsigned int )2)]; - llvm_cbe_tmp1426 = *llvm_cbe_tmp1425; - if ((llvm_cbe_tmp1426 == ((unsigned char )69))) { - goto llvm_cbe_bb1412; - } else { - llvm_cbe_inescq_912486_1__PHI_TEMPORARY = llvm_cbe_inescq_912486_0; /* for PHI node */ - llvm_cbe_c_1812491_1__PHI_TEMPORARY = llvm_cbe_c_1812491_0; /* for PHI node */ - goto llvm_cbe_bb1430; - } - -llvm_cbe_cond_true1569: - if ((((signed int )llvm_cbe_c_1812491_1) > ((signed int )((unsigned int )82)))) { - goto llvm_cbe_cond_true1582; - } else { - llvm_cbe_d_1012504_1__PHI_TEMPORARY = ((unsigned int )82); /* for PHI node */ - goto llvm_cbe_cond_next1584; - } - -llvm_cbe_cond_next1576: - llvm_cbe_d_10 = llvm_cbe_d_10__PHI_TEMPORARY; - if ((((signed int )llvm_cbe_d_10) < ((signed int )llvm_cbe_c_1812491_1))) { - goto llvm_cbe_cond_true1582; - } else { - llvm_cbe_d_1012504_1__PHI_TEMPORARY = llvm_cbe_d_10; /* for PHI node */ - goto llvm_cbe_cond_next1584; - } - - do { /* Syntactic loop 'bb1604' to make GCC happy */ -llvm_cbe_bb1604: - llvm_cbe_indvar26648 = llvm_cbe_indvar26648__PHI_TEMPORARY; - llvm_cbe_c_2812521_12 = llvm_cbe_indvar26648 + llvm_cbe_c_1812491_1; - llvm_cbe_tmp1609 = &llvm_cbe_classbits[(((signed int )(((signed int )llvm_cbe_c_2812521_12) / ((signed int )((unsigned int )8)))))]; - llvm_cbe_tmp1610 = *llvm_cbe_tmp1609; - *llvm_cbe_tmp1609 = (((unsigned char )((((unsigned char )(((unsigned int )1) << (llvm_cbe_c_2812521_12 & ((unsigned int )7))))) | llvm_cbe_tmp1610))); - llvm_cbe_tmp1624 = *llvm_cbe_tmp1623; - llvm_cbe_tmp1627 = *(&llvm_cbe_tmp1624[llvm_cbe_c_2812521_12]); - llvm_cbe_tmp16271628 = ((unsigned int )(unsigned char )llvm_cbe_tmp1627); - llvm_cbe_tmp1633 = &llvm_cbe_classbits[(((unsigned int )(((unsigned int )llvm_cbe_tmp16271628) >> ((unsigned int )((unsigned int )3)))))]; - llvm_cbe_tmp1634 = *llvm_cbe_tmp1633; - *llvm_cbe_tmp1633 = (((unsigned char )((((unsigned char )(((unsigned int )1) << (llvm_cbe_tmp16271628 & ((unsigned int )7))))) | llvm_cbe_tmp1634))); - if ((((signed int )(llvm_cbe_c_2812521_12 + ((unsigned int )1))) > ((signed int )llvm_cbe_d_1012504_1))) { - llvm_cbe_class_lastchar_6__PHI_TEMPORARY = llvm_cbe_d_1012504_1; /* for PHI node */ - llvm_cbe_class_charcount_6__PHI_TEMPORARY = llvm_cbe_tmp1597; /* for PHI node */ - llvm_cbe_inescq_3__PHI_TEMPORARY = llvm_cbe_inescq_10; /* for PHI node */ - goto llvm_cbe_bb1694; - } else { - llvm_cbe_indvar26648__PHI_TEMPORARY = (llvm_cbe_indvar26648 + ((unsigned int )1)); /* for PHI node */ - goto llvm_cbe_bb1604; - } - - } while (1); /* end of syntactic loop 'bb1604' */ -llvm_cbe_bb1604_preheader: - if ((llvm_cbe_tmp865 == ((unsigned int )0))) { - llvm_cbe_indvar26645__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb1604_us; - } else { - llvm_cbe_indvar26648__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb1604; - } - - do { /* Syntactic loop 'bb1604.us' to make GCC happy */ -llvm_cbe_bb1604_us: - llvm_cbe_indvar26645 = llvm_cbe_indvar26645__PHI_TEMPORARY; - llvm_cbe_c_2812521_12_us = llvm_cbe_indvar26645 + llvm_cbe_c_1812491_1; - llvm_cbe_tmp1609_us = &llvm_cbe_classbits[(((signed int )(((signed int )llvm_cbe_c_2812521_12_us) / ((signed int )((unsigned int )8)))))]; - llvm_cbe_tmp1610_us = *llvm_cbe_tmp1609_us; - *llvm_cbe_tmp1609_us = (((unsigned char )((((unsigned char )(((unsigned int )1) << (llvm_cbe_c_2812521_12_us & ((unsigned int )7))))) | llvm_cbe_tmp1610_us))); - if ((((signed int )(llvm_cbe_c_2812521_12_us + ((unsigned int )1))) > ((signed int )llvm_cbe_d_1012504_1))) { - llvm_cbe_class_lastchar_6__PHI_TEMPORARY = llvm_cbe_d_1012504_1; /* for PHI node */ - llvm_cbe_class_charcount_6__PHI_TEMPORARY = llvm_cbe_tmp1597; /* for PHI node */ - llvm_cbe_inescq_3__PHI_TEMPORARY = llvm_cbe_inescq_10; /* for PHI node */ - goto llvm_cbe_bb1694; - } else { - llvm_cbe_indvar26645__PHI_TEMPORARY = (llvm_cbe_indvar26645 + ((unsigned int )1)); /* for PHI node */ - goto llvm_cbe_bb1604_us; - } - - } while (1); /* end of syntactic loop 'bb1604.us' */ -llvm_cbe_cond_next1690: - llvm_cbe_c_29 = llvm_cbe_c_29__PHI_TEMPORARY; - llvm_cbe_tmp1692 = llvm_cbe_class_charcount_7 + ((unsigned int )1); - llvm_cbe_class_lastchar_6__PHI_TEMPORARY = llvm_cbe_c_29; /* for PHI node */ - llvm_cbe_class_charcount_6__PHI_TEMPORARY = llvm_cbe_tmp1692; /* for PHI node */ - llvm_cbe_inescq_3__PHI_TEMPORARY = llvm_cbe_inescq_11; /* for PHI node */ - goto llvm_cbe_bb1694; - -llvm_cbe_LONE_SINGLE_CHARACTER: - llvm_cbe_inescq_11 = llvm_cbe_inescq_11__PHI_TEMPORARY; - llvm_cbe_tmp1658 = &llvm_cbe_classbits[(((signed int )(((signed int )llvm_cbe_c_1812491_1) / ((signed int )((unsigned int )8)))))]; - llvm_cbe_tmp1659 = *llvm_cbe_tmp1658; - *llvm_cbe_tmp1658 = (((unsigned char )(llvm_cbe_tmp1659 | (((unsigned char )(((unsigned int )1) << (llvm_cbe_c_1812491_1 & ((unsigned int )7)))))))); - if ((llvm_cbe_tmp865 == ((unsigned int )0))) { - llvm_cbe_c_29__PHI_TEMPORARY = llvm_cbe_c_1812491_1; /* for PHI node */ - goto llvm_cbe_cond_next1690; - } else { - goto llvm_cbe_cond_true1670; - } - -llvm_cbe_bb1517: - *(&llvm_cbe_ptr106) = llvm_cbe_tmp1431; - llvm_cbe_inescq_11__PHI_TEMPORARY = llvm_cbe_inescq_10; /* for PHI node */ - goto llvm_cbe_LONE_SINGLE_CHARACTER; - -llvm_cbe_cond_false1570: - *(&llvm_cbe_ptr106) = llvm_cbe_tmp1431; - llvm_cbe_inescq_11__PHI_TEMPORARY = llvm_cbe_inescq_10; /* for PHI node */ - goto llvm_cbe_LONE_SINGLE_CHARACTER; - -llvm_cbe_cond_true1670: - llvm_cbe_tmp1673 = *llvm_cbe_tmp1623; - llvm_cbe_tmp1676 = *(&llvm_cbe_tmp1673[llvm_cbe_c_1812491_1]); - llvm_cbe_tmp16761677 = ((unsigned int )(unsigned char )llvm_cbe_tmp1676); - llvm_cbe_tmp1682 = &llvm_cbe_classbits[(((unsigned int )(((unsigned int )llvm_cbe_tmp16761677) >> ((unsigned int )((unsigned int )3)))))]; - llvm_cbe_tmp1683 = *llvm_cbe_tmp1682; - *llvm_cbe_tmp1682 = (((unsigned char )((((unsigned char )(((unsigned int )1) << (llvm_cbe_tmp16761677 & ((unsigned int )7))))) | llvm_cbe_tmp1683))); - llvm_cbe_c_29__PHI_TEMPORARY = llvm_cbe_tmp16761677; /* for PHI node */ - goto llvm_cbe_cond_next1690; - - } while (1); /* end of syntactic loop 'bb717' */ -llvm_cbe_bb717_preheader: - llvm_cbe_tmp865 = llvm_cbe_options104_39466_9 & ((unsigned int )1); - llvm_cbe_class_lastchar_7__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - llvm_cbe_class_charcount_7__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_inescq_4__PHI_TEMPORARY = llvm_cbe_inescq_29422_9; /* for PHI node */ - llvm_cbe_c_11__PHI_TEMPORARY = llvm_cbe_c_8; /* for PHI node */ - goto llvm_cbe_bb717; - -llvm_cbe_cond_next1800: - llvm_cbe_code105_11 = llvm_cbe_code105_11__PHI_TEMPORARY; - llvm_cbe_tmp1802 = &llvm_cbe_code105_11[((unsigned int )32)]; - llvm_cbe_tmp519612629 = *(&llvm_cbe_ptr106); - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp519612629[((unsigned int )1)]); - llvm_cbe_slot_913437_0_us61_13__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_13__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_repeat_max_10__PHI_TEMPORARY = llvm_cbe_repeat_max_10; /* for PHI node */ - llvm_cbe_repeat_min_10__PHI_TEMPORARY = llvm_cbe_repeat_min_10; /* for PHI node */ - llvm_cbe_options_addr_2__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_save_hwm_7__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_previous_callout_5__PHI_TEMPORARY = llvm_cbe_previous_callout_9; /* for PHI node */ - llvm_cbe_previous_3__PHI_TEMPORARY = llvm_cbe_code105_10; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_2__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_9; /* for PHI node */ - llvm_cbe_inescq_2__PHI_TEMPORARY = llvm_cbe_inescq_5; /* for PHI node */ - llvm_cbe_last_code_2__PHI_TEMPORARY = llvm_cbe_last_code_15771_1; /* for PHI node */ - llvm_cbe_code105_3__PHI_TEMPORARY = llvm_cbe_tmp1802; /* for PHI node */ - llvm_cbe_after_manual_callout_7__PHI_TEMPORARY = llvm_cbe_after_manual_callout_1; /* for PHI node */ - llvm_cbe_options104_3__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_req_caseopt_3__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_9; /* for PHI node */ - llvm_cbe_zerofirstbyte_2__PHI_TEMPORARY = llvm_cbe_firstbyte102_6; /* for PHI node */ - llvm_cbe_zeroreqbyte_2__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_9; /* for PHI node */ - llvm_cbe_reqbyte103_5__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_9; /* for PHI node */ - llvm_cbe_firstbyte102_3__PHI_TEMPORARY = llvm_cbe_firstbyte102_6; /* for PHI node */ - llvm_cbe_greedy_non_default_3__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_9; /* for PHI node */ - llvm_cbe_greedy_default_3__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_9; /* for PHI node */ - goto llvm_cbe_bb131; - -llvm_cbe_cond_true1769: - *llvm_cbe_code105_10 = ((unsigned char )78); - llvm_cbe_tmp1772 = &llvm_cbe_code105_10[((unsigned int )1)]; - if ((llvm_cbe_iftmp_509_0 == ((unsigned int *)/*NULL*/0))) { - llvm_cbe_c_3112623_4__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb1778; - } else { - llvm_cbe_code105_11__PHI_TEMPORARY = llvm_cbe_tmp1772; /* for PHI node */ - goto llvm_cbe_cond_next1800; - } - -llvm_cbe_cond_next1756: - llvm_cbe_firstbyte102_6 = (((llvm_cbe_firstbyte102_39829_9 == ((unsigned int )-2))) ? (((unsigned int )-1)) : (llvm_cbe_firstbyte102_39829_9)); - if ((llvm_cbe_negate_class_0 == ((unsigned int )0))) { - goto llvm_cbe_cond_false1794; - } else { - goto llvm_cbe_cond_true1769; - } - - do { /* Syntactic loop 'bb1778' to make GCC happy */ -llvm_cbe_bb1778: - llvm_cbe_c_3112623_4 = llvm_cbe_c_3112623_4__PHI_TEMPORARY; - llvm_cbe_tmp1781 = *(&llvm_cbe_classbits[llvm_cbe_c_3112623_4]); - llvm_cbe_tmp1772_sum = llvm_cbe_c_3112623_4 + ((unsigned int )1); - *(&llvm_cbe_code105_10[llvm_cbe_tmp1772_sum]) = (((unsigned char )(llvm_cbe_tmp1781 ^ ((unsigned char )-1)))); - if ((llvm_cbe_tmp1772_sum == ((unsigned int )32))) { - llvm_cbe_code105_11__PHI_TEMPORARY = llvm_cbe_tmp1772; /* for PHI node */ - goto llvm_cbe_cond_next1800; - } else { - llvm_cbe_c_3112623_4__PHI_TEMPORARY = llvm_cbe_tmp1772_sum; /* for PHI node */ - goto llvm_cbe_bb1778; - } - - } while (1); /* end of syntactic loop 'bb1778' */ -llvm_cbe_cond_false1794: - *llvm_cbe_code105_10 = ((unsigned char )77); - llvm_cbe_tmp1797 = &llvm_cbe_code105_10[((unsigned int )1)]; - ltmp_7_1 = memcpy(llvm_cbe_tmp1797, llvm_cbe_classbits711, ((unsigned int )32)); - llvm_cbe_code105_11__PHI_TEMPORARY = llvm_cbe_tmp1797; /* for PHI node */ - goto llvm_cbe_cond_next1800; - -llvm_cbe_END_REPEAT: - llvm_cbe_repeat_max_13 = llvm_cbe_repeat_max_13__PHI_TEMPORARY; - llvm_cbe_save_hwm_5 = llvm_cbe_save_hwm_5__PHI_TEMPORARY; - llvm_cbe_code105_13 = llvm_cbe_code105_13__PHI_TEMPORARY; - llvm_cbe_reqbyte103_9 = llvm_cbe_reqbyte103_9__PHI_TEMPORARY; - llvm_cbe_tmp3167 = *llvm_cbe_tmp1993; - *llvm_cbe_tmp1993 = (llvm_cbe_tmp3167 | llvm_cbe_iftmp_236_0); - llvm_cbe_tmp519613332 = *(&llvm_cbe_ptr106); - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp519613332[((unsigned int )1)]); - llvm_cbe_slot_913437_0_us61_13__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_13__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_repeat_max_10__PHI_TEMPORARY = llvm_cbe_repeat_max_13; /* for PHI node */ - llvm_cbe_repeat_min_10__PHI_TEMPORARY = llvm_cbe_repeat_min_9; /* for PHI node */ - llvm_cbe_options_addr_2__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_save_hwm_7__PHI_TEMPORARY = llvm_cbe_save_hwm_5; /* for PHI node */ - llvm_cbe_previous_callout_5__PHI_TEMPORARY = llvm_cbe_previous_callout_9; /* for PHI node */ - llvm_cbe_previous_3__PHI_TEMPORARY = ((unsigned char *)/*NULL*/0); /* for PHI node */ - llvm_cbe_groupsetfirstbyte_2__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_9; /* for PHI node */ - llvm_cbe_inescq_2__PHI_TEMPORARY = llvm_cbe_inescq_29422_9; /* for PHI node */ - llvm_cbe_last_code_2__PHI_TEMPORARY = llvm_cbe_last_code_15771_1; /* for PHI node */ - llvm_cbe_code105_3__PHI_TEMPORARY = llvm_cbe_code105_13; /* for PHI node */ - llvm_cbe_after_manual_callout_7__PHI_TEMPORARY = llvm_cbe_after_manual_callout_1; /* for PHI node */ - llvm_cbe_options104_3__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_req_caseopt_3__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_9; /* for PHI node */ - llvm_cbe_zerofirstbyte_2__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_29740_9; /* for PHI node */ - llvm_cbe_zeroreqbyte_2__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_29762_9; /* for PHI node */ - llvm_cbe_reqbyte103_5__PHI_TEMPORARY = llvm_cbe_reqbyte103_9; /* for PHI node */ - llvm_cbe_firstbyte102_3__PHI_TEMPORARY = llvm_cbe_firstbyte102_7; /* for PHI node */ - llvm_cbe_greedy_non_default_3__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_9; /* for PHI node */ - llvm_cbe_greedy_default_3__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_9; /* for PHI node */ - goto llvm_cbe_bb131; - -llvm_cbe_cond_next2111: - llvm_cbe_possessive_quantifier_612736_1 = llvm_cbe_possessive_quantifier_612736_1__PHI_TEMPORARY; - llvm_cbe_c_3212739_1 = llvm_cbe_c_3212739_1__PHI_TEMPORARY; - llvm_cbe_reqbyte103_712742_1 = llvm_cbe_reqbyte103_712742_1__PHI_TEMPORARY; - llvm_cbe_op_type_512745_1 = llvm_cbe_op_type_512745_1__PHI_TEMPORARY; - llvm_cbe_repeat_type_612750_1 = llvm_cbe_repeat_type_612750_1__PHI_TEMPORARY; - llvm_cbe_prop_value_0 = llvm_cbe_prop_value_0__PHI_TEMPORARY; - llvm_cbe_prop_type_0 = llvm_cbe_prop_type_0__PHI_TEMPORARY; - if ((llvm_cbe_repeat_max_9 == ((unsigned int )0))) { - llvm_cbe_repeat_max_13__PHI_TEMPORARY = llvm_cbe_repeat_max_9; /* for PHI node */ - llvm_cbe_save_hwm_5__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_code105_13__PHI_TEMPORARY = llvm_cbe_previous_25708_1; /* for PHI node */ - llvm_cbe_reqbyte103_9__PHI_TEMPORARY = llvm_cbe_reqbyte103_712742_1; /* for PHI node */ - goto llvm_cbe_END_REPEAT; - } else { - goto llvm_cbe_cond_next2119; - } - -llvm_cbe_cond_true2021: - llvm_cbe_tmp209512753 = *llvm_cbe_previous_25708_1; - if ((((unsigned char )(((unsigned char )(llvm_cbe_tmp209512753 + ((unsigned char )-14))))) < ((unsigned char )((unsigned char )2)))) { - llvm_cbe_possessive_quantifier_612736_0__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - llvm_cbe_c_3212739_0__PHI_TEMPORARY = llvm_cbe_tmp19821983; /* for PHI node */ - llvm_cbe_reqbyte103_712742_0__PHI_TEMPORARY = llvm_cbe_reqbyte103_6; /* for PHI node */ - llvm_cbe_op_type_512745_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_repeat_type_612750_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_cond_true2100; - } else { - llvm_cbe_possessive_quantifier_612736_1__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - llvm_cbe_c_3212739_1__PHI_TEMPORARY = llvm_cbe_tmp19821983; /* for PHI node */ - llvm_cbe_reqbyte103_712742_1__PHI_TEMPORARY = llvm_cbe_reqbyte103_6; /* for PHI node */ - llvm_cbe_op_type_512745_1__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_repeat_type_612750_1__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_prop_value_0__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - llvm_cbe_prop_type_0__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_cond_next2111; - } - -llvm_cbe_cond_true2006: - llvm_cbe_tmp2007 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp2010 = *llvm_cbe_previous_25708_1; - llvm_cbe_tmp2017 = check_auto_possessive((((unsigned int )(unsigned char )llvm_cbe_tmp2010)), llvm_cbe_tmp19821983, (&llvm_cbe_tmp2007[((unsigned int )1)]), llvm_cbe_options104_39466_9, llvm_cbe_cd); - if ((llvm_cbe_tmp2017 == ((unsigned int )0))) { - llvm_cbe_possessive_quantifier_6__PHI_TEMPORARY = llvm_cbe_possessive_quantifier_512675_0; /* for PHI node */ - llvm_cbe_c_32__PHI_TEMPORARY = llvm_cbe_tmp19821983; /* for PHI node */ - llvm_cbe_reqbyte103_7__PHI_TEMPORARY = llvm_cbe_reqbyte103_6; /* for PHI node */ - llvm_cbe_op_type_5__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_repeat_type_6__PHI_TEMPORARY = llvm_cbe_repeat_type_012701_0; /* for PHI node */ - goto llvm_cbe_OUTPUT_SINGLE_REPEAT; - } else { - goto llvm_cbe_cond_true2021; - } - -llvm_cbe_cond_next1996: - llvm_cbe_reqbyte103_6 = llvm_cbe_reqbyte103_6__PHI_TEMPORARY; - if (((llvm_cbe_possessive_quantifier_512675_0 == ((unsigned int )0)) & (((signed int )llvm_cbe_repeat_max_9) < ((signed int )((unsigned int )0))))) { - goto llvm_cbe_cond_true2006; - } else { - llvm_cbe_possessive_quantifier_6__PHI_TEMPORARY = llvm_cbe_possessive_quantifier_512675_0; /* for PHI node */ - llvm_cbe_c_32__PHI_TEMPORARY = llvm_cbe_tmp19821983; /* for PHI node */ - llvm_cbe_reqbyte103_7__PHI_TEMPORARY = llvm_cbe_reqbyte103_6; /* for PHI node */ - llvm_cbe_op_type_5__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_repeat_type_6__PHI_TEMPORARY = llvm_cbe_repeat_type_012701_0; /* for PHI node */ - goto llvm_cbe_OUTPUT_SINGLE_REPEAT; - } - -llvm_cbe_cond_true1979: - llvm_cbe_possessive_quantifier_512675_0 = llvm_cbe_possessive_quantifier_512675_0__PHI_TEMPORARY; - llvm_cbe_repeat_type_012701_0 = llvm_cbe_repeat_type_012701_0__PHI_TEMPORARY; - llvm_cbe_tmp1982 = *(&llvm_cbe_code105_10[((unsigned int )-1)]); - llvm_cbe_tmp19821983 = ((unsigned int )(unsigned char )llvm_cbe_tmp1982); - if ((((signed int )llvm_cbe_repeat_min_9) > ((signed int )((unsigned int )1)))) { - goto llvm_cbe_cond_true1988; - } else { - llvm_cbe_reqbyte103_6__PHI_TEMPORARY = llvm_cbe_reqbyte103_1; /* for PHI node */ - goto llvm_cbe_cond_next1996; - } - -llvm_cbe_cond_true1955: - *(&llvm_cbe_ptr106) = llvm_cbe_tmp1950; - llvm_cbe_tmp197412733 = *llvm_cbe_previous_25708_1; - if ((((unsigned char )(((unsigned char )(llvm_cbe_tmp197412733 + ((unsigned char )-27))))) < ((unsigned char )((unsigned char )2)))) { - llvm_cbe_possessive_quantifier_512675_0__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - llvm_cbe_repeat_type_012701_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_cond_true1979; - } else { - llvm_cbe_possessive_quantifier_512675_1__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - llvm_cbe_repeat_type_012701_1__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_cond_false2025; - } - -llvm_cbe_cond_next1930: - llvm_cbe_repeat_max_9 = llvm_cbe_repeat_max_9__PHI_TEMPORARY; - llvm_cbe_repeat_min_9 = llvm_cbe_repeat_min_9__PHI_TEMPORARY; - llvm_cbe_reqbyte103_1 = (((llvm_cbe_repeat_min_9 == ((unsigned int )0))) ? (llvm_cbe_zeroreqbyte_29762_9) : (llvm_cbe_reqbyte103_59784_9)); - llvm_cbe_firstbyte102_7 = (((llvm_cbe_repeat_min_9 == ((unsigned int )0))) ? (llvm_cbe_zerofirstbyte_29740_9) : (llvm_cbe_firstbyte102_39829_9)); - llvm_cbe_iftmp_236_0 = (((llvm_cbe_repeat_min_9 == llvm_cbe_repeat_max_9)) ? (((unsigned int )0)) : (((unsigned int )512))); - *(&llvm_cbe_tempcode) = llvm_cbe_previous_25708_1; - llvm_cbe_tmp1949 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp1950 = &llvm_cbe_tmp1949[((unsigned int )1)]; - llvm_cbe_tmp1951 = *llvm_cbe_tmp1950; - switch (llvm_cbe_tmp1951) { - default: - llvm_cbe_repeat_type_0__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_9; /* for PHI node */ - goto llvm_cbe_cond_next1972; -; - case ((unsigned char )43): - goto llvm_cbe_cond_true1955; - break; - case ((unsigned char )63): - goto llvm_cbe_cond_true1965; - } -llvm_cbe_bb1921: - if ((llvm_cbe_previous_25708_1 == ((unsigned char *)/*NULL*/0))) { - goto llvm_cbe_cond_true1928; - } else { - llvm_cbe_repeat_max_9__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - llvm_cbe_repeat_min_9__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_cond_next1930; - } - -llvm_cbe_REPEAT: - llvm_cbe_repeat_max_4 = llvm_cbe_repeat_max_4__PHI_TEMPORARY; - llvm_cbe_repeat_min_4 = llvm_cbe_repeat_min_4__PHI_TEMPORARY; - if ((llvm_cbe_previous_25708_1 == ((unsigned char *)/*NULL*/0))) { - goto llvm_cbe_cond_true1928; - } else { - llvm_cbe_repeat_max_9__PHI_TEMPORARY = llvm_cbe_repeat_max_4; /* for PHI node */ - llvm_cbe_repeat_min_9__PHI_TEMPORARY = llvm_cbe_repeat_min_4; /* for PHI node */ - goto llvm_cbe_cond_next1930; - } - -llvm_cbe_bb1912: - llvm_cbe_repeat_max_3 = llvm_cbe_repeat_max_3__PHI_TEMPORARY; - llvm_cbe_repeat_min_3 = llvm_cbe_repeat_min_3__PHI_TEMPORARY; - llvm_cbe_tmp93_0 = llvm_cbe_tmp93_0__PHI_TEMPORARY; - *(&llvm_cbe_ptr106) = llvm_cbe_tmp93_0; - llvm_cbe_tmp1915 = *llvm_cbe_errorcodeptr; - if ((llvm_cbe_tmp1915 == ((unsigned int )0))) { - llvm_cbe_repeat_max_4__PHI_TEMPORARY = llvm_cbe_repeat_max_3; /* for PHI node */ - llvm_cbe_repeat_min_4__PHI_TEMPORARY = llvm_cbe_repeat_min_3; /* for PHI node */ - goto llvm_cbe_REPEAT; - } else { - llvm_cbe_slot_913437_0_us61_12__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_12__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - goto llvm_cbe_FAILED; - } - -llvm_cbe_cond_true1842: - *llvm_cbe_errorcodeptr = ((unsigned int )5); - llvm_cbe_repeat_max_3__PHI_TEMPORARY = llvm_cbe_repeat_max_10; /* for PHI node */ - llvm_cbe_repeat_min_3__PHI_TEMPORARY = llvm_cbe_repeat_min_10; /* for PHI node */ - llvm_cbe_tmp93_0__PHI_TEMPORARY = llvm_cbe_p1813_6_lcssa; /* for PHI node */ - goto llvm_cbe_bb1912; - -llvm_cbe_bb1837: - llvm_cbe_p1813_6_lcssa = llvm_cbe_p1813_6_lcssa__PHI_TEMPORARY; - llvm_cbe_tmp1810_pn_lcssa = llvm_cbe_tmp1810_pn_lcssa__PHI_TEMPORARY; - llvm_cbe_min_6_lcssa = llvm_cbe_min_6_lcssa__PHI_TEMPORARY; - if ((((unsigned int )llvm_cbe_min_6_lcssa) > ((unsigned int )((unsigned int )65535)))) { - goto llvm_cbe_cond_true1842; - } else { - goto llvm_cbe_cond_next1846; - } - -llvm_cbe_cond_next1809: - llvm_cbe_tmp1810 = *(&llvm_cbe_ptr106); - llvm_cbe_p1813_626504 = &llvm_cbe_tmp1810[((unsigned int )1)]; - llvm_cbe_tmp182826506 = *llvm_cbe_p1813_626504; - llvm_cbe_tmp183126509 = *(&digitab[(((unsigned int )(unsigned char )llvm_cbe_tmp182826506))]); - if (((((unsigned char )(llvm_cbe_tmp183126509 & ((unsigned char )4)))) == ((unsigned char )0))) { - llvm_cbe_p1813_6_lcssa__PHI_TEMPORARY = llvm_cbe_p1813_626504; /* for PHI node */ - llvm_cbe_tmp1810_pn_lcssa__PHI_TEMPORARY = llvm_cbe_tmp1810; /* for PHI node */ - llvm_cbe_min_6_lcssa__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb1837; - } else { - llvm_cbe_p1813_626505__PHI_TEMPORARY = llvm_cbe_p1813_626504; /* for PHI node */ - llvm_cbe_min_626502__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb1816; - } - -llvm_cbe_bb1803: - if (llvm_cbe_iftmp_136_0) { - llvm_cbe_storemerge26707_in__PHI_TEMPORARY = llvm_cbe_c_2; /* for PHI node */ - llvm_cbe_last_code_15771_4__PHI_TEMPORARY = llvm_cbe_last_code_15771_1; /* for PHI node */ - llvm_cbe_options_addr_25789_11__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_save_hwm_79347_11__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_29395_11__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_9; /* for PHI node */ - llvm_cbe_options104_39466_11__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_req_caseopt_39708_11__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_9; /* for PHI node */ - llvm_cbe_reqbyte103_59784_11__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_9; /* for PHI node */ - llvm_cbe_firstbyte102_39829_11__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - llvm_cbe_greedy_non_default_39879_11__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_9; /* for PHI node */ - llvm_cbe_greedy_default_39909_11__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_9; /* for PHI node */ - llvm_cbe_previous_callout_3__PHI_TEMPORARY = llvm_cbe_previous_callout_9; /* for PHI node */ - llvm_cbe_inescq_6__PHI_TEMPORARY = llvm_cbe_inescq_29422_9; /* for PHI node */ - llvm_cbe_code105_8__PHI_TEMPORARY = llvm_cbe_code105_10; /* for PHI node */ - llvm_cbe_after_manual_callout_3__PHI_TEMPORARY = llvm_cbe_after_manual_callout_1; /* for PHI node */ - goto llvm_cbe_ONE_CHAR; - } else { - goto llvm_cbe_cond_next1809; - } - - do { /* Syntactic loop 'bb1816' to make GCC happy */ -llvm_cbe_bb1816: - llvm_cbe_p1813_626505 = llvm_cbe_p1813_626505__PHI_TEMPORARY; - llvm_cbe_min_626502 = llvm_cbe_min_626502__PHI_TEMPORARY; - llvm_cbe_tmp1820 = *llvm_cbe_p1813_626505; - llvm_cbe_tmp1823 = ((llvm_cbe_min_626502 * ((unsigned int )10)) + ((unsigned int )-48)) + (((unsigned int )(unsigned char )llvm_cbe_tmp1820)); - llvm_cbe_p1813_6 = &llvm_cbe_p1813_626505[((unsigned int )1)]; - llvm_cbe_tmp1828 = *llvm_cbe_p1813_6; - llvm_cbe_tmp1831 = *(&digitab[(((unsigned int )(unsigned char )llvm_cbe_tmp1828))]); - if (((((unsigned char )(llvm_cbe_tmp1831 & ((unsigned char )4)))) == ((unsigned char )0))) { - llvm_cbe_p1813_6_lcssa__PHI_TEMPORARY = llvm_cbe_p1813_6; /* for PHI node */ - llvm_cbe_tmp1810_pn_lcssa__PHI_TEMPORARY = llvm_cbe_p1813_626505; /* for PHI node */ - llvm_cbe_min_6_lcssa__PHI_TEMPORARY = llvm_cbe_tmp1823; /* for PHI node */ - goto llvm_cbe_bb1837; - } else { - llvm_cbe_p1813_626505__PHI_TEMPORARY = llvm_cbe_p1813_6; /* for PHI node */ - llvm_cbe_min_626502__PHI_TEMPORARY = llvm_cbe_tmp1823; /* for PHI node */ - goto llvm_cbe_bb1816; - } - - } while (1); /* end of syntactic loop 'bb1816' */ -llvm_cbe_cond_next1846: - llvm_cbe_tmp1848 = *llvm_cbe_p1813_6_lcssa; - if ((llvm_cbe_tmp1848 == ((unsigned char )125))) { - llvm_cbe_repeat_max_3__PHI_TEMPORARY = llvm_cbe_min_6_lcssa; /* for PHI node */ - llvm_cbe_repeat_min_3__PHI_TEMPORARY = llvm_cbe_min_6_lcssa; /* for PHI node */ - llvm_cbe_tmp93_0__PHI_TEMPORARY = llvm_cbe_p1813_6_lcssa; /* for PHI node */ - goto llvm_cbe_bb1912; - } else { - goto llvm_cbe_cond_false1854; - } - -llvm_cbe_cond_false1854: - llvm_cbe_tmp1856 = &llvm_cbe_tmp1810_pn_lcssa[((unsigned int )2)]; - llvm_cbe_tmp1858 = *llvm_cbe_tmp1856; - if ((llvm_cbe_tmp1858 == ((unsigned char )125))) { - llvm_cbe_repeat_max_3__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - llvm_cbe_repeat_min_3__PHI_TEMPORARY = llvm_cbe_min_6_lcssa; /* for PHI node */ - llvm_cbe_tmp93_0__PHI_TEMPORARY = llvm_cbe_tmp1856; /* for PHI node */ - goto llvm_cbe_bb1912; - } else { - goto llvm_cbe_bb1873_preheader; - } - -llvm_cbe_cond_true1889: - *llvm_cbe_errorcodeptr = ((unsigned int )5); - llvm_cbe_repeat_max_3__PHI_TEMPORARY = llvm_cbe_repeat_max_10; /* for PHI node */ - llvm_cbe_repeat_min_3__PHI_TEMPORARY = llvm_cbe_repeat_min_10; /* for PHI node */ - llvm_cbe_tmp93_0__PHI_TEMPORARY = llvm_cbe_p1813_9_lcssa; /* for PHI node */ - goto llvm_cbe_bb1912; - -llvm_cbe_bb1884: - llvm_cbe_p1813_9_lcssa = llvm_cbe_p1813_9_lcssa__PHI_TEMPORARY; - llvm_cbe_max_8_lcssa = llvm_cbe_max_8_lcssa__PHI_TEMPORARY; - if ((((unsigned int )llvm_cbe_max_8_lcssa) > ((unsigned int )((unsigned int )65535)))) { - goto llvm_cbe_cond_true1889; - } else { - goto llvm_cbe_cond_next1893; - } - -llvm_cbe_bb1873_preheader: - llvm_cbe_tmp187826498 = *(&digitab[(((unsigned int )(unsigned char )llvm_cbe_tmp1858))]); - if (((((unsigned char )(llvm_cbe_tmp187826498 & ((unsigned char )4)))) == ((unsigned char )0))) { - llvm_cbe_p1813_9_lcssa__PHI_TEMPORARY = llvm_cbe_tmp1856; /* for PHI node */ - llvm_cbe_max_8_lcssa__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb1884; - } else { - llvm_cbe_p1813_926494_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_max_826493__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb1863; - } - - do { /* Syntactic loop 'bb1863' to make GCC happy */ -llvm_cbe_bb1863: - llvm_cbe_p1813_926494_rec = llvm_cbe_p1813_926494_rec__PHI_TEMPORARY; - llvm_cbe_max_826493 = llvm_cbe_max_826493__PHI_TEMPORARY; - llvm_cbe_tmp1867 = *(&llvm_cbe_tmp1810_pn_lcssa[(llvm_cbe_p1813_926494_rec + ((unsigned int )2))]); - llvm_cbe_tmp1870 = ((llvm_cbe_max_826493 * ((unsigned int )10)) + ((unsigned int )-48)) + (((unsigned int )(unsigned char )llvm_cbe_tmp1867)); - llvm_cbe_tmp1872 = &llvm_cbe_tmp1810_pn_lcssa[(llvm_cbe_p1813_926494_rec + ((unsigned int )3))]; - llvm_cbe_tmp1875 = *llvm_cbe_tmp1872; - llvm_cbe_tmp1878 = *(&digitab[(((unsigned int )(unsigned char )llvm_cbe_tmp1875))]); - if (((((unsigned char )(llvm_cbe_tmp1878 & ((unsigned char )4)))) == ((unsigned char )0))) { - llvm_cbe_p1813_9_lcssa__PHI_TEMPORARY = llvm_cbe_tmp1872; /* for PHI node */ - llvm_cbe_max_8_lcssa__PHI_TEMPORARY = llvm_cbe_tmp1870; /* for PHI node */ - goto llvm_cbe_bb1884; - } else { - llvm_cbe_p1813_926494_rec__PHI_TEMPORARY = (llvm_cbe_p1813_926494_rec + ((unsigned int )1)); /* for PHI node */ - llvm_cbe_max_826493__PHI_TEMPORARY = llvm_cbe_tmp1870; /* for PHI node */ - goto llvm_cbe_bb1863; - } - - } while (1); /* end of syntactic loop 'bb1863' */ -llvm_cbe_cond_next1893: - if ((((signed int )llvm_cbe_max_8_lcssa) < ((signed int )llvm_cbe_min_6_lcssa))) { - goto llvm_cbe_cond_true1899; - } else { - llvm_cbe_repeat_max_3__PHI_TEMPORARY = llvm_cbe_max_8_lcssa; /* for PHI node */ - llvm_cbe_repeat_min_3__PHI_TEMPORARY = llvm_cbe_min_6_lcssa; /* for PHI node */ - llvm_cbe_tmp93_0__PHI_TEMPORARY = llvm_cbe_p1813_9_lcssa; /* for PHI node */ - goto llvm_cbe_bb1912; - } - -llvm_cbe_cond_true1899: - *llvm_cbe_errorcodeptr = ((unsigned int )4); - llvm_cbe_repeat_max_3__PHI_TEMPORARY = llvm_cbe_repeat_max_10; /* for PHI node */ - llvm_cbe_repeat_min_3__PHI_TEMPORARY = llvm_cbe_repeat_min_10; /* for PHI node */ - llvm_cbe_tmp93_0__PHI_TEMPORARY = llvm_cbe_p1813_9_lcssa; /* for PHI node */ - goto llvm_cbe_bb1912; - -llvm_cbe_bb1923: - llvm_cbe_repeat_max_4__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - llvm_cbe_repeat_min_4__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_REPEAT; - -llvm_cbe_cond_next1972: - llvm_cbe_repeat_type_0 = llvm_cbe_repeat_type_0__PHI_TEMPORARY; - llvm_cbe_tmp1974 = *llvm_cbe_previous_25708_1; - if ((((unsigned char )(((unsigned char )(llvm_cbe_tmp1974 + ((unsigned char )-27))))) < ((unsigned char )((unsigned char )2)))) { - llvm_cbe_possessive_quantifier_512675_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_repeat_type_012701_0__PHI_TEMPORARY = llvm_cbe_repeat_type_0; /* for PHI node */ - goto llvm_cbe_cond_true1979; - } else { - llvm_cbe_possessive_quantifier_512675_1__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_repeat_type_012701_1__PHI_TEMPORARY = llvm_cbe_repeat_type_0; /* for PHI node */ - goto llvm_cbe_cond_false2025; - } - -llvm_cbe_cond_true1965: - *(&llvm_cbe_ptr106) = llvm_cbe_tmp1950; - llvm_cbe_repeat_type_0__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_9; /* for PHI node */ - goto llvm_cbe_cond_next1972; - -llvm_cbe_cond_true1988: - llvm_cbe_tmp1994 = *llvm_cbe_tmp1993; - llvm_cbe_tmp1995 = (llvm_cbe_tmp19821983 | llvm_cbe_req_caseopt_39708_9) | llvm_cbe_tmp1994; - llvm_cbe_reqbyte103_6__PHI_TEMPORARY = llvm_cbe_tmp1995; /* for PHI node */ - goto llvm_cbe_cond_next1996; - -llvm_cbe_OUTPUT_SINGLE_REPEAT: - llvm_cbe_possessive_quantifier_6 = llvm_cbe_possessive_quantifier_6__PHI_TEMPORARY; - llvm_cbe_c_32 = llvm_cbe_c_32__PHI_TEMPORARY; - llvm_cbe_reqbyte103_7 = llvm_cbe_reqbyte103_7__PHI_TEMPORARY; - llvm_cbe_op_type_5 = llvm_cbe_op_type_5__PHI_TEMPORARY; - llvm_cbe_repeat_type_6 = llvm_cbe_repeat_type_6__PHI_TEMPORARY; - llvm_cbe_tmp2095 = *llvm_cbe_previous_25708_1; - if ((((unsigned char )(((unsigned char )(llvm_cbe_tmp2095 + ((unsigned char )-14))))) < ((unsigned char )((unsigned char )2)))) { - llvm_cbe_possessive_quantifier_612736_0__PHI_TEMPORARY = llvm_cbe_possessive_quantifier_6; /* for PHI node */ - llvm_cbe_c_3212739_0__PHI_TEMPORARY = llvm_cbe_c_32; /* for PHI node */ - llvm_cbe_reqbyte103_712742_0__PHI_TEMPORARY = llvm_cbe_reqbyte103_7; /* for PHI node */ - llvm_cbe_op_type_512745_0__PHI_TEMPORARY = llvm_cbe_op_type_5; /* for PHI node */ - llvm_cbe_repeat_type_612750_0__PHI_TEMPORARY = llvm_cbe_repeat_type_6; /* for PHI node */ - goto llvm_cbe_cond_true2100; - } else { - llvm_cbe_possessive_quantifier_612736_1__PHI_TEMPORARY = llvm_cbe_possessive_quantifier_6; /* for PHI node */ - llvm_cbe_c_3212739_1__PHI_TEMPORARY = llvm_cbe_c_32; /* for PHI node */ - llvm_cbe_reqbyte103_712742_1__PHI_TEMPORARY = llvm_cbe_reqbyte103_7; /* for PHI node */ - llvm_cbe_op_type_512745_1__PHI_TEMPORARY = llvm_cbe_op_type_5; /* for PHI node */ - llvm_cbe_repeat_type_612750_1__PHI_TEMPORARY = llvm_cbe_repeat_type_6; /* for PHI node */ - llvm_cbe_prop_value_0__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - llvm_cbe_prop_type_0__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_cond_next2111; - } - -llvm_cbe_cond_true2031: - llvm_cbe_tmp2034 = *(&llvm_cbe_previous_25708_1[((unsigned int )1)]); - llvm_cbe_tmp20342035 = ((unsigned int )(unsigned char )llvm_cbe_tmp2034); - if (((llvm_cbe_possessive_quantifier_512675_1 == ((unsigned int )0)) & (((signed int )llvm_cbe_repeat_max_9) < ((signed int )((unsigned int )0))))) { - goto llvm_cbe_cond_true2045; - } else { - llvm_cbe_possessive_quantifier_6__PHI_TEMPORARY = llvm_cbe_possessive_quantifier_512675_1; /* for PHI node */ - llvm_cbe_c_32__PHI_TEMPORARY = llvm_cbe_tmp20342035; /* for PHI node */ - llvm_cbe_reqbyte103_7__PHI_TEMPORARY = llvm_cbe_reqbyte103_1; /* for PHI node */ - llvm_cbe_op_type_5__PHI_TEMPORARY = ((unsigned int )13); /* for PHI node */ - llvm_cbe_repeat_type_6__PHI_TEMPORARY = llvm_cbe_repeat_type_012701_1; /* for PHI node */ - goto llvm_cbe_OUTPUT_SINGLE_REPEAT; - } - -llvm_cbe_cond_false2025: - llvm_cbe_possessive_quantifier_512675_1 = llvm_cbe_possessive_quantifier_512675_1__PHI_TEMPORARY; - llvm_cbe_repeat_type_012701_1 = llvm_cbe_repeat_type_012701_1__PHI_TEMPORARY; - llvm_cbe_tmp2027 = *llvm_cbe_previous_25708_1; - if ((llvm_cbe_tmp2027 == ((unsigned char )29))) { - goto llvm_cbe_cond_true2031; - } else { - goto llvm_cbe_cond_false2060; - } - -llvm_cbe_cond_true2045: - llvm_cbe_tmp2046 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp2052 = check_auto_possessive(((unsigned int )29), llvm_cbe_tmp20342035, (&llvm_cbe_tmp2046[((unsigned int )1)]), llvm_cbe_options104_39466_9, llvm_cbe_cd); - if ((llvm_cbe_tmp2052 == ((unsigned int )0))) { - llvm_cbe_possessive_quantifier_6__PHI_TEMPORARY = llvm_cbe_possessive_quantifier_512675_1; /* for PHI node */ - llvm_cbe_c_32__PHI_TEMPORARY = llvm_cbe_tmp20342035; /* for PHI node */ - llvm_cbe_reqbyte103_7__PHI_TEMPORARY = llvm_cbe_reqbyte103_1; /* for PHI node */ - llvm_cbe_op_type_5__PHI_TEMPORARY = ((unsigned int )13); /* for PHI node */ - llvm_cbe_repeat_type_6__PHI_TEMPORARY = llvm_cbe_repeat_type_012701_1; /* for PHI node */ - goto llvm_cbe_OUTPUT_SINGLE_REPEAT; - } else { - goto llvm_cbe_cond_true2056; - } - -llvm_cbe_cond_true2056: - llvm_cbe_possessive_quantifier_6__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - llvm_cbe_c_32__PHI_TEMPORARY = llvm_cbe_tmp20342035; /* for PHI node */ - llvm_cbe_reqbyte103_7__PHI_TEMPORARY = llvm_cbe_reqbyte103_1; /* for PHI node */ - llvm_cbe_op_type_5__PHI_TEMPORARY = ((unsigned int )13); /* for PHI node */ - llvm_cbe_repeat_type_6__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_OUTPUT_SINGLE_REPEAT; - -llvm_cbe_cond_true2066: - llvm_cbe_tmp20682069 = ((unsigned int )(unsigned char )llvm_cbe_tmp2027); - if (((llvm_cbe_possessive_quantifier_512675_1 == ((unsigned int )0)) & (((signed int )llvm_cbe_repeat_max_9) < ((signed int )((unsigned int )0))))) { - goto llvm_cbe_cond_true2079; - } else { - llvm_cbe_possessive_quantifier_6__PHI_TEMPORARY = llvm_cbe_possessive_quantifier_512675_1; /* for PHI node */ - llvm_cbe_c_32__PHI_TEMPORARY = llvm_cbe_tmp20682069; /* for PHI node */ - llvm_cbe_reqbyte103_7__PHI_TEMPORARY = llvm_cbe_reqbyte103_1; /* for PHI node */ - llvm_cbe_op_type_5__PHI_TEMPORARY = ((unsigned int )26); /* for PHI node */ - llvm_cbe_repeat_type_6__PHI_TEMPORARY = llvm_cbe_repeat_type_012701_1; /* for PHI node */ - goto llvm_cbe_OUTPUT_SINGLE_REPEAT; - } - -llvm_cbe_cond_false2060: - if ((((unsigned char )llvm_cbe_tmp2027) < ((unsigned char )((unsigned char )22)))) { - goto llvm_cbe_cond_true2066; - } else { - goto llvm_cbe_cond_false2348; - } - -llvm_cbe_cond_true2079: - llvm_cbe_tmp2080 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp2086 = check_auto_possessive(llvm_cbe_tmp20682069, ((unsigned int )0), (&llvm_cbe_tmp2080[((unsigned int )1)]), llvm_cbe_options104_39466_9, llvm_cbe_cd); - if ((llvm_cbe_tmp2086 == ((unsigned int )0))) { - llvm_cbe_possessive_quantifier_6__PHI_TEMPORARY = llvm_cbe_possessive_quantifier_512675_1; /* for PHI node */ - llvm_cbe_c_32__PHI_TEMPORARY = llvm_cbe_tmp20682069; /* for PHI node */ - llvm_cbe_reqbyte103_7__PHI_TEMPORARY = llvm_cbe_reqbyte103_1; /* for PHI node */ - llvm_cbe_op_type_5__PHI_TEMPORARY = ((unsigned int )26); /* for PHI node */ - llvm_cbe_repeat_type_6__PHI_TEMPORARY = llvm_cbe_repeat_type_012701_1; /* for PHI node */ - goto llvm_cbe_OUTPUT_SINGLE_REPEAT; - } else { - goto llvm_cbe_cond_true2090; - } - -llvm_cbe_cond_true2090: - llvm_cbe_possessive_quantifier_6__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - llvm_cbe_c_32__PHI_TEMPORARY = llvm_cbe_tmp20682069; /* for PHI node */ - llvm_cbe_reqbyte103_7__PHI_TEMPORARY = llvm_cbe_reqbyte103_1; /* for PHI node */ - llvm_cbe_op_type_5__PHI_TEMPORARY = ((unsigned int )26); /* for PHI node */ - llvm_cbe_repeat_type_6__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_OUTPUT_SINGLE_REPEAT; - -llvm_cbe_cond_true2100: - llvm_cbe_possessive_quantifier_612736_0 = llvm_cbe_possessive_quantifier_612736_0__PHI_TEMPORARY; - llvm_cbe_c_3212739_0 = llvm_cbe_c_3212739_0__PHI_TEMPORARY; - llvm_cbe_reqbyte103_712742_0 = llvm_cbe_reqbyte103_712742_0__PHI_TEMPORARY; - llvm_cbe_op_type_512745_0 = llvm_cbe_op_type_512745_0__PHI_TEMPORARY; - llvm_cbe_repeat_type_612750_0 = llvm_cbe_repeat_type_612750_0__PHI_TEMPORARY; - llvm_cbe_tmp2103 = *(&llvm_cbe_previous_25708_1[((unsigned int )1)]); - llvm_cbe_tmp21032104 = ((unsigned int )(unsigned char )llvm_cbe_tmp2103); - llvm_cbe_tmp2107 = *(&llvm_cbe_previous_25708_1[((unsigned int )2)]); - llvm_cbe_tmp21072108 = ((unsigned int )(unsigned char )llvm_cbe_tmp2107); - llvm_cbe_possessive_quantifier_612736_1__PHI_TEMPORARY = llvm_cbe_possessive_quantifier_612736_0; /* for PHI node */ - llvm_cbe_c_3212739_1__PHI_TEMPORARY = llvm_cbe_c_3212739_0; /* for PHI node */ - llvm_cbe_reqbyte103_712742_1__PHI_TEMPORARY = llvm_cbe_reqbyte103_712742_0; /* for PHI node */ - llvm_cbe_op_type_512745_1__PHI_TEMPORARY = llvm_cbe_op_type_512745_0; /* for PHI node */ - llvm_cbe_repeat_type_612750_1__PHI_TEMPORARY = llvm_cbe_repeat_type_612750_0; /* for PHI node */ - llvm_cbe_prop_value_0__PHI_TEMPORARY = llvm_cbe_tmp21072108; /* for PHI node */ - llvm_cbe_prop_type_0__PHI_TEMPORARY = llvm_cbe_tmp21032104; /* for PHI node */ - goto llvm_cbe_cond_next2111; - -llvm_cbe_cond_false2197: - if ((llvm_cbe_repeat_max_9 == ((unsigned int )1))) { - llvm_cbe_repeat_max_13__PHI_TEMPORARY = llvm_cbe_repeat_max_9; /* for PHI node */ - llvm_cbe_save_hwm_5__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_code105_13__PHI_TEMPORARY = llvm_cbe_code105_10; /* for PHI node */ - llvm_cbe_reqbyte103_9__PHI_TEMPORARY = llvm_cbe_reqbyte103_712742_1; /* for PHI node */ - goto llvm_cbe_END_REPEAT; - } else { - goto llvm_cbe_cond_next2204; - } - -llvm_cbe_cond_true2185: - if ((llvm_cbe_repeat_max_9 == ((unsigned int )-1))) { - goto llvm_cbe_cond_true2190; - } else { - goto llvm_cbe_cond_false2197; - } - -llvm_cbe_cond_next2127: - llvm_cbe_tmp2130 = llvm_cbe_repeat_type_612750_1 + llvm_cbe_op_type_512745_1; - switch (llvm_cbe_repeat_min_9) { - default: - goto llvm_cbe_cond_false2226; -; - case ((unsigned int )0): - goto llvm_cbe_cond_true2135; - break; - case ((unsigned int )1): - goto llvm_cbe_cond_true2185; - } -llvm_cbe_cond_next2119: - if ((llvm_cbe_repeat_max_9 == ((unsigned int )1))) { - goto llvm_cbe_cond_next2127; - } else { - goto llvm_cbe_cond_true2124; - } - -llvm_cbe_cond_true2124: - *llvm_cbe_tmp2377 = ((unsigned int )1); - goto llvm_cbe_cond_next2127; - -llvm_cbe_cond_next2342: - llvm_cbe_repeat_max_11 = llvm_cbe_repeat_max_11__PHI_TEMPORARY; - llvm_cbe_code105_14 = llvm_cbe_code105_14__PHI_TEMPORARY; - *llvm_cbe_code105_14 = (((unsigned char )llvm_cbe_c_3212739_1)); - llvm_cbe_tmp2347 = &llvm_cbe_code105_14[((unsigned int )1)]; - if ((llvm_cbe_possessive_quantifier_612736_1 == ((unsigned int )0))) { - llvm_cbe_repeat_max_13__PHI_TEMPORARY = llvm_cbe_repeat_max_11; /* for PHI node */ - llvm_cbe_save_hwm_5__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_code105_13__PHI_TEMPORARY = llvm_cbe_tmp2347; /* for PHI node */ - llvm_cbe_reqbyte103_9__PHI_TEMPORARY = llvm_cbe_reqbyte103_712742_1; /* for PHI node */ - goto llvm_cbe_END_REPEAT; - } else { - llvm_cbe_repeat_max_12__PHI_TEMPORARY = llvm_cbe_repeat_max_11; /* for PHI node */ - llvm_cbe_save_hwm_413043_0__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_code105_1213058_0__PHI_TEMPORARY = llvm_cbe_tmp2347; /* for PHI node */ - llvm_cbe_reqbyte103_813077_0__PHI_TEMPORARY = llvm_cbe_reqbyte103_712742_1; /* for PHI node */ - goto llvm_cbe_cond_true3056; - } - -llvm_cbe_cond_true2140: - *llvm_cbe_previous_25708_1 = (((unsigned char )(llvm_cbe_tmp21412142 + ((unsigned char )30)))); - llvm_cbe_tmp2146 = &llvm_cbe_previous_25708_1[((unsigned int )1)]; - llvm_cbe_repeat_max_11__PHI_TEMPORARY = llvm_cbe_repeat_max_9; /* for PHI node */ - llvm_cbe_code105_14__PHI_TEMPORARY = llvm_cbe_tmp2146; /* for PHI node */ - goto llvm_cbe_cond_next2342; - -llvm_cbe_cond_true2135: - llvm_cbe_tmp21412142 = ((unsigned char )llvm_cbe_tmp2130); - if ((llvm_cbe_repeat_max_9 == ((unsigned int )-1))) { - goto llvm_cbe_cond_true2140; - } else { - goto llvm_cbe_cond_false2147; - } - -llvm_cbe_cond_true2152: - *llvm_cbe_previous_25708_1 = (((unsigned char )(llvm_cbe_tmp21412142 + ((unsigned char )34)))); - llvm_cbe_tmp2158 = &llvm_cbe_previous_25708_1[((unsigned int )1)]; - llvm_cbe_repeat_max_11__PHI_TEMPORARY = llvm_cbe_repeat_max_9; /* for PHI node */ - llvm_cbe_code105_14__PHI_TEMPORARY = llvm_cbe_tmp2158; /* for PHI node */ - goto llvm_cbe_cond_next2342; - -llvm_cbe_cond_false2147: - if ((llvm_cbe_repeat_max_9 == ((unsigned int )1))) { - goto llvm_cbe_cond_true2152; - } else { - goto llvm_cbe_cond_false2159; - } - -llvm_cbe_cond_false2159: - *llvm_cbe_previous_25708_1 = (((unsigned char )(llvm_cbe_tmp21412142 + ((unsigned char )36)))); - *(&llvm_cbe_previous_25708_1[((unsigned int )1)]) = (((unsigned char )(((unsigned int )(((unsigned int )llvm_cbe_repeat_max_9) >> ((unsigned int )((unsigned int )8))))))); - *(&llvm_cbe_previous_25708_1[((unsigned int )2)]) = (((unsigned char )llvm_cbe_repeat_max_9)); - llvm_cbe_tmp2177 = &llvm_cbe_previous_25708_1[((unsigned int )3)]; - llvm_cbe_repeat_max_11__PHI_TEMPORARY = llvm_cbe_repeat_max_9; /* for PHI node */ - llvm_cbe_code105_14__PHI_TEMPORARY = llvm_cbe_tmp2177; /* for PHI node */ - goto llvm_cbe_cond_next2342; - -llvm_cbe_cond_true2190: - *llvm_cbe_previous_25708_1 = (((unsigned char )((((unsigned char )llvm_cbe_tmp2130)) + ((unsigned char )32)))); - llvm_cbe_tmp2196 = &llvm_cbe_previous_25708_1[((unsigned int )1)]; - llvm_cbe_repeat_max_11__PHI_TEMPORARY = llvm_cbe_repeat_max_9; /* for PHI node */ - llvm_cbe_code105_14__PHI_TEMPORARY = llvm_cbe_tmp2196; /* for PHI node */ - goto llvm_cbe_cond_next2342; - -llvm_cbe_cond_next2204: - *llvm_cbe_code105_10 = (((unsigned char )((((unsigned char )llvm_cbe_tmp2130)) + ((unsigned char )36)))); - *(&llvm_cbe_code105_10[((unsigned int )1)]) = (((unsigned char )(((unsigned int )(((unsigned int )(llvm_cbe_repeat_max_9 + ((unsigned int )65535))) >> ((unsigned int )((unsigned int )8))))))); - *(&llvm_cbe_code105_10[((unsigned int )2)]) = (((unsigned char )((((unsigned char )llvm_cbe_repeat_max_9)) + ((unsigned char )-1)))); - llvm_cbe_tmp2224 = &llvm_cbe_code105_10[((unsigned int )3)]; - llvm_cbe_repeat_max_11__PHI_TEMPORARY = llvm_cbe_repeat_max_9; /* for PHI node */ - llvm_cbe_code105_14__PHI_TEMPORARY = llvm_cbe_tmp2224; /* for PHI node */ - goto llvm_cbe_cond_next2342; - -llvm_cbe_cond_true2259: - *llvm_cbe_tmp2254 = (((unsigned char )llvm_cbe_prop_type_0)); - *(&llvm_cbe_previous_25708_1[((unsigned int )5)]) = (((unsigned char )llvm_cbe_prop_value_0)); - *(&llvm_cbe_previous_25708_1[((unsigned int )6)]) = llvm_cbe_tmp2273; - llvm_cbe_tmp227612756 = &llvm_cbe_previous_25708_1[((unsigned int )7)]; - llvm_cbe_repeat_max_11__PHI_TEMPORARY = llvm_cbe_repeat_max_9; /* for PHI node */ - llvm_cbe_code105_14__PHI_TEMPORARY = llvm_cbe_tmp227612756; /* for PHI node */ - goto llvm_cbe_cond_next2342; - -llvm_cbe_cond_true2249: - *llvm_cbe_tmp2244 = (((unsigned char )llvm_cbe_c_3212739_1)); - llvm_cbe_tmp2254 = &llvm_cbe_previous_25708_1[((unsigned int )4)]; - llvm_cbe_tmp2273 = ((unsigned char )((((unsigned char )llvm_cbe_tmp2130)) + ((unsigned char )30))); - if ((((signed int )llvm_cbe_prop_type_0) > ((signed int )((unsigned int )-1)))) { - goto llvm_cbe_cond_true2259; - } else { - goto llvm_cbe_cond_next2270; - } - -llvm_cbe_cond_false2226: - *llvm_cbe_previous_25708_1 = (((unsigned char )((((unsigned char )llvm_cbe_op_type_512745_1)) + ((unsigned char )38)))); - *(&llvm_cbe_previous_25708_1[((unsigned int )1)]) = (((unsigned char )(((unsigned int )(((unsigned int )llvm_cbe_repeat_min_9) >> ((unsigned int )((unsigned int )8))))))); - *(&llvm_cbe_previous_25708_1[((unsigned int )2)]) = (((unsigned char )llvm_cbe_repeat_min_9)); - llvm_cbe_tmp2244 = &llvm_cbe_previous_25708_1[((unsigned int )3)]; - if ((((signed int )llvm_cbe_repeat_max_9) < ((signed int )((unsigned int )0)))) { - goto llvm_cbe_cond_true2249; - } else { - goto llvm_cbe_cond_false2277; - } - -llvm_cbe_cond_next2270: - *llvm_cbe_tmp2254 = llvm_cbe_tmp2273; - llvm_cbe_tmp2276 = &llvm_cbe_previous_25708_1[((unsigned int )5)]; - llvm_cbe_repeat_max_11__PHI_TEMPORARY = llvm_cbe_repeat_max_9; /* for PHI node */ - llvm_cbe_code105_14__PHI_TEMPORARY = llvm_cbe_tmp2276; /* for PHI node */ - goto llvm_cbe_cond_next2342; - -llvm_cbe_cond_false2277: - if ((llvm_cbe_repeat_min_9 == llvm_cbe_repeat_max_9)) { - llvm_cbe_repeat_max_11__PHI_TEMPORARY = llvm_cbe_repeat_max_9; /* for PHI node */ - llvm_cbe_code105_14__PHI_TEMPORARY = llvm_cbe_tmp2244; /* for PHI node */ - goto llvm_cbe_cond_next2342; - } else { - goto llvm_cbe_cond_true2283; - } - -llvm_cbe_cond_true2312: - *llvm_cbe_code105_16 = (((unsigned char )(llvm_cbe_tmp23132314 + ((unsigned char )34)))); - llvm_cbe_tmp2318 = &llvm_cbe_code105_16[((unsigned int )1)]; - llvm_cbe_repeat_max_11__PHI_TEMPORARY = llvm_cbe_tmp2307; /* for PHI node */ - llvm_cbe_code105_14__PHI_TEMPORARY = llvm_cbe_tmp2318; /* for PHI node */ - goto llvm_cbe_cond_next2342; - -llvm_cbe_cond_next2304: - llvm_cbe_code105_16 = llvm_cbe_code105_16__PHI_TEMPORARY; - llvm_cbe_tmp2307 = llvm_cbe_repeat_max_9 - llvm_cbe_repeat_min_9; - llvm_cbe_tmp23132314 = ((unsigned char )llvm_cbe_tmp2130); - if ((llvm_cbe_tmp2307 == ((unsigned int )1))) { - goto llvm_cbe_cond_true2312; - } else { - goto llvm_cbe_cond_false2319; - } - -llvm_cbe_cond_true2283: - *llvm_cbe_tmp2244 = (((unsigned char )llvm_cbe_c_3212739_1)); - llvm_cbe_tmp2288 = &llvm_cbe_previous_25708_1[((unsigned int )4)]; - if ((((signed int )llvm_cbe_prop_type_0) > ((signed int )((unsigned int )-1)))) { - goto llvm_cbe_cond_true2293; - } else { - llvm_cbe_code105_16__PHI_TEMPORARY = llvm_cbe_tmp2288; /* for PHI node */ - goto llvm_cbe_cond_next2304; - } - -llvm_cbe_cond_true2293: - *llvm_cbe_tmp2288 = (((unsigned char )llvm_cbe_prop_type_0)); - *(&llvm_cbe_previous_25708_1[((unsigned int )5)]) = (((unsigned char )llvm_cbe_prop_value_0)); - llvm_cbe_tmp2303 = &llvm_cbe_previous_25708_1[((unsigned int )6)]; - llvm_cbe_code105_16__PHI_TEMPORARY = llvm_cbe_tmp2303; /* for PHI node */ - goto llvm_cbe_cond_next2304; - -llvm_cbe_cond_false2319: - *llvm_cbe_code105_16 = (((unsigned char )(llvm_cbe_tmp23132314 + ((unsigned char )36)))); - *(&llvm_cbe_code105_16[((unsigned int )1)]) = (((unsigned char )(((unsigned int )(((unsigned int )llvm_cbe_tmp2307) >> ((unsigned int )((unsigned int )8))))))); - *(&llvm_cbe_code105_16[((unsigned int )2)]) = (((unsigned char )llvm_cbe_tmp2307)); - llvm_cbe_tmp2337 = &llvm_cbe_code105_16[((unsigned int )3)]; - llvm_cbe_repeat_max_11__PHI_TEMPORARY = llvm_cbe_tmp2307; /* for PHI node */ - llvm_cbe_code105_14__PHI_TEMPORARY = llvm_cbe_tmp2337; /* for PHI node */ - goto llvm_cbe_cond_next2342; - -llvm_cbe_cond_true2363: - if ((llvm_cbe_repeat_max_9 == ((unsigned int )0))) { - llvm_cbe_repeat_max_13__PHI_TEMPORARY = llvm_cbe_repeat_max_9; /* for PHI node */ - llvm_cbe_save_hwm_5__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_code105_13__PHI_TEMPORARY = llvm_cbe_previous_25708_1; /* for PHI node */ - llvm_cbe_reqbyte103_9__PHI_TEMPORARY = llvm_cbe_reqbyte103_1; /* for PHI node */ - goto llvm_cbe_END_REPEAT; - } else { - goto llvm_cbe_cond_next2370; - } - -llvm_cbe_cond_false2348: - if (((((unsigned char )(((unsigned char )(llvm_cbe_tmp2027 + ((unsigned char )-77))))) < ((unsigned char )((unsigned char )2))) | (llvm_cbe_tmp2027 == ((unsigned char )80)))) { - goto llvm_cbe_cond_true2363; - } else { - goto llvm_cbe_cond_false2475; - } - -llvm_cbe_cond_true2547: - if ((llvm_cbe_repeat_max_9 == ((unsigned int )0))) { - llvm_cbe_repeat_max_13__PHI_TEMPORARY = llvm_cbe_repeat_max_9; /* for PHI node */ - llvm_cbe_save_hwm_5__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_code105_13__PHI_TEMPORARY = llvm_cbe_previous_25708_1; /* for PHI node */ - llvm_cbe_reqbyte103_9__PHI_TEMPORARY = llvm_cbe_reqbyte103_1; /* for PHI node */ - goto llvm_cbe_END_REPEAT; - } else { - goto llvm_cbe_cond_next2554; - } - -llvm_cbe_cond_next2542: - llvm_cbe_ketoffset_7 = llvm_cbe_ketoffset_7__PHI_TEMPORARY; - if ((llvm_cbe_repeat_min_9 == ((unsigned int )0))) { - goto llvm_cbe_cond_true2547; - } else { - goto llvm_cbe_cond_false2628; - } - -llvm_cbe_cond_next2511: - if ((llvm_cbe_repeat_max_9 == ((unsigned int )-1))) { - llvm_cbe_ket_6_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb2518; - } else { - llvm_cbe_ketoffset_7__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_cond_next2542; - } - -llvm_cbe_cond_next2504: - if ((((signed int )llvm_cbe_tmp2488) > ((signed int )((unsigned int )30000)))) { - goto llvm_cbe_cond_true2509; - } else { - goto llvm_cbe_cond_next2511; - } - -llvm_cbe_cond_true2482: - llvm_cbe_tmp24842485 = ((unsigned int )(unsigned long)llvm_cbe_code105_10); - llvm_cbe_tmp2488 = llvm_cbe_tmp24842485 - (((unsigned int )(unsigned long)llvm_cbe_previous_25708_1)); - if ((llvm_cbe_tmp2027 == ((unsigned char )95))) { - goto llvm_cbe_cond_true2494; - } else { - goto llvm_cbe_cond_next2504; - } - -llvm_cbe_cond_false2475: - if ((((unsigned char )(((unsigned char )(llvm_cbe_tmp2027 + ((unsigned char )-92))))) < ((unsigned char )((unsigned char )4)))) { - goto llvm_cbe_cond_true2482; - } else { - goto llvm_cbe_cond_false3045; - } - -llvm_cbe_cond_true2494: - llvm_cbe_tmp2497 = *(&llvm_cbe_previous_25708_1[((unsigned int )3)]); - if ((llvm_cbe_tmp2497 == ((unsigned char )101))) { - goto llvm_cbe_cond_true2501; - } else { - goto llvm_cbe_cond_next2504; - } - -llvm_cbe_bb2536: - llvm_cbe_tmp2541 = llvm_cbe_tmp24842485 - (((unsigned int )(unsigned long)llvm_cbe_tmp2530)); - llvm_cbe_ketoffset_7__PHI_TEMPORARY = llvm_cbe_tmp2541; /* for PHI node */ - goto llvm_cbe_cond_next2542; - - do { /* Syntactic loop 'bb2518' to make GCC happy */ -llvm_cbe_bb2518: - llvm_cbe_ket_6_rec = llvm_cbe_ket_6_rec__PHI_TEMPORARY; - llvm_cbe_tmp2521 = *(&llvm_cbe_previous_25708_1[(llvm_cbe_ket_6_rec + ((unsigned int )1))]); - llvm_cbe_tmp2526 = *(&llvm_cbe_previous_25708_1[(llvm_cbe_ket_6_rec + ((unsigned int )2))]); - llvm_cbe_tmp2530_rec = llvm_cbe_ket_6_rec + (((((unsigned int )(unsigned char )llvm_cbe_tmp2521)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp2526))); - llvm_cbe_tmp2530 = &llvm_cbe_previous_25708_1[llvm_cbe_tmp2530_rec]; - llvm_cbe_tmp2532 = *llvm_cbe_tmp2530; - if ((llvm_cbe_tmp2532 == ((unsigned char )84))) { - goto llvm_cbe_bb2536; - } else { - llvm_cbe_ket_6_rec__PHI_TEMPORARY = llvm_cbe_tmp2530_rec; /* for PHI node */ - goto llvm_cbe_bb2518; - } - - } while (1); /* end of syntactic loop 'bb2518' */ -llvm_cbe_cond_next3051: - llvm_cbe_repeat_max_15 = llvm_cbe_repeat_max_15__PHI_TEMPORARY; - llvm_cbe_save_hwm_4 = llvm_cbe_save_hwm_4__PHI_TEMPORARY; - llvm_cbe_code105_12 = llvm_cbe_code105_12__PHI_TEMPORARY; - llvm_cbe_reqbyte103_8 = llvm_cbe_reqbyte103_8__PHI_TEMPORARY; - if ((llvm_cbe_possessive_quantifier_512675_1 == ((unsigned int )0))) { - llvm_cbe_repeat_max_13__PHI_TEMPORARY = llvm_cbe_repeat_max_15; /* for PHI node */ - llvm_cbe_save_hwm_5__PHI_TEMPORARY = llvm_cbe_save_hwm_4; /* for PHI node */ - llvm_cbe_code105_13__PHI_TEMPORARY = llvm_cbe_code105_12; /* for PHI node */ - llvm_cbe_reqbyte103_9__PHI_TEMPORARY = llvm_cbe_reqbyte103_8; /* for PHI node */ - goto llvm_cbe_END_REPEAT; - } else { - llvm_cbe_repeat_max_12__PHI_TEMPORARY = llvm_cbe_repeat_max_15; /* for PHI node */ - llvm_cbe_save_hwm_413043_0__PHI_TEMPORARY = llvm_cbe_save_hwm_4; /* for PHI node */ - llvm_cbe_code105_1213058_0__PHI_TEMPORARY = llvm_cbe_code105_12; /* for PHI node */ - llvm_cbe_reqbyte103_813077_0__PHI_TEMPORARY = llvm_cbe_reqbyte103_8; /* for PHI node */ - goto llvm_cbe_cond_true3056; - } - -llvm_cbe_cond_next2390: - *llvm_cbe_code105_10 = (((unsigned char )((((unsigned char )llvm_cbe_repeat_type_012701_1)) + ((unsigned char )69)))); - llvm_cbe_tmp2396 = &llvm_cbe_code105_10[((unsigned int )1)]; - llvm_cbe_repeat_max_15__PHI_TEMPORARY = llvm_cbe_repeat_max_9; /* for PHI node */ - llvm_cbe_save_hwm_4__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_code105_12__PHI_TEMPORARY = llvm_cbe_tmp2396; /* for PHI node */ - llvm_cbe_reqbyte103_8__PHI_TEMPORARY = llvm_cbe_reqbyte103_1; /* for PHI node */ - goto llvm_cbe_cond_next3051; - -llvm_cbe_cond_next2378: - if (((llvm_cbe_repeat_min_9 == ((unsigned int )0)) & (llvm_cbe_repeat_max_9 == ((unsigned int )-1)))) { - goto llvm_cbe_cond_next2390; - } else { - goto llvm_cbe_bb2397; - } - -llvm_cbe_cond_next2370: - if ((llvm_cbe_repeat_max_9 == ((unsigned int )1))) { - goto llvm_cbe_cond_next2378; - } else { - goto llvm_cbe_cond_true2375; - } - -llvm_cbe_cond_true2375: - *llvm_cbe_tmp2377 = ((unsigned int )1); - goto llvm_cbe_cond_next2378; - -llvm_cbe_cond_next2409: - *llvm_cbe_code105_10 = (((unsigned char )((((unsigned char )llvm_cbe_repeat_type_012701_1)) + ((unsigned char )71)))); - llvm_cbe_tmp2415 = &llvm_cbe_code105_10[((unsigned int )1)]; - llvm_cbe_repeat_max_15__PHI_TEMPORARY = llvm_cbe_repeat_max_9; /* for PHI node */ - llvm_cbe_save_hwm_4__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_code105_12__PHI_TEMPORARY = llvm_cbe_tmp2415; /* for PHI node */ - llvm_cbe_reqbyte103_8__PHI_TEMPORARY = llvm_cbe_reqbyte103_1; /* for PHI node */ - goto llvm_cbe_cond_next3051; - -llvm_cbe_bb2397: - if (((llvm_cbe_repeat_min_9 == ((unsigned int )1)) & (llvm_cbe_repeat_max_9 == ((unsigned int )-1)))) { - goto llvm_cbe_cond_next2409; - } else { - goto llvm_cbe_bb2416; - } - -llvm_cbe_cond_next2428: - *llvm_cbe_code105_10 = (((unsigned char )(llvm_cbe_tmp24362437 + ((unsigned char )73)))); - llvm_cbe_tmp2434 = &llvm_cbe_code105_10[((unsigned int )1)]; - llvm_cbe_repeat_max_15__PHI_TEMPORARY = llvm_cbe_repeat_max_9; /* for PHI node */ - llvm_cbe_save_hwm_4__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_code105_12__PHI_TEMPORARY = llvm_cbe_tmp2434; /* for PHI node */ - llvm_cbe_reqbyte103_8__PHI_TEMPORARY = llvm_cbe_reqbyte103_1; /* for PHI node */ - goto llvm_cbe_cond_next3051; - -llvm_cbe_bb2416: - llvm_cbe_tmp24362437 = ((unsigned char )llvm_cbe_repeat_type_012701_1); - if (((llvm_cbe_repeat_min_9 == ((unsigned int )0)) & (llvm_cbe_repeat_max_9 == ((unsigned int )1)))) { - goto llvm_cbe_cond_next2428; - } else { - goto llvm_cbe_bb2435; - } - -llvm_cbe_bb2435: - *llvm_cbe_code105_10 = (((unsigned char )(llvm_cbe_tmp24362437 + ((unsigned char )75)))); - *(&llvm_cbe_code105_10[((unsigned int )1)]) = (((unsigned char )(((unsigned int )(((unsigned int )llvm_cbe_repeat_min_9) >> ((unsigned int )((unsigned int )8))))))); - *(&llvm_cbe_code105_10[((unsigned int )2)]) = (((unsigned char )llvm_cbe_repeat_min_9)); - llvm_cbe_repeat_max_14 = (((llvm_cbe_repeat_max_9 == ((unsigned int )-1))) ? (((unsigned int )0)) : (llvm_cbe_repeat_max_9)); - *(&llvm_cbe_code105_10[((unsigned int )3)]) = (((unsigned char )(((unsigned int )(((unsigned int )llvm_cbe_repeat_max_14) >> ((unsigned int )((unsigned int )8))))))); - *(&llvm_cbe_code105_10[((unsigned int )4)]) = (((unsigned char )llvm_cbe_repeat_max_14)); - llvm_cbe_tmp2471 = &llvm_cbe_code105_10[((unsigned int )5)]; - llvm_cbe_repeat_max_15__PHI_TEMPORARY = llvm_cbe_repeat_max_14; /* for PHI node */ - llvm_cbe_save_hwm_4__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_code105_12__PHI_TEMPORARY = llvm_cbe_tmp2471; /* for PHI node */ - llvm_cbe_reqbyte103_8__PHI_TEMPORARY = llvm_cbe_reqbyte103_1; /* for PHI node */ - goto llvm_cbe_cond_next3051; - -llvm_cbe_bb2970_preheader: - llvm_cbe_bralink_11_ph = llvm_cbe_bralink_11_ph__PHI_TEMPORARY; - llvm_cbe_save_hwm_9_ph = llvm_cbe_save_hwm_9_ph__PHI_TEMPORARY; - llvm_cbe_code105_22_ph = llvm_cbe_code105_22_ph__PHI_TEMPORARY; - if ((llvm_cbe_bralink_11_ph == ((unsigned char *)/*NULL*/0))) { - llvm_cbe_repeat_max_15__PHI_TEMPORARY = llvm_cbe_repeat_max_16; /* for PHI node */ - llvm_cbe_save_hwm_4__PHI_TEMPORARY = llvm_cbe_save_hwm_9_ph; /* for PHI node */ - llvm_cbe_code105_12__PHI_TEMPORARY = llvm_cbe_code105_22_ph; /* for PHI node */ - llvm_cbe_reqbyte103_8__PHI_TEMPORARY = llvm_cbe_reqbyte103_1213269_0; /* for PHI node */ - goto llvm_cbe_cond_next3051; - } else { - llvm_cbe_indvar26616__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_bralink_1126488__PHI_TEMPORARY = llvm_cbe_bralink_11_ph; /* for PHI node */ - goto llvm_cbe_bb2911; - } - -llvm_cbe_cond_next2763: - llvm_cbe_tmp2765 = *llvm_cbe_iftmp_509_0; - llvm_cbe_tmp2766 = *(&llvm_cbe_length_prevgroup); - *llvm_cbe_iftmp_509_0 = ((llvm_cbe_tmp2765 + ((unsigned int )-6)) + ((llvm_cbe_tmp2766 + ((unsigned int )7)) * llvm_cbe_repeat_max_16)); - llvm_cbe_bralink_11_ph__PHI_TEMPORARY = llvm_cbe_bralink_813241_0; /* for PHI node */ - llvm_cbe_save_hwm_9_ph__PHI_TEMPORARY = llvm_cbe_save_hwm_313252_0; /* for PHI node */ - llvm_cbe_code105_22_ph__PHI_TEMPORARY = llvm_cbe_code105_1813259_0; /* for PHI node */ - goto llvm_cbe_bb2970_preheader; - -llvm_cbe_cond_true2751: - llvm_cbe_repeat_max_16 = llvm_cbe_repeat_max_16__PHI_TEMPORARY; - llvm_cbe_bralink_813241_0 = llvm_cbe_bralink_813241_0__PHI_TEMPORARY; - llvm_cbe_save_hwm_313252_0 = llvm_cbe_save_hwm_313252_0__PHI_TEMPORARY; - llvm_cbe_previous_913258_0 = llvm_cbe_previous_913258_0__PHI_TEMPORARY; - llvm_cbe_code105_1813259_0 = llvm_cbe_code105_1813259_0__PHI_TEMPORARY; - llvm_cbe_reqbyte103_1213269_0 = llvm_cbe_reqbyte103_1213269_0__PHI_TEMPORARY; - if (((llvm_cbe_iftmp_509_0 == ((unsigned int *)/*NULL*/0)) | (((signed int )llvm_cbe_repeat_max_16) < ((signed int )((unsigned int )1))))) { - goto llvm_cbe_bb2773; - } else { - goto llvm_cbe_cond_next2763; - } - -llvm_cbe_cond_next2625: - llvm_cbe_bralink_7 = llvm_cbe_bralink_7__PHI_TEMPORARY; - llvm_cbe_previous_8 = llvm_cbe_previous_8__PHI_TEMPORARY; - llvm_cbe_code105_17 = llvm_cbe_code105_17__PHI_TEMPORARY; - llvm_cbe_tmp2627 = llvm_cbe_repeat_max_9 + ((unsigned int )-1); - if ((((signed int )llvm_cbe_tmp2627) > ((signed int )((unsigned int )-1)))) { - llvm_cbe_repeat_max_16__PHI_TEMPORARY = llvm_cbe_tmp2627; /* for PHI node */ - llvm_cbe_bralink_813241_0__PHI_TEMPORARY = llvm_cbe_bralink_7; /* for PHI node */ - llvm_cbe_save_hwm_313252_0__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_previous_913258_0__PHI_TEMPORARY = llvm_cbe_previous_8; /* for PHI node */ - llvm_cbe_code105_1813259_0__PHI_TEMPORARY = llvm_cbe_code105_17; /* for PHI node */ - llvm_cbe_reqbyte103_1213269_0__PHI_TEMPORARY = llvm_cbe_reqbyte103_1; /* for PHI node */ - goto llvm_cbe_cond_true2751; - } else { - llvm_cbe_repeat_max_17__PHI_TEMPORARY = llvm_cbe_tmp2627; /* for PHI node */ - llvm_cbe_save_hwm_313252_1__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_code105_1813259_1__PHI_TEMPORARY = llvm_cbe_code105_17; /* for PHI node */ - llvm_cbe_reqbyte103_1213269_1__PHI_TEMPORARY = llvm_cbe_reqbyte103_1; /* for PHI node */ - goto llvm_cbe_cond_false2976; - } - -llvm_cbe_cond_true2559: - adjust_recurse(llvm_cbe_previous_25708_1, ((unsigned int )1), llvm_cbe_cd, llvm_cbe_save_hwm_79347_9); - llvm_cbe_tmp2567 = &llvm_cbe_previous_25708_1[((unsigned int )1)]; - ltmp_8_1 = memmove(llvm_cbe_tmp2567, llvm_cbe_previous_25708_1, llvm_cbe_tmp2488); - llvm_cbe_tmp2570 = &llvm_cbe_code105_10[((unsigned int )1)]; - *llvm_cbe_previous_25708_1 = (((unsigned char )((((unsigned char )llvm_cbe_repeat_type_012701_1)) + ((unsigned char )102)))); - llvm_cbe_bralink_7__PHI_TEMPORARY = ((unsigned char *)/*NULL*/0); /* for PHI node */ - llvm_cbe_previous_8__PHI_TEMPORARY = llvm_cbe_tmp2567; /* for PHI node */ - llvm_cbe_code105_17__PHI_TEMPORARY = llvm_cbe_tmp2570; /* for PHI node */ - goto llvm_cbe_cond_next2625; - -llvm_cbe_cond_next2554: - *llvm_cbe_code105_10 = ((unsigned char )0); - if ((((signed int )llvm_cbe_repeat_max_9) < ((signed int )((unsigned int )2)))) { - goto llvm_cbe_cond_true2559; - } else { - goto llvm_cbe_cond_false2577; - } - -llvm_cbe_cond_false2577: - adjust_recurse(llvm_cbe_previous_25708_1, ((unsigned int )4), llvm_cbe_cd, llvm_cbe_save_hwm_79347_9); - llvm_cbe_tmp2586 = &llvm_cbe_previous_25708_1[((unsigned int )4)]; - ltmp_9_1 = memmove(llvm_cbe_tmp2586, llvm_cbe_previous_25708_1, llvm_cbe_tmp2488); - llvm_cbe_tmp2589 = &llvm_cbe_code105_10[((unsigned int )4)]; - *llvm_cbe_previous_25708_1 = (((unsigned char )((((unsigned char )llvm_cbe_repeat_type_012701_1)) + ((unsigned char )102)))); - *(&llvm_cbe_previous_25708_1[((unsigned int )1)]) = ((unsigned char )93); - llvm_cbe_tmp2598 = &llvm_cbe_previous_25708_1[((unsigned int )2)]; - *llvm_cbe_tmp2598 = ((unsigned char )0); - *(&llvm_cbe_previous_25708_1[((unsigned int )3)]) = ((unsigned char )0); - llvm_cbe_bralink_7__PHI_TEMPORARY = llvm_cbe_tmp2598; /* for PHI node */ - llvm_cbe_previous_8__PHI_TEMPORARY = llvm_cbe_tmp2586; /* for PHI node */ - llvm_cbe_code105_17__PHI_TEMPORARY = llvm_cbe_tmp2589; /* for PHI node */ - goto llvm_cbe_cond_next2625; - -llvm_cbe_cond_next2746: - llvm_cbe_repeat_max_18 = llvm_cbe_repeat_max_18__PHI_TEMPORARY; - llvm_cbe_save_hwm_213284_1 = llvm_cbe_save_hwm_213284_1__PHI_TEMPORARY; - llvm_cbe_code105_2013285_1 = llvm_cbe_code105_2013285_1__PHI_TEMPORARY; - llvm_cbe_reqbyte103_1113286_1 = llvm_cbe_reqbyte103_1113286_1__PHI_TEMPORARY; - if ((((signed int )llvm_cbe_repeat_max_18) > ((signed int )((unsigned int )-1)))) { - llvm_cbe_repeat_max_16__PHI_TEMPORARY = llvm_cbe_repeat_max_18; /* for PHI node */ - llvm_cbe_bralink_813241_0__PHI_TEMPORARY = ((unsigned char *)/*NULL*/0); /* for PHI node */ - llvm_cbe_save_hwm_313252_0__PHI_TEMPORARY = llvm_cbe_save_hwm_213284_1; /* for PHI node */ - llvm_cbe_previous_913258_0__PHI_TEMPORARY = llvm_cbe_previous_25708_1; /* for PHI node */ - llvm_cbe_code105_1813259_0__PHI_TEMPORARY = llvm_cbe_code105_2013285_1; /* for PHI node */ - llvm_cbe_reqbyte103_1213269_0__PHI_TEMPORARY = llvm_cbe_reqbyte103_1113286_1; /* for PHI node */ - goto llvm_cbe_cond_true2751; - } else { - llvm_cbe_repeat_max_17__PHI_TEMPORARY = llvm_cbe_repeat_max_18; /* for PHI node */ - llvm_cbe_save_hwm_313252_1__PHI_TEMPORARY = llvm_cbe_save_hwm_213284_1; /* for PHI node */ - llvm_cbe_code105_1813259_1__PHI_TEMPORARY = llvm_cbe_code105_2013285_1; /* for PHI node */ - llvm_cbe_reqbyte103_1213269_1__PHI_TEMPORARY = llvm_cbe_reqbyte103_1113286_1; /* for PHI node */ - goto llvm_cbe_cond_false2976; - } - -llvm_cbe_cond_true2638: - llvm_cbe_tmp2640 = *llvm_cbe_iftmp_509_0; - llvm_cbe_tmp2643 = *(&llvm_cbe_length_prevgroup); - *llvm_cbe_iftmp_509_0 = (((llvm_cbe_repeat_min_9 + ((unsigned int )-1)) * llvm_cbe_tmp2643) + llvm_cbe_tmp2640); - if ((((signed int )llvm_cbe_repeat_max_9) > ((signed int )((unsigned int )0)))) { - llvm_cbe_save_hwm_213284_0__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_code105_2013285_0__PHI_TEMPORARY = llvm_cbe_code105_10; /* for PHI node */ - llvm_cbe_reqbyte103_1113286_0__PHI_TEMPORARY = llvm_cbe_reqbyte103_1; /* for PHI node */ - goto llvm_cbe_cond_true2741; - } else { - llvm_cbe_repeat_max_18__PHI_TEMPORARY = llvm_cbe_repeat_max_9; /* for PHI node */ - llvm_cbe_save_hwm_213284_1__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_code105_2013285_1__PHI_TEMPORARY = llvm_cbe_code105_10; /* for PHI node */ - llvm_cbe_reqbyte103_1113286_1__PHI_TEMPORARY = llvm_cbe_reqbyte103_1; /* for PHI node */ - goto llvm_cbe_cond_next2746; - } - -llvm_cbe_cond_true2633: - if ((llvm_cbe_iftmp_509_0 == ((unsigned int *)/*NULL*/0))) { - goto llvm_cbe_cond_false2647; - } else { - goto llvm_cbe_cond_true2638; - } - -llvm_cbe_cond_false2628: - if ((((signed int )llvm_cbe_repeat_min_9) > ((signed int )((unsigned int )1)))) { - goto llvm_cbe_cond_true2633; - } else { - llvm_cbe_save_hwm_2__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_code105_20__PHI_TEMPORARY = llvm_cbe_code105_10; /* for PHI node */ - llvm_cbe_reqbyte103_11__PHI_TEMPORARY = llvm_cbe_reqbyte103_1; /* for PHI node */ - goto llvm_cbe_cond_next2736; - } - -llvm_cbe_cond_next2736: - llvm_cbe_save_hwm_2 = llvm_cbe_save_hwm_2__PHI_TEMPORARY; - llvm_cbe_code105_20 = llvm_cbe_code105_20__PHI_TEMPORARY; - llvm_cbe_reqbyte103_11 = llvm_cbe_reqbyte103_11__PHI_TEMPORARY; - if ((((signed int )llvm_cbe_repeat_max_9) > ((signed int )((unsigned int )0)))) { - llvm_cbe_save_hwm_213284_0__PHI_TEMPORARY = llvm_cbe_save_hwm_2; /* for PHI node */ - llvm_cbe_code105_2013285_0__PHI_TEMPORARY = llvm_cbe_code105_20; /* for PHI node */ - llvm_cbe_reqbyte103_1113286_0__PHI_TEMPORARY = llvm_cbe_reqbyte103_11; /* for PHI node */ - goto llvm_cbe_cond_true2741; - } else { - llvm_cbe_repeat_max_18__PHI_TEMPORARY = llvm_cbe_repeat_max_9; /* for PHI node */ - llvm_cbe_save_hwm_213284_1__PHI_TEMPORARY = llvm_cbe_save_hwm_2; /* for PHI node */ - llvm_cbe_code105_2013285_1__PHI_TEMPORARY = llvm_cbe_code105_20; /* for PHI node */ - llvm_cbe_reqbyte103_1113286_1__PHI_TEMPORARY = llvm_cbe_reqbyte103_11; /* for PHI node */ - goto llvm_cbe_cond_next2746; - } - -llvm_cbe_cond_false2647: - llvm_cbe_reqbyte103_10 = ((((((signed int )llvm_cbe_reqbyte103_1) < ((signed int )((unsigned int )0))) & (llvm_cbe_groupsetfirstbyte_29395_9 != ((unsigned int )0)))) ? (llvm_cbe_firstbyte102_7) : (llvm_cbe_reqbyte103_1)); - if ((((signed int )llvm_cbe_repeat_min_9) > ((signed int )((unsigned int )1)))) { - goto llvm_cbe_bb2662_preheader; - } else { - llvm_cbe_save_hwm_2__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_code105_20__PHI_TEMPORARY = llvm_cbe_code105_10; /* for PHI node */ - llvm_cbe_reqbyte103_11__PHI_TEMPORARY = llvm_cbe_reqbyte103_10; /* for PHI node */ - goto llvm_cbe_cond_next2736; - } - -llvm_cbe_cond_next2736_loopexit: - llvm_cbe_tmp2725 = &llvm_cbe_code105_10[(llvm_cbe_code105_1913296_0_rec + llvm_cbe_tmp2488)]; - llvm_cbe_save_hwm_2__PHI_TEMPORARY = llvm_cbe_tmp2665; /* for PHI node */ - llvm_cbe_code105_20__PHI_TEMPORARY = llvm_cbe_tmp2725; /* for PHI node */ - llvm_cbe_reqbyte103_11__PHI_TEMPORARY = llvm_cbe_reqbyte103_10; /* for PHI node */ - goto llvm_cbe_cond_next2736; - - do { /* Syntactic loop 'bb2662' to make GCC happy */ -llvm_cbe_bb2662: - llvm_cbe_indvar26622 = llvm_cbe_indvar26622__PHI_TEMPORARY; - llvm_cbe_save_hwm_113294_0 = llvm_cbe_save_hwm_113294_0__PHI_TEMPORARY; - llvm_cbe_code105_1913296_0_rec = llvm_cbe_indvar26622 * llvm_cbe_tmp2488; - llvm_cbe_tmp2665 = *llvm_cbe_tmp203; - ltmp_10_1 = memcpy((&llvm_cbe_code105_10[llvm_cbe_code105_1913296_0_rec]), llvm_cbe_previous_25708_1, llvm_cbe_tmp2488); - if ((((unsigned char *)llvm_cbe_save_hwm_113294_0) < ((unsigned char *)llvm_cbe_tmp2665))) { - llvm_cbe_indvar26619__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb2670; - } else { - goto llvm_cbe_bb2728; - } - -llvm_cbe_bb2728: - llvm_cbe_indvar_next26623 = llvm_cbe_indvar26622 + ((unsigned int )1); - if ((((signed int )(llvm_cbe_indvar26622 + ((unsigned int )2))) < ((signed int )llvm_cbe_repeat_min_9))) { - llvm_cbe_indvar26622__PHI_TEMPORARY = llvm_cbe_indvar_next26623; /* for PHI node */ - llvm_cbe_save_hwm_113294_0__PHI_TEMPORARY = llvm_cbe_tmp2665; /* for PHI node */ - goto llvm_cbe_bb2662; - } else { - goto llvm_cbe_cond_next2736_loopexit; - } - - do { /* Syntactic loop 'bb2670' to make GCC happy */ -llvm_cbe_bb2670: - llvm_cbe_indvar26619 = llvm_cbe_indvar26619__PHI_TEMPORARY; - llvm_cbe_hc_813305_0_rec = llvm_cbe_indvar26619 << ((unsigned int )1); - llvm_cbe_tmp2673 = *llvm_cbe_tmp203; - llvm_cbe_tmp2676 = *(&llvm_cbe_save_hwm_113294_0[llvm_cbe_hc_813305_0_rec]); - llvm_cbe_tmp2680 = &llvm_cbe_save_hwm_113294_0[(llvm_cbe_hc_813305_0_rec | ((unsigned int )1))]; - llvm_cbe_tmp2681 = *llvm_cbe_tmp2680; - *llvm_cbe_tmp2673 = (((unsigned char )(((unsigned int )(((unsigned int )((((((unsigned int )(unsigned char )llvm_cbe_tmp2676)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp2681))) + llvm_cbe_tmp2488)) >> ((unsigned int )((unsigned int )8))))))); - llvm_cbe_tmp2691 = *llvm_cbe_tmp203; - llvm_cbe_tmp2700 = *llvm_cbe_tmp2680; - *(&llvm_cbe_tmp2691[((unsigned int )1)]) = (((unsigned char )(llvm_cbe_tmp2700 + llvm_cbe_tmp27022703))); - llvm_cbe_tmp2709 = *llvm_cbe_tmp203; - *llvm_cbe_tmp203 = (&llvm_cbe_tmp2709[((unsigned int )2)]); - if ((((unsigned char *)(&llvm_cbe_save_hwm_113294_0[(llvm_cbe_hc_813305_0_rec + ((unsigned int )2))])) < ((unsigned char *)llvm_cbe_tmp2665))) { - llvm_cbe_indvar26619__PHI_TEMPORARY = (llvm_cbe_indvar26619 + ((unsigned int )1)); /* for PHI node */ - goto llvm_cbe_bb2670; - } else { - goto llvm_cbe_bb2728; - } - - } while (1); /* end of syntactic loop 'bb2670' */ - } while (1); /* end of syntactic loop 'bb2662' */ -llvm_cbe_bb2662_preheader: - llvm_cbe_tmp27022703 = ((unsigned char )llvm_cbe_tmp2488); - llvm_cbe_indvar26622__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_save_hwm_113294_0__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - goto llvm_cbe_bb2662; - -llvm_cbe_cond_true2741: - llvm_cbe_save_hwm_213284_0 = llvm_cbe_save_hwm_213284_0__PHI_TEMPORARY; - llvm_cbe_code105_2013285_0 = llvm_cbe_code105_2013285_0__PHI_TEMPORARY; - llvm_cbe_reqbyte103_1113286_0 = llvm_cbe_reqbyte103_1113286_0__PHI_TEMPORARY; - llvm_cbe_tmp2744 = llvm_cbe_repeat_max_9 - llvm_cbe_repeat_min_9; - llvm_cbe_repeat_max_18__PHI_TEMPORARY = llvm_cbe_tmp2744; /* for PHI node */ - llvm_cbe_save_hwm_213284_1__PHI_TEMPORARY = llvm_cbe_save_hwm_213284_0; /* for PHI node */ - llvm_cbe_code105_2013285_1__PHI_TEMPORARY = llvm_cbe_code105_2013285_0; /* for PHI node */ - llvm_cbe_reqbyte103_1113286_1__PHI_TEMPORARY = llvm_cbe_reqbyte103_1113286_0; /* for PHI node */ - goto llvm_cbe_cond_next2746; - - do { /* Syntactic loop 'bb2905' to make GCC happy */ -llvm_cbe_bb2905: - llvm_cbe_indvar26613 = llvm_cbe_indvar26613__PHI_TEMPORARY; - llvm_cbe_bralink_10 = llvm_cbe_bralink_10__PHI_TEMPORARY; - llvm_cbe_save_hwm_8 = llvm_cbe_save_hwm_8__PHI_TEMPORARY; - llvm_cbe_code105_21 = llvm_cbe_code105_21__PHI_TEMPORARY; - llvm_cbe_i_9 = (llvm_cbe_repeat_max_16 - llvm_cbe_indvar26613) + ((unsigned int )-1); - if ((((signed int )llvm_cbe_i_9) > ((signed int )((unsigned int )-1)))) { - goto llvm_cbe_bb2776; - } else { - llvm_cbe_bralink_11_ph__PHI_TEMPORARY = llvm_cbe_bralink_10; /* for PHI node */ - llvm_cbe_save_hwm_9_ph__PHI_TEMPORARY = llvm_cbe_save_hwm_8; /* for PHI node */ - llvm_cbe_code105_22_ph__PHI_TEMPORARY = llvm_cbe_code105_21; /* for PHI node */ - goto llvm_cbe_bb2970_preheader; - } - -llvm_cbe_bb2898: - llvm_cbe_bralink_913313_1 = llvm_cbe_bralink_913313_1__PHI_TEMPORARY; - llvm_cbe_code105_2313314_1 = llvm_cbe_code105_2313314_1__PHI_TEMPORARY; - llvm_cbe_tmp2902 = &llvm_cbe_code105_2313314_1[llvm_cbe_tmp2488]; - llvm_cbe_indvar_next26614 = llvm_cbe_indvar26613 + ((unsigned int )1); - llvm_cbe_indvar26613__PHI_TEMPORARY = llvm_cbe_indvar_next26614; /* for PHI node */ - llvm_cbe_bralink_10__PHI_TEMPORARY = llvm_cbe_bralink_913313_1; /* for PHI node */ - llvm_cbe_save_hwm_8__PHI_TEMPORARY = llvm_cbe_tmp2781; /* for PHI node */ - llvm_cbe_code105_21__PHI_TEMPORARY = llvm_cbe_tmp2902; /* for PHI node */ - goto llvm_cbe_bb2905; - -llvm_cbe_cond_next2808: - llvm_cbe_iftmp_312_0 = llvm_cbe_iftmp_312_0__PHI_TEMPORARY; - *llvm_cbe_tmp2796 = (((unsigned char )(((unsigned int )(((unsigned int )llvm_cbe_iftmp_312_0) >> ((unsigned int )((unsigned int )8))))))); - *(&llvm_cbe_code105_21[((unsigned int )3)]) = (((unsigned char )llvm_cbe_iftmp_312_0)); - llvm_cbe_tmp2822 = &llvm_cbe_code105_21[((unsigned int )4)]; - ltmp_11_1 = memcpy(llvm_cbe_tmp2822, llvm_cbe_previous_913258_0, llvm_cbe_tmp2488); - if ((((unsigned char *)llvm_cbe_save_hwm_8) < ((unsigned char *)llvm_cbe_tmp2781))) { - llvm_cbe_bralink_913313_0_ph__PHI_TEMPORARY = llvm_cbe_tmp2796; /* for PHI node */ - llvm_cbe_code105_2313314_0_ph__PHI_TEMPORARY = llvm_cbe_tmp2822; /* for PHI node */ - goto llvm_cbe_bb2828_preheader; - } else { - llvm_cbe_bralink_913313_1__PHI_TEMPORARY = llvm_cbe_tmp2796; /* for PHI node */ - llvm_cbe_code105_2313314_1__PHI_TEMPORARY = llvm_cbe_tmp2822; /* for PHI node */ - goto llvm_cbe_bb2898; - } - -llvm_cbe_cond_true2792: - *llvm_cbe_tmp2787 = ((unsigned char )93); - llvm_cbe_tmp2796 = &llvm_cbe_code105_21[((unsigned int )2)]; - if ((llvm_cbe_bralink_10 == ((unsigned char *)/*NULL*/0))) { - llvm_cbe_iftmp_312_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_cond_next2808; - } else { - goto llvm_cbe_cond_true2801; - } - -llvm_cbe_bb2776: - llvm_cbe_tmp2781 = *llvm_cbe_tmp203; - *llvm_cbe_code105_21 = llvm_cbe_tmp2784; - llvm_cbe_tmp2787 = &llvm_cbe_code105_21[((unsigned int )1)]; - if ((llvm_cbe_i_9 == ((unsigned int )0))) { - goto llvm_cbe_cond_next2823; - } else { - goto llvm_cbe_cond_true2792; - } - -llvm_cbe_cond_true2801: - llvm_cbe_tmp2806 = (((unsigned int )(unsigned long)llvm_cbe_tmp2796)) - (((unsigned int )(unsigned long)llvm_cbe_bralink_10)); - llvm_cbe_iftmp_312_0__PHI_TEMPORARY = llvm_cbe_tmp2806; /* for PHI node */ - goto llvm_cbe_cond_next2808; - -llvm_cbe_cond_next2823: - ltmp_12_1 = memcpy(llvm_cbe_tmp2787, llvm_cbe_previous_913258_0, llvm_cbe_tmp2488); - if ((((unsigned char *)llvm_cbe_save_hwm_8) < ((unsigned char *)llvm_cbe_tmp2781))) { - llvm_cbe_bralink_913313_0_ph__PHI_TEMPORARY = llvm_cbe_bralink_10; /* for PHI node */ - llvm_cbe_code105_2313314_0_ph__PHI_TEMPORARY = llvm_cbe_tmp2787; /* for PHI node */ - goto llvm_cbe_bb2828_preheader; - } else { - llvm_cbe_bralink_913313_1__PHI_TEMPORARY = llvm_cbe_bralink_10; /* for PHI node */ - llvm_cbe_code105_2313314_1__PHI_TEMPORARY = llvm_cbe_tmp2787; /* for PHI node */ - goto llvm_cbe_bb2898; - } - - do { /* Syntactic loop 'bb2828' to make GCC happy */ -llvm_cbe_bb2828: - llvm_cbe_indvar = llvm_cbe_indvar__PHI_TEMPORARY; - llvm_cbe_hc2777_713319_0_rec = llvm_cbe_indvar << ((unsigned int )1); - llvm_cbe_tmp2832 = *llvm_cbe_tmp203; - llvm_cbe_tmp2835 = *(&llvm_cbe_save_hwm_8[llvm_cbe_hc2777_713319_0_rec]); - llvm_cbe_tmp2839 = &llvm_cbe_save_hwm_8[(llvm_cbe_hc2777_713319_0_rec | ((unsigned int )1))]; - llvm_cbe_tmp2840 = *llvm_cbe_tmp2839; - *llvm_cbe_tmp2832 = (((unsigned char )(((unsigned int )(((unsigned int )(llvm_cbe_tmp2844 + (((((unsigned int )(unsigned char )llvm_cbe_tmp2835)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp2840))))) >> ((unsigned int )((unsigned int )8))))))); - llvm_cbe_tmp2859 = *llvm_cbe_tmp203; - llvm_cbe_tmp2868 = *llvm_cbe_tmp2839; - *(&llvm_cbe_tmp2859[((unsigned int )1)]) = (((unsigned char )(llvm_cbe_tmp2872 + llvm_cbe_tmp2868))); - llvm_cbe_tmp2886 = *llvm_cbe_tmp203; - *llvm_cbe_tmp203 = (&llvm_cbe_tmp2886[((unsigned int )2)]); - if ((((unsigned char *)(&llvm_cbe_save_hwm_8[(llvm_cbe_hc2777_713319_0_rec + ((unsigned int )2))])) < ((unsigned char *)llvm_cbe_tmp2781))) { - llvm_cbe_indvar__PHI_TEMPORARY = (llvm_cbe_indvar + ((unsigned int )1)); /* for PHI node */ - goto llvm_cbe_bb2828; - } else { - llvm_cbe_bralink_913313_1__PHI_TEMPORARY = llvm_cbe_bralink_913313_0_ph; /* for PHI node */ - llvm_cbe_code105_2313314_1__PHI_TEMPORARY = llvm_cbe_code105_2313314_0_ph; /* for PHI node */ - goto llvm_cbe_bb2898; - } - - } while (1); /* end of syntactic loop 'bb2828' */ -llvm_cbe_bb2828_preheader: - llvm_cbe_bralink_913313_0_ph = llvm_cbe_bralink_913313_0_ph__PHI_TEMPORARY; - llvm_cbe_code105_2313314_0_ph = llvm_cbe_code105_2313314_0_ph__PHI_TEMPORARY; - llvm_cbe_tmp2844 = ((((llvm_cbe_i_9 == ((unsigned int )0))) ? (((unsigned int )1)) : (((unsigned int )4)))) + llvm_cbe_tmp2488; - llvm_cbe_tmp2872 = ((unsigned char )(((((llvm_cbe_i_9 == ((unsigned int )0))) ? (((unsigned char )1)) : (((unsigned char )4)))) + llvm_cbe_tmp28702871)); - llvm_cbe_indvar__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb2828; - - } while (1); /* end of syntactic loop 'bb2905' */ -llvm_cbe_bb2773: - llvm_cbe_tmp2784 = ((unsigned char )((((unsigned char )llvm_cbe_repeat_type_012701_1)) + ((unsigned char )102))); - llvm_cbe_tmp28702871 = ((unsigned char )llvm_cbe_tmp2488); - llvm_cbe_indvar26613__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_bralink_10__PHI_TEMPORARY = llvm_cbe_bralink_813241_0; /* for PHI node */ - llvm_cbe_save_hwm_8__PHI_TEMPORARY = llvm_cbe_save_hwm_313252_0; /* for PHI node */ - llvm_cbe_code105_21__PHI_TEMPORARY = llvm_cbe_code105_1813259_0; /* for PHI node */ - goto llvm_cbe_bb2905; - -llvm_cbe_cond_false2976: - llvm_cbe_repeat_max_17 = llvm_cbe_repeat_max_17__PHI_TEMPORARY; - llvm_cbe_save_hwm_313252_1 = llvm_cbe_save_hwm_313252_1__PHI_TEMPORARY; - llvm_cbe_code105_1813259_1 = llvm_cbe_code105_1813259_1__PHI_TEMPORARY; - llvm_cbe_reqbyte103_1213269_1 = llvm_cbe_reqbyte103_1213269_1__PHI_TEMPORARY; - llvm_cbe_tmp2980 = &llvm_cbe_code105_1813259_1[(-(llvm_cbe_ketoffset_7))]; - llvm_cbe_tmp2983 = *(&llvm_cbe_code105_1813259_1[(((unsigned int )1) - llvm_cbe_ketoffset_7)]); - llvm_cbe_tmp2988 = *(&llvm_cbe_code105_1813259_1[(((unsigned int )2) - llvm_cbe_ketoffset_7)]); - llvm_cbe_tmp2980_sum = (-((((((unsigned int )(unsigned char )llvm_cbe_tmp2983)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp2988))))) - llvm_cbe_ketoffset_7; - llvm_cbe_tmp2993 = &llvm_cbe_code105_1813259_1[llvm_cbe_tmp2980_sum]; - *llvm_cbe_tmp2980 = (((unsigned char )((((unsigned char )llvm_cbe_repeat_type_012701_1)) + ((unsigned char )85)))); - if ((llvm_cbe_iftmp_509_0 == ((unsigned int *)/*NULL*/0))) { - goto llvm_cbe_cond_true3002; - } else { - llvm_cbe_repeat_max_15__PHI_TEMPORARY = llvm_cbe_repeat_max_17; /* for PHI node */ - llvm_cbe_save_hwm_4__PHI_TEMPORARY = llvm_cbe_save_hwm_313252_1; /* for PHI node */ - llvm_cbe_code105_12__PHI_TEMPORARY = llvm_cbe_code105_1813259_1; /* for PHI node */ - llvm_cbe_reqbyte103_8__PHI_TEMPORARY = llvm_cbe_reqbyte103_1213269_1; /* for PHI node */ - goto llvm_cbe_cond_next3051; - } - -llvm_cbe_cond_true3002: - llvm_cbe_tmp3004 = *llvm_cbe_tmp2993; - if ((llvm_cbe_tmp3004 == ((unsigned char )92))) { - llvm_cbe_repeat_max_15__PHI_TEMPORARY = llvm_cbe_repeat_max_17; /* for PHI node */ - llvm_cbe_save_hwm_4__PHI_TEMPORARY = llvm_cbe_save_hwm_313252_1; /* for PHI node */ - llvm_cbe_code105_12__PHI_TEMPORARY = llvm_cbe_code105_1813259_1; /* for PHI node */ - llvm_cbe_reqbyte103_8__PHI_TEMPORARY = llvm_cbe_reqbyte103_1213269_1; /* for PHI node */ - goto llvm_cbe_cond_next3051; - } else { - llvm_cbe_scode_5_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb3010; - } - -llvm_cbe_cond_true3018: - llvm_cbe_tmp3020 = *llvm_cbe_tmp2993; - *llvm_cbe_tmp2993 = (((unsigned char )(llvm_cbe_tmp3020 + ((unsigned char )3)))); - llvm_cbe_repeat_max_15__PHI_TEMPORARY = llvm_cbe_repeat_max_17; /* for PHI node */ - llvm_cbe_save_hwm_4__PHI_TEMPORARY = llvm_cbe_save_hwm_313252_1; /* for PHI node */ - llvm_cbe_code105_12__PHI_TEMPORARY = llvm_cbe_code105_1813259_1; /* for PHI node */ - llvm_cbe_reqbyte103_8__PHI_TEMPORARY = llvm_cbe_reqbyte103_1213269_1; /* for PHI node */ - goto llvm_cbe_cond_next3051; - - do { /* Syntactic loop 'bb3010' to make GCC happy */ -llvm_cbe_bb3010: - llvm_cbe_scode_5_rec = llvm_cbe_scode_5_rec__PHI_TEMPORARY; - llvm_cbe_tmp2993_sum26701 = llvm_cbe_tmp2980_sum + llvm_cbe_scode_5_rec; - llvm_cbe_tmp3014 = could_be_empty_branch((&llvm_cbe_code105_1813259_1[llvm_cbe_tmp2993_sum26701]), llvm_cbe_tmp2980); - if ((llvm_cbe_tmp3014 == ((unsigned int )0))) { - goto llvm_cbe_cond_next3023; - } else { - goto llvm_cbe_cond_true3018; - } - -llvm_cbe_cond_next3023: - llvm_cbe_tmp3026 = *(&llvm_cbe_code105_1813259_1[(llvm_cbe_tmp2993_sum26701 + ((unsigned int )1))]); - llvm_cbe_tmp3031 = *(&llvm_cbe_code105_1813259_1[(llvm_cbe_tmp2993_sum26701 + ((unsigned int )2))]); - llvm_cbe_tmp3035_rec = llvm_cbe_scode_5_rec + (((((unsigned int )(unsigned char )llvm_cbe_tmp3026)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp3031))); - llvm_cbe_tmp3037 = *(&llvm_cbe_code105_1813259_1[(llvm_cbe_tmp2980_sum + llvm_cbe_tmp3035_rec)]); - if ((llvm_cbe_tmp3037 == ((unsigned char )83))) { - llvm_cbe_scode_5_rec__PHI_TEMPORARY = llvm_cbe_tmp3035_rec; /* for PHI node */ - goto llvm_cbe_bb3010; - } else { - llvm_cbe_repeat_max_15__PHI_TEMPORARY = llvm_cbe_repeat_max_17; /* for PHI node */ - llvm_cbe_save_hwm_4__PHI_TEMPORARY = llvm_cbe_save_hwm_313252_1; /* for PHI node */ - llvm_cbe_code105_12__PHI_TEMPORARY = llvm_cbe_code105_1813259_1; /* for PHI node */ - llvm_cbe_reqbyte103_8__PHI_TEMPORARY = llvm_cbe_reqbyte103_1213269_1; /* for PHI node */ - goto llvm_cbe_cond_next3051; - } - - } while (1); /* end of syntactic loop 'bb3010' */ -llvm_cbe_cond_next3051_loopexit: - llvm_cbe_tmp2959 = &llvm_cbe_code105_22_ph[(llvm_cbe_code105_2226489_rec + ((unsigned int )3))]; - llvm_cbe_repeat_max_15__PHI_TEMPORARY = llvm_cbe_repeat_max_16; /* for PHI node */ - llvm_cbe_save_hwm_4__PHI_TEMPORARY = llvm_cbe_save_hwm_9_ph; /* for PHI node */ - llvm_cbe_code105_12__PHI_TEMPORARY = llvm_cbe_tmp2959; /* for PHI node */ - llvm_cbe_reqbyte103_8__PHI_TEMPORARY = llvm_cbe_reqbyte103_1213269_0; /* for PHI node */ - goto llvm_cbe_cond_next3051; - - do { /* Syntactic loop 'bb2911' to make GCC happy */ -llvm_cbe_bb2911: - llvm_cbe_indvar26616 = llvm_cbe_indvar26616__PHI_TEMPORARY; - llvm_cbe_bralink_1126488 = llvm_cbe_bralink_1126488__PHI_TEMPORARY; - llvm_cbe_code105_2226489_rec = llvm_cbe_indvar26616 * ((unsigned int )3); - llvm_cbe_code105_2226489 = &llvm_cbe_code105_22_ph[llvm_cbe_code105_2226489_rec]; - llvm_cbe_tmp2917 = (((unsigned int )(unsigned long)llvm_cbe_code105_2226489)) - (((unsigned int )(unsigned long)llvm_cbe_bralink_1126488)); - llvm_cbe_tmp2918 = llvm_cbe_tmp2917 + ((unsigned int )1); - llvm_cbe_tmp2924 = &llvm_cbe_code105_22_ph[(llvm_cbe_code105_2226489_rec - llvm_cbe_tmp2917)]; - llvm_cbe_tmp2925 = *llvm_cbe_tmp2924; - llvm_cbe_tmp2929 = &llvm_cbe_code105_22_ph[(llvm_cbe_code105_2226489_rec + (((unsigned int )1) - llvm_cbe_tmp2917))]; - llvm_cbe_tmp2930 = *llvm_cbe_tmp2929; - llvm_cbe_tmp2932 = ((((unsigned int )(unsigned char )llvm_cbe_tmp2925)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp2930)); - if ((llvm_cbe_tmp2932 == ((unsigned int )0))) { - llvm_cbe_iftmp_320_0__PHI_TEMPORARY = ((unsigned char *)/*NULL*/0); /* for PHI node */ - goto llvm_cbe_cond_next2943; - } else { - goto llvm_cbe_cond_true2937; - } - -llvm_cbe_cond_next2943: - llvm_cbe_iftmp_320_0 = llvm_cbe_iftmp_320_0__PHI_TEMPORARY; - *llvm_cbe_code105_2226489 = ((unsigned char )84); - llvm_cbe_tmp29492950 = ((unsigned char )(((unsigned int )(((unsigned int )llvm_cbe_tmp2918) >> ((unsigned int )((unsigned int )8)))))); - *(&llvm_cbe_code105_22_ph[(llvm_cbe_code105_2226489_rec + ((unsigned int )1))]) = llvm_cbe_tmp29492950; - llvm_cbe_tmp29532954 = ((unsigned char )llvm_cbe_tmp2918); - *(&llvm_cbe_code105_22_ph[(llvm_cbe_code105_2226489_rec + ((unsigned int )2))]) = llvm_cbe_tmp29532954; - *llvm_cbe_tmp2924 = llvm_cbe_tmp29492950; - *llvm_cbe_tmp2929 = llvm_cbe_tmp29532954; - llvm_cbe_indvar_next26617 = llvm_cbe_indvar26616 + ((unsigned int )1); - if ((llvm_cbe_iftmp_320_0 == ((unsigned char *)/*NULL*/0))) { - goto llvm_cbe_cond_next3051_loopexit; - } else { - llvm_cbe_indvar26616__PHI_TEMPORARY = llvm_cbe_indvar_next26617; /* for PHI node */ - llvm_cbe_bralink_1126488__PHI_TEMPORARY = llvm_cbe_iftmp_320_0; /* for PHI node */ - goto llvm_cbe_bb2911; - } - -llvm_cbe_cond_true2937: - llvm_cbe_tmp2941 = &llvm_cbe_bralink_1126488[(-(llvm_cbe_tmp2932))]; - llvm_cbe_iftmp_320_0__PHI_TEMPORARY = llvm_cbe_tmp2941; /* for PHI node */ - goto llvm_cbe_cond_next2943; - - } while (1); /* end of syntactic loop 'bb2911' */ -llvm_cbe_bb3087: - llvm_cbe_tmp3090 = *(&llvm_cbe_tempcode); - llvm_cbe_tmp3092 = (((unsigned int )(unsigned long)llvm_cbe_code105_1213058_0)) - (((unsigned int )(unsigned long)llvm_cbe_tmp3090)); - if ((((signed int )llvm_cbe_tmp3092) > ((signed int )((unsigned int )0)))) { - goto llvm_cbe_cond_true3097; - } else { - llvm_cbe_repeat_max_13__PHI_TEMPORARY = llvm_cbe_repeat_max_12; /* for PHI node */ - llvm_cbe_save_hwm_5__PHI_TEMPORARY = llvm_cbe_save_hwm_413043_0; /* for PHI node */ - llvm_cbe_code105_13__PHI_TEMPORARY = llvm_cbe_code105_1213058_0; /* for PHI node */ - llvm_cbe_reqbyte103_9__PHI_TEMPORARY = llvm_cbe_reqbyte103_813077_0; /* for PHI node */ - goto llvm_cbe_END_REPEAT; - } - -llvm_cbe_cond_true3056: - llvm_cbe_repeat_max_12 = llvm_cbe_repeat_max_12__PHI_TEMPORARY; - llvm_cbe_save_hwm_413043_0 = llvm_cbe_save_hwm_413043_0__PHI_TEMPORARY; - llvm_cbe_code105_1213058_0 = llvm_cbe_code105_1213058_0__PHI_TEMPORARY; - llvm_cbe_reqbyte103_813077_0 = llvm_cbe_reqbyte103_813077_0__PHI_TEMPORARY; - llvm_cbe_tmp3058 = *(&llvm_cbe_tempcode); - llvm_cbe_tmp3059 = *llvm_cbe_tmp3058; - switch (llvm_cbe_tmp3059) { - default: - goto llvm_cbe_bb3087; -; - case ((unsigned char )38): - goto llvm_cbe_bb3078; - break; - case ((unsigned char )64): - goto llvm_cbe_bb3078; - break; - case ((unsigned char )51): - goto llvm_cbe_bb3078; - break; - } -llvm_cbe_bb3078: - llvm_cbe_tmp3084 = *(&_pcre_OP_lengths[(((unsigned int )(unsigned char )llvm_cbe_tmp3059))]); - *(&llvm_cbe_tempcode) = (&llvm_cbe_tmp3058[(((unsigned int )(unsigned char )llvm_cbe_tmp3084))]); - goto llvm_cbe_bb3087; - -llvm_cbe_bb3101: - *llvm_cbe_tmp3090 = ((unsigned char )39); - llvm_cbe_repeat_max_13__PHI_TEMPORARY = llvm_cbe_repeat_max_12; /* for PHI node */ - llvm_cbe_save_hwm_5__PHI_TEMPORARY = llvm_cbe_save_hwm_413043_0; /* for PHI node */ - llvm_cbe_code105_13__PHI_TEMPORARY = llvm_cbe_code105_1213058_0; /* for PHI node */ - llvm_cbe_reqbyte103_9__PHI_TEMPORARY = llvm_cbe_reqbyte103_813077_0; /* for PHI node */ - goto llvm_cbe_END_REPEAT; - -llvm_cbe_cond_true3097: - llvm_cbe_tmp3099 = *llvm_cbe_tmp3090; - switch ((((unsigned int )(unsigned char )llvm_cbe_tmp3099))) { - default: - goto llvm_cbe_bb3125; -; - case ((unsigned int )30): - goto llvm_cbe_bb3101; - break; - case ((unsigned int )32): - goto llvm_cbe_bb3103; - case ((unsigned int )34): - goto llvm_cbe_bb3105; - case ((unsigned int )36): - goto llvm_cbe_bb3107; - case ((unsigned int )43): - goto llvm_cbe_bb3117; - case ((unsigned int )45): - goto llvm_cbe_bb3119; - case ((unsigned int )47): - goto llvm_cbe_bb3121; - case ((unsigned int )49): - goto llvm_cbe_bb3123; - case ((unsigned int )56): - goto llvm_cbe_bb3109; - case ((unsigned int )58): - goto llvm_cbe_bb3111; - case ((unsigned int )60): - goto llvm_cbe_bb3113; - case ((unsigned int )62): - goto llvm_cbe_bb3115; - } -llvm_cbe_bb3103: - *llvm_cbe_tmp3090 = ((unsigned char )40); - llvm_cbe_repeat_max_13__PHI_TEMPORARY = llvm_cbe_repeat_max_12; /* for PHI node */ - llvm_cbe_save_hwm_5__PHI_TEMPORARY = llvm_cbe_save_hwm_413043_0; /* for PHI node */ - llvm_cbe_code105_13__PHI_TEMPORARY = llvm_cbe_code105_1213058_0; /* for PHI node */ - llvm_cbe_reqbyte103_9__PHI_TEMPORARY = llvm_cbe_reqbyte103_813077_0; /* for PHI node */ - goto llvm_cbe_END_REPEAT; - -llvm_cbe_bb3105: - *llvm_cbe_tmp3090 = ((unsigned char )41); - llvm_cbe_repeat_max_13__PHI_TEMPORARY = llvm_cbe_repeat_max_12; /* for PHI node */ - llvm_cbe_save_hwm_5__PHI_TEMPORARY = llvm_cbe_save_hwm_413043_0; /* for PHI node */ - llvm_cbe_code105_13__PHI_TEMPORARY = llvm_cbe_code105_1213058_0; /* for PHI node */ - llvm_cbe_reqbyte103_9__PHI_TEMPORARY = llvm_cbe_reqbyte103_813077_0; /* for PHI node */ - goto llvm_cbe_END_REPEAT; - -llvm_cbe_bb3107: - *llvm_cbe_tmp3090 = ((unsigned char )42); - llvm_cbe_repeat_max_13__PHI_TEMPORARY = llvm_cbe_repeat_max_12; /* for PHI node */ - llvm_cbe_save_hwm_5__PHI_TEMPORARY = llvm_cbe_save_hwm_413043_0; /* for PHI node */ - llvm_cbe_code105_13__PHI_TEMPORARY = llvm_cbe_code105_1213058_0; /* for PHI node */ - llvm_cbe_reqbyte103_9__PHI_TEMPORARY = llvm_cbe_reqbyte103_813077_0; /* for PHI node */ - goto llvm_cbe_END_REPEAT; - -llvm_cbe_bb3109: - *llvm_cbe_tmp3090 = ((unsigned char )65); - llvm_cbe_repeat_max_13__PHI_TEMPORARY = llvm_cbe_repeat_max_12; /* for PHI node */ - llvm_cbe_save_hwm_5__PHI_TEMPORARY = llvm_cbe_save_hwm_413043_0; /* for PHI node */ - llvm_cbe_code105_13__PHI_TEMPORARY = llvm_cbe_code105_1213058_0; /* for PHI node */ - llvm_cbe_reqbyte103_9__PHI_TEMPORARY = llvm_cbe_reqbyte103_813077_0; /* for PHI node */ - goto llvm_cbe_END_REPEAT; - -llvm_cbe_bb3111: - *llvm_cbe_tmp3090 = ((unsigned char )66); - llvm_cbe_repeat_max_13__PHI_TEMPORARY = llvm_cbe_repeat_max_12; /* for PHI node */ - llvm_cbe_save_hwm_5__PHI_TEMPORARY = llvm_cbe_save_hwm_413043_0; /* for PHI node */ - llvm_cbe_code105_13__PHI_TEMPORARY = llvm_cbe_code105_1213058_0; /* for PHI node */ - llvm_cbe_reqbyte103_9__PHI_TEMPORARY = llvm_cbe_reqbyte103_813077_0; /* for PHI node */ - goto llvm_cbe_END_REPEAT; - -llvm_cbe_bb3113: - *llvm_cbe_tmp3090 = ((unsigned char )67); - llvm_cbe_repeat_max_13__PHI_TEMPORARY = llvm_cbe_repeat_max_12; /* for PHI node */ - llvm_cbe_save_hwm_5__PHI_TEMPORARY = llvm_cbe_save_hwm_413043_0; /* for PHI node */ - llvm_cbe_code105_13__PHI_TEMPORARY = llvm_cbe_code105_1213058_0; /* for PHI node */ - llvm_cbe_reqbyte103_9__PHI_TEMPORARY = llvm_cbe_reqbyte103_813077_0; /* for PHI node */ - goto llvm_cbe_END_REPEAT; - -llvm_cbe_bb3115: - *llvm_cbe_tmp3090 = ((unsigned char )68); - llvm_cbe_repeat_max_13__PHI_TEMPORARY = llvm_cbe_repeat_max_12; /* for PHI node */ - llvm_cbe_save_hwm_5__PHI_TEMPORARY = llvm_cbe_save_hwm_413043_0; /* for PHI node */ - llvm_cbe_code105_13__PHI_TEMPORARY = llvm_cbe_code105_1213058_0; /* for PHI node */ - llvm_cbe_reqbyte103_9__PHI_TEMPORARY = llvm_cbe_reqbyte103_813077_0; /* for PHI node */ - goto llvm_cbe_END_REPEAT; - -llvm_cbe_bb3117: - *llvm_cbe_tmp3090 = ((unsigned char )52); - llvm_cbe_repeat_max_13__PHI_TEMPORARY = llvm_cbe_repeat_max_12; /* for PHI node */ - llvm_cbe_save_hwm_5__PHI_TEMPORARY = llvm_cbe_save_hwm_413043_0; /* for PHI node */ - llvm_cbe_code105_13__PHI_TEMPORARY = llvm_cbe_code105_1213058_0; /* for PHI node */ - llvm_cbe_reqbyte103_9__PHI_TEMPORARY = llvm_cbe_reqbyte103_813077_0; /* for PHI node */ - goto llvm_cbe_END_REPEAT; - -llvm_cbe_bb3119: - *llvm_cbe_tmp3090 = ((unsigned char )53); - llvm_cbe_repeat_max_13__PHI_TEMPORARY = llvm_cbe_repeat_max_12; /* for PHI node */ - llvm_cbe_save_hwm_5__PHI_TEMPORARY = llvm_cbe_save_hwm_413043_0; /* for PHI node */ - llvm_cbe_code105_13__PHI_TEMPORARY = llvm_cbe_code105_1213058_0; /* for PHI node */ - llvm_cbe_reqbyte103_9__PHI_TEMPORARY = llvm_cbe_reqbyte103_813077_0; /* for PHI node */ - goto llvm_cbe_END_REPEAT; - -llvm_cbe_bb3121: - *llvm_cbe_tmp3090 = ((unsigned char )54); - llvm_cbe_repeat_max_13__PHI_TEMPORARY = llvm_cbe_repeat_max_12; /* for PHI node */ - llvm_cbe_save_hwm_5__PHI_TEMPORARY = llvm_cbe_save_hwm_413043_0; /* for PHI node */ - llvm_cbe_code105_13__PHI_TEMPORARY = llvm_cbe_code105_1213058_0; /* for PHI node */ - llvm_cbe_reqbyte103_9__PHI_TEMPORARY = llvm_cbe_reqbyte103_813077_0; /* for PHI node */ - goto llvm_cbe_END_REPEAT; - -llvm_cbe_bb3123: - *llvm_cbe_tmp3090 = ((unsigned char )55); - llvm_cbe_repeat_max_13__PHI_TEMPORARY = llvm_cbe_repeat_max_12; /* for PHI node */ - llvm_cbe_save_hwm_5__PHI_TEMPORARY = llvm_cbe_save_hwm_413043_0; /* for PHI node */ - llvm_cbe_code105_13__PHI_TEMPORARY = llvm_cbe_code105_1213058_0; /* for PHI node */ - llvm_cbe_reqbyte103_9__PHI_TEMPORARY = llvm_cbe_reqbyte103_813077_0; /* for PHI node */ - goto llvm_cbe_END_REPEAT; - -llvm_cbe_bb3125: - ltmp_13_1 = memmove((&llvm_cbe_tmp3090[((unsigned int )3)]), llvm_cbe_tmp3090, llvm_cbe_tmp3092); - llvm_cbe_tmp3134 = llvm_cbe_tmp3092 + ((unsigned int )3); - llvm_cbe_tmp3135 = *(&llvm_cbe_tempcode); - *llvm_cbe_tmp3135 = ((unsigned char )92); - *(&llvm_cbe_code105_1213058_0[((unsigned int )3)]) = ((unsigned char )84); - llvm_cbe_tmp31413142 = ((unsigned char )(((unsigned int )(((unsigned int )llvm_cbe_tmp3134) >> ((unsigned int )((unsigned int )8)))))); - *(&llvm_cbe_code105_1213058_0[((unsigned int )4)]) = llvm_cbe_tmp31413142; - llvm_cbe_tmp31453146 = ((unsigned char )llvm_cbe_tmp3134); - *(&llvm_cbe_code105_1213058_0[((unsigned int )5)]) = llvm_cbe_tmp31453146; - llvm_cbe_tmp3151 = &llvm_cbe_code105_1213058_0[((unsigned int )6)]; - llvm_cbe_tmp3152 = *(&llvm_cbe_tempcode); - *(&llvm_cbe_tmp3152[((unsigned int )1)]) = llvm_cbe_tmp31413142; - llvm_cbe_tmp3157 = *(&llvm_cbe_tempcode); - *(&llvm_cbe_tmp3157[((unsigned int )2)]) = llvm_cbe_tmp31453146; - llvm_cbe_repeat_max_13__PHI_TEMPORARY = llvm_cbe_repeat_max_12; /* for PHI node */ - llvm_cbe_save_hwm_5__PHI_TEMPORARY = llvm_cbe_save_hwm_413043_0; /* for PHI node */ - llvm_cbe_code105_13__PHI_TEMPORARY = llvm_cbe_tmp3151; /* for PHI node */ - llvm_cbe_reqbyte103_9__PHI_TEMPORARY = llvm_cbe_reqbyte103_813077_0; /* for PHI node */ - goto llvm_cbe_END_REPEAT; - -llvm_cbe_cond_next3774: - *llvm_cbe_tmp3737 = (((unsigned char )llvm_cbe_n_5_lcssa)); - llvm_cbe_tmp3780 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp3784 = *llvm_cbe_tmp3783; - *(&llvm_cbe_code105_10[((unsigned int )2)]) = (((unsigned char )(((unsigned int )(((unsigned int )((((unsigned int )(unsigned long)(&llvm_cbe_tmp3780[((unsigned int )1)]))) - (((unsigned int )(unsigned long)llvm_cbe_tmp3784)))) >> ((unsigned int )((unsigned int )8))))))); - llvm_cbe_tmp3792 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp3797 = *llvm_cbe_tmp3783; - *(&llvm_cbe_code105_10[((unsigned int )3)]) = (((unsigned char )((((unsigned char )((((unsigned char )(unsigned long)llvm_cbe_tmp3792)) + ((unsigned char )1)))) - (((unsigned char )(unsigned long)llvm_cbe_tmp3797))))); - *(&llvm_cbe_code105_10[((unsigned int )4)]) = ((unsigned char )0); - *(&llvm_cbe_code105_10[((unsigned int )5)]) = ((unsigned char )0); - llvm_cbe_tmp3810 = &llvm_cbe_code105_10[((unsigned int )6)]; - llvm_cbe_tmp519613366 = *(&llvm_cbe_ptr106); - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp519613366[((unsigned int )1)]); - llvm_cbe_slot_913437_0_us61_13__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_13__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_repeat_max_10__PHI_TEMPORARY = llvm_cbe_repeat_max_10; /* for PHI node */ - llvm_cbe_repeat_min_10__PHI_TEMPORARY = llvm_cbe_repeat_min_10; /* for PHI node */ - llvm_cbe_options_addr_2__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_save_hwm_7__PHI_TEMPORARY = llvm_cbe_tmp3176; /* for PHI node */ - llvm_cbe_previous_callout_5__PHI_TEMPORARY = llvm_cbe_code105_10; /* for PHI node */ - llvm_cbe_previous_3__PHI_TEMPORARY = ((unsigned char *)/*NULL*/0); /* for PHI node */ - llvm_cbe_groupsetfirstbyte_2__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_9; /* for PHI node */ - llvm_cbe_inescq_2__PHI_TEMPORARY = llvm_cbe_inescq_29422_9; /* for PHI node */ - llvm_cbe_last_code_2__PHI_TEMPORARY = llvm_cbe_last_code_15771_1; /* for PHI node */ - llvm_cbe_code105_3__PHI_TEMPORARY = llvm_cbe_tmp3810; /* for PHI node */ - llvm_cbe_after_manual_callout_7__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - llvm_cbe_options104_3__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_req_caseopt_3__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_9; /* for PHI node */ - llvm_cbe_zerofirstbyte_2__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_29740_9; /* for PHI node */ - llvm_cbe_zeroreqbyte_2__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_29762_9; /* for PHI node */ - llvm_cbe_reqbyte103_5__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_9; /* for PHI node */ - llvm_cbe_firstbyte102_3__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - llvm_cbe_greedy_non_default_3__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_9; /* for PHI node */ - llvm_cbe_greedy_default_3__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_9; /* for PHI node */ - goto llvm_cbe_bb131; - -llvm_cbe_cond_next3767: - if ((((signed int )llvm_cbe_n_5_lcssa) > ((signed int )((unsigned int )255)))) { - goto llvm_cbe_cond_true3772; - } else { - goto llvm_cbe_cond_next3774; - } - -llvm_cbe_bb3759: - llvm_cbe_n_5_lcssa = llvm_cbe_n_5_lcssa__PHI_TEMPORARY; - llvm_cbe_tmp3760 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp3761 = *llvm_cbe_tmp3760; - if ((llvm_cbe_tmp3761 == ((unsigned char )41))) { - goto llvm_cbe_cond_next3767; - } else { - goto llvm_cbe_cond_true3765; - } - -llvm_cbe_bb3733: - *llvm_cbe_code105_10 = ((unsigned char )82); - llvm_cbe_tmp3737 = &llvm_cbe_code105_10[((unsigned int )1)]; - llvm_cbe_tmp374726477 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp374826478 = &llvm_cbe_tmp374726477[((unsigned int )1)]; - *(&llvm_cbe_ptr106) = llvm_cbe_tmp374826478; - llvm_cbe_tmp375026479 = *llvm_cbe_tmp374826478; - llvm_cbe_tmp375326482 = *(&digitab[(((unsigned int )(unsigned char )llvm_cbe_tmp375026479))]); - if (((((unsigned char )(llvm_cbe_tmp375326482 & ((unsigned char )4)))) == ((unsigned char )0))) { - llvm_cbe_n_5_lcssa__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb3759; - } else { - llvm_cbe_n_526476__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb3738; - } - -llvm_cbe_cond_true3184: - llvm_cbe_tmp3187 = &llvm_cbe_tmp3177[((unsigned int )2)]; - *(&llvm_cbe_ptr106) = llvm_cbe_tmp3187; - llvm_cbe_tmp3189 = *llvm_cbe_tmp3187; - switch ((((unsigned int )(unsigned char )llvm_cbe_tmp3189))) { - default: - goto llvm_cbe_OTHER_CHAR_AFTER_QUERY; -; - case ((unsigned int )33): - goto llvm_cbe_bb3695; - case ((unsigned int )35): - llvm_cbe_tmp3195_pn__PHI_TEMPORARY = llvm_cbe_tmp3187; /* for PHI node */ - goto llvm_cbe_bb3197; - break; - case ((unsigned int )38): - llvm_cbe_terminator_7__PHI_TEMPORARY = ((unsigned int )41); /* for PHI node */ - llvm_cbe_is_recurse_0__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - llvm_cbe_save_hwm_10__PHI_TEMPORARY = llvm_cbe_tmp3176; /* for PHI node */ - llvm_cbe_zerofirstbyte_4__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_29740_9; /* for PHI node */ - llvm_cbe_zeroreqbyte_4__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_29762_9; /* for PHI node */ - llvm_cbe_firstbyte102_13__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - goto llvm_cbe_NAMED_REF_OR_RECURSE; - case ((unsigned int )39): - goto llvm_cbe_bb3840; - case ((unsigned int )40): - goto llvm_cbe_bb3224; - case ((unsigned int )43): - goto llvm_cbe_bb4177; - case ((unsigned int )45): - goto llvm_cbe_bb4177; - case ((unsigned int )48): - goto llvm_cbe_bb4177; - case ((unsigned int )49): - goto llvm_cbe_bb4177; - case ((unsigned int )50): - goto llvm_cbe_bb4177; - case ((unsigned int )51): - goto llvm_cbe_bb4177; - case ((unsigned int )52): - goto llvm_cbe_bb4177; - case ((unsigned int )53): - goto llvm_cbe_bb4177; - case ((unsigned int )54): - goto llvm_cbe_bb4177; - case ((unsigned int )55): - goto llvm_cbe_bb4177; - case ((unsigned int )56): - goto llvm_cbe_bb4177; - case ((unsigned int )57): - goto llvm_cbe_bb4177; - case ((unsigned int )58): - llvm_cbe_reset_bracount132_8__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb3221; - case ((unsigned int )60): - goto llvm_cbe_bb3698; - case ((unsigned int )61): - goto llvm_cbe_bb3692; - case ((unsigned int )62): - goto llvm_cbe_bb3730; - case ((unsigned int )67): - goto llvm_cbe_bb3733; - case ((unsigned int )80): - goto llvm_cbe_bb3811; - case ((unsigned int )82): - goto llvm_cbe_bb4163; - case ((unsigned int )124): - goto llvm_cbe_bb3220; - } -llvm_cbe_bb3172: - llvm_cbe_tmp3176 = *llvm_cbe_tmp203; - llvm_cbe_tmp3177 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp3178 = &llvm_cbe_tmp3177[((unsigned int )1)]; - *(&llvm_cbe_ptr106) = llvm_cbe_tmp3178; - llvm_cbe_tmp3180 = *llvm_cbe_tmp3178; - if ((llvm_cbe_tmp3180 == ((unsigned char )63))) { - goto llvm_cbe_cond_true3184; - } else { - goto llvm_cbe_cond_false4629; - } - - do { /* Syntactic loop 'bb3738' to make GCC happy */ -llvm_cbe_bb3738: - llvm_cbe_n_526476 = llvm_cbe_n_526476__PHI_TEMPORARY; - llvm_cbe_tmp3741 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp3742 = *llvm_cbe_tmp3741; - llvm_cbe_tmp3745 = ((llvm_cbe_n_526476 * ((unsigned int )10)) + ((unsigned int )-48)) + (((unsigned int )(unsigned char )llvm_cbe_tmp3742)); - llvm_cbe_tmp3748 = &llvm_cbe_tmp3741[((unsigned int )1)]; - *(&llvm_cbe_ptr106) = llvm_cbe_tmp3748; - llvm_cbe_tmp3750 = *llvm_cbe_tmp3748; - llvm_cbe_tmp3753 = *(&digitab[(((unsigned int )(unsigned char )llvm_cbe_tmp3750))]); - if (((((unsigned char )(llvm_cbe_tmp3753 & ((unsigned char )4)))) == ((unsigned char )0))) { - llvm_cbe_n_5_lcssa__PHI_TEMPORARY = llvm_cbe_tmp3745; /* for PHI node */ - goto llvm_cbe_bb3759; - } else { - llvm_cbe_n_526476__PHI_TEMPORARY = llvm_cbe_tmp3745; /* for PHI node */ - goto llvm_cbe_bb3738; - } - - } while (1); /* end of syntactic loop 'bb3738' */ -llvm_cbe_cond_true4480: - llvm_cbe_tmp519613479 = *(&llvm_cbe_ptr106); - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp519613479[((unsigned int )1)]); - llvm_cbe_slot_913437_0_us61_13__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_13__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_repeat_max_10__PHI_TEMPORARY = llvm_cbe_repeat_max_10; /* for PHI node */ - llvm_cbe_repeat_min_10__PHI_TEMPORARY = llvm_cbe_repeat_min_10; /* for PHI node */ - llvm_cbe_options_addr_2__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_save_hwm_7__PHI_TEMPORARY = llvm_cbe_save_hwm_11; /* for PHI node */ - llvm_cbe_previous_callout_5__PHI_TEMPORARY = llvm_cbe_previous_callout_9; /* for PHI node */ - llvm_cbe_previous_3__PHI_TEMPORARY = llvm_cbe_code105_10; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_2__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_9; /* for PHI node */ - llvm_cbe_inescq_2__PHI_TEMPORARY = llvm_cbe_inescq_29422_9; /* for PHI node */ - llvm_cbe_last_code_2__PHI_TEMPORARY = llvm_cbe_last_code_15771_1; /* for PHI node */ - llvm_cbe_code105_3__PHI_TEMPORARY = llvm_cbe_tmp4475; /* for PHI node */ - llvm_cbe_after_manual_callout_7__PHI_TEMPORARY = llvm_cbe_after_manual_callout_1; /* for PHI node */ - llvm_cbe_options104_3__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_req_caseopt_3__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_9; /* for PHI node */ - llvm_cbe_zerofirstbyte_2__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_8; /* for PHI node */ - llvm_cbe_zeroreqbyte_2__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_8; /* for PHI node */ - llvm_cbe_reqbyte103_5__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_9; /* for PHI node */ - llvm_cbe_firstbyte102_3__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - llvm_cbe_greedy_non_default_3__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_9; /* for PHI node */ - llvm_cbe_greedy_default_3__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_9; /* for PHI node */ - goto llvm_cbe_bb131; - -llvm_cbe_cond_next4435: - llvm_cbe_called_6 = llvm_cbe_called_6__PHI_TEMPORARY; - *llvm_cbe_code105_10 = ((unsigned char )92); - *(&llvm_cbe_code105_10[((unsigned int )1)]) = ((unsigned char )0); - *(&llvm_cbe_code105_10[((unsigned int )2)]) = ((unsigned char )6); - *(&llvm_cbe_code105_10[((unsigned int )3)]) = ((unsigned char )81); - llvm_cbe_tmp4448 = *llvm_cbe_tmp4563; - *(&llvm_cbe_code105_10[((unsigned int )4)]) = (((unsigned char )(((unsigned int )(((unsigned int )((((unsigned int )(unsigned long)llvm_cbe_called_6)) - (((unsigned int )(unsigned long)llvm_cbe_tmp4448)))) >> ((unsigned int )((unsigned int )8))))))); - llvm_cbe_tmp4460 = *llvm_cbe_tmp4563; - *(&llvm_cbe_code105_10[((unsigned int )5)]) = (((unsigned char )((((unsigned char )(unsigned long)llvm_cbe_called_6)) - (((unsigned char )(unsigned long)llvm_cbe_tmp4460))))); - *(&llvm_cbe_code105_10[((unsigned int )6)]) = ((unsigned char )84); - *(&llvm_cbe_code105_10[((unsigned int )7)]) = ((unsigned char )0); - *(&llvm_cbe_code105_10[((unsigned int )8)]) = ((unsigned char )6); - llvm_cbe_tmp4475 = &llvm_cbe_code105_10[((unsigned int )9)]; - *(&llvm_cbe_length_prevgroup) = ((unsigned int )9); - if ((llvm_cbe_firstbyte102_15 == ((unsigned int )-2))) { - goto llvm_cbe_cond_true4480; - } else { - llvm_cbe_slot_913437_0_us61_5__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_5__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_1__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_save_hwm_6__PHI_TEMPORARY = llvm_cbe_save_hwm_11; /* for PHI node */ - llvm_cbe_previous_callout_4__PHI_TEMPORARY = llvm_cbe_previous_callout_9; /* for PHI node */ - llvm_cbe_previous_6__PHI_TEMPORARY = llvm_cbe_code105_10; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_1__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_9; /* for PHI node */ - llvm_cbe_inescq_1__PHI_TEMPORARY = llvm_cbe_inescq_29422_9; /* for PHI node */ - llvm_cbe_code105_9__PHI_TEMPORARY = llvm_cbe_tmp4475; /* for PHI node */ - llvm_cbe_options104_2__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_req_caseopt_2__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_9; /* for PHI node */ - llvm_cbe_zerofirstbyte_1__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_8; /* for PHI node */ - llvm_cbe_zeroreqbyte_1__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_8; /* for PHI node */ - llvm_cbe_firstbyte102_2__PHI_TEMPORARY = llvm_cbe_firstbyte102_15; /* for PHI node */ - llvm_cbe_greedy_non_default_2__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_9; /* for PHI node */ - llvm_cbe_greedy_default_2__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_9; /* for PHI node */ - goto llvm_cbe_bb5195; - } - -llvm_cbe_HANDLE_RECURSION: - llvm_cbe_recno_12 = llvm_cbe_recno_12__PHI_TEMPORARY; - llvm_cbe_save_hwm_11 = llvm_cbe_save_hwm_11__PHI_TEMPORARY; - llvm_cbe_zerofirstbyte_8 = llvm_cbe_zerofirstbyte_8__PHI_TEMPORARY; - llvm_cbe_zeroreqbyte_8 = llvm_cbe_zeroreqbyte_8__PHI_TEMPORARY; - llvm_cbe_firstbyte102_15 = llvm_cbe_firstbyte102_15__PHI_TEMPORARY; - llvm_cbe_tmp4289 = *llvm_cbe_tmp4563; - if ((llvm_cbe_iftmp_509_0 == ((unsigned int *)/*NULL*/0))) { - goto llvm_cbe_cond_true4294; - } else { - llvm_cbe_called_6__PHI_TEMPORARY = llvm_cbe_tmp4289; /* for PHI node */ - goto llvm_cbe_cond_next4435; - } - -llvm_cbe_cond_next4158: - llvm_cbe_recno_11 = llvm_cbe_recno_11__PHI_TEMPORARY; - if ((llvm_cbe_is_recurse_013390_0_ph == ((unsigned int )0))) { - llvm_cbe_recno_13__PHI_TEMPORARY = llvm_cbe_recno_11; /* for PHI node */ - llvm_cbe_save_hwm_14__PHI_TEMPORARY = llvm_cbe_save_hwm_1013396_0_ph; /* for PHI node */ - llvm_cbe_zerofirstbyte_5__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_413398_0_ph; /* for PHI node */ - llvm_cbe_zeroreqbyte_5__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_413400_0_ph; /* for PHI node */ - llvm_cbe_firstbyte102_14__PHI_TEMPORARY = llvm_cbe_firstbyte102_1313402_0_ph; /* for PHI node */ - goto llvm_cbe_HANDLE_REFERENCE; - } else { - llvm_cbe_recno_12__PHI_TEMPORARY = llvm_cbe_recno_11; /* for PHI node */ - llvm_cbe_save_hwm_11__PHI_TEMPORARY = llvm_cbe_save_hwm_1013396_0_ph; /* for PHI node */ - llvm_cbe_zerofirstbyte_8__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_413398_0_ph; /* for PHI node */ - llvm_cbe_zeroreqbyte_8__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_413400_0_ph; /* for PHI node */ - llvm_cbe_firstbyte102_15__PHI_TEMPORARY = llvm_cbe_firstbyte102_1313402_0_ph; /* for PHI node */ - goto llvm_cbe_HANDLE_RECURSION; - } - -llvm_cbe_cond_next4068: - if ((((signed int )llvm_cbe_tmp4053) > ((signed int )((unsigned int )32)))) { - goto llvm_cbe_cond_true4073; - } else { - llvm_cbe_recno_11__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_cond_next4158; - } - -llvm_cbe_cond_true4058: - llvm_cbe_tmp4059 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp4060 = *llvm_cbe_tmp4059; - if (((((unsigned int )(unsigned char )llvm_cbe_tmp4060)) == llvm_cbe_terminator_713369_0_ph)) { - goto llvm_cbe_cond_next4068; - } else { - goto llvm_cbe_cond_true4066; - } - -llvm_cbe_bb4048: - llvm_cbe_tmp4032_lcssa = llvm_cbe_tmp4032_lcssa__PHI_TEMPORARY; - llvm_cbe_tmp4053 = (((unsigned int )(unsigned long)llvm_cbe_tmp4032_lcssa)) - (((unsigned int )(unsigned long)llvm_cbe_tmp402913416_0_ph)); - if ((llvm_cbe_iftmp_509_0 == ((unsigned int *)/*NULL*/0))) { - goto llvm_cbe_cond_false4076; - } else { - goto llvm_cbe_cond_true4058; - } - -llvm_cbe_bb4034_preheader: - llvm_cbe_terminator_713369_0_ph = llvm_cbe_terminator_713369_0_ph__PHI_TEMPORARY; - llvm_cbe_is_recurse_013390_0_ph = llvm_cbe_is_recurse_013390_0_ph__PHI_TEMPORARY; - llvm_cbe_save_hwm_1013396_0_ph = llvm_cbe_save_hwm_1013396_0_ph__PHI_TEMPORARY; - llvm_cbe_zerofirstbyte_413398_0_ph = llvm_cbe_zerofirstbyte_413398_0_ph__PHI_TEMPORARY; - llvm_cbe_zeroreqbyte_413400_0_ph = llvm_cbe_zeroreqbyte_413400_0_ph__PHI_TEMPORARY; - llvm_cbe_firstbyte102_1313402_0_ph = llvm_cbe_firstbyte102_1313402_0_ph__PHI_TEMPORARY; - llvm_cbe_tmp402913416_0_ph = llvm_cbe_tmp402913416_0_ph__PHI_TEMPORARY; - llvm_cbe_storemerge5542_ph = llvm_cbe_storemerge5542_ph__PHI_TEMPORARY; - *(&llvm_cbe_ptr106) = llvm_cbe_storemerge5542_ph; - llvm_cbe_tmp403726541 = *llvm_cbe_tmp435; - llvm_cbe_tmp403926543 = *llvm_cbe_storemerge5542_ph; - llvm_cbe_tmp404226546 = *(&llvm_cbe_tmp403726541[(((unsigned int )(unsigned char )llvm_cbe_tmp403926543))]); - if (((((unsigned char )(llvm_cbe_tmp404226546 & ((unsigned char )16)))) == ((unsigned char )0))) { - llvm_cbe_tmp4032_lcssa__PHI_TEMPORARY = llvm_cbe_storemerge5542_ph; /* for PHI node */ - goto llvm_cbe_bb4048; - } else { - llvm_cbe_tmp403226550__PHI_TEMPORARY = llvm_cbe_storemerge5542_ph; /* for PHI node */ - goto llvm_cbe_bb4031; - } - -llvm_cbe_bb3826: - llvm_cbe_tmp38293830 = ((unsigned int )(bool )(llvm_cbe_tmp3815 == ((unsigned char )62))); - llvm_cbe_tmp402913426 = &llvm_cbe_tmp3177[((unsigned int )4)]; - llvm_cbe_terminator_713369_0_ph__PHI_TEMPORARY = ((unsigned int )41); /* for PHI node */ - llvm_cbe_is_recurse_013390_0_ph__PHI_TEMPORARY = llvm_cbe_tmp38293830; /* for PHI node */ - llvm_cbe_save_hwm_1013396_0_ph__PHI_TEMPORARY = llvm_cbe_tmp3176; /* for PHI node */ - llvm_cbe_zerofirstbyte_413398_0_ph__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_29740_9; /* for PHI node */ - llvm_cbe_zeroreqbyte_413400_0_ph__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_29762_9; /* for PHI node */ - llvm_cbe_firstbyte102_1313402_0_ph__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - llvm_cbe_tmp402913416_0_ph__PHI_TEMPORARY = llvm_cbe_tmp402913426; /* for PHI node */ - llvm_cbe_storemerge5542_ph__PHI_TEMPORARY = llvm_cbe_tmp402913426; /* for PHI node */ - goto llvm_cbe_bb4034_preheader; - -llvm_cbe_bb3811: - llvm_cbe_tmp3813 = &llvm_cbe_tmp3177[((unsigned int )3)]; - *(&llvm_cbe_ptr106) = llvm_cbe_tmp3813; - llvm_cbe_tmp3815 = *llvm_cbe_tmp3813; - switch (llvm_cbe_tmp3815) { - default: - goto llvm_cbe_cond_true3837; -; - case ((unsigned char )61): - goto llvm_cbe_bb3826; - break; - case ((unsigned char )62): - goto llvm_cbe_bb3826; - break; - case ((unsigned char )60): - goto llvm_cbe_bb3840; - } -llvm_cbe_NAMED_REF_OR_RECURSE: - llvm_cbe_terminator_7 = llvm_cbe_terminator_7__PHI_TEMPORARY; - llvm_cbe_is_recurse_0 = llvm_cbe_is_recurse_0__PHI_TEMPORARY; - llvm_cbe_save_hwm_10 = llvm_cbe_save_hwm_10__PHI_TEMPORARY; - llvm_cbe_zerofirstbyte_4 = llvm_cbe_zerofirstbyte_4__PHI_TEMPORARY; - llvm_cbe_zeroreqbyte_4 = llvm_cbe_zeroreqbyte_4__PHI_TEMPORARY; - llvm_cbe_firstbyte102_13 = llvm_cbe_firstbyte102_13__PHI_TEMPORARY; - llvm_cbe_tmp4028 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp4029 = &llvm_cbe_tmp4028[((unsigned int )1)]; - llvm_cbe_terminator_713369_0_ph__PHI_TEMPORARY = llvm_cbe_terminator_7; /* for PHI node */ - llvm_cbe_is_recurse_013390_0_ph__PHI_TEMPORARY = llvm_cbe_is_recurse_0; /* for PHI node */ - llvm_cbe_save_hwm_1013396_0_ph__PHI_TEMPORARY = llvm_cbe_save_hwm_10; /* for PHI node */ - llvm_cbe_zerofirstbyte_413398_0_ph__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_4; /* for PHI node */ - llvm_cbe_zeroreqbyte_413400_0_ph__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_4; /* for PHI node */ - llvm_cbe_firstbyte102_1313402_0_ph__PHI_TEMPORARY = llvm_cbe_firstbyte102_13; /* for PHI node */ - llvm_cbe_tmp402913416_0_ph__PHI_TEMPORARY = llvm_cbe_tmp4029; /* for PHI node */ - llvm_cbe_storemerge5542_ph__PHI_TEMPORARY = llvm_cbe_tmp4029; /* for PHI node */ - goto llvm_cbe_bb4034_preheader; - -llvm_cbe_bb4971: - *(&llvm_cbe_ptr106) = llvm_cbe_tmp4950; - llvm_cbe_tmp4975 = *llvm_cbe_tmp4950; - switch (llvm_cbe_tmp4975) { - default: - goto llvm_cbe_cond_false4986; -; - case ((unsigned char )60): - llvm_cbe_terminator_7__PHI_TEMPORARY = ((unsigned int )62); /* for PHI node */ - llvm_cbe_is_recurse_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_save_hwm_10__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_zerofirstbyte_4__PHI_TEMPORARY = llvm_cbe_firstbyte102_12; /* for PHI node */ - llvm_cbe_zeroreqbyte_4__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_9; /* for PHI node */ - llvm_cbe_firstbyte102_13__PHI_TEMPORARY = llvm_cbe_firstbyte102_12; /* for PHI node */ - goto llvm_cbe_NAMED_REF_OR_RECURSE; - case ((unsigned char )39): - goto llvm_cbe_cond_true4979_NAMED_REF_OR_RECURSE_crit_edge; - break; - } -llvm_cbe_cond_true4948: - llvm_cbe_tmp4949 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp4950 = &llvm_cbe_tmp4949[((unsigned int )1)]; - llvm_cbe_tmp4951 = *llvm_cbe_tmp4950; - switch (llvm_cbe_tmp4951) { - default: - goto llvm_cbe_cond_next4993; -; - case ((unsigned char )39): - goto llvm_cbe_bb4971; - break; - case ((unsigned char )60): - goto llvm_cbe_bb4971; - break; - case ((unsigned char )123): - goto llvm_cbe_bb4971; - break; - } -llvm_cbe_cond_next4941: - llvm_cbe_firstbyte102_12 = llvm_cbe_firstbyte102_12__PHI_TEMPORARY; - if ((llvm_cbe_tmp4877 == ((unsigned int )-26))) { - goto llvm_cbe_cond_true4948; - } else { - goto llvm_cbe_cond_next4993; - } - -llvm_cbe_cond_next4921: - if ((llvm_cbe_firstbyte102_39829_9 == ((unsigned int )-2))) { - goto llvm_cbe_cond_true4926; - } else { - llvm_cbe_firstbyte102_12__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - goto llvm_cbe_cond_next4941; - } - -llvm_cbe_cond_true4889: - switch (llvm_cbe_tmp4877) { - default: - goto llvm_cbe_cond_next4921; -; - case ((unsigned int )-25): - goto llvm_cbe_cond_true4894; - break; - case ((unsigned int )-24): - llvm_cbe_slot_913437_0_us61_5__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_5__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_1__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_save_hwm_6__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_previous_callout_4__PHI_TEMPORARY = llvm_cbe_previous_callout_9; /* for PHI node */ - llvm_cbe_previous_6__PHI_TEMPORARY = llvm_cbe_previous_25708_1; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_1__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_9; /* for PHI node */ - llvm_cbe_inescq_1__PHI_TEMPORARY = llvm_cbe_inescq_29422_9; /* for PHI node */ - llvm_cbe_code105_9__PHI_TEMPORARY = llvm_cbe_code105_10; /* for PHI node */ - llvm_cbe_options104_2__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_req_caseopt_2__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_9; /* for PHI node */ - llvm_cbe_zerofirstbyte_1__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_29740_9; /* for PHI node */ - llvm_cbe_zeroreqbyte_1__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_29762_9; /* for PHI node */ - llvm_cbe_firstbyte102_2__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - llvm_cbe_greedy_non_default_2__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_9; /* for PHI node */ - llvm_cbe_greedy_default_2__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_9; /* for PHI node */ - goto llvm_cbe_bb5195; - } -llvm_cbe_cond_next4884: - if ((((signed int )llvm_cbe_tmp4877) < ((signed int )((unsigned int )0)))) { - goto llvm_cbe_cond_true4889; - } else { - llvm_cbe_storemerge26707_in__PHI_TEMPORARY = llvm_cbe_tmp4877; /* for PHI node */ - llvm_cbe_last_code_15771_4__PHI_TEMPORARY = llvm_cbe_last_code_15771_1; /* for PHI node */ - llvm_cbe_options_addr_25789_11__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_save_hwm_79347_11__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_29395_11__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_9; /* for PHI node */ - llvm_cbe_options104_39466_11__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_req_caseopt_39708_11__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_9; /* for PHI node */ - llvm_cbe_reqbyte103_59784_11__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_9; /* for PHI node */ - llvm_cbe_firstbyte102_39829_11__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - llvm_cbe_greedy_non_default_39879_11__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_9; /* for PHI node */ - llvm_cbe_greedy_default_39909_11__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_9; /* for PHI node */ - llvm_cbe_previous_callout_3__PHI_TEMPORARY = llvm_cbe_previous_callout_9; /* for PHI node */ - llvm_cbe_inescq_6__PHI_TEMPORARY = llvm_cbe_inescq_29422_9; /* for PHI node */ - llvm_cbe_code105_8__PHI_TEMPORARY = llvm_cbe_code105_10; /* for PHI node */ - llvm_cbe_after_manual_callout_3__PHI_TEMPORARY = llvm_cbe_after_manual_callout_1; /* for PHI node */ - goto llvm_cbe_ONE_CHAR; - } - -llvm_cbe_bb4870: - llvm_cbe_tmp4871 = *(&llvm_cbe_ptr106); - *(&llvm_cbe_tempptr) = llvm_cbe_tmp4871; - llvm_cbe_tmp4874 = *llvm_cbe_tmp24; - llvm_cbe_tmp4877 = check_escape((&llvm_cbe_ptr106), llvm_cbe_errorcodeptr, llvm_cbe_tmp4874, llvm_cbe_options104_39466_9, ((unsigned int )0)); - llvm_cbe_tmp4879 = *llvm_cbe_errorcodeptr; - if ((llvm_cbe_tmp4879 == ((unsigned int )0))) { - goto llvm_cbe_cond_next4884; - } else { - llvm_cbe_slot_913437_0_us61_12__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_12__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - goto llvm_cbe_FAILED; - } - -llvm_cbe_cond_true4926: - if ((((unsigned int )(((unsigned int )-6) - llvm_cbe_tmp4877)) < ((unsigned int )((unsigned int )16)))) { - goto llvm_cbe_cond_true4938; - } else { - llvm_cbe_firstbyte102_12__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - goto llvm_cbe_cond_next4941; - } - -llvm_cbe_cond_true4938: - llvm_cbe_firstbyte102_12__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_cond_next4941; - -llvm_cbe_cond_true4979_NAMED_REF_OR_RECURSE_crit_edge: - llvm_cbe_terminator_7__PHI_TEMPORARY = ((unsigned int )39); /* for PHI node */ - llvm_cbe_is_recurse_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_save_hwm_10__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_zerofirstbyte_4__PHI_TEMPORARY = llvm_cbe_firstbyte102_12; /* for PHI node */ - llvm_cbe_zeroreqbyte_4__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_9; /* for PHI node */ - llvm_cbe_firstbyte102_13__PHI_TEMPORARY = llvm_cbe_firstbyte102_12; /* for PHI node */ - goto llvm_cbe_NAMED_REF_OR_RECURSE; - -llvm_cbe_cond_false4986: - llvm_cbe_terminator_7__PHI_TEMPORARY = ((unsigned int )125); /* for PHI node */ - llvm_cbe_is_recurse_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_save_hwm_10__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_zerofirstbyte_4__PHI_TEMPORARY = llvm_cbe_firstbyte102_12; /* for PHI node */ - llvm_cbe_zeroreqbyte_4__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_9; /* for PHI node */ - llvm_cbe_firstbyte102_13__PHI_TEMPORARY = llvm_cbe_firstbyte102_12; /* for PHI node */ - goto llvm_cbe_NAMED_REF_OR_RECURSE; - - do { /* Syntactic loop 'bb4031' to make GCC happy */ -llvm_cbe_bb4031: - llvm_cbe_tmp403226550 = llvm_cbe_tmp403226550__PHI_TEMPORARY; - llvm_cbe_tmp4033 = &llvm_cbe_tmp403226550[((unsigned int )1)]; - *(&llvm_cbe_ptr106) = llvm_cbe_tmp4033; - llvm_cbe_tmp4039 = *llvm_cbe_tmp4033; - llvm_cbe_tmp4042 = *(&llvm_cbe_tmp403726541[(((unsigned int )(unsigned char )llvm_cbe_tmp4039))]); - if (((((unsigned char )(llvm_cbe_tmp4042 & ((unsigned char )16)))) == ((unsigned char )0))) { - llvm_cbe_tmp4032_lcssa__PHI_TEMPORARY = llvm_cbe_tmp4033; /* for PHI node */ - goto llvm_cbe_bb4048; - } else { - llvm_cbe_tmp403226550__PHI_TEMPORARY = llvm_cbe_tmp4033; /* for PHI node */ - goto llvm_cbe_bb4031; - } - - } while (1); /* end of syntactic loop 'bb4031' */ -llvm_cbe_cond_true4128: - llvm_cbe_tmp4131 = *llvm_cbe_slot_1313461_1; - llvm_cbe_tmp4136 = *(&llvm_cbe_slot_1313461_1[((unsigned int )1)]); - llvm_cbe_tmp4138 = ((((unsigned int )(unsigned char )llvm_cbe_tmp4131)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp4136)); - llvm_cbe_recno_11__PHI_TEMPORARY = llvm_cbe_tmp4138; /* for PHI node */ - goto llvm_cbe_cond_next4158; - -llvm_cbe_bb4120: - llvm_cbe_i3185_1413455_1 = llvm_cbe_i3185_1413455_1__PHI_TEMPORARY; - llvm_cbe_slot_1313461_1 = llvm_cbe_slot_1313461_1__PHI_TEMPORARY; - if ((((signed int )llvm_cbe_tmp411513469) > ((signed int )llvm_cbe_i3185_1413455_1))) { - goto llvm_cbe_cond_true4128; - } else { - goto llvm_cbe_cond_false4139; - } - -llvm_cbe_cond_false4076: - llvm_cbe_tmp4079 = *llvm_cbe_tmp3478; - llvm_cbe_tmp411513469 = *llvm_cbe_tmp351413356; - if ((((signed int )llvm_cbe_tmp411513469) > ((signed int )((unsigned int )0)))) { - llvm_cbe_i3185_1413455_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_slot_1313461_0_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_cond_false4092; - } else { - llvm_cbe_i3185_1413455_1__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_slot_1313461_1__PHI_TEMPORARY = llvm_cbe_tmp4079; /* for PHI node */ - goto llvm_cbe_bb4120; - } - - do { /* Syntactic loop 'cond_false4092' to make GCC happy */ -llvm_cbe_cond_false4092: - llvm_cbe_i3185_1413455_0 = llvm_cbe_i3185_1413455_0__PHI_TEMPORARY; - llvm_cbe_slot_1313461_0_rec = llvm_cbe_slot_1313461_0_rec__PHI_TEMPORARY; - llvm_cbe_slot_1313461_0 = &llvm_cbe_tmp4079[llvm_cbe_slot_1313461_0_rec]; - llvm_cbe_tmp4097 = strncmp(llvm_cbe_tmp402913416_0_ph, (&llvm_cbe_tmp4079[(llvm_cbe_slot_1313461_0_rec + ((unsigned int )2))]), llvm_cbe_tmp4053); - if ((llvm_cbe_tmp4097 == ((unsigned int )0))) { - llvm_cbe_i3185_1413455_1__PHI_TEMPORARY = llvm_cbe_i3185_1413455_0; /* for PHI node */ - llvm_cbe_slot_1313461_1__PHI_TEMPORARY = llvm_cbe_slot_1313461_0; /* for PHI node */ - goto llvm_cbe_bb4120; - } else { - goto llvm_cbe_bb4112; - } - -llvm_cbe_bb4112: - llvm_cbe_tmp4107 = *llvm_cbe_tmp3506; - llvm_cbe_tmp4109_rec = llvm_cbe_slot_1313461_0_rec + llvm_cbe_tmp4107; - llvm_cbe_tmp4109 = &llvm_cbe_tmp4079[llvm_cbe_tmp4109_rec]; - llvm_cbe_tmp4111 = llvm_cbe_i3185_1413455_0 + ((unsigned int )1); - if ((((signed int )llvm_cbe_tmp411513469) > ((signed int )llvm_cbe_tmp4111))) { - llvm_cbe_i3185_1413455_0__PHI_TEMPORARY = llvm_cbe_tmp4111; /* for PHI node */ - llvm_cbe_slot_1313461_0_rec__PHI_TEMPORARY = llvm_cbe_tmp4109_rec; /* for PHI node */ - goto llvm_cbe_cond_false4092; - } else { - llvm_cbe_i3185_1413455_1__PHI_TEMPORARY = llvm_cbe_tmp4111; /* for PHI node */ - llvm_cbe_slot_1313461_1__PHI_TEMPORARY = llvm_cbe_tmp4109; /* for PHI node */ - goto llvm_cbe_bb4120; - } - - } while (1); /* end of syntactic loop 'cond_false4092' */ -llvm_cbe_cond_false4139: - llvm_cbe_tmp4145 = *llvm_cbe_tmp24; - llvm_cbe_tmp4146 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp4149 = find_parens(llvm_cbe_tmp4146, llvm_cbe_tmp4145, llvm_cbe_tmp402913416_0_ph, llvm_cbe_tmp4053, ((((unsigned int )(((unsigned int )llvm_cbe_options104_39466_9) >> ((unsigned int )((unsigned int )3))))) & ((unsigned int )1))); - if ((((signed int )llvm_cbe_tmp4149) < ((signed int )((unsigned int )1)))) { - goto llvm_cbe_cond_true4154; - } else { - llvm_cbe_recno_11__PHI_TEMPORARY = llvm_cbe_tmp4149; /* for PHI node */ - goto llvm_cbe_cond_next4158; - } - -llvm_cbe_cond_next4240: - switch (llvm_cbe_tmp4179) { - default: - llvm_cbe_recno_12__PHI_TEMPORARY = llvm_cbe_recno_14_lcssa; /* for PHI node */ - llvm_cbe_save_hwm_11__PHI_TEMPORARY = llvm_cbe_tmp3176; /* for PHI node */ - llvm_cbe_zerofirstbyte_8__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_29740_9; /* for PHI node */ - llvm_cbe_zeroreqbyte_8__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_29762_9; /* for PHI node */ - llvm_cbe_firstbyte102_15__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - goto llvm_cbe_HANDLE_RECURSION; -; - case ((unsigned char )45): - goto llvm_cbe_cond_true4245; - break; - case ((unsigned char )43): - goto llvm_cbe_cond_true4271; - } -llvm_cbe_bb4232: - llvm_cbe_recno_14_lcssa = llvm_cbe_recno_14_lcssa__PHI_TEMPORARY; - llvm_cbe_tmp4233 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp4234 = *llvm_cbe_tmp4233; - if ((llvm_cbe_tmp4234 == ((unsigned char )41))) { - goto llvm_cbe_cond_next4240; - } else { - goto llvm_cbe_cond_true4238; - } - -llvm_cbe_bb4221_preheader: - llvm_cbe_tmp422226553 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp422326554 = *llvm_cbe_tmp422226553; - llvm_cbe_tmp422626557 = *(&digitab[(((unsigned int )(unsigned char )llvm_cbe_tmp422326554))]); - if (((((unsigned char )(llvm_cbe_tmp422626557 & ((unsigned char )4)))) == ((unsigned char )0))) { - llvm_cbe_recno_14_lcssa__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb4232; - } else { - llvm_cbe_recno_1426552__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb4212; - } - -llvm_cbe_bb4177: - llvm_cbe_tmp4178 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp4179 = *llvm_cbe_tmp4178; - switch (llvm_cbe_tmp4179) { - default: - goto llvm_cbe_bb4221_preheader; -; - case ((unsigned char )43): - goto llvm_cbe_cond_true4185; - break; - case ((unsigned char )45): - goto llvm_cbe_cond_true4193; - } -llvm_cbe_bb4163: - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp3177[((unsigned int )3)]); - goto llvm_cbe_bb4177; - -llvm_cbe_cond_true4185: - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp4178[((unsigned int )1)]); - goto llvm_cbe_bb4221_preheader; - -llvm_cbe_cond_next4207: - *(&llvm_cbe_ptr106) = llvm_cbe_tmp4195; - goto llvm_cbe_bb4221_preheader; - -llvm_cbe_cond_true4193: - llvm_cbe_tmp4195 = &llvm_cbe_tmp4178[((unsigned int )1)]; - llvm_cbe_tmp4196 = *llvm_cbe_tmp4195; - llvm_cbe_tmp4199 = *(&digitab[(((unsigned int )(unsigned char )llvm_cbe_tmp4196))]); - if (((((unsigned char )(llvm_cbe_tmp4199 & ((unsigned char )4)))) == ((unsigned char )0))) { - goto llvm_cbe_OTHER_CHAR_AFTER_QUERY; - } else { - goto llvm_cbe_cond_next4207; - } - - do { /* Syntactic loop 'bb4212' to make GCC happy */ -llvm_cbe_bb4212: - llvm_cbe_recno_1426552 = llvm_cbe_recno_1426552__PHI_TEMPORARY; - llvm_cbe_tmp4215 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp4216 = *llvm_cbe_tmp4215; - llvm_cbe_tmp4219 = ((llvm_cbe_recno_1426552 * ((unsigned int )10)) + ((unsigned int )-48)) + (((unsigned int )(unsigned char )llvm_cbe_tmp4216)); - llvm_cbe_tmp4220 = &llvm_cbe_tmp4215[((unsigned int )1)]; - *(&llvm_cbe_ptr106) = llvm_cbe_tmp4220; - llvm_cbe_tmp4223 = *llvm_cbe_tmp4220; - llvm_cbe_tmp4226 = *(&digitab[(((unsigned int )(unsigned char )llvm_cbe_tmp4223))]); - if (((((unsigned char )(llvm_cbe_tmp4226 & ((unsigned char )4)))) == ((unsigned char )0))) { - llvm_cbe_recno_14_lcssa__PHI_TEMPORARY = llvm_cbe_tmp4219; /* for PHI node */ - goto llvm_cbe_bb4232; - } else { - llvm_cbe_recno_1426552__PHI_TEMPORARY = llvm_cbe_tmp4219; /* for PHI node */ - goto llvm_cbe_bb4212; - } - - } while (1); /* end of syntactic loop 'bb4212' */ -llvm_cbe_cond_next4252: - llvm_cbe_tmp4255 = *llvm_cbe_tmp24; - llvm_cbe_tmp4258 = (llvm_cbe_tmp4255 - llvm_cbe_recno_14_lcssa) + ((unsigned int )1); - if ((((signed int )llvm_cbe_tmp4258) < ((signed int )((unsigned int )1)))) { - goto llvm_cbe_cond_true4263; - } else { - llvm_cbe_recno_12__PHI_TEMPORARY = llvm_cbe_tmp4258; /* for PHI node */ - llvm_cbe_save_hwm_11__PHI_TEMPORARY = llvm_cbe_tmp3176; /* for PHI node */ - llvm_cbe_zerofirstbyte_8__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_29740_9; /* for PHI node */ - llvm_cbe_zeroreqbyte_8__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_29762_9; /* for PHI node */ - llvm_cbe_firstbyte102_15__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - goto llvm_cbe_HANDLE_RECURSION; - } - -llvm_cbe_cond_true4245: - if ((llvm_cbe_recno_14_lcssa == ((unsigned int )0))) { - goto llvm_cbe_cond_true4250; - } else { - goto llvm_cbe_cond_next4252; - } - -llvm_cbe_cond_next4278: - llvm_cbe_tmp4281 = *llvm_cbe_tmp24; - llvm_cbe_tmp4283 = llvm_cbe_tmp4281 + llvm_cbe_recno_14_lcssa; - llvm_cbe_recno_12__PHI_TEMPORARY = llvm_cbe_tmp4283; /* for PHI node */ - llvm_cbe_save_hwm_11__PHI_TEMPORARY = llvm_cbe_tmp3176; /* for PHI node */ - llvm_cbe_zerofirstbyte_8__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_29740_9; /* for PHI node */ - llvm_cbe_zeroreqbyte_8__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_29762_9; /* for PHI node */ - llvm_cbe_firstbyte102_15__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - goto llvm_cbe_HANDLE_RECURSION; - -llvm_cbe_cond_true4271: - if ((llvm_cbe_recno_14_lcssa == ((unsigned int )0))) { - goto llvm_cbe_cond_true4276; - } else { - goto llvm_cbe_cond_next4278; - } - -llvm_cbe_cond_next4327: - llvm_cbe_tmp4330 = *llvm_cbe_tmp4563; - llvm_cbe_tmp4332 = &llvm_cbe_tmp4330[llvm_cbe_recno_12]; - llvm_cbe_tmp4335 = *llvm_cbe_tmp203; - llvm_cbe_tmp4338 = &llvm_cbe_code105_10[((unsigned int )4)]; - *llvm_cbe_tmp4335 = (((unsigned char )(((unsigned int )(((unsigned int )((((unsigned int )(unsigned long)llvm_cbe_tmp4338)) - (((unsigned int )(unsigned long)llvm_cbe_tmp4330)))) >> ((unsigned int )((unsigned int )8))))))); - llvm_cbe_tmp4350 = *llvm_cbe_tmp203; - llvm_cbe_tmp4358 = *llvm_cbe_tmp4563; - *(&llvm_cbe_tmp4350[((unsigned int )1)]) = (((unsigned char )((((unsigned char )(unsigned long)llvm_cbe_tmp4338)) - (((unsigned char )(unsigned long)llvm_cbe_tmp4358))))); - llvm_cbe_tmp4366 = *llvm_cbe_tmp203; - *llvm_cbe_tmp203 = (&llvm_cbe_tmp4366[((unsigned int )2)]); - llvm_cbe_called_6__PHI_TEMPORARY = llvm_cbe_tmp4332; /* for PHI node */ - goto llvm_cbe_cond_next4435; - -llvm_cbe_cond_true4312: - llvm_cbe_tmp4318 = *llvm_cbe_tmp24; - llvm_cbe_tmp4319 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp4321 = find_parens(llvm_cbe_tmp4319, llvm_cbe_tmp4318, ((unsigned char *)/*NULL*/0), llvm_cbe_recno_12, ((((unsigned int )(((unsigned int )llvm_cbe_options104_39466_9) >> ((unsigned int )((unsigned int )3))))) & ((unsigned int )1))); - if ((((signed int )llvm_cbe_tmp4321) < ((signed int )((unsigned int )0)))) { - goto llvm_cbe_cond_true4325; - } else { - goto llvm_cbe_cond_next4327; - } - -llvm_cbe_cond_next4307: - llvm_cbe_called_5 = llvm_cbe_called_5__PHI_TEMPORARY; - if ((llvm_cbe_called_5 == ((unsigned char *)/*NULL*/0))) { - goto llvm_cbe_cond_true4312; - } else { - goto llvm_cbe_cond_false4370; - } - -llvm_cbe_cond_true4294: - *llvm_cbe_code105_10 = ((unsigned char )0); - if ((llvm_cbe_recno_12 == ((unsigned int )0))) { - llvm_cbe_called_5__PHI_TEMPORARY = llvm_cbe_tmp4289; /* for PHI node */ - goto llvm_cbe_cond_next4307; - } else { - goto llvm_cbe_cond_true4300; - } - -llvm_cbe_cond_true4300: - llvm_cbe_tmp4303 = *llvm_cbe_tmp4563; - llvm_cbe_tmp4306 = find_bracket(llvm_cbe_tmp4303, llvm_cbe_recno_12); - llvm_cbe_called_5__PHI_TEMPORARY = llvm_cbe_tmp4306; /* for PHI node */ - goto llvm_cbe_cond_next4307; - -llvm_cbe_cond_false4370: - llvm_cbe_tmp4373 = *(&llvm_cbe_called_5[((unsigned int )1)]); - llvm_cbe_tmp4378 = *(&llvm_cbe_called_5[((unsigned int )2)]); - if (((((((unsigned int )(unsigned char )llvm_cbe_tmp4373)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp4378))) == ((unsigned int )0))) { - llvm_cbe_bcptr4386_6__PHI_TEMPORARY = (&llvm_cbe_bc); /* for PHI node */ - goto llvm_cbe_bb4409; - } else { - llvm_cbe_called_6__PHI_TEMPORARY = llvm_cbe_called_5; /* for PHI node */ - goto llvm_cbe_cond_next4435; - } - - do { /* Syntactic loop 'bb4409' to make GCC happy */ -llvm_cbe_bb4409: - llvm_cbe_bcptr4386_6 = llvm_cbe_bcptr4386_6__PHI_TEMPORARY; - if ((llvm_cbe_bcptr4386_6 == ((struct l_struct_2E_branch_chain *)/*NULL*/0))) { - goto llvm_cbe_cond_true4430; - } else { - goto llvm_cbe_cond_next4415; - } - -llvm_cbe_cond_next4405: - llvm_cbe_tmp4408 = *(&llvm_cbe_bcptr4386_6->field0); - llvm_cbe_bcptr4386_6__PHI_TEMPORARY = llvm_cbe_tmp4408; /* for PHI node */ - goto llvm_cbe_bb4409; - -llvm_cbe_bb4393: - llvm_cbe_tmp4399 = could_be_empty_branch(llvm_cbe_tmp4418, llvm_cbe_code105_10); - if ((llvm_cbe_tmp4399 == ((unsigned int )0))) { - llvm_cbe_called_6__PHI_TEMPORARY = llvm_cbe_called_5; /* for PHI node */ - goto llvm_cbe_cond_next4435; - } else { - goto llvm_cbe_cond_next4405; - } - -llvm_cbe_cond_next4415: - llvm_cbe_tmp4418 = *(&llvm_cbe_bcptr4386_6->field1); - if ((((unsigned char *)llvm_cbe_tmp4418) < ((unsigned char *)llvm_cbe_called_5))) { - goto llvm_cbe_cond_true4430; - } else { - goto llvm_cbe_bb4393; - } - - } while (1); /* end of syntactic loop 'bb4409' */ -llvm_cbe_bb4584: - *llvm_cbe_tmp4496 = llvm_cbe_tmp4555; - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp4537[((unsigned int )1)]); - llvm_cbe_slot_913437_0_us61_13__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_13__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_repeat_max_10__PHI_TEMPORARY = llvm_cbe_repeat_max_10; /* for PHI node */ - llvm_cbe_repeat_min_10__PHI_TEMPORARY = llvm_cbe_repeat_min_10; /* for PHI node */ - llvm_cbe_options_addr_2__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_save_hwm_7__PHI_TEMPORARY = llvm_cbe_tmp3176; /* for PHI node */ - llvm_cbe_previous_callout_5__PHI_TEMPORARY = llvm_cbe_previous_callout_9; /* for PHI node */ - llvm_cbe_previous_3__PHI_TEMPORARY = ((unsigned char *)/*NULL*/0); /* for PHI node */ - llvm_cbe_groupsetfirstbyte_2__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_9; /* for PHI node */ - llvm_cbe_inescq_2__PHI_TEMPORARY = llvm_cbe_inescq_29422_9; /* for PHI node */ - llvm_cbe_last_code_2__PHI_TEMPORARY = llvm_cbe_last_code_15771_1; /* for PHI node */ - llvm_cbe_code105_3__PHI_TEMPORARY = llvm_cbe_code105_10; /* for PHI node */ - llvm_cbe_after_manual_callout_7__PHI_TEMPORARY = llvm_cbe_after_manual_callout_1; /* for PHI node */ - llvm_cbe_options104_3__PHI_TEMPORARY = llvm_cbe_tmp4555; /* for PHI node */ - llvm_cbe_req_caseopt_3__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_9; /* for PHI node */ - llvm_cbe_zerofirstbyte_2__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_29740_9; /* for PHI node */ - llvm_cbe_zeroreqbyte_2__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_29762_9; /* for PHI node */ - llvm_cbe_reqbyte103_5__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_9; /* for PHI node */ - llvm_cbe_firstbyte102_3__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - llvm_cbe_greedy_non_default_3__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_9; /* for PHI node */ - llvm_cbe_greedy_default_3__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_9; /* for PHI node */ - goto llvm_cbe_bb131; - -llvm_cbe_cond_next4572: - if ((llvm_cbe_iftmp_509_0 == ((unsigned int *)/*NULL*/0))) { - goto llvm_cbe_bb4584; - } else { - goto llvm_cbe_cond_next4578; - } - -llvm_cbe_cond_true4561: - llvm_cbe_tmp4564 = *llvm_cbe_tmp4563; - if (((&llvm_cbe_tmp4564[((unsigned int )3)]) == llvm_cbe_code105_10)) { - goto llvm_cbe_cond_next4572; - } else { - goto llvm_cbe_bb4589; - } - -llvm_cbe_bb4550: - llvm_cbe_tmp4551 = *(&llvm_cbe_set); - llvm_cbe_tmp4554 = *(&llvm_cbe_unset); - llvm_cbe_tmp4555 = (llvm_cbe_tmp4551 | llvm_cbe_options104_39466_9) & (llvm_cbe_tmp4554 ^ ((unsigned int )-1)); - if ((llvm_cbe_tmp4538 == ((unsigned char )41))) { - goto llvm_cbe_cond_true4561; - } else { - goto llvm_cbe_cond_next4625; - } - - do { /* Syntactic loop 'bb4536' to make GCC happy */ -llvm_cbe_bb4536: - llvm_cbe_optset_6 = llvm_cbe_optset_6__PHI_TEMPORARY; - llvm_cbe_tmp4537 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp4538 = *llvm_cbe_tmp4537; - switch (llvm_cbe_tmp4538) { - default: - goto llvm_cbe_bb4484; -; - case ((unsigned char )41): - goto llvm_cbe_bb4550; - break; - case ((unsigned char )58): - goto llvm_cbe_bb4550; - break; - } -llvm_cbe_bb4484: - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp4537[((unsigned int )1)]); - switch ((((unsigned int )(unsigned char )llvm_cbe_tmp4538))) { - default: - goto llvm_cbe_bb4531; -; - case ((unsigned int )45): - llvm_cbe_optset_6__PHI_TEMPORARY = (&llvm_cbe_unset); /* for PHI node */ - goto llvm_cbe_bb4536; - case ((unsigned int )74): - goto llvm_cbe_bb4490; - break; - case ((unsigned int )85): - goto llvm_cbe_bb4521; - case ((unsigned int )88): - goto llvm_cbe_bb4526; - case ((unsigned int )105): - goto llvm_cbe_bb4501; - case ((unsigned int )109): - goto llvm_cbe_bb4506; - case ((unsigned int )115): - goto llvm_cbe_bb4511; - case ((unsigned int )120): - goto llvm_cbe_bb4516; - } -llvm_cbe_bb4490: - llvm_cbe_tmp4492 = *llvm_cbe_optset_6; - *llvm_cbe_optset_6 = (llvm_cbe_tmp4492 | ((unsigned int )524288)); - llvm_cbe_tmp4497 = *llvm_cbe_tmp4496; - *llvm_cbe_tmp4496 = (llvm_cbe_tmp4497 | ((unsigned int )134217728)); - llvm_cbe_optset_6__PHI_TEMPORARY = llvm_cbe_optset_6; /* for PHI node */ - goto llvm_cbe_bb4536; - -llvm_cbe_bb4501: - llvm_cbe_tmp4503 = *llvm_cbe_optset_6; - *llvm_cbe_optset_6 = (llvm_cbe_tmp4503 | ((unsigned int )1)); - llvm_cbe_optset_6__PHI_TEMPORARY = llvm_cbe_optset_6; /* for PHI node */ - goto llvm_cbe_bb4536; - -llvm_cbe_bb4506: - llvm_cbe_tmp4508 = *llvm_cbe_optset_6; - *llvm_cbe_optset_6 = (llvm_cbe_tmp4508 | ((unsigned int )2)); - llvm_cbe_optset_6__PHI_TEMPORARY = llvm_cbe_optset_6; /* for PHI node */ - goto llvm_cbe_bb4536; - -llvm_cbe_bb4511: - llvm_cbe_tmp4513 = *llvm_cbe_optset_6; - *llvm_cbe_optset_6 = (llvm_cbe_tmp4513 | ((unsigned int )4)); - llvm_cbe_optset_6__PHI_TEMPORARY = llvm_cbe_optset_6; /* for PHI node */ - goto llvm_cbe_bb4536; - -llvm_cbe_bb4516: - llvm_cbe_tmp4518 = *llvm_cbe_optset_6; - *llvm_cbe_optset_6 = (llvm_cbe_tmp4518 | ((unsigned int )8)); - llvm_cbe_optset_6__PHI_TEMPORARY = llvm_cbe_optset_6; /* for PHI node */ - goto llvm_cbe_bb4536; - -llvm_cbe_bb4521: - llvm_cbe_tmp4523 = *llvm_cbe_optset_6; - *llvm_cbe_optset_6 = (llvm_cbe_tmp4523 | ((unsigned int )512)); - llvm_cbe_optset_6__PHI_TEMPORARY = llvm_cbe_optset_6; /* for PHI node */ - goto llvm_cbe_bb4536; - -llvm_cbe_bb4526: - llvm_cbe_tmp4528 = *llvm_cbe_optset_6; - *llvm_cbe_optset_6 = (llvm_cbe_tmp4528 | ((unsigned int )64)); - llvm_cbe_optset_6__PHI_TEMPORARY = llvm_cbe_optset_6; /* for PHI node */ - goto llvm_cbe_bb4536; - - } while (1); /* end of syntactic loop 'bb4536' */ -llvm_cbe_OTHER_CHAR_AFTER_QUERY: - *(&llvm_cbe_unset) = ((unsigned int )0); - *(&llvm_cbe_set) = ((unsigned int )0); - llvm_cbe_optset_6__PHI_TEMPORARY = (&llvm_cbe_set); /* for PHI node */ - goto llvm_cbe_bb4536; - -llvm_cbe_cond_next4578: - llvm_cbe_tmp4580 = *llvm_cbe_iftmp_509_0; - if ((llvm_cbe_tmp4580 == ((unsigned int )6))) { - goto llvm_cbe_bb4584; - } else { - goto llvm_cbe_bb4589; - } - -llvm_cbe_cond_false4621: - llvm_cbe_tmp519613486 = *(&llvm_cbe_ptr106); - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp519613486[((unsigned int )1)]); - llvm_cbe_slot_913437_0_us61_13__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_13__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_repeat_max_10__PHI_TEMPORARY = llvm_cbe_repeat_max_10; /* for PHI node */ - llvm_cbe_repeat_min_10__PHI_TEMPORARY = llvm_cbe_repeat_min_10; /* for PHI node */ - llvm_cbe_options_addr_2__PHI_TEMPORARY = llvm_cbe_tmp4555; /* for PHI node */ - llvm_cbe_save_hwm_7__PHI_TEMPORARY = llvm_cbe_tmp3176; /* for PHI node */ - llvm_cbe_previous_callout_5__PHI_TEMPORARY = llvm_cbe_previous_callout_9; /* for PHI node */ - llvm_cbe_previous_3__PHI_TEMPORARY = ((unsigned char *)/*NULL*/0); /* for PHI node */ - llvm_cbe_groupsetfirstbyte_2__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_9; /* for PHI node */ - llvm_cbe_inescq_2__PHI_TEMPORARY = llvm_cbe_inescq_29422_9; /* for PHI node */ - llvm_cbe_last_code_2__PHI_TEMPORARY = llvm_cbe_last_code_15771_1; /* for PHI node */ - llvm_cbe_code105_3__PHI_TEMPORARY = llvm_cbe_code105_24; /* for PHI node */ - llvm_cbe_after_manual_callout_7__PHI_TEMPORARY = llvm_cbe_after_manual_callout_1; /* for PHI node */ - llvm_cbe_options104_3__PHI_TEMPORARY = llvm_cbe_tmp4555; /* for PHI node */ - llvm_cbe_req_caseopt_3__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_zerofirstbyte_2__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_29740_9; /* for PHI node */ - llvm_cbe_zeroreqbyte_2__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_29762_9; /* for PHI node */ - llvm_cbe_reqbyte103_5__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_9; /* for PHI node */ - llvm_cbe_firstbyte102_3__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - llvm_cbe_greedy_non_default_3__PHI_TEMPORARY = llvm_cbe_tmp4615; /* for PHI node */ - llvm_cbe_greedy_default_3__PHI_TEMPORARY = llvm_cbe_tmp4613; /* for PHI node */ - goto llvm_cbe_bb131; - -llvm_cbe_cond_next4607: - llvm_cbe_code105_24 = llvm_cbe_code105_24__PHI_TEMPORARY; - llvm_cbe_tmp4613 = (((unsigned int )(((unsigned int )llvm_cbe_tmp4555) >> ((unsigned int )((unsigned int )9))))) & ((unsigned int )1); - llvm_cbe_tmp4615 = llvm_cbe_tmp4613 ^ ((unsigned int )1); - if (((llvm_cbe_tmp4555 & ((unsigned int )1)) == ((unsigned int )0))) { - goto llvm_cbe_cond_false4621; - } else { - llvm_cbe_slot_913437_0_us61_5__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_5__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_1__PHI_TEMPORARY = llvm_cbe_tmp4555; /* for PHI node */ - llvm_cbe_save_hwm_6__PHI_TEMPORARY = llvm_cbe_tmp3176; /* for PHI node */ - llvm_cbe_previous_callout_4__PHI_TEMPORARY = llvm_cbe_previous_callout_9; /* for PHI node */ - llvm_cbe_previous_6__PHI_TEMPORARY = ((unsigned char *)/*NULL*/0); /* for PHI node */ - llvm_cbe_groupsetfirstbyte_1__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_9; /* for PHI node */ - llvm_cbe_inescq_1__PHI_TEMPORARY = llvm_cbe_inescq_29422_9; /* for PHI node */ - llvm_cbe_code105_9__PHI_TEMPORARY = llvm_cbe_code105_24; /* for PHI node */ - llvm_cbe_options104_2__PHI_TEMPORARY = llvm_cbe_tmp4555; /* for PHI node */ - llvm_cbe_req_caseopt_2__PHI_TEMPORARY = ((unsigned int )256); /* for PHI node */ - llvm_cbe_zerofirstbyte_1__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_29740_9; /* for PHI node */ - llvm_cbe_zeroreqbyte_1__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_29762_9; /* for PHI node */ - llvm_cbe_firstbyte102_2__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - llvm_cbe_greedy_non_default_2__PHI_TEMPORARY = llvm_cbe_tmp4615; /* for PHI node */ - llvm_cbe_greedy_default_2__PHI_TEMPORARY = llvm_cbe_tmp4613; /* for PHI node */ - goto llvm_cbe_bb5195; - } - -llvm_cbe_bb4589: - if ((((llvm_cbe_tmp4555 ^ llvm_cbe_options104_39466_9) & ((unsigned int )7)) == ((unsigned int )0))) { - llvm_cbe_code105_24__PHI_TEMPORARY = llvm_cbe_code105_10; /* for PHI node */ - goto llvm_cbe_cond_next4607; - } else { - goto llvm_cbe_cond_true4597; - } - -llvm_cbe_cond_true4597: - *llvm_cbe_code105_10 = ((unsigned char )24); - *(&llvm_cbe_code105_10[((unsigned int )1)]) = (((unsigned char )((((unsigned char )llvm_cbe_tmp4555)) & ((unsigned char )7)))); - llvm_cbe_tmp4606 = &llvm_cbe_code105_10[((unsigned int )2)]; - llvm_cbe_code105_24__PHI_TEMPORARY = llvm_cbe_tmp4606; /* for PHI node */ - goto llvm_cbe_cond_next4607; - -llvm_cbe_cond_true4852: - llvm_cbe_tmp519613492 = *(&llvm_cbe_ptr106); - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp519613492[((unsigned int )1)]); - llvm_cbe_slot_913437_0_us61_13__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_3; /* for PHI node */ - llvm_cbe_slot_913437_059_13__PHI_TEMPORARY = llvm_cbe_slot_913437_059_3; /* for PHI node */ - llvm_cbe_repeat_max_10__PHI_TEMPORARY = llvm_cbe_repeat_max_10; /* for PHI node */ - llvm_cbe_repeat_min_10__PHI_TEMPORARY = llvm_cbe_repeat_min_10; /* for PHI node */ - llvm_cbe_options_addr_2__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_save_hwm_7__PHI_TEMPORARY = llvm_cbe_tmp3176; /* for PHI node */ - llvm_cbe_previous_callout_5__PHI_TEMPORARY = llvm_cbe_previous_callout_9; /* for PHI node */ - llvm_cbe_previous_3__PHI_TEMPORARY = llvm_cbe_iftmp_467_0; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_2__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_4; /* for PHI node */ - llvm_cbe_inescq_2__PHI_TEMPORARY = llvm_cbe_inescq_29422_9; /* for PHI node */ - llvm_cbe_last_code_2__PHI_TEMPORARY = llvm_cbe_last_code_15771_1; /* for PHI node */ - llvm_cbe_code105_3__PHI_TEMPORARY = llvm_cbe_code105_26; /* for PHI node */ - llvm_cbe_after_manual_callout_7__PHI_TEMPORARY = llvm_cbe_after_manual_callout_1; /* for PHI node */ - llvm_cbe_options104_3__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_req_caseopt_3__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_9; /* for PHI node */ - llvm_cbe_zerofirstbyte_2__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_3; /* for PHI node */ - llvm_cbe_zeroreqbyte_2__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_9; /* for PHI node */ - llvm_cbe_reqbyte103_5__PHI_TEMPORARY = llvm_cbe_tmp4848; /* for PHI node */ - llvm_cbe_firstbyte102_3__PHI_TEMPORARY = llvm_cbe_firstbyte102_11; /* for PHI node */ - llvm_cbe_greedy_non_default_3__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_9; /* for PHI node */ - llvm_cbe_greedy_default_3__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_9; /* for PHI node */ - goto llvm_cbe_bb131; - -llvm_cbe_cond_next4847: - llvm_cbe_groupsetfirstbyte_4 = llvm_cbe_groupsetfirstbyte_4__PHI_TEMPORARY; - llvm_cbe_zerofirstbyte_3 = llvm_cbe_zerofirstbyte_3__PHI_TEMPORARY; - llvm_cbe_firstbyte102_11 = llvm_cbe_firstbyte102_11__PHI_TEMPORARY; - llvm_cbe_tmp4848 = *(&llvm_cbe_subreqbyte); - if ((((signed int )llvm_cbe_tmp4848) > ((signed int )((unsigned int )-1)))) { - goto llvm_cbe_cond_true4852; - } else { - llvm_cbe_slot_913437_0_us61_5__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_3; /* for PHI node */ - llvm_cbe_slot_913437_059_5__PHI_TEMPORARY = llvm_cbe_slot_913437_059_3; /* for PHI node */ - llvm_cbe_options_addr_1__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_save_hwm_6__PHI_TEMPORARY = llvm_cbe_tmp3176; /* for PHI node */ - llvm_cbe_previous_callout_4__PHI_TEMPORARY = llvm_cbe_previous_callout_9; /* for PHI node */ - llvm_cbe_previous_6__PHI_TEMPORARY = llvm_cbe_iftmp_467_0; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_1__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_4; /* for PHI node */ - llvm_cbe_inescq_1__PHI_TEMPORARY = llvm_cbe_inescq_29422_9; /* for PHI node */ - llvm_cbe_code105_9__PHI_TEMPORARY = llvm_cbe_code105_26; /* for PHI node */ - llvm_cbe_options104_2__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_req_caseopt_2__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_9; /* for PHI node */ - llvm_cbe_zerofirstbyte_1__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_3; /* for PHI node */ - llvm_cbe_zeroreqbyte_1__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_9; /* for PHI node */ - llvm_cbe_firstbyte102_2__PHI_TEMPORARY = llvm_cbe_firstbyte102_11; /* for PHI node */ - llvm_cbe_greedy_non_default_2__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_9; /* for PHI node */ - llvm_cbe_greedy_default_2__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_9; /* for PHI node */ - goto llvm_cbe_bb5195; - } - -llvm_cbe_cond_true4822: - if ((((signed int )llvm_cbe_tmp4823) > ((signed int )((unsigned int )-1)))) { - goto llvm_cbe_cond_true4827; - } else { - llvm_cbe_groupsetfirstbyte_4__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_zerofirstbyte_3__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - llvm_cbe_firstbyte102_11__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_cond_next4847; - } - -llvm_cbe_cond_true4817: - llvm_cbe_tmp4823 = *(&llvm_cbe_subfirstbyte); - if ((llvm_cbe_firstbyte102_39829_9 == ((unsigned int )-2))) { - goto llvm_cbe_cond_true4822; - } else { - goto llvm_cbe_cond_false4831; - } - -llvm_cbe_cond_next4810: - if ((((signed int )llvm_cbe_bravalue_9) > ((signed int )((unsigned int )91)))) { - goto llvm_cbe_cond_true4817; - } else { - goto llvm_cbe_cond_false4855; - } - -llvm_cbe_cond_next4804: - llvm_cbe_code105_26 = llvm_cbe_code105_26__PHI_TEMPORARY; - if ((llvm_cbe_bravalue_9 == ((unsigned int )101))) { - llvm_cbe_slot_913437_0_us61_5__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_3; /* for PHI node */ - llvm_cbe_slot_913437_059_5__PHI_TEMPORARY = llvm_cbe_slot_913437_059_3; /* for PHI node */ - llvm_cbe_options_addr_1__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_save_hwm_6__PHI_TEMPORARY = llvm_cbe_tmp3176; /* for PHI node */ - llvm_cbe_previous_callout_4__PHI_TEMPORARY = llvm_cbe_previous_callout_9; /* for PHI node */ - llvm_cbe_previous_6__PHI_TEMPORARY = llvm_cbe_iftmp_467_0; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_1__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_9; /* for PHI node */ - llvm_cbe_inescq_1__PHI_TEMPORARY = llvm_cbe_inescq_29422_9; /* for PHI node */ - llvm_cbe_code105_9__PHI_TEMPORARY = llvm_cbe_code105_26; /* for PHI node */ - llvm_cbe_options104_2__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_req_caseopt_2__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_9; /* for PHI node */ - llvm_cbe_zerofirstbyte_1__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_29740_9; /* for PHI node */ - llvm_cbe_zeroreqbyte_1__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_29762_9; /* for PHI node */ - llvm_cbe_firstbyte102_2__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - llvm_cbe_greedy_non_default_2__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_9; /* for PHI node */ - llvm_cbe_greedy_default_2__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_9; /* for PHI node */ - goto llvm_cbe_bb5195; - } else { - goto llvm_cbe_cond_next4810; - } - -llvm_cbe_cond_true4778: - llvm_cbe_tmp4780 = *llvm_cbe_iftmp_509_0; - llvm_cbe_tmp4781 = *(&llvm_cbe_length_prevgroup); - *llvm_cbe_iftmp_509_0 = ((llvm_cbe_tmp4780 + ((unsigned int )-6)) + llvm_cbe_tmp4781); - *(&llvm_cbe_code105_10[((unsigned int )1)]) = ((unsigned char )0); - *(&llvm_cbe_code105_10[((unsigned int )2)]) = ((unsigned char )3); - *(&llvm_cbe_code105_10[((unsigned int )3)]) = ((unsigned char )84); - *(&llvm_cbe_code105_10[((unsigned int )4)]) = ((unsigned char )0); - *(&llvm_cbe_code105_10[((unsigned int )5)]) = ((unsigned char )3); - llvm_cbe_tmp4801 = &llvm_cbe_code105_10[((unsigned int )6)]; - llvm_cbe_code105_26__PHI_TEMPORARY = llvm_cbe_tmp4801; /* for PHI node */ - goto llvm_cbe_cond_next4804; - -llvm_cbe_cond_next4773: - if ((llvm_cbe_iftmp_509_0 == ((unsigned int *)/*NULL*/0))) { - goto llvm_cbe_cond_false4802; - } else { - goto llvm_cbe_cond_true4778; - } - -llvm_cbe_cond_next4765: - llvm_cbe_bravalue_9 = llvm_cbe_bravalue_9__PHI_TEMPORARY; - llvm_cbe_tmp4766 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp4767 = *llvm_cbe_tmp4766; - if ((llvm_cbe_tmp4767 == ((unsigned char )41))) { - goto llvm_cbe_cond_next4773; - } else { - goto llvm_cbe_cond_true4771; - } - -llvm_cbe_cond_next4700: - if (((llvm_cbe_bravalue_8 == ((unsigned int )95)) & (llvm_cbe_iftmp_509_0 == ((unsigned int *)/*NULL*/0)))) { - llvm_cbe_condcount_6__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_tc_6_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb4714; - } else { - llvm_cbe_bravalue_9__PHI_TEMPORARY = llvm_cbe_bravalue_8; /* for PHI node */ - goto llvm_cbe_cond_next4765; - } - -llvm_cbe_cond_next4658: - llvm_cbe_slot_913437_0_us61_3 = llvm_cbe_slot_913437_0_us61_3__PHI_TEMPORARY; - llvm_cbe_slot_913437_059_3 = llvm_cbe_slot_913437_059_3__PHI_TEMPORARY; - llvm_cbe_skipbytes133_8 = llvm_cbe_skipbytes133_8__PHI_TEMPORARY; - llvm_cbe_newoptions_8 = llvm_cbe_newoptions_8__PHI_TEMPORARY; - llvm_cbe_reset_bracount132_9 = llvm_cbe_reset_bracount132_9__PHI_TEMPORARY; - llvm_cbe_bravalue_8 = llvm_cbe_bravalue_8__PHI_TEMPORARY; - llvm_cbe_iftmp_467_0 = (((((signed int )llvm_cbe_bravalue_8) > ((signed int )((unsigned int )91)))) ? (llvm_cbe_code105_10) : (((unsigned char *)/*NULL*/0))); - *llvm_cbe_code105_10 = (((unsigned char )llvm_cbe_bravalue_8)); - *(&llvm_cbe_tempcode) = llvm_cbe_code105_10; - llvm_cbe_tmp4674 = *llvm_cbe_tmp1993; - *(&llvm_cbe_length_prevgroup) = ((unsigned int )0); - llvm_cbe_tmp4695 = compile_regex(llvm_cbe_newoptions_8, (llvm_cbe_options104_39466_9 & ((unsigned int )7)), (&llvm_cbe_tempcode), (&llvm_cbe_ptr106), llvm_cbe_errorcodeptr, (((unsigned int )(bool )(((unsigned int )(llvm_cbe_bravalue_8 + ((unsigned int )-89))) < ((unsigned int )((unsigned int )2))))), llvm_cbe_reset_bracount132_9, llvm_cbe_skipbytes133_8, (&llvm_cbe_subfirstbyte), (&llvm_cbe_subreqbyte), (&llvm_cbe_bc), llvm_cbe_cd, llvm_cbe_iftmp_468_0); - if ((llvm_cbe_tmp4695 == ((unsigned int )0))) { - llvm_cbe_slot_913437_0_us61_12__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_3; /* for PHI node */ - llvm_cbe_slot_913437_059_12__PHI_TEMPORARY = llvm_cbe_slot_913437_059_3; /* for PHI node */ - goto llvm_cbe_FAILED; - } else { - goto llvm_cbe_cond_next4700; - } - -llvm_cbe_bb3221: - llvm_cbe_reset_bracount132_8 = llvm_cbe_reset_bracount132_8__PHI_TEMPORARY; - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp3177[((unsigned int )3)]); - llvm_cbe_slot_913437_0_us61_3__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_3__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_skipbytes133_8__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_newoptions_8__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_reset_bracount132_9__PHI_TEMPORARY = llvm_cbe_reset_bracount132_8; /* for PHI node */ - llvm_cbe_bravalue_8__PHI_TEMPORARY = ((unsigned int )93); /* for PHI node */ - goto llvm_cbe_cond_next4658; - -llvm_cbe_bb3220: - llvm_cbe_reset_bracount132_8__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_bb3221; - -llvm_cbe_cond_true3231: - llvm_cbe_tmp3234 = *(&llvm_cbe_tmp3177[((unsigned int )4)]); - switch (llvm_cbe_tmp3234) { - default: - goto llvm_cbe_cond_next3256; -; - case ((unsigned char )33): - llvm_cbe_slot_913437_0_us61_3__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_3__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_skipbytes133_8__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_newoptions_8__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_reset_bracount132_9__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_bravalue_8__PHI_TEMPORARY = ((unsigned int )95); /* for PHI node */ - goto llvm_cbe_cond_next4658; - case ((unsigned char )61): - llvm_cbe_slot_913437_0_us61_3__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_3__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_skipbytes133_8__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_newoptions_8__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_reset_bracount132_9__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_bravalue_8__PHI_TEMPORARY = ((unsigned int )95); /* for PHI node */ - goto llvm_cbe_cond_next4658; - case ((unsigned char )60): - llvm_cbe_slot_913437_0_us61_3__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_3__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_skipbytes133_8__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_newoptions_8__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_reset_bracount132_9__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_bravalue_8__PHI_TEMPORARY = ((unsigned int )95); /* for PHI node */ - goto llvm_cbe_cond_next4658; - } -llvm_cbe_bb3224: - llvm_cbe_tmp3227 = *(&llvm_cbe_tmp3177[((unsigned int )3)]); - if ((llvm_cbe_tmp3227 == ((unsigned char )63))) { - goto llvm_cbe_cond_true3231; - } else { - goto llvm_cbe_cond_next3256; - } - -llvm_cbe_bb3422: - if ((llvm_cbe_iftmp_509_0 == ((unsigned int *)/*NULL*/0))) { - goto llvm_cbe_cond_next3428; - } else { - llvm_cbe_slot_913437_0_us61_3__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_3__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_skipbytes133_8__PHI_TEMPORARY = ((unsigned int )3); /* for PHI node */ - llvm_cbe_newoptions_8__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_reset_bracount132_9__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_bravalue_8__PHI_TEMPORARY = ((unsigned int )95); /* for PHI node */ - goto llvm_cbe_cond_next4658; - } - -llvm_cbe_bb3411: - llvm_cbe_tmp3412 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp3413 = *llvm_cbe_tmp3412; - llvm_cbe_tmp3416 = &llvm_cbe_tmp3412[((unsigned int )1)]; - *(&llvm_cbe_ptr106) = llvm_cbe_tmp3416; - if ((llvm_cbe_tmp3413 == ((unsigned char )41))) { - goto llvm_cbe_bb3422; - } else { - goto llvm_cbe_bb3418; - } - -llvm_cbe_bb3391: - llvm_cbe_recno_7_lcssa = llvm_cbe_recno_7_lcssa__PHI_TEMPORARY; - llvm_cbe_tmp3392 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp3396 = (((unsigned int )(unsigned long)llvm_cbe_tmp3392)) - (((unsigned int )(unsigned long)llvm_cbe_tmp3328)); - if ((((signed int )llvm_cbe_terminator_0) < ((signed int )((unsigned int )1)))) { - goto llvm_cbe_bb3411; - } else { - goto llvm_cbe_cond_next3402; - } - -llvm_cbe_bb3377_preheader: - llvm_cbe_tmp338226532 = *llvm_cbe_tmp3328; - llvm_cbe_tmp338526535 = *(&llvm_cbe_tmp3326[(((unsigned int )(unsigned char )llvm_cbe_tmp338226532))]); - if (((((unsigned char )(llvm_cbe_tmp338526535 & ((unsigned char )16)))) == ((unsigned char )0))) { - llvm_cbe_recno_7_lcssa__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb3391; - } else { - llvm_cbe_recno_726527__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb3347; - } - -llvm_cbe_bb3323: - llvm_cbe_terminator_0 = llvm_cbe_terminator_0__PHI_TEMPORARY; - llvm_cbe_refsign_6 = llvm_cbe_refsign_6__PHI_TEMPORARY; - llvm_cbe_tmp3326 = *llvm_cbe_tmp435; - llvm_cbe_tmp3327 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp3328 = &llvm_cbe_tmp3327[((unsigned int )1)]; - llvm_cbe_tmp3329 = *llvm_cbe_tmp3328; - llvm_cbe_tmp3332 = *(&llvm_cbe_tmp3326[(((unsigned int )(unsigned char )llvm_cbe_tmp3329))]); - *(&llvm_cbe_ptr106) = llvm_cbe_tmp3328; - if (((((unsigned char )(llvm_cbe_tmp3332 & ((unsigned char )16)))) == ((unsigned char )0))) { - goto llvm_cbe_cond_true3339; - } else { - goto llvm_cbe_bb3377_preheader; - } - -llvm_cbe_cond_next3256: - llvm_cbe_tmp3258 = &llvm_cbe_code105_10[((unsigned int )3)]; - *llvm_cbe_tmp3258 = ((unsigned char )99); - llvm_cbe_tmp3259 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp3260 = &llvm_cbe_tmp3259[((unsigned int )1)]; - llvm_cbe_tmp3261 = *llvm_cbe_tmp3260; - switch (llvm_cbe_tmp3261) { - default: - llvm_cbe_terminator_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_refsign_6__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_bb3323; -; - case ((unsigned char )82): - goto llvm_cbe_cond_next3266; - break; - case ((unsigned char )60): - goto llvm_cbe_cond_true3286; - case ((unsigned char )39): - goto llvm_cbe_cond_true3296; - case ((unsigned char )43): - goto llvm_cbe_cond_true3314; - case ((unsigned char )45): - goto llvm_cbe_cond_true3314; - } -llvm_cbe_cond_next3274: - *(&llvm_cbe_ptr106) = llvm_cbe_tmp3268; - *llvm_cbe_tmp3258 = ((unsigned char )100); - llvm_cbe_terminator_0__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - llvm_cbe_refsign_6__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_bb3323; - -llvm_cbe_cond_next3266: - llvm_cbe_tmp3268 = &llvm_cbe_tmp3259[((unsigned int )2)]; - llvm_cbe_tmp3269 = *llvm_cbe_tmp3268; - if ((llvm_cbe_tmp3269 == ((unsigned char )38))) { - goto llvm_cbe_cond_next3274; - } else { - goto llvm_cbe_bb3279; - } - -llvm_cbe_bb3279: - switch (llvm_cbe_tmp3261) { - default: - llvm_cbe_terminator_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_refsign_6__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_bb3323; -; - case ((unsigned char )60): - goto llvm_cbe_cond_true3286; - break; - case ((unsigned char )39): - goto llvm_cbe_cond_true3296; - case ((unsigned char )43): - goto llvm_cbe_cond_true3314; - case ((unsigned char )45): - goto llvm_cbe_cond_true3314; - } -llvm_cbe_cond_true3286: - *(&llvm_cbe_ptr106) = llvm_cbe_tmp3260; - llvm_cbe_terminator_0__PHI_TEMPORARY = ((unsigned int )62); /* for PHI node */ - llvm_cbe_refsign_6__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_bb3323; - -llvm_cbe_cond_true3296: - *(&llvm_cbe_ptr106) = llvm_cbe_tmp3260; - llvm_cbe_terminator_0__PHI_TEMPORARY = ((unsigned int )39); /* for PHI node */ - llvm_cbe_refsign_6__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_bb3323; - -llvm_cbe_cond_true3314: - *(&llvm_cbe_ptr106) = llvm_cbe_tmp3260; - llvm_cbe_tmp3318 = *llvm_cbe_tmp3260; - llvm_cbe_tmp33183319 = ((unsigned int )(unsigned char )llvm_cbe_tmp3318); - llvm_cbe_terminator_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_refsign_6__PHI_TEMPORARY = llvm_cbe_tmp33183319; /* for PHI node */ - goto llvm_cbe_bb3323; - - do { /* Syntactic loop 'bb3347' to make GCC happy */ -llvm_cbe_bb3347: - llvm_cbe_recno_726527 = llvm_cbe_recno_726527__PHI_TEMPORARY; - if ((((signed int )llvm_cbe_recno_726527) > ((signed int )((unsigned int )-1)))) { - goto llvm_cbe_cond_true3352; - } else { - llvm_cbe_recno_6__PHI_TEMPORARY = llvm_cbe_recno_726527; /* for PHI node */ - goto llvm_cbe_cond_next3374; - } - -llvm_cbe_cond_next3374: - llvm_cbe_recno_6 = llvm_cbe_recno_6__PHI_TEMPORARY; - llvm_cbe_tmp3375 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp3376 = &llvm_cbe_tmp3375[((unsigned int )1)]; - *(&llvm_cbe_ptr106) = llvm_cbe_tmp3376; - llvm_cbe_tmp3382 = *llvm_cbe_tmp3376; - llvm_cbe_tmp3385 = *(&llvm_cbe_tmp3326[(((unsigned int )(unsigned char )llvm_cbe_tmp3382))]); - if (((((unsigned char )(llvm_cbe_tmp3385 & ((unsigned char )16)))) == ((unsigned char )0))) { - llvm_cbe_recno_7_lcssa__PHI_TEMPORARY = llvm_cbe_recno_6; /* for PHI node */ - goto llvm_cbe_bb3391; - } else { - llvm_cbe_recno_726527__PHI_TEMPORARY = llvm_cbe_recno_6; /* for PHI node */ - goto llvm_cbe_bb3347; - } - -llvm_cbe_cond_true3352: - llvm_cbe_tmp3353 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp3354 = *llvm_cbe_tmp3353; - llvm_cbe_tmp33543355 = ((unsigned int )(unsigned char )llvm_cbe_tmp3354); - llvm_cbe_tmp3357 = *(&digitab[llvm_cbe_tmp33543355]); - if (((((unsigned char )(llvm_cbe_tmp3357 & ((unsigned char )4)))) == ((unsigned char )0))) { - llvm_cbe_recno_6__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_cond_next3374; - } else { - goto llvm_cbe_cond_true3363; - } - -llvm_cbe_cond_true3363: - llvm_cbe_tmp3370 = ((llvm_cbe_recno_726527 * ((unsigned int )10)) + ((unsigned int )-48)) + llvm_cbe_tmp33543355; - llvm_cbe_recno_6__PHI_TEMPORARY = llvm_cbe_tmp3370; /* for PHI node */ - goto llvm_cbe_cond_next3374; - - } while (1); /* end of syntactic loop 'bb3347' */ -llvm_cbe_cond_next3402: - llvm_cbe_tmp3404 = *llvm_cbe_tmp3392; - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp3392[((unsigned int )1)]); - if (((((unsigned int )(unsigned char )llvm_cbe_tmp3404)) == llvm_cbe_terminator_0)) { - goto llvm_cbe_bb3411; - } else { - goto llvm_cbe_bb3418; - } - -llvm_cbe_cond_next3465: - llvm_cbe_recno_8 = llvm_cbe_recno_8__PHI_TEMPORARY; - *(&llvm_cbe_code105_10[((unsigned int )4)]) = (((unsigned char )(((unsigned int )(((unsigned int )llvm_cbe_recno_8) >> ((unsigned int )((unsigned int )8))))))); - *(&llvm_cbe_code105_10[((unsigned int )5)]) = (((unsigned char )llvm_cbe_recno_8)); - llvm_cbe_slot_913437_0_us61_3__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_3__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_skipbytes133_8__PHI_TEMPORARY = ((unsigned int )3); /* for PHI node */ - llvm_cbe_newoptions_8__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_reset_bracount132_9__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_bravalue_8__PHI_TEMPORARY = ((unsigned int )95); /* for PHI node */ - goto llvm_cbe_cond_next4658; - -llvm_cbe_cond_true3445: - llvm_cbe_tmp3451 = (llvm_cbe_tmp3448 - llvm_cbe_recno_7_lcssa) + ((unsigned int )1); - if ((((signed int )llvm_cbe_tmp3451) < ((signed int )((unsigned int )1)))) { - goto llvm_cbe_cond_true3456; - } else { - llvm_cbe_recno_8__PHI_TEMPORARY = llvm_cbe_tmp3451; /* for PHI node */ - goto llvm_cbe_cond_next3465; - } - -llvm_cbe_cond_next3440: - llvm_cbe_tmp3448 = *llvm_cbe_tmp24; - if ((llvm_cbe_refsign_6 == ((unsigned int )45))) { - goto llvm_cbe_cond_true3445; - } else { - goto llvm_cbe_cond_false3459; - } - -llvm_cbe_cond_true3433: - if ((((signed int )llvm_cbe_recno_7_lcssa) < ((signed int )((unsigned int )1)))) { - goto llvm_cbe_cond_true3438; - } else { - goto llvm_cbe_cond_next3440; - } - -llvm_cbe_cond_next3428: - if ((((signed int )llvm_cbe_refsign_6) > ((signed int )((unsigned int )0)))) { - goto llvm_cbe_cond_true3433; - } else { - goto llvm_cbe_cond_next3476; - } - -llvm_cbe_cond_false3459: - llvm_cbe_tmp3464 = llvm_cbe_tmp3448 + llvm_cbe_recno_7_lcssa; - llvm_cbe_recno_8__PHI_TEMPORARY = llvm_cbe_tmp3464; /* for PHI node */ - goto llvm_cbe_cond_next3465; - -llvm_cbe_cond_true3528: - llvm_cbe_tmp3531 = *llvm_cbe_slot_613344_1; - llvm_cbe_tmp3536 = *(&llvm_cbe_slot_613344_1[((unsigned int )1)]); - llvm_cbe_tmp3538 = ((((unsigned int )(unsigned char )llvm_cbe_tmp3531)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp3536)); - *(&llvm_cbe_code105_10[((unsigned int )4)]) = (((unsigned char )(((unsigned int )(((unsigned int )llvm_cbe_tmp3538) >> ((unsigned int )((unsigned int )8))))))); - *(&llvm_cbe_code105_10[((unsigned int )5)]) = (((unsigned char )llvm_cbe_tmp3538)); - llvm_cbe_slot_913437_0_us61_3__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_3__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_skipbytes133_8__PHI_TEMPORARY = ((unsigned int )3); /* for PHI node */ - llvm_cbe_newoptions_8__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_reset_bracount132_9__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_bravalue_8__PHI_TEMPORARY = ((unsigned int )95); /* for PHI node */ - goto llvm_cbe_cond_next4658; - -llvm_cbe_bb3520: - llvm_cbe_i3185_613340_1 = llvm_cbe_i3185_613340_1__PHI_TEMPORARY; - llvm_cbe_slot_613344_1 = llvm_cbe_slot_613344_1__PHI_TEMPORARY; - if ((((signed int )llvm_cbe_tmp351513357) > ((signed int )llvm_cbe_i3185_613340_1))) { - goto llvm_cbe_cond_true3528; - } else { - goto llvm_cbe_cond_false3549; - } - -llvm_cbe_cond_next3476: - llvm_cbe_tmp3479 = *llvm_cbe_tmp3478; - llvm_cbe_tmp351513357 = *llvm_cbe_tmp351413356; - if ((((signed int )llvm_cbe_tmp351513357) > ((signed int )((unsigned int )0)))) { - llvm_cbe_i3185_613340_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_slot_613344_0_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_cond_false3492; - } else { - llvm_cbe_i3185_613340_1__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_slot_613344_1__PHI_TEMPORARY = llvm_cbe_tmp3479; /* for PHI node */ - goto llvm_cbe_bb3520; - } - - do { /* Syntactic loop 'cond_false3492' to make GCC happy */ -llvm_cbe_cond_false3492: - llvm_cbe_i3185_613340_0 = llvm_cbe_i3185_613340_0__PHI_TEMPORARY; - llvm_cbe_slot_613344_0_rec = llvm_cbe_slot_613344_0_rec__PHI_TEMPORARY; - llvm_cbe_slot_613344_0 = &llvm_cbe_tmp3479[llvm_cbe_slot_613344_0_rec]; - llvm_cbe_tmp3497 = strncmp(llvm_cbe_tmp3328, (&llvm_cbe_tmp3479[(llvm_cbe_slot_613344_0_rec + ((unsigned int )2))]), llvm_cbe_tmp3396); - if ((llvm_cbe_tmp3497 == ((unsigned int )0))) { - llvm_cbe_i3185_613340_1__PHI_TEMPORARY = llvm_cbe_i3185_613340_0; /* for PHI node */ - llvm_cbe_slot_613344_1__PHI_TEMPORARY = llvm_cbe_slot_613344_0; /* for PHI node */ - goto llvm_cbe_bb3520; - } else { - goto llvm_cbe_bb3512; - } - -llvm_cbe_bb3512: - llvm_cbe_tmp3507 = *llvm_cbe_tmp3506; - llvm_cbe_tmp3509_rec = llvm_cbe_slot_613344_0_rec + llvm_cbe_tmp3507; - llvm_cbe_tmp3509 = &llvm_cbe_tmp3479[llvm_cbe_tmp3509_rec]; - llvm_cbe_tmp3511 = llvm_cbe_i3185_613340_0 + ((unsigned int )1); - if ((((signed int )llvm_cbe_tmp351513357) > ((signed int )llvm_cbe_tmp3511))) { - llvm_cbe_i3185_613340_0__PHI_TEMPORARY = llvm_cbe_tmp3511; /* for PHI node */ - llvm_cbe_slot_613344_0_rec__PHI_TEMPORARY = llvm_cbe_tmp3509_rec; /* for PHI node */ - goto llvm_cbe_cond_false3492; - } else { - llvm_cbe_i3185_613340_1__PHI_TEMPORARY = llvm_cbe_tmp3511; /* for PHI node */ - llvm_cbe_slot_613344_1__PHI_TEMPORARY = llvm_cbe_tmp3509; /* for PHI node */ - goto llvm_cbe_bb3520; - } - - } while (1); /* end of syntactic loop 'cond_false3492' */ -llvm_cbe_cond_true3564: - *(&llvm_cbe_code105_10[((unsigned int )4)]) = (((unsigned char )(((unsigned int )(((unsigned int )llvm_cbe_tmp3559) >> ((unsigned int )((unsigned int )8))))))); - *(&llvm_cbe_code105_10[((unsigned int )5)]) = (((unsigned char )llvm_cbe_tmp3559)); - llvm_cbe_slot_913437_0_us61_3__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_3__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_skipbytes133_8__PHI_TEMPORARY = ((unsigned int )3); /* for PHI node */ - llvm_cbe_newoptions_8__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_reset_bracount132_9__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_bravalue_8__PHI_TEMPORARY = ((unsigned int )95); /* for PHI node */ - goto llvm_cbe_cond_next4658; - -llvm_cbe_cond_false3549: - llvm_cbe_tmp3555 = *llvm_cbe_tmp24; - llvm_cbe_tmp3559 = find_parens(llvm_cbe_tmp3416, llvm_cbe_tmp3555, llvm_cbe_tmp3328, llvm_cbe_tmp3396, ((((unsigned int )(((unsigned int )llvm_cbe_options104_39466_9) >> ((unsigned int )((unsigned int )3))))) & ((unsigned int )1))); - if ((((signed int )llvm_cbe_tmp3559) > ((signed int )((unsigned int )0)))) { - goto llvm_cbe_cond_true3564; - } else { - goto llvm_cbe_cond_false3575; - } - -llvm_cbe_bb3623: - llvm_cbe_recno_10 = (((llvm_cbe_recno_9 == ((unsigned int )0))) ? (((unsigned int )65535)) : (llvm_cbe_recno_9)); - *llvm_cbe_tmp3258 = ((unsigned char )100); - *(&llvm_cbe_code105_10[((unsigned int )4)]) = (((unsigned char )(((unsigned int )(((unsigned int )llvm_cbe_recno_10) >> ((unsigned int )((unsigned int )8))))))); - *(&llvm_cbe_code105_10[((unsigned int )5)]) = (((unsigned char )llvm_cbe_recno_10)); - llvm_cbe_slot_913437_0_us61_3__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_3__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_skipbytes133_8__PHI_TEMPORARY = ((unsigned int )3); /* for PHI node */ - llvm_cbe_newoptions_8__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_reset_bracount132_9__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_bravalue_8__PHI_TEMPORARY = ((unsigned int )95); /* for PHI node */ - goto llvm_cbe_cond_next4658; - - do { /* Syntactic loop 'bb3617' to make GCC happy */ -llvm_cbe_bb3617: - llvm_cbe_indvar26632 = llvm_cbe_indvar26632__PHI_TEMPORARY; - llvm_cbe_recno_9 = llvm_cbe_recno_9__PHI_TEMPORARY; - llvm_cbe_i3185_7 = llvm_cbe_indvar26632 + ((unsigned int )1); - if ((((signed int )llvm_cbe_i3185_7) < ((signed int )llvm_cbe_tmp3396))) { - goto llvm_cbe_bb3589; - } else { - goto llvm_cbe_bb3623; - } - -llvm_cbe_cond_next3605: - llvm_cbe_tmp3614 = ((llvm_cbe_recno_9 * ((unsigned int )10)) + ((unsigned int )-48)) + llvm_cbe_tmp35933594; - llvm_cbe_indvar26632__PHI_TEMPORARY = llvm_cbe_i3185_7; /* for PHI node */ - llvm_cbe_recno_9__PHI_TEMPORARY = llvm_cbe_tmp3614; /* for PHI node */ - goto llvm_cbe_bb3617; - -llvm_cbe_bb3589: - llvm_cbe_tmp3593 = *(&llvm_cbe_tmp3327[(llvm_cbe_indvar26632 + ((unsigned int )2))]); - llvm_cbe_tmp35933594 = ((unsigned int )(unsigned char )llvm_cbe_tmp3593); - llvm_cbe_tmp3596 = *(&digitab[llvm_cbe_tmp35933594]); - if (((((unsigned char )(llvm_cbe_tmp3596 & ((unsigned char )4)))) == ((unsigned char )0))) { - goto llvm_cbe_cond_true3603; - } else { - goto llvm_cbe_cond_next3605; - } - - } while (1); /* end of syntactic loop 'bb3617' */ -llvm_cbe_cond_false3582: - llvm_cbe_tmp3584 = *llvm_cbe_tmp3328; - if ((llvm_cbe_tmp3584 == ((unsigned char )82))) { - llvm_cbe_indvar26632__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_recno_9__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb3617; - } else { - goto llvm_cbe_cond_false3643; - } - -llvm_cbe_cond_false3575: - if ((llvm_cbe_terminator_0 == ((unsigned int )0))) { - goto llvm_cbe_cond_false3582; - } else { - goto llvm_cbe_cond_true3580; - } - -llvm_cbe_cond_next3657: - *llvm_cbe_tmp3258 = ((unsigned char )101); - llvm_cbe_slot_913437_0_us61_3__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_3__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_skipbytes133_8__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - llvm_cbe_newoptions_8__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_reset_bracount132_9__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_bravalue_8__PHI_TEMPORARY = ((unsigned int )95); /* for PHI node */ - goto llvm_cbe_cond_next4658; - -llvm_cbe_cond_next3649: - llvm_cbe_tmp3652 = strncmp(llvm_cbe_tmp3328, (&(_2E_str74[((unsigned int )0)])), ((unsigned int )6)); - if ((llvm_cbe_tmp3652 == ((unsigned int )0))) { - goto llvm_cbe_cond_next3657; - } else { - goto llvm_cbe_bb3660; - } - -llvm_cbe_cond_false3643: - if ((llvm_cbe_tmp3396 == ((unsigned int )6))) { - goto llvm_cbe_cond_next3649; - } else { - goto llvm_cbe_bb3660; - } - -llvm_cbe_cond_true3665: - *(&llvm_cbe_code105_10[((unsigned int )4)]) = (((unsigned char )(((unsigned int )(((unsigned int )llvm_cbe_recno_7_lcssa) >> ((unsigned int )((unsigned int )8))))))); - *(&llvm_cbe_code105_10[((unsigned int )5)]) = (((unsigned char )llvm_cbe_recno_7_lcssa)); - llvm_cbe_slot_913437_0_us61_3__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_3__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_skipbytes133_8__PHI_TEMPORARY = ((unsigned int )3); /* for PHI node */ - llvm_cbe_newoptions_8__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_reset_bracount132_9__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_bravalue_8__PHI_TEMPORARY = ((unsigned int )95); /* for PHI node */ - goto llvm_cbe_cond_next4658; - -llvm_cbe_bb3660: - if ((((signed int )llvm_cbe_recno_7_lcssa) > ((signed int )((unsigned int )0)))) { - goto llvm_cbe_cond_true3665; - } else { - goto llvm_cbe_cond_false3676; - } - -llvm_cbe_bb3692: - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp3177[((unsigned int )3)]); - llvm_cbe_slot_913437_0_us61_3__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_3__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_skipbytes133_8__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_newoptions_8__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_reset_bracount132_9__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_bravalue_8__PHI_TEMPORARY = ((unsigned int )87); /* for PHI node */ - goto llvm_cbe_cond_next4658; - -llvm_cbe_bb3695: - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp3177[((unsigned int )3)]); - llvm_cbe_slot_913437_0_us61_3__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_3__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_skipbytes133_8__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_newoptions_8__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_reset_bracount132_9__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_bravalue_8__PHI_TEMPORARY = ((unsigned int )88); /* for PHI node */ - goto llvm_cbe_cond_next4658; - -llvm_cbe_bb3703: - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp3177[((unsigned int )4)]); - llvm_cbe_slot_913437_0_us61_3__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_3__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_skipbytes133_8__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_newoptions_8__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_reset_bracount132_9__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_bravalue_8__PHI_TEMPORARY = ((unsigned int )89); /* for PHI node */ - goto llvm_cbe_cond_next4658; - -llvm_cbe_bb3698: - llvm_cbe_tmp3700 = &llvm_cbe_tmp3177[((unsigned int )3)]; - llvm_cbe_tmp3701 = *llvm_cbe_tmp3700; - llvm_cbe_tmp37013702 = ((unsigned int )(unsigned char )llvm_cbe_tmp3701); - switch (llvm_cbe_tmp37013702) { - default: - goto llvm_cbe_bb3709; -; - case ((unsigned int )33): - goto llvm_cbe_bb3706; - case ((unsigned int )61): - goto llvm_cbe_bb3703; - break; - } -llvm_cbe_bb3706: - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp3177[((unsigned int )4)]); - llvm_cbe_slot_913437_0_us61_3__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_3__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_skipbytes133_8__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_newoptions_8__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_reset_bracount132_9__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_bravalue_8__PHI_TEMPORARY = ((unsigned int )90); /* for PHI node */ - goto llvm_cbe_cond_next4658; - -llvm_cbe_bb3730: - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp3177[((unsigned int )3)]); - llvm_cbe_slot_913437_0_us61_3__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_3__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_skipbytes133_8__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_newoptions_8__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_reset_bracount132_9__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_bravalue_8__PHI_TEMPORARY = ((unsigned int )92); /* for PHI node */ - goto llvm_cbe_cond_next4658; - -llvm_cbe_cond_next4625: - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp4537[((unsigned int )1)]); - llvm_cbe_slot_913437_0_us61_3__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_3__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_skipbytes133_8__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_newoptions_8__PHI_TEMPORARY = llvm_cbe_tmp4555; /* for PHI node */ - llvm_cbe_reset_bracount132_9__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_bravalue_8__PHI_TEMPORARY = ((unsigned int )93); /* for PHI node */ - goto llvm_cbe_cond_next4658; - -llvm_cbe_cond_false4629: - if (((llvm_cbe_options104_39466_9 & ((unsigned int )4096)) == ((unsigned int )0))) { - llvm_cbe_slot_913437_0_us61_2__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_2__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - goto llvm_cbe_NUMBERED_GROUP; - } else { - llvm_cbe_slot_913437_0_us61_3__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_3__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_skipbytes133_8__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_newoptions_8__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_reset_bracount132_9__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_bravalue_8__PHI_TEMPORARY = ((unsigned int )93); /* for PHI node */ - goto llvm_cbe_cond_next4658; - } - -llvm_cbe_NUMBERED_GROUP: - llvm_cbe_slot_913437_0_us61_2 = llvm_cbe_slot_913437_0_us61_2__PHI_TEMPORARY; - llvm_cbe_slot_913437_059_2 = llvm_cbe_slot_913437_059_2__PHI_TEMPORARY; - llvm_cbe_tmp4639 = *llvm_cbe_tmp24; - llvm_cbe_tmp4640 = llvm_cbe_tmp4639 + ((unsigned int )1); - *llvm_cbe_tmp24 = llvm_cbe_tmp4640; - *(&llvm_cbe_code105_10[((unsigned int )3)]) = (((unsigned char )(((unsigned int )(((unsigned int )llvm_cbe_tmp4640) >> ((unsigned int )((unsigned int )8))))))); - llvm_cbe_tmp4652 = *llvm_cbe_tmp24; - *(&llvm_cbe_code105_10[((unsigned int )4)]) = (((unsigned char )llvm_cbe_tmp4652)); - llvm_cbe_slot_913437_0_us61_3__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_2; /* for PHI node */ - llvm_cbe_slot_913437_059_3__PHI_TEMPORARY = llvm_cbe_slot_913437_059_2; /* for PHI node */ - llvm_cbe_skipbytes133_8__PHI_TEMPORARY = ((unsigned int )2); /* for PHI node */ - llvm_cbe_newoptions_8__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_reset_bracount132_9__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_bravalue_8__PHI_TEMPORARY = ((unsigned int )94); /* for PHI node */ - goto llvm_cbe_cond_next4658; - -llvm_cbe_cond_next4018: - llvm_cbe_slot_913437_0_us61_1 = llvm_cbe_slot_913437_0_us61_1__PHI_TEMPORARY; - llvm_cbe_slot_913437_059_1 = llvm_cbe_slot_913437_059_1__PHI_TEMPORARY; - llvm_cbe_tmp4019 = *(&llvm_cbe_ptr106); - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp4019[((unsigned int )1)]); - llvm_cbe_tmp4023 = *llvm_cbe_tmp351413356; - *llvm_cbe_tmp351413356 = (llvm_cbe_tmp4023 + ((unsigned int )1)); - llvm_cbe_slot_913437_0_us61_2__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_1; /* for PHI node */ - llvm_cbe_slot_913437_059_2__PHI_TEMPORARY = llvm_cbe_slot_913437_059_1; /* for PHI node */ - goto llvm_cbe_NUMBERED_GROUP; - -llvm_cbe_cond_next3899: - llvm_cbe_tmp3901 = llvm_cbe_tmp3875 + ((unsigned int )3); - llvm_cbe_tmp3904 = *llvm_cbe_tmp3506; - if ((((signed int )llvm_cbe_tmp3901) > ((signed int )llvm_cbe_tmp3904))) { - goto llvm_cbe_cond_true3908; - } else { - llvm_cbe_slot_913437_0_us61_1__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_1__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - goto llvm_cbe_cond_next4018; - } - -llvm_cbe_cond_next3890: - llvm_cbe_tmp3893 = *llvm_cbe_tmp351413356; - if ((((signed int )llvm_cbe_tmp3893) > ((signed int )((unsigned int )9999)))) { - goto llvm_cbe_cond_true3897; - } else { - goto llvm_cbe_cond_next3899; - } - -llvm_cbe_cond_true3880: - llvm_cbe_tmp3881 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp3882 = *llvm_cbe_tmp3881; - if (((((unsigned int )(unsigned char )llvm_cbe_tmp3882)) == llvm_cbe_iftmp_415_0)) { - goto llvm_cbe_cond_next3890; - } else { - goto llvm_cbe_cond_true3888; - } - -llvm_cbe_bb3870: - llvm_cbe_tmp3854_lcssa = llvm_cbe_tmp3854_lcssa__PHI_TEMPORARY; - llvm_cbe_tmp3875 = (((unsigned int )(unsigned long)llvm_cbe_tmp3854_lcssa)) - (((unsigned int )(unsigned long)llvm_cbe_tmp3851)); - if ((llvm_cbe_iftmp_509_0 == ((unsigned int *)/*NULL*/0))) { - goto llvm_cbe_cond_false3921; - } else { - goto llvm_cbe_cond_true3880; - } - -llvm_cbe_bb3840: - llvm_cbe_tmp3841 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp3842 = *llvm_cbe_tmp3841; - llvm_cbe_iftmp_415_0 = (((llvm_cbe_tmp3842 == ((unsigned char )60))) ? (((unsigned int )62)) : (((unsigned int )39))); - llvm_cbe_tmp3851 = &llvm_cbe_tmp3841[((unsigned int )1)]; - *(&llvm_cbe_ptr106) = llvm_cbe_tmp3851; - llvm_cbe_tmp385926515 = *llvm_cbe_tmp435; - llvm_cbe_tmp386126517 = *llvm_cbe_tmp3851; - llvm_cbe_tmp386426520 = *(&llvm_cbe_tmp385926515[(((unsigned int )(unsigned char )llvm_cbe_tmp386126517))]); - if (((((unsigned char )(llvm_cbe_tmp386426520 & ((unsigned char )16)))) == ((unsigned char )0))) { - llvm_cbe_tmp3854_lcssa__PHI_TEMPORARY = llvm_cbe_tmp3851; /* for PHI node */ - goto llvm_cbe_bb3870; - } else { - llvm_cbe_tmp385426524__PHI_TEMPORARY = llvm_cbe_tmp3851; /* for PHI node */ - goto llvm_cbe_bb3853; - } - -llvm_cbe_bb3709: - llvm_cbe_tmp3712 = *llvm_cbe_tmp435; - llvm_cbe_tmp3718 = *(&llvm_cbe_tmp3712[llvm_cbe_tmp37013702]); - if (((((unsigned char )(llvm_cbe_tmp3718 & ((unsigned char )16)))) == ((unsigned char )0))) { - goto llvm_cbe_cond_next3725; - } else { - goto llvm_cbe_bb3840; - } - - do { /* Syntactic loop 'bb3853' to make GCC happy */ -llvm_cbe_bb3853: - llvm_cbe_tmp385426524 = llvm_cbe_tmp385426524__PHI_TEMPORARY; - llvm_cbe_tmp3855 = &llvm_cbe_tmp385426524[((unsigned int )1)]; - *(&llvm_cbe_ptr106) = llvm_cbe_tmp3855; - llvm_cbe_tmp3861 = *llvm_cbe_tmp3855; - llvm_cbe_tmp3864 = *(&llvm_cbe_tmp385926515[(((unsigned int )(unsigned char )llvm_cbe_tmp3861))]); - if (((((unsigned char )(llvm_cbe_tmp3864 & ((unsigned char )16)))) == ((unsigned char )0))) { - llvm_cbe_tmp3854_lcssa__PHI_TEMPORARY = llvm_cbe_tmp3855; /* for PHI node */ - goto llvm_cbe_bb3870; - } else { - llvm_cbe_tmp385426524__PHI_TEMPORARY = llvm_cbe_tmp3855; /* for PHI node */ - goto llvm_cbe_bb3853; - } - - } while (1); /* end of syntactic loop 'bb3853' */ -llvm_cbe_cond_true3908: - *llvm_cbe_tmp3506 = llvm_cbe_tmp3901; - if ((((signed int )llvm_cbe_tmp3875) > ((signed int )((unsigned int )32)))) { - goto llvm_cbe_cond_true3917; - } else { - llvm_cbe_slot_913437_0_us61_1__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_1__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - goto llvm_cbe_cond_next4018; - } - -llvm_cbe_bb3993: - llvm_cbe_slot_913437_0_us61_0 = llvm_cbe_slot_913437_0_us61_0__PHI_TEMPORARY; - llvm_cbe_slot_913437_059_0 = llvm_cbe_slot_913437_059_0__PHI_TEMPORARY; - llvm_cbe_slot_913437_1 = llvm_cbe_slot_913437_1__PHI_TEMPORARY; - llvm_cbe_tmp3996 = *llvm_cbe_tmp24; - *llvm_cbe_slot_913437_1 = (((unsigned char )(((unsigned int )(((unsigned int )(llvm_cbe_tmp3996 + ((unsigned int )1))) >> ((unsigned int )((unsigned int )8))))))); - llvm_cbe_tmp4004 = *llvm_cbe_tmp24; - *(&llvm_cbe_slot_913437_1[((unsigned int )1)]) = (((unsigned char )((((unsigned char )llvm_cbe_tmp4004)) + ((unsigned char )1)))); - ltmp_15_1 = memcpy((&llvm_cbe_slot_913437_1[((unsigned int )2)]), llvm_cbe_tmp3851, llvm_cbe_tmp3875); - *(&llvm_cbe_slot_913437_1[(llvm_cbe_tmp3875 + ((unsigned int )2))]) = ((unsigned char )0); - llvm_cbe_slot_913437_0_us61_1__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_0; /* for PHI node */ - llvm_cbe_slot_913437_059_1__PHI_TEMPORARY = llvm_cbe_slot_913437_059_0; /* for PHI node */ - goto llvm_cbe_cond_next4018; - -llvm_cbe_cond_false3921: - llvm_cbe_tmp3924 = *llvm_cbe_tmp3478; - llvm_cbe_tmp398813449 = *llvm_cbe_tmp351413356; - if ((((signed int )llvm_cbe_tmp398813449) > ((signed int )((unsigned int )0)))) { - goto llvm_cbe_bb3925_preheader; - } else { - llvm_cbe_slot_913437_0_us61_0__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_0__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_slot_913437_1__PHI_TEMPORARY = llvm_cbe_tmp3924; /* for PHI node */ - goto llvm_cbe_bb3993; - } - -llvm_cbe_cond_true3961_split: - llvm_cbe_slot_913437_0_us61_14 = llvm_cbe_slot_913437_0_us61_14__PHI_TEMPORARY; - llvm_cbe_slot_913437_059_14 = llvm_cbe_slot_913437_059_14__PHI_TEMPORARY; - llvm_cbe_slot_913437_0_lcssa14144_us_lcssa = llvm_cbe_slot_913437_0_lcssa14144_us_lcssa__PHI_TEMPORARY; - llvm_cbe_i3185_1013432_0_lcssa14142_us_lcssa = llvm_cbe_i3185_1013432_0_lcssa14142_us_lcssa__PHI_TEMPORARY; - llvm_cbe_tmp3969 = *llvm_cbe_tmp3506; - ltmp_14_1 = memmove((&llvm_cbe_slot_913437_0_lcssa14144_us_lcssa[llvm_cbe_tmp3969]), llvm_cbe_slot_913437_0_lcssa14144_us_lcssa, ((llvm_cbe_tmp398813449 - llvm_cbe_i3185_1013432_0_lcssa14142_us_lcssa) * llvm_cbe_tmp3969)); - llvm_cbe_slot_913437_0_us61_0__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_14; /* for PHI node */ - llvm_cbe_slot_913437_059_0__PHI_TEMPORARY = llvm_cbe_slot_913437_059_14; /* for PHI node */ - llvm_cbe_slot_913437_1__PHI_TEMPORARY = llvm_cbe_slot_913437_0_lcssa14144_us_lcssa; /* for PHI node */ - goto llvm_cbe_bb3993; - -llvm_cbe_cond_true3961_split_loopexit: - llvm_cbe_slot_913437_0_us_le = &llvm_cbe_tmp3924[llvm_cbe_slot_913437_0_us_rec]; - llvm_cbe_slot_913437_0_us61_14__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us_le; /* for PHI node */ - llvm_cbe_slot_913437_059_14__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_slot_913437_0_lcssa14144_us_lcssa__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us_le; /* for PHI node */ - llvm_cbe_i3185_1013432_0_lcssa14142_us_lcssa__PHI_TEMPORARY = llvm_cbe_i3185_1013432_0_us; /* for PHI node */ - goto llvm_cbe_cond_true3961_split; - - do { /* Syntactic loop 'bb3925.us' to make GCC happy */ -llvm_cbe_bb3925_us: - llvm_cbe_i3185_1013432_0_us = llvm_cbe_i3185_1013432_0_us__PHI_TEMPORARY; - llvm_cbe_slot_913437_0_us_rec = llvm_cbe_slot_913437_0_us_rec__PHI_TEMPORARY; - llvm_cbe_tmp3930_us = memcmp(llvm_cbe_tmp3851, (&llvm_cbe_tmp3924[(llvm_cbe_slot_913437_0_us_rec + ((unsigned int )2))]), llvm_cbe_tmp3875); - if ((llvm_cbe_tmp3930_us == ((unsigned int )0))) { - goto llvm_cbe_cond_true3935_us; - } else { - llvm_cbe_crc_10_us__PHI_TEMPORARY = llvm_cbe_tmp3930_us; /* for PHI node */ - goto llvm_cbe_cond_next3956_us; - } - -llvm_cbe_bb3985_us: - llvm_cbe_tmp3980_us = *llvm_cbe_tmp3506; - llvm_cbe_tmp3982_us_rec = llvm_cbe_slot_913437_0_us_rec + llvm_cbe_tmp3980_us; - llvm_cbe_tmp3984_us = llvm_cbe_i3185_1013432_0_us + ((unsigned int )1); - if ((((signed int )llvm_cbe_tmp398813449) > ((signed int )llvm_cbe_tmp3984_us))) { - llvm_cbe_i3185_1013432_0_us__PHI_TEMPORARY = llvm_cbe_tmp3984_us; /* for PHI node */ - llvm_cbe_slot_913437_0_us_rec__PHI_TEMPORARY = llvm_cbe_tmp3982_us_rec; /* for PHI node */ - goto llvm_cbe_bb3925_us; - } else { - goto llvm_cbe_bb3993_loopexit; - } - -llvm_cbe_cond_next3956_us: - llvm_cbe_crc_10_us = llvm_cbe_crc_10_us__PHI_TEMPORARY; - if ((((signed int )llvm_cbe_crc_10_us) < ((signed int )((unsigned int )0)))) { - goto llvm_cbe_cond_true3961_split_loopexit; - } else { - goto llvm_cbe_bb3985_us; - } - -llvm_cbe_cond_true3935_us: - llvm_cbe_tmp3940_us = *(&llvm_cbe_tmp3924[(llvm_cbe_slot_913437_0_us_rec + llvm_cbe_tmp3937)]); - if ((llvm_cbe_tmp3940_us == ((unsigned char )0))) { - goto llvm_cbe_cond_true3951_split; - } else { - llvm_cbe_crc_10_us__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_cond_next3956_us; - } - - } while (1); /* end of syntactic loop 'bb3925.us' */ -llvm_cbe_bb3925_preheader: - llvm_cbe_tmp3937 = llvm_cbe_tmp3875 + ((unsigned int )2); - if (((llvm_cbe_options104_39466_9 & ((unsigned int )524288)) == ((unsigned int )0))) { - llvm_cbe_i3185_1013432_0_us__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_slot_913437_0_us_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb3925_us; - } else { - llvm_cbe_i3185_1013432_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_slot_913437_0_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb3925; - } - -llvm_cbe_cond_true3961_split_loopexit56: - llvm_cbe_slot_913437_0_le = &llvm_cbe_tmp3924[llvm_cbe_slot_913437_0_rec]; - llvm_cbe_slot_913437_0_us61_14__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_14__PHI_TEMPORARY = llvm_cbe_slot_913437_0_le; /* for PHI node */ - llvm_cbe_slot_913437_0_lcssa14144_us_lcssa__PHI_TEMPORARY = llvm_cbe_slot_913437_0_le; /* for PHI node */ - llvm_cbe_i3185_1013432_0_lcssa14142_us_lcssa__PHI_TEMPORARY = llvm_cbe_i3185_1013432_0; /* for PHI node */ - goto llvm_cbe_cond_true3961_split; - - do { /* Syntactic loop 'bb3925' to make GCC happy */ -llvm_cbe_bb3925: - llvm_cbe_i3185_1013432_0 = llvm_cbe_i3185_1013432_0__PHI_TEMPORARY; - llvm_cbe_slot_913437_0_rec = llvm_cbe_slot_913437_0_rec__PHI_TEMPORARY; - llvm_cbe_tmp3930 = memcmp(llvm_cbe_tmp3851, (&llvm_cbe_tmp3924[(llvm_cbe_slot_913437_0_rec + ((unsigned int )2))]), llvm_cbe_tmp3875); - if ((llvm_cbe_tmp3930 == ((unsigned int )0))) { - goto llvm_cbe_cond_true3935; - } else { - llvm_cbe_crc_10__PHI_TEMPORARY = llvm_cbe_tmp3930; /* for PHI node */ - goto llvm_cbe_cond_next3956; - } - -llvm_cbe_bb3985: - llvm_cbe_tmp3980 = *llvm_cbe_tmp3506; - llvm_cbe_tmp3982_rec = llvm_cbe_slot_913437_0_rec + llvm_cbe_tmp3980; - llvm_cbe_tmp3984 = llvm_cbe_i3185_1013432_0 + ((unsigned int )1); - if ((((signed int )llvm_cbe_tmp398813449) > ((signed int )llvm_cbe_tmp3984))) { - llvm_cbe_i3185_1013432_0__PHI_TEMPORARY = llvm_cbe_tmp3984; /* for PHI node */ - llvm_cbe_slot_913437_0_rec__PHI_TEMPORARY = llvm_cbe_tmp3982_rec; /* for PHI node */ - goto llvm_cbe_bb3925; - } else { - goto llvm_cbe_bb3993_loopexit55; - } - -llvm_cbe_cond_next3956: - llvm_cbe_crc_10 = llvm_cbe_crc_10__PHI_TEMPORARY; - if ((((signed int )llvm_cbe_crc_10) < ((signed int )((unsigned int )0)))) { - goto llvm_cbe_cond_true3961_split_loopexit56; - } else { - goto llvm_cbe_bb3985; - } - -llvm_cbe_cond_true3935: - llvm_cbe_tmp3940 = *(&llvm_cbe_tmp3924[(llvm_cbe_slot_913437_0_rec + llvm_cbe_tmp3937)]); - if ((llvm_cbe_tmp3940 == ((unsigned char )0))) { - goto llvm_cbe_cond_true3944; - } else { - llvm_cbe_crc_10__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_cond_next3956; - } - -llvm_cbe_cond_true3944: - llvm_cbe_crc_10__PHI_TEMPORARY = llvm_cbe_tmp3930; /* for PHI node */ - goto llvm_cbe_cond_next3956; - - } while (1); /* end of syntactic loop 'bb3925' */ -llvm_cbe_bb3993_loopexit: - llvm_cbe_slot_913437_0_us = &llvm_cbe_tmp3924[llvm_cbe_slot_913437_0_us_rec]; - llvm_cbe_tmp3982_us = &llvm_cbe_tmp3924[llvm_cbe_tmp3982_us_rec]; - llvm_cbe_slot_913437_0_us61_0__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us; /* for PHI node */ - llvm_cbe_slot_913437_059_0__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_slot_913437_1__PHI_TEMPORARY = llvm_cbe_tmp3982_us; /* for PHI node */ - goto llvm_cbe_bb3993; - -llvm_cbe_bb3993_loopexit55: - llvm_cbe_slot_913437_0 = &llvm_cbe_tmp3924[llvm_cbe_slot_913437_0_rec]; - llvm_cbe_tmp3982 = &llvm_cbe_tmp3924[llvm_cbe_tmp3982_rec]; - llvm_cbe_slot_913437_0_us61_0__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_0__PHI_TEMPORARY = llvm_cbe_slot_913437_0; /* for PHI node */ - llvm_cbe_slot_913437_1__PHI_TEMPORARY = llvm_cbe_tmp3982; /* for PHI node */ - goto llvm_cbe_bb3993; - -llvm_cbe_cond_true4741: - if ((((signed int )llvm_cbe_tmp4716) > ((signed int )((unsigned int )1)))) { - goto llvm_cbe_cond_true4746; - } else { - llvm_cbe_bravalue_9__PHI_TEMPORARY = ((unsigned int )101); /* for PHI node */ - goto llvm_cbe_cond_next4765; - } - -llvm_cbe_bb4734: - llvm_cbe_tmp4737 = *(&llvm_cbe_code105_10[((unsigned int )3)]); - if ((llvm_cbe_tmp4737 == ((unsigned char )101))) { - goto llvm_cbe_cond_true4741; - } else { - goto llvm_cbe_cond_false4749; - } - - do { /* Syntactic loop 'bb4714' to make GCC happy */ -llvm_cbe_bb4714: - llvm_cbe_condcount_6 = llvm_cbe_condcount_6__PHI_TEMPORARY; - llvm_cbe_tc_6_rec = llvm_cbe_tc_6_rec__PHI_TEMPORARY; - llvm_cbe_tmp4716 = llvm_cbe_condcount_6 + ((unsigned int )1); - llvm_cbe_tmp4719 = *(&llvm_cbe_code105_10[(llvm_cbe_tc_6_rec + ((unsigned int )1))]); - llvm_cbe_tmp4724 = *(&llvm_cbe_code105_10[(llvm_cbe_tc_6_rec + ((unsigned int )2))]); - llvm_cbe_tmp4728_rec = llvm_cbe_tc_6_rec + (((((unsigned int )(unsigned char )llvm_cbe_tmp4719)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp4724))); - llvm_cbe_tmp4730 = *(&llvm_cbe_code105_10[llvm_cbe_tmp4728_rec]); - if ((llvm_cbe_tmp4730 == ((unsigned char )84))) { - goto llvm_cbe_bb4734; - } else { - llvm_cbe_condcount_6__PHI_TEMPORARY = llvm_cbe_tmp4716; /* for PHI node */ - llvm_cbe_tc_6_rec__PHI_TEMPORARY = llvm_cbe_tmp4728_rec; /* for PHI node */ - goto llvm_cbe_bb4714; - } - - } while (1); /* end of syntactic loop 'bb4714' */ -llvm_cbe_cond_next4756: - if ((llvm_cbe_tmp4716 == ((unsigned int )1))) { - goto llvm_cbe_cond_true4761; - } else { - llvm_cbe_bravalue_9__PHI_TEMPORARY = llvm_cbe_bravalue_8; /* for PHI node */ - goto llvm_cbe_cond_next4765; - } - -llvm_cbe_cond_false4749: - if ((((signed int )llvm_cbe_tmp4716) > ((signed int )((unsigned int )2)))) { - goto llvm_cbe_cond_true4754; - } else { - goto llvm_cbe_cond_next4756; - } - -llvm_cbe_cond_true4761: - *(&llvm_cbe_subreqbyte) = ((unsigned int )-1); - *(&llvm_cbe_subfirstbyte) = ((unsigned int )-1); - llvm_cbe_bravalue_9__PHI_TEMPORARY = llvm_cbe_bravalue_8; /* for PHI node */ - goto llvm_cbe_cond_next4765; - -llvm_cbe_cond_false4802: - llvm_cbe_tmp4803 = *(&llvm_cbe_tempcode); - llvm_cbe_code105_26__PHI_TEMPORARY = llvm_cbe_tmp4803; /* for PHI node */ - goto llvm_cbe_cond_next4804; - -llvm_cbe_cond_true4827: - llvm_cbe_groupsetfirstbyte_4__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - llvm_cbe_zerofirstbyte_3__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - llvm_cbe_firstbyte102_11__PHI_TEMPORARY = llvm_cbe_tmp4823; /* for PHI node */ - goto llvm_cbe_cond_next4847; - -llvm_cbe_cond_false4831: - if ((((signed int )llvm_cbe_tmp4823) > ((signed int )((unsigned int )-1)))) { - goto llvm_cbe_cond_true4836; - } else { - llvm_cbe_groupsetfirstbyte_4__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_zerofirstbyte_3__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - llvm_cbe_firstbyte102_11__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - goto llvm_cbe_cond_next4847; - } - -llvm_cbe_cond_true4836: - llvm_cbe_tmp4837 = *(&llvm_cbe_subreqbyte); - if ((((signed int )llvm_cbe_tmp4837) < ((signed int )((unsigned int )0)))) { - goto llvm_cbe_cond_true4841; - } else { - llvm_cbe_groupsetfirstbyte_4__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_zerofirstbyte_3__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - llvm_cbe_firstbyte102_11__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - goto llvm_cbe_cond_next4847; - } - -llvm_cbe_cond_true4841: - *(&llvm_cbe_subreqbyte) = (llvm_cbe_tmp4823 | llvm_cbe_tmp4674); - llvm_cbe_groupsetfirstbyte_4__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_zerofirstbyte_3__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - llvm_cbe_firstbyte102_11__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - goto llvm_cbe_cond_next4847; - -llvm_cbe_cond_true4865: - llvm_cbe_tmp519613495 = *(&llvm_cbe_ptr106); - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp519613495[((unsigned int )1)]); - llvm_cbe_slot_913437_0_us61_13__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_3; /* for PHI node */ - llvm_cbe_slot_913437_059_13__PHI_TEMPORARY = llvm_cbe_slot_913437_059_3; /* for PHI node */ - llvm_cbe_repeat_max_10__PHI_TEMPORARY = llvm_cbe_repeat_max_10; /* for PHI node */ - llvm_cbe_repeat_min_10__PHI_TEMPORARY = llvm_cbe_repeat_min_10; /* for PHI node */ - llvm_cbe_options_addr_2__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_save_hwm_7__PHI_TEMPORARY = llvm_cbe_tmp3176; /* for PHI node */ - llvm_cbe_previous_callout_5__PHI_TEMPORARY = llvm_cbe_previous_callout_9; /* for PHI node */ - llvm_cbe_previous_3__PHI_TEMPORARY = llvm_cbe_iftmp_467_0; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_2__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_inescq_2__PHI_TEMPORARY = llvm_cbe_inescq_29422_9; /* for PHI node */ - llvm_cbe_last_code_2__PHI_TEMPORARY = llvm_cbe_last_code_15771_1; /* for PHI node */ - llvm_cbe_code105_3__PHI_TEMPORARY = llvm_cbe_code105_26; /* for PHI node */ - llvm_cbe_after_manual_callout_7__PHI_TEMPORARY = llvm_cbe_after_manual_callout_1; /* for PHI node */ - llvm_cbe_options104_3__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_req_caseopt_3__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_9; /* for PHI node */ - llvm_cbe_zerofirstbyte_2__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - llvm_cbe_zeroreqbyte_2__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_9; /* for PHI node */ - llvm_cbe_reqbyte103_5__PHI_TEMPORARY = llvm_cbe_tmp4861; /* for PHI node */ - llvm_cbe_firstbyte102_3__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - llvm_cbe_greedy_non_default_3__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_9; /* for PHI node */ - llvm_cbe_greedy_default_3__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_9; /* for PHI node */ - goto llvm_cbe_bb131; - -llvm_cbe_cond_true4860: - llvm_cbe_tmp4861 = *(&llvm_cbe_subreqbyte); - if ((((signed int )llvm_cbe_tmp4861) > ((signed int )((unsigned int )-1)))) { - goto llvm_cbe_cond_true4865; - } else { - llvm_cbe_slot_913437_0_us61_5__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_3; /* for PHI node */ - llvm_cbe_slot_913437_059_5__PHI_TEMPORARY = llvm_cbe_slot_913437_059_3; /* for PHI node */ - llvm_cbe_options_addr_1__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_save_hwm_6__PHI_TEMPORARY = llvm_cbe_tmp3176; /* for PHI node */ - llvm_cbe_previous_callout_4__PHI_TEMPORARY = llvm_cbe_previous_callout_9; /* for PHI node */ - llvm_cbe_previous_6__PHI_TEMPORARY = llvm_cbe_iftmp_467_0; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_1__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_inescq_1__PHI_TEMPORARY = llvm_cbe_inescq_29422_9; /* for PHI node */ - llvm_cbe_code105_9__PHI_TEMPORARY = llvm_cbe_code105_26; /* for PHI node */ - llvm_cbe_options104_2__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_req_caseopt_2__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_9; /* for PHI node */ - llvm_cbe_zerofirstbyte_1__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - llvm_cbe_zeroreqbyte_1__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_9; /* for PHI node */ - llvm_cbe_firstbyte102_2__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - llvm_cbe_greedy_non_default_2__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_9; /* for PHI node */ - llvm_cbe_greedy_default_2__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_9; /* for PHI node */ - goto llvm_cbe_bb5195; - } - -llvm_cbe_cond_false4855: - if ((llvm_cbe_bravalue_9 == ((unsigned int )87))) { - goto llvm_cbe_cond_true4860; - } else { - llvm_cbe_slot_913437_0_us61_5__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_3; /* for PHI node */ - llvm_cbe_slot_913437_059_5__PHI_TEMPORARY = llvm_cbe_slot_913437_059_3; /* for PHI node */ - llvm_cbe_options_addr_1__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_save_hwm_6__PHI_TEMPORARY = llvm_cbe_tmp3176; /* for PHI node */ - llvm_cbe_previous_callout_4__PHI_TEMPORARY = llvm_cbe_previous_callout_9; /* for PHI node */ - llvm_cbe_previous_6__PHI_TEMPORARY = llvm_cbe_iftmp_467_0; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_1__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_inescq_1__PHI_TEMPORARY = llvm_cbe_inescq_29422_9; /* for PHI node */ - llvm_cbe_code105_9__PHI_TEMPORARY = llvm_cbe_code105_26; /* for PHI node */ - llvm_cbe_options104_2__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_req_caseopt_2__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_9; /* for PHI node */ - llvm_cbe_zerofirstbyte_1__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - llvm_cbe_zeroreqbyte_1__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_9; /* for PHI node */ - llvm_cbe_firstbyte102_2__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - llvm_cbe_greedy_non_default_2__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_9; /* for PHI node */ - llvm_cbe_greedy_default_2__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_9; /* for PHI node */ - goto llvm_cbe_bb5195; - } - -llvm_cbe_cond_next4910: - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp4895[((unsigned int )3)]); - llvm_cbe_slot_913437_0_us61_13__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_13__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_repeat_max_10__PHI_TEMPORARY = llvm_cbe_repeat_max_10; /* for PHI node */ - llvm_cbe_repeat_min_10__PHI_TEMPORARY = llvm_cbe_repeat_min_10; /* for PHI node */ - llvm_cbe_options_addr_2__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_save_hwm_7__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_previous_callout_5__PHI_TEMPORARY = llvm_cbe_previous_callout_9; /* for PHI node */ - llvm_cbe_previous_3__PHI_TEMPORARY = llvm_cbe_previous_25708_1; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_2__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_9; /* for PHI node */ - llvm_cbe_inescq_2__PHI_TEMPORARY = llvm_cbe_inescq_29422_9; /* for PHI node */ - llvm_cbe_last_code_2__PHI_TEMPORARY = llvm_cbe_last_code_15771_1; /* for PHI node */ - llvm_cbe_code105_3__PHI_TEMPORARY = llvm_cbe_code105_10; /* for PHI node */ - llvm_cbe_after_manual_callout_7__PHI_TEMPORARY = llvm_cbe_after_manual_callout_1; /* for PHI node */ - llvm_cbe_options104_3__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_req_caseopt_3__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_9; /* for PHI node */ - llvm_cbe_zerofirstbyte_2__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_29740_9; /* for PHI node */ - llvm_cbe_zeroreqbyte_2__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_29762_9; /* for PHI node */ - llvm_cbe_reqbyte103_5__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_9; /* for PHI node */ - llvm_cbe_firstbyte102_3__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - llvm_cbe_greedy_non_default_3__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_9; /* for PHI node */ - llvm_cbe_greedy_default_3__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_9; /* for PHI node */ - goto llvm_cbe_bb131; - -llvm_cbe_cond_next4902: - llvm_cbe_tmp4905 = *(&llvm_cbe_tmp4895[((unsigned int )2)]); - if ((llvm_cbe_tmp4905 == ((unsigned char )69))) { - goto llvm_cbe_cond_next4910; - } else { - llvm_cbe_slot_913437_0_us61_5__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_5__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_1__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_save_hwm_6__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_previous_callout_4__PHI_TEMPORARY = llvm_cbe_previous_callout_9; /* for PHI node */ - llvm_cbe_previous_6__PHI_TEMPORARY = llvm_cbe_previous_25708_1; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_1__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_9; /* for PHI node */ - llvm_cbe_inescq_1__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - llvm_cbe_code105_9__PHI_TEMPORARY = llvm_cbe_code105_10; /* for PHI node */ - llvm_cbe_options104_2__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_req_caseopt_2__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_9; /* for PHI node */ - llvm_cbe_zerofirstbyte_1__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_29740_9; /* for PHI node */ - llvm_cbe_zeroreqbyte_1__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_29762_9; /* for PHI node */ - llvm_cbe_firstbyte102_2__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - llvm_cbe_greedy_non_default_2__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_9; /* for PHI node */ - llvm_cbe_greedy_default_2__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_9; /* for PHI node */ - goto llvm_cbe_bb5195; - } - -llvm_cbe_cond_true4894: - llvm_cbe_tmp4895 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp4897 = *(&llvm_cbe_tmp4895[((unsigned int )1)]); - if ((llvm_cbe_tmp4897 == ((unsigned char )92))) { - goto llvm_cbe_cond_next4902; - } else { - llvm_cbe_slot_913437_0_us61_5__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_5__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_1__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_save_hwm_6__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_previous_callout_4__PHI_TEMPORARY = llvm_cbe_previous_callout_9; /* for PHI node */ - llvm_cbe_previous_6__PHI_TEMPORARY = llvm_cbe_previous_25708_1; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_1__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_9; /* for PHI node */ - llvm_cbe_inescq_1__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - llvm_cbe_code105_9__PHI_TEMPORARY = llvm_cbe_code105_10; /* for PHI node */ - llvm_cbe_options104_2__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_req_caseopt_2__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_9; /* for PHI node */ - llvm_cbe_zerofirstbyte_1__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_29740_9; /* for PHI node */ - llvm_cbe_zeroreqbyte_1__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_29762_9; /* for PHI node */ - llvm_cbe_firstbyte102_2__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - llvm_cbe_greedy_non_default_2__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_9; /* for PHI node */ - llvm_cbe_greedy_default_2__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_9; /* for PHI node */ - goto llvm_cbe_bb5195; - } - -llvm_cbe_cond_true5048: - *llvm_cbe_tmp5042 = llvm_cbe_recno_13; - llvm_cbe_tmp519613501 = *(&llvm_cbe_ptr106); - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp519613501[((unsigned int )1)]); - llvm_cbe_slot_913437_0_us61_13__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_13__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_repeat_max_10__PHI_TEMPORARY = llvm_cbe_repeat_max_10; /* for PHI node */ - llvm_cbe_repeat_min_10__PHI_TEMPORARY = llvm_cbe_repeat_min_10; /* for PHI node */ - llvm_cbe_options_addr_2__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_save_hwm_7__PHI_TEMPORARY = llvm_cbe_save_hwm_14; /* for PHI node */ - llvm_cbe_previous_callout_5__PHI_TEMPORARY = llvm_cbe_previous_callout_9; /* for PHI node */ - llvm_cbe_previous_3__PHI_TEMPORARY = llvm_cbe_code105_10; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_2__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_9; /* for PHI node */ - llvm_cbe_inescq_2__PHI_TEMPORARY = llvm_cbe_inescq_29422_9; /* for PHI node */ - llvm_cbe_last_code_2__PHI_TEMPORARY = llvm_cbe_last_code_15771_1; /* for PHI node */ - llvm_cbe_code105_3__PHI_TEMPORARY = llvm_cbe_tmp5024; /* for PHI node */ - llvm_cbe_after_manual_callout_7__PHI_TEMPORARY = llvm_cbe_after_manual_callout_1; /* for PHI node */ - llvm_cbe_options104_3__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_req_caseopt_3__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_9; /* for PHI node */ - llvm_cbe_zerofirstbyte_2__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_5; /* for PHI node */ - llvm_cbe_zeroreqbyte_2__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_5; /* for PHI node */ - llvm_cbe_reqbyte103_5__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_9; /* for PHI node */ - llvm_cbe_firstbyte102_3__PHI_TEMPORARY = llvm_cbe_firstbyte102_16; /* for PHI node */ - llvm_cbe_greedy_non_default_3__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_9; /* for PHI node */ - llvm_cbe_greedy_default_3__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_9; /* for PHI node */ - goto llvm_cbe_bb131; - -llvm_cbe_HANDLE_REFERENCE: - llvm_cbe_recno_13 = llvm_cbe_recno_13__PHI_TEMPORARY; - llvm_cbe_save_hwm_14 = llvm_cbe_save_hwm_14__PHI_TEMPORARY; - llvm_cbe_zerofirstbyte_5 = llvm_cbe_zerofirstbyte_5__PHI_TEMPORARY; - llvm_cbe_zeroreqbyte_5 = llvm_cbe_zeroreqbyte_5__PHI_TEMPORARY; - llvm_cbe_firstbyte102_14 = llvm_cbe_firstbyte102_14__PHI_TEMPORARY; - llvm_cbe_firstbyte102_16 = (((llvm_cbe_firstbyte102_14 == ((unsigned int )-2))) ? (((unsigned int )-1)) : (llvm_cbe_firstbyte102_14)); - *llvm_cbe_code105_10 = ((unsigned char )80); - *(&llvm_cbe_code105_10[((unsigned int )1)]) = (((unsigned char )(((unsigned int )(((unsigned int )llvm_cbe_recno_13) >> ((unsigned int )((unsigned int )8))))))); - *(&llvm_cbe_code105_10[((unsigned int )2)]) = (((unsigned char )llvm_cbe_recno_13)); - llvm_cbe_tmp5024 = &llvm_cbe_code105_10[((unsigned int )3)]; - llvm_cbe_tmp5027 = *llvm_cbe_tmp5026; - *llvm_cbe_tmp5026 = (llvm_cbe_tmp5027 | ((((((signed int )llvm_cbe_recno_13) < ((signed int )((unsigned int )32)))) ? ((((unsigned int )1) << llvm_cbe_recno_13)) : (((unsigned int )1))))); - llvm_cbe_tmp5043 = *llvm_cbe_tmp5042; - if ((((signed int )llvm_cbe_tmp5043) < ((signed int )llvm_cbe_recno_13))) { - goto llvm_cbe_cond_true5048; - } else { - llvm_cbe_slot_913437_0_us61_5__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_5__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_1__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_save_hwm_6__PHI_TEMPORARY = llvm_cbe_save_hwm_14; /* for PHI node */ - llvm_cbe_previous_callout_4__PHI_TEMPORARY = llvm_cbe_previous_callout_9; /* for PHI node */ - llvm_cbe_previous_6__PHI_TEMPORARY = llvm_cbe_code105_10; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_1__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_9; /* for PHI node */ - llvm_cbe_inescq_1__PHI_TEMPORARY = llvm_cbe_inescq_29422_9; /* for PHI node */ - llvm_cbe_code105_9__PHI_TEMPORARY = llvm_cbe_tmp5024; /* for PHI node */ - llvm_cbe_options104_2__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_req_caseopt_2__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_9; /* for PHI node */ - llvm_cbe_zerofirstbyte_1__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_5; /* for PHI node */ - llvm_cbe_zeroreqbyte_1__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_5; /* for PHI node */ - llvm_cbe_firstbyte102_2__PHI_TEMPORARY = llvm_cbe_firstbyte102_16; /* for PHI node */ - llvm_cbe_greedy_non_default_2__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_9; /* for PHI node */ - llvm_cbe_greedy_default_2__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_9; /* for PHI node */ - goto llvm_cbe_bb5195; - } - -llvm_cbe_cond_true4999: - llvm_cbe_tmp5002 = ((unsigned int )-27) - llvm_cbe_tmp4877; - llvm_cbe_recno_13__PHI_TEMPORARY = llvm_cbe_tmp5002; /* for PHI node */ - llvm_cbe_save_hwm_14__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_zerofirstbyte_5__PHI_TEMPORARY = llvm_cbe_firstbyte102_12; /* for PHI node */ - llvm_cbe_zeroreqbyte_5__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_9; /* for PHI node */ - llvm_cbe_firstbyte102_14__PHI_TEMPORARY = llvm_cbe_firstbyte102_12; /* for PHI node */ - goto llvm_cbe_HANDLE_REFERENCE; - -llvm_cbe_cond_next4993: - if ((((signed int )(-(llvm_cbe_tmp4877))) > ((signed int )((unsigned int )26)))) { - goto llvm_cbe_cond_true4999; - } else { - goto llvm_cbe_cond_false5053; - } - -llvm_cbe_bb5073: - llvm_cbe_iftmp_490_0 = (((((unsigned int )(llvm_cbe_tmp4877 + ((unsigned int )21))) < ((unsigned int )((unsigned int )16)))) ? (llvm_cbe_code105_10) : (((unsigned char *)/*NULL*/0))); - *llvm_cbe_code105_10 = (((unsigned char )(-((((unsigned char )llvm_cbe_tmp4877)))))); - llvm_cbe_tmp5089 = &llvm_cbe_code105_10[((unsigned int )1)]; - llvm_cbe_tmp519613505 = *(&llvm_cbe_ptr106); - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp519613505[((unsigned int )1)]); - llvm_cbe_slot_913437_0_us61_13__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_13__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_repeat_max_10__PHI_TEMPORARY = llvm_cbe_repeat_max_10; /* for PHI node */ - llvm_cbe_repeat_min_10__PHI_TEMPORARY = llvm_cbe_repeat_min_10; /* for PHI node */ - llvm_cbe_options_addr_2__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_save_hwm_7__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_previous_callout_5__PHI_TEMPORARY = llvm_cbe_previous_callout_9; /* for PHI node */ - llvm_cbe_previous_3__PHI_TEMPORARY = llvm_cbe_iftmp_490_0; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_2__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_9; /* for PHI node */ - llvm_cbe_inescq_2__PHI_TEMPORARY = llvm_cbe_inescq_29422_9; /* for PHI node */ - llvm_cbe_last_code_2__PHI_TEMPORARY = llvm_cbe_last_code_15771_1; /* for PHI node */ - llvm_cbe_code105_3__PHI_TEMPORARY = llvm_cbe_tmp5089; /* for PHI node */ - llvm_cbe_after_manual_callout_7__PHI_TEMPORARY = llvm_cbe_after_manual_callout_1; /* for PHI node */ - llvm_cbe_options104_3__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_req_caseopt_3__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_9; /* for PHI node */ - llvm_cbe_zerofirstbyte_2__PHI_TEMPORARY = llvm_cbe_firstbyte102_12; /* for PHI node */ - llvm_cbe_zeroreqbyte_2__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_9; /* for PHI node */ - llvm_cbe_reqbyte103_5__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_9; /* for PHI node */ - llvm_cbe_firstbyte102_3__PHI_TEMPORARY = llvm_cbe_firstbyte102_12; /* for PHI node */ - llvm_cbe_greedy_non_default_3__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_9; /* for PHI node */ - llvm_cbe_greedy_default_3__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_9; /* for PHI node */ - goto llvm_cbe_bb131; - -llvm_cbe_cond_false5053: - switch (llvm_cbe_tmp4877) { - default: - goto llvm_cbe_bb5073; -; - case ((unsigned int )-21): - goto llvm_cbe_bb5071; - break; - case ((unsigned int )-15): - goto llvm_cbe_bb5071; - break; - case ((unsigned int )-14): - goto llvm_cbe_bb5071; - break; - } -llvm_cbe_cond_true5144: - llvm_cbe_tmp5146 = *llvm_cbe_tmp1755; - llvm_cbe_tmp5149 = (((unsigned int )(unsigned char )llvm_cbe_tmp5146)) | llvm_cbe_req_caseopt_39708_14; - llvm_cbe_tmp519613508 = *(&llvm_cbe_ptr106); - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp519613508[((unsigned int )1)]); - llvm_cbe_slot_913437_0_us61_13__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_13__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_repeat_max_10__PHI_TEMPORARY = llvm_cbe_repeat_max_10; /* for PHI node */ - llvm_cbe_repeat_min_10__PHI_TEMPORARY = llvm_cbe_repeat_min_10; /* for PHI node */ - llvm_cbe_options_addr_2__PHI_TEMPORARY = llvm_cbe_options_addr_25789_14; /* for PHI node */ - llvm_cbe_save_hwm_7__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_14; /* for PHI node */ - llvm_cbe_previous_callout_5__PHI_TEMPORARY = llvm_cbe_previous_callout_312578_0; /* for PHI node */ - llvm_cbe_previous_3__PHI_TEMPORARY = llvm_cbe_code105_812582_0; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_2__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_14; /* for PHI node */ - llvm_cbe_inescq_2__PHI_TEMPORARY = llvm_cbe_inescq_612580_0; /* for PHI node */ - llvm_cbe_last_code_2__PHI_TEMPORARY = llvm_cbe_last_code_15771_11; /* for PHI node */ - llvm_cbe_code105_3__PHI_TEMPORARY = llvm_cbe_code105_27; /* for PHI node */ - llvm_cbe_after_manual_callout_7__PHI_TEMPORARY = llvm_cbe_after_manual_callout_312586_0; /* for PHI node */ - llvm_cbe_options104_3__PHI_TEMPORARY = llvm_cbe_options104_39466_14; /* for PHI node */ - llvm_cbe_req_caseopt_3__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_14; /* for PHI node */ - llvm_cbe_zerofirstbyte_2__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - llvm_cbe_zeroreqbyte_2__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_14; /* for PHI node */ - llvm_cbe_reqbyte103_5__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_14; /* for PHI node */ - llvm_cbe_firstbyte102_3__PHI_TEMPORARY = llvm_cbe_tmp5149; /* for PHI node */ - llvm_cbe_greedy_non_default_3__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_14; /* for PHI node */ - llvm_cbe_greedy_default_3__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_14; /* for PHI node */ - goto llvm_cbe_bb131; - -llvm_cbe_bb5126: - if ((llvm_cbe_firstbyte102_39829_14 == ((unsigned int )-2))) { - goto llvm_cbe_cond_true5144; - } else { - goto llvm_cbe_cond_true5181; - } - -llvm_cbe_bb5120: - llvm_cbe_last_code_15771_11 = llvm_cbe_last_code_15771_11__PHI_TEMPORARY; - llvm_cbe_options_addr_25789_14 = llvm_cbe_options_addr_25789_14__PHI_TEMPORARY; - llvm_cbe_save_hwm_79347_14 = llvm_cbe_save_hwm_79347_14__PHI_TEMPORARY; - llvm_cbe_groupsetfirstbyte_29395_14 = llvm_cbe_groupsetfirstbyte_29395_14__PHI_TEMPORARY; - llvm_cbe_options104_39466_14 = llvm_cbe_options104_39466_14__PHI_TEMPORARY; - llvm_cbe_req_caseopt_39708_14 = llvm_cbe_req_caseopt_39708_14__PHI_TEMPORARY; - llvm_cbe_reqbyte103_59784_14 = llvm_cbe_reqbyte103_59784_14__PHI_TEMPORARY; - llvm_cbe_firstbyte102_39829_14 = llvm_cbe_firstbyte102_39829_14__PHI_TEMPORARY; - llvm_cbe_greedy_non_default_39879_14 = llvm_cbe_greedy_non_default_39879_14__PHI_TEMPORARY; - llvm_cbe_greedy_default_39909_14 = llvm_cbe_greedy_default_39909_14__PHI_TEMPORARY; - llvm_cbe_previous_callout_312578_0 = llvm_cbe_previous_callout_312578_0__PHI_TEMPORARY; - llvm_cbe_inescq_612580_0 = llvm_cbe_inescq_612580_0__PHI_TEMPORARY; - llvm_cbe_code105_812582_0 = llvm_cbe_code105_812582_0__PHI_TEMPORARY; - llvm_cbe_after_manual_callout_312586_0 = llvm_cbe_after_manual_callout_312586_0__PHI_TEMPORARY; - llvm_cbe_code105_8_pn = llvm_cbe_code105_8_pn__PHI_TEMPORARY; - llvm_cbe_c_38 = llvm_cbe_c_38__PHI_TEMPORARY; - llvm_cbe_code105_27 = &llvm_cbe_code105_8_pn[((unsigned int )1)]; - if ((((signed int )llvm_cbe_c_38) < ((signed int )((unsigned int )1)))) { - llvm_cbe_last_code_15771_5__PHI_TEMPORARY = llvm_cbe_last_code_15771_11; /* for PHI node */ - llvm_cbe_options_addr_25789_12__PHI_TEMPORARY = llvm_cbe_options_addr_25789_14; /* for PHI node */ - llvm_cbe_save_hwm_79347_12__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_14; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_29395_12__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_14; /* for PHI node */ - llvm_cbe_options104_39466_12__PHI_TEMPORARY = llvm_cbe_options104_39466_14; /* for PHI node */ - llvm_cbe_req_caseopt_39708_12__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_14; /* for PHI node */ - llvm_cbe_reqbyte103_59784_12__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_14; /* for PHI node */ - llvm_cbe_firstbyte102_39829_12__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_14; /* for PHI node */ - llvm_cbe_greedy_non_default_39879_12__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_14; /* for PHI node */ - llvm_cbe_greedy_default_39909_12__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_14; /* for PHI node */ - llvm_cbe_previous_callout_312578_1__PHI_TEMPORARY = llvm_cbe_previous_callout_312578_0; /* for PHI node */ - llvm_cbe_inescq_612580_1__PHI_TEMPORARY = llvm_cbe_inescq_612580_0; /* for PHI node */ - llvm_cbe_code105_812582_1__PHI_TEMPORARY = llvm_cbe_code105_812582_0; /* for PHI node */ - llvm_cbe_after_manual_callout_312586_1__PHI_TEMPORARY = llvm_cbe_after_manual_callout_312586_0; /* for PHI node */ - llvm_cbe_c_3812612_0__PHI_TEMPORARY = llvm_cbe_c_38; /* for PHI node */ - llvm_cbe_code105_2712615_0__PHI_TEMPORARY = llvm_cbe_code105_27; /* for PHI node */ - goto llvm_cbe_bb5111; - } else { - goto llvm_cbe_bb5126; - } - -llvm_cbe_ONE_CHAR: - llvm_cbe_storemerge26707_in = llvm_cbe_storemerge26707_in__PHI_TEMPORARY; - llvm_cbe_last_code_15771_4 = llvm_cbe_last_code_15771_4__PHI_TEMPORARY; - llvm_cbe_options_addr_25789_11 = llvm_cbe_options_addr_25789_11__PHI_TEMPORARY; - llvm_cbe_save_hwm_79347_11 = llvm_cbe_save_hwm_79347_11__PHI_TEMPORARY; - llvm_cbe_groupsetfirstbyte_29395_11 = llvm_cbe_groupsetfirstbyte_29395_11__PHI_TEMPORARY; - llvm_cbe_options104_39466_11 = llvm_cbe_options104_39466_11__PHI_TEMPORARY; - llvm_cbe_req_caseopt_39708_11 = llvm_cbe_req_caseopt_39708_11__PHI_TEMPORARY; - llvm_cbe_reqbyte103_59784_11 = llvm_cbe_reqbyte103_59784_11__PHI_TEMPORARY; - llvm_cbe_firstbyte102_39829_11 = llvm_cbe_firstbyte102_39829_11__PHI_TEMPORARY; - llvm_cbe_greedy_non_default_39879_11 = llvm_cbe_greedy_non_default_39879_11__PHI_TEMPORARY; - llvm_cbe_greedy_default_39909_11 = llvm_cbe_greedy_default_39909_11__PHI_TEMPORARY; - llvm_cbe_previous_callout_3 = llvm_cbe_previous_callout_3__PHI_TEMPORARY; - llvm_cbe_inescq_6 = llvm_cbe_inescq_6__PHI_TEMPORARY; - llvm_cbe_code105_8 = llvm_cbe_code105_8__PHI_TEMPORARY; - llvm_cbe_after_manual_callout_3 = llvm_cbe_after_manual_callout_3__PHI_TEMPORARY; - *llvm_cbe_tmp1755 = (((unsigned char )llvm_cbe_storemerge26707_in)); - *llvm_cbe_code105_8 = (((((llvm_cbe_options104_39466_11 & ((unsigned int )1)) == ((unsigned int )0))) ? (((unsigned char )27)) : (((unsigned char )28)))); - llvm_cbe_last_code_15771_11__PHI_TEMPORARY = llvm_cbe_last_code_15771_4; /* for PHI node */ - llvm_cbe_options_addr_25789_14__PHI_TEMPORARY = llvm_cbe_options_addr_25789_11; /* for PHI node */ - llvm_cbe_save_hwm_79347_14__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_11; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_29395_14__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_11; /* for PHI node */ - llvm_cbe_options104_39466_14__PHI_TEMPORARY = llvm_cbe_options104_39466_11; /* for PHI node */ - llvm_cbe_req_caseopt_39708_14__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_11; /* for PHI node */ - llvm_cbe_reqbyte103_59784_14__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_11; /* for PHI node */ - llvm_cbe_firstbyte102_39829_14__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_11; /* for PHI node */ - llvm_cbe_greedy_non_default_39879_14__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_11; /* for PHI node */ - llvm_cbe_greedy_default_39909_14__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_11; /* for PHI node */ - llvm_cbe_previous_callout_312578_0__PHI_TEMPORARY = llvm_cbe_previous_callout_3; /* for PHI node */ - llvm_cbe_inescq_612580_0__PHI_TEMPORARY = llvm_cbe_inescq_6; /* for PHI node */ - llvm_cbe_code105_812582_0__PHI_TEMPORARY = llvm_cbe_code105_8; /* for PHI node */ - llvm_cbe_after_manual_callout_312586_0__PHI_TEMPORARY = llvm_cbe_after_manual_callout_3; /* for PHI node */ - llvm_cbe_code105_8_pn__PHI_TEMPORARY = llvm_cbe_code105_8; /* for PHI node */ - llvm_cbe_c_38__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb5120; - -llvm_cbe_cond_next259: - if (((llvm_cbe_options104_39466_8 & ((unsigned int )16384)) == ((unsigned int )0))) { - llvm_cbe_storemerge26707_in__PHI_TEMPORARY = llvm_cbe_tmp13513612358_8; /* for PHI node */ - llvm_cbe_last_code_15771_4__PHI_TEMPORARY = llvm_cbe_last_code_15771_0; /* for PHI node */ - llvm_cbe_options_addr_25789_11__PHI_TEMPORARY = llvm_cbe_options_addr_25789_8; /* for PHI node */ - llvm_cbe_save_hwm_79347_11__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_8; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_29395_11__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_8; /* for PHI node */ - llvm_cbe_options104_39466_11__PHI_TEMPORARY = llvm_cbe_options104_39466_8; /* for PHI node */ - llvm_cbe_req_caseopt_39708_11__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_8; /* for PHI node */ - llvm_cbe_reqbyte103_59784_11__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_8; /* for PHI node */ - llvm_cbe_firstbyte102_39829_11__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_8; /* for PHI node */ - llvm_cbe_greedy_non_default_39879_11__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_8; /* for PHI node */ - llvm_cbe_greedy_default_39909_11__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_8; /* for PHI node */ - llvm_cbe_previous_callout_3__PHI_TEMPORARY = ((unsigned char *)/*NULL*/0); /* for PHI node */ - llvm_cbe_inescq_6__PHI_TEMPORARY = llvm_cbe_inescq_29422_8; /* for PHI node */ - llvm_cbe_code105_8__PHI_TEMPORARY = llvm_cbe_code105_25773_0; /* for PHI node */ - llvm_cbe_after_manual_callout_3__PHI_TEMPORARY = llvm_cbe_after_manual_callout_79460_8; /* for PHI node */ - goto llvm_cbe_ONE_CHAR; - } else { - goto llvm_cbe_cond_true265; - } - -llvm_cbe_bb244: - if (((llvm_cbe_previous_callout_59381_8 == ((unsigned char *)/*NULL*/0)) | llvm_cbe_tmp138_not)) { - goto llvm_cbe_cond_next259; - } else { - goto llvm_cbe_cond_true254; - } - -llvm_cbe_cond_true254: - llvm_cbe_tmp255 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp4_i = *llvm_cbe_tmp3783; - llvm_cbe_tmp9_i = *(&llvm_cbe_previous_callout_59381_8[((unsigned int )2)]); - llvm_cbe_tmp14_i = *(&llvm_cbe_previous_callout_59381_8[((unsigned int )3)]); - llvm_cbe_tmp17_i = ((((unsigned int )(unsigned long)llvm_cbe_tmp255)) - (((unsigned int )(unsigned long)llvm_cbe_tmp4_i))) - (((((unsigned int )(unsigned char )llvm_cbe_tmp9_i)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp14_i))); - *(&llvm_cbe_previous_callout_59381_8[((unsigned int )4)]) = (((unsigned char )(((unsigned int )(((unsigned int )llvm_cbe_tmp17_i) >> ((unsigned int )((unsigned int )8))))))); - *(&llvm_cbe_previous_callout_59381_8[((unsigned int )5)]) = (((unsigned char )llvm_cbe_tmp17_i)); - goto llvm_cbe_cond_next259; - -llvm_cbe_cond_true265: - llvm_cbe_tmp267 = *(&llvm_cbe_ptr106); - *llvm_cbe_code105_25773_0 = ((unsigned char )82); - *(&llvm_cbe_code105_25773_0[((unsigned int )1)]) = ((unsigned char )-1); - llvm_cbe_tmp11_i4 = *llvm_cbe_tmp3783; - *(&llvm_cbe_code105_25773_0[((unsigned int )2)]) = (((unsigned char )(((unsigned int )(((unsigned int )((((unsigned int )(unsigned long)llvm_cbe_tmp267)) - (((unsigned int )(unsigned long)llvm_cbe_tmp11_i4)))) >> ((unsigned int )((unsigned int )8))))))); - llvm_cbe_tmp23_i = *llvm_cbe_tmp3783; - *(&llvm_cbe_code105_25773_0[((unsigned int )3)]) = (((unsigned char )((((unsigned char )(unsigned long)llvm_cbe_tmp267)) - (((unsigned char )(unsigned long)llvm_cbe_tmp23_i))))); - *(&llvm_cbe_code105_25773_0[((unsigned int )4)]) = ((unsigned char )0); - *(&llvm_cbe_code105_25773_0[((unsigned int )5)]) = ((unsigned char )0); - llvm_cbe_tmp35_i = &llvm_cbe_code105_25773_0[((unsigned int )6)]; - llvm_cbe_storemerge26707_in__PHI_TEMPORARY = llvm_cbe_tmp13513612358_8; /* for PHI node */ - llvm_cbe_last_code_15771_4__PHI_TEMPORARY = llvm_cbe_last_code_15771_0; /* for PHI node */ - llvm_cbe_options_addr_25789_11__PHI_TEMPORARY = llvm_cbe_options_addr_25789_8; /* for PHI node */ - llvm_cbe_save_hwm_79347_11__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_8; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_29395_11__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_8; /* for PHI node */ - llvm_cbe_options104_39466_11__PHI_TEMPORARY = llvm_cbe_options104_39466_8; /* for PHI node */ - llvm_cbe_req_caseopt_39708_11__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_8; /* for PHI node */ - llvm_cbe_reqbyte103_59784_11__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_8; /* for PHI node */ - llvm_cbe_firstbyte102_39829_11__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_8; /* for PHI node */ - llvm_cbe_greedy_non_default_39879_11__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_8; /* for PHI node */ - llvm_cbe_greedy_default_39909_11__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_8; /* for PHI node */ - llvm_cbe_previous_callout_3__PHI_TEMPORARY = llvm_cbe_code105_25773_0; /* for PHI node */ - llvm_cbe_inescq_6__PHI_TEMPORARY = llvm_cbe_inescq_29422_8; /* for PHI node */ - llvm_cbe_code105_8__PHI_TEMPORARY = llvm_cbe_tmp35_i; /* for PHI node */ - llvm_cbe_after_manual_callout_3__PHI_TEMPORARY = llvm_cbe_after_manual_callout_79460_8; /* for PHI node */ - goto llvm_cbe_ONE_CHAR; - -llvm_cbe_bb5111: - llvm_cbe_last_code_15771_5 = llvm_cbe_last_code_15771_5__PHI_TEMPORARY; - llvm_cbe_options_addr_25789_12 = llvm_cbe_options_addr_25789_12__PHI_TEMPORARY; - llvm_cbe_save_hwm_79347_12 = llvm_cbe_save_hwm_79347_12__PHI_TEMPORARY; - llvm_cbe_groupsetfirstbyte_29395_12 = llvm_cbe_groupsetfirstbyte_29395_12__PHI_TEMPORARY; - llvm_cbe_options104_39466_12 = llvm_cbe_options104_39466_12__PHI_TEMPORARY; - llvm_cbe_req_caseopt_39708_12 = llvm_cbe_req_caseopt_39708_12__PHI_TEMPORARY; - llvm_cbe_reqbyte103_59784_12 = llvm_cbe_reqbyte103_59784_12__PHI_TEMPORARY; - llvm_cbe_firstbyte102_39829_12 = llvm_cbe_firstbyte102_39829_12__PHI_TEMPORARY; - llvm_cbe_greedy_non_default_39879_12 = llvm_cbe_greedy_non_default_39879_12__PHI_TEMPORARY; - llvm_cbe_greedy_default_39909_12 = llvm_cbe_greedy_default_39909_12__PHI_TEMPORARY; - llvm_cbe_previous_callout_312578_1 = llvm_cbe_previous_callout_312578_1__PHI_TEMPORARY; - llvm_cbe_inescq_612580_1 = llvm_cbe_inescq_612580_1__PHI_TEMPORARY; - llvm_cbe_code105_812582_1 = llvm_cbe_code105_812582_1__PHI_TEMPORARY; - llvm_cbe_after_manual_callout_312586_1 = llvm_cbe_after_manual_callout_312586_1__PHI_TEMPORARY; - llvm_cbe_c_3812612_0 = llvm_cbe_c_3812612_0__PHI_TEMPORARY; - llvm_cbe_code105_2712615_0 = llvm_cbe_code105_2712615_0__PHI_TEMPORARY; - llvm_cbe_tmp5114 = *(&llvm_cbe_mcbuffer[llvm_cbe_c_3812612_0]); - *llvm_cbe_code105_2712615_0 = llvm_cbe_tmp5114; - llvm_cbe_tmp5119 = llvm_cbe_c_3812612_0 + ((unsigned int )1); - llvm_cbe_last_code_15771_11__PHI_TEMPORARY = llvm_cbe_last_code_15771_5; /* for PHI node */ - llvm_cbe_options_addr_25789_14__PHI_TEMPORARY = llvm_cbe_options_addr_25789_12; /* for PHI node */ - llvm_cbe_save_hwm_79347_14__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_12; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_29395_14__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_12; /* for PHI node */ - llvm_cbe_options104_39466_14__PHI_TEMPORARY = llvm_cbe_options104_39466_12; /* for PHI node */ - llvm_cbe_req_caseopt_39708_14__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_12; /* for PHI node */ - llvm_cbe_reqbyte103_59784_14__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_12; /* for PHI node */ - llvm_cbe_firstbyte102_39829_14__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_12; /* for PHI node */ - llvm_cbe_greedy_non_default_39879_14__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_12; /* for PHI node */ - llvm_cbe_greedy_default_39909_14__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_12; /* for PHI node */ - llvm_cbe_previous_callout_312578_0__PHI_TEMPORARY = llvm_cbe_previous_callout_312578_1; /* for PHI node */ - llvm_cbe_inescq_612580_0__PHI_TEMPORARY = llvm_cbe_inescq_612580_1; /* for PHI node */ - llvm_cbe_code105_812582_0__PHI_TEMPORARY = llvm_cbe_code105_812582_1; /* for PHI node */ - llvm_cbe_after_manual_callout_312586_0__PHI_TEMPORARY = llvm_cbe_after_manual_callout_312586_1; /* for PHI node */ - llvm_cbe_code105_8_pn__PHI_TEMPORARY = llvm_cbe_code105_2712615_0; /* for PHI node */ - llvm_cbe_c_38__PHI_TEMPORARY = llvm_cbe_tmp5119; /* for PHI node */ - goto llvm_cbe_bb5120; - -llvm_cbe_cond_next1752: - *llvm_cbe_tmp1755 = (((unsigned char )llvm_cbe_class_lastchar_8)); - *llvm_cbe_code105_10 = (((((llvm_cbe_options104_39466_9 & ((unsigned int )1)) == ((unsigned int )0))) ? (((unsigned char )27)) : (((unsigned char )28)))); - llvm_cbe_code105_2712620 = &llvm_cbe_code105_10[((unsigned int )1)]; - llvm_cbe_last_code_15771_5__PHI_TEMPORARY = llvm_cbe_last_code_15771_1; /* for PHI node */ - llvm_cbe_options_addr_25789_12__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_save_hwm_79347_12__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_9; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_29395_12__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_9; /* for PHI node */ - llvm_cbe_options104_39466_12__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_req_caseopt_39708_12__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_9; /* for PHI node */ - llvm_cbe_reqbyte103_59784_12__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_9; /* for PHI node */ - llvm_cbe_firstbyte102_39829_12__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - llvm_cbe_greedy_non_default_39879_12__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_9; /* for PHI node */ - llvm_cbe_greedy_default_39909_12__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_9; /* for PHI node */ - llvm_cbe_previous_callout_312578_1__PHI_TEMPORARY = llvm_cbe_previous_callout_9; /* for PHI node */ - llvm_cbe_inescq_612580_1__PHI_TEMPORARY = llvm_cbe_inescq_5; /* for PHI node */ - llvm_cbe_code105_812582_1__PHI_TEMPORARY = llvm_cbe_code105_10; /* for PHI node */ - llvm_cbe_after_manual_callout_312586_1__PHI_TEMPORARY = llvm_cbe_after_manual_callout_1; /* for PHI node */ - llvm_cbe_c_3812612_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_code105_2712615_0__PHI_TEMPORARY = llvm_cbe_code105_2712620; /* for PHI node */ - goto llvm_cbe_bb5111; - -llvm_cbe_cond_true5181: - llvm_cbe_tmp5184 = *llvm_cbe_code105_8_pn; - llvm_cbe_tmp5190 = *llvm_cbe_tmp1993; - llvm_cbe_tmp5191 = (llvm_cbe_tmp5190 | llvm_cbe_req_caseopt_39708_14) | (((unsigned int )(unsigned char )llvm_cbe_tmp5184)); - llvm_cbe_tmp519613511 = *(&llvm_cbe_ptr106); - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp519613511[((unsigned int )1)]); - llvm_cbe_slot_913437_0_us61_13__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_13__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_repeat_max_10__PHI_TEMPORARY = llvm_cbe_repeat_max_10; /* for PHI node */ - llvm_cbe_repeat_min_10__PHI_TEMPORARY = llvm_cbe_repeat_min_10; /* for PHI node */ - llvm_cbe_options_addr_2__PHI_TEMPORARY = llvm_cbe_options_addr_25789_14; /* for PHI node */ - llvm_cbe_save_hwm_7__PHI_TEMPORARY = llvm_cbe_save_hwm_79347_14; /* for PHI node */ - llvm_cbe_previous_callout_5__PHI_TEMPORARY = llvm_cbe_previous_callout_312578_0; /* for PHI node */ - llvm_cbe_previous_3__PHI_TEMPORARY = llvm_cbe_code105_812582_0; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_2__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_14; /* for PHI node */ - llvm_cbe_inescq_2__PHI_TEMPORARY = llvm_cbe_inescq_612580_0; /* for PHI node */ - llvm_cbe_last_code_2__PHI_TEMPORARY = llvm_cbe_last_code_15771_11; /* for PHI node */ - llvm_cbe_code105_3__PHI_TEMPORARY = llvm_cbe_code105_27; /* for PHI node */ - llvm_cbe_after_manual_callout_7__PHI_TEMPORARY = llvm_cbe_after_manual_callout_312586_0; /* for PHI node */ - llvm_cbe_options104_3__PHI_TEMPORARY = llvm_cbe_options104_39466_14; /* for PHI node */ - llvm_cbe_req_caseopt_3__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_14; /* for PHI node */ - llvm_cbe_zerofirstbyte_2__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_14; /* for PHI node */ - llvm_cbe_zeroreqbyte_2__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_14; /* for PHI node */ - llvm_cbe_reqbyte103_5__PHI_TEMPORARY = llvm_cbe_tmp5191; /* for PHI node */ - llvm_cbe_firstbyte102_3__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_14; /* for PHI node */ - llvm_cbe_greedy_non_default_3__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_14; /* for PHI node */ - llvm_cbe_greedy_default_3__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_14; /* for PHI node */ - goto llvm_cbe_bb131; - -llvm_cbe_bb5195: - llvm_cbe_slot_913437_0_us61_5 = llvm_cbe_slot_913437_0_us61_5__PHI_TEMPORARY; - llvm_cbe_slot_913437_059_5 = llvm_cbe_slot_913437_059_5__PHI_TEMPORARY; - llvm_cbe_options_addr_1 = llvm_cbe_options_addr_1__PHI_TEMPORARY; - llvm_cbe_save_hwm_6 = llvm_cbe_save_hwm_6__PHI_TEMPORARY; - llvm_cbe_previous_callout_4 = llvm_cbe_previous_callout_4__PHI_TEMPORARY; - llvm_cbe_previous_6 = llvm_cbe_previous_6__PHI_TEMPORARY; - llvm_cbe_groupsetfirstbyte_1 = llvm_cbe_groupsetfirstbyte_1__PHI_TEMPORARY; - llvm_cbe_inescq_1 = llvm_cbe_inescq_1__PHI_TEMPORARY; - llvm_cbe_code105_9 = llvm_cbe_code105_9__PHI_TEMPORARY; - llvm_cbe_options104_2 = llvm_cbe_options104_2__PHI_TEMPORARY; - llvm_cbe_req_caseopt_2 = llvm_cbe_req_caseopt_2__PHI_TEMPORARY; - llvm_cbe_zerofirstbyte_1 = llvm_cbe_zerofirstbyte_1__PHI_TEMPORARY; - llvm_cbe_zeroreqbyte_1 = llvm_cbe_zeroreqbyte_1__PHI_TEMPORARY; - llvm_cbe_firstbyte102_2 = llvm_cbe_firstbyte102_2__PHI_TEMPORARY; - llvm_cbe_greedy_non_default_2 = llvm_cbe_greedy_non_default_2__PHI_TEMPORARY; - llvm_cbe_greedy_default_2 = llvm_cbe_greedy_default_2__PHI_TEMPORARY; - llvm_cbe_tmp5196 = *(&llvm_cbe_ptr106); - *(&llvm_cbe_ptr106) = (&llvm_cbe_tmp5196[((unsigned int )1)]); - llvm_cbe_slot_913437_0_us61_13__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_5; /* for PHI node */ - llvm_cbe_slot_913437_059_13__PHI_TEMPORARY = llvm_cbe_slot_913437_059_5; /* for PHI node */ - llvm_cbe_repeat_max_10__PHI_TEMPORARY = llvm_cbe_repeat_max_10; /* for PHI node */ - llvm_cbe_repeat_min_10__PHI_TEMPORARY = llvm_cbe_repeat_min_10; /* for PHI node */ - llvm_cbe_options_addr_2__PHI_TEMPORARY = llvm_cbe_options_addr_1; /* for PHI node */ - llvm_cbe_save_hwm_7__PHI_TEMPORARY = llvm_cbe_save_hwm_6; /* for PHI node */ - llvm_cbe_previous_callout_5__PHI_TEMPORARY = llvm_cbe_previous_callout_4; /* for PHI node */ - llvm_cbe_previous_3__PHI_TEMPORARY = llvm_cbe_previous_6; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_2__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_1; /* for PHI node */ - llvm_cbe_inescq_2__PHI_TEMPORARY = llvm_cbe_inescq_1; /* for PHI node */ - llvm_cbe_last_code_2__PHI_TEMPORARY = llvm_cbe_last_code_15771_1; /* for PHI node */ - llvm_cbe_code105_3__PHI_TEMPORARY = llvm_cbe_code105_9; /* for PHI node */ - llvm_cbe_after_manual_callout_7__PHI_TEMPORARY = llvm_cbe_after_manual_callout_1; /* for PHI node */ - llvm_cbe_options104_3__PHI_TEMPORARY = llvm_cbe_options104_2; /* for PHI node */ - llvm_cbe_req_caseopt_3__PHI_TEMPORARY = llvm_cbe_req_caseopt_2; /* for PHI node */ - llvm_cbe_zerofirstbyte_2__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_1; /* for PHI node */ - llvm_cbe_zeroreqbyte_2__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_1; /* for PHI node */ - llvm_cbe_reqbyte103_5__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_9; /* for PHI node */ - llvm_cbe_firstbyte102_3__PHI_TEMPORARY = llvm_cbe_firstbyte102_2; /* for PHI node */ - llvm_cbe_greedy_non_default_3__PHI_TEMPORARY = llvm_cbe_greedy_non_default_2; /* for PHI node */ - llvm_cbe_greedy_default_3__PHI_TEMPORARY = llvm_cbe_greedy_default_2; /* for PHI node */ - goto llvm_cbe_bb131; - - do { /* Syntactic loop 'bb3197' to make GCC happy */ -llvm_cbe_bb3197: - llvm_cbe_tmp3195_pn = llvm_cbe_tmp3195_pn__PHI_TEMPORARY; - llvm_cbe_storemerge = &llvm_cbe_tmp3195_pn[((unsigned int )1)]; - *(&llvm_cbe_ptr106) = llvm_cbe_storemerge; - llvm_cbe_tmp3199 = *llvm_cbe_storemerge; - switch (llvm_cbe_tmp3199) { - default: - llvm_cbe_tmp3195_pn__PHI_TEMPORARY = llvm_cbe_storemerge; /* for PHI node */ - goto llvm_cbe_bb3197; -; - case ((unsigned char )0): - goto llvm_cbe_cond_true3217; - break; - case ((unsigned char )41): - llvm_cbe_slot_913437_0_us61_5__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_5__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_1__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_save_hwm_6__PHI_TEMPORARY = llvm_cbe_tmp3176; /* for PHI node */ - llvm_cbe_previous_callout_4__PHI_TEMPORARY = llvm_cbe_previous_callout_9; /* for PHI node */ - llvm_cbe_previous_6__PHI_TEMPORARY = llvm_cbe_previous_25708_1; /* for PHI node */ - llvm_cbe_groupsetfirstbyte_1__PHI_TEMPORARY = llvm_cbe_groupsetfirstbyte_29395_9; /* for PHI node */ - llvm_cbe_inescq_1__PHI_TEMPORARY = llvm_cbe_inescq_29422_9; /* for PHI node */ - llvm_cbe_code105_9__PHI_TEMPORARY = llvm_cbe_code105_10; /* for PHI node */ - llvm_cbe_options104_2__PHI_TEMPORARY = llvm_cbe_options104_39466_9; /* for PHI node */ - llvm_cbe_req_caseopt_2__PHI_TEMPORARY = llvm_cbe_req_caseopt_39708_9; /* for PHI node */ - llvm_cbe_zerofirstbyte_1__PHI_TEMPORARY = llvm_cbe_zerofirstbyte_29740_9; /* for PHI node */ - llvm_cbe_zeroreqbyte_1__PHI_TEMPORARY = llvm_cbe_zeroreqbyte_29762_9; /* for PHI node */ - llvm_cbe_firstbyte102_2__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - llvm_cbe_greedy_non_default_2__PHI_TEMPORARY = llvm_cbe_greedy_non_default_39879_9; /* for PHI node */ - llvm_cbe_greedy_default_2__PHI_TEMPORARY = llvm_cbe_greedy_default_39909_9; /* for PHI node */ - goto llvm_cbe_bb5195; - } - } while (1); /* end of syntactic loop 'bb3197' */ - } while (1); /* end of syntactic loop 'bb131' */ -llvm_cbe_cond_next66: - llvm_cbe_code_2 = llvm_cbe_code_2__PHI_TEMPORARY; - llvm_cbe_reverse_count_0 = llvm_cbe_reverse_count_0__PHI_TEMPORARY; - *(&llvm_cbe_length_prevgroup) = ((unsigned int )0); - *(&llvm_cbe_ptr106) = llvm_cbe_ptr_013604_1; - llvm_cbe_tmp117 = (((unsigned int )(((unsigned int )llvm_cbe_options_addr_313605_1) >> ((unsigned int )((unsigned int )9))))) & ((unsigned int )1); - llvm_cbe_tmp119 = llvm_cbe_tmp117 ^ ((unsigned int )1); - llvm_cbe_req_caseopt_3_ph = ((((llvm_cbe_options_addr_313605_1 & ((unsigned int )1)) == ((unsigned int )0))) ? (((unsigned int )0)) : (((unsigned int )256))); - llvm_cbe_tmp188189 = ((unsigned int )(unsigned long)llvm_cbe_code_2); - llvm_cbe_slot_913437_0_us61_13__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_9; /* for PHI node */ - llvm_cbe_slot_913437_059_13__PHI_TEMPORARY = llvm_cbe_slot_913437_059_9; /* for PHI node */ - llvm_cbe_repeat_max_10__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_repeat_min_10__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_options_addr_2__PHI_TEMPORARY = llvm_cbe_options_addr_313605_1; /* for PHI node */ - llvm_cbe_save_hwm_7__PHI_TEMPORARY = ((unsigned char *)/*NULL*/0); /* for PHI node */ - llvm_cbe_previous_callout_5__PHI_TEMPORARY = ((unsigned char *)/*NULL*/0); /* for PHI node */ - llvm_cbe_previous_3__PHI_TEMPORARY = ((unsigned char *)/*NULL*/0); /* for PHI node */ - llvm_cbe_groupsetfirstbyte_2__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_inescq_2__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_last_code_2__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_code105_3__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_after_manual_callout_7__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_options104_3__PHI_TEMPORARY = llvm_cbe_options_addr_313605_1; /* for PHI node */ - llvm_cbe_req_caseopt_3__PHI_TEMPORARY = llvm_cbe_req_caseopt_3_ph; /* for PHI node */ - llvm_cbe_zerofirstbyte_2__PHI_TEMPORARY = ((unsigned int )-2); /* for PHI node */ - llvm_cbe_zeroreqbyte_2__PHI_TEMPORARY = ((unsigned int )-2); /* for PHI node */ - llvm_cbe_reqbyte103_5__PHI_TEMPORARY = ((unsigned int )-2); /* for PHI node */ - llvm_cbe_firstbyte102_3__PHI_TEMPORARY = ((unsigned int )-2); /* for PHI node */ - llvm_cbe_greedy_non_default_3__PHI_TEMPORARY = llvm_cbe_tmp119; /* for PHI node */ - llvm_cbe_greedy_default_3__PHI_TEMPORARY = llvm_cbe_tmp117; /* for PHI node */ - goto llvm_cbe_bb131; - -llvm_cbe_cond_next49: - llvm_cbe_code_0 = llvm_cbe_code_0__PHI_TEMPORARY; - if ((llvm_cbe_lookbehind == ((unsigned int )0))) { - llvm_cbe_code_2__PHI_TEMPORARY = llvm_cbe_code_0; /* for PHI node */ - llvm_cbe_reverse_count_0__PHI_TEMPORARY = llvm_cbe_reverse_count_113916_1; /* for PHI node */ - goto llvm_cbe_cond_next66; - } else { - goto llvm_cbe_cond_true54; - } - -llvm_cbe_cond_true39: - *llvm_cbe_code_113600_1 = ((unsigned char )24); - *(&llvm_cbe_code_113600_1[((unsigned int )1)]) = (((unsigned char )((((unsigned char )llvm_cbe_options_addr_313605_1)) & ((unsigned char )7)))); - llvm_cbe_tmp46 = &llvm_cbe_code_113600_1[((unsigned int )2)]; - llvm_cbe_tmp47 = *(&llvm_cbe_length); - *(&llvm_cbe_length) = (llvm_cbe_tmp47 + ((unsigned int )2)); - llvm_cbe_code_0__PHI_TEMPORARY = llvm_cbe_tmp46; /* for PHI node */ - goto llvm_cbe_cond_next49; - -llvm_cbe_cond_true54: - *llvm_cbe_code_0 = ((unsigned char )91); - llvm_cbe_tmp56 = &llvm_cbe_code_0[((unsigned int )1)]; - *llvm_cbe_tmp56 = ((unsigned char )0); - *(&llvm_cbe_code_0[((unsigned int )2)]) = ((unsigned char )0); - llvm_cbe_tmp63 = &llvm_cbe_code_0[((unsigned int )3)]; - llvm_cbe_tmp64 = *(&llvm_cbe_length); - *(&llvm_cbe_length) = (llvm_cbe_tmp64 + ((unsigned int )3)); - llvm_cbe_code_2__PHI_TEMPORARY = llvm_cbe_tmp63; /* for PHI node */ - llvm_cbe_reverse_count_0__PHI_TEMPORARY = llvm_cbe_tmp56; /* for PHI node */ - goto llvm_cbe_cond_next66; - -llvm_cbe_bb590: - llvm_cbe_tmp597 = *(&llvm_cbe_ptr106); - if ((llvm_cbe_iftmp_509_0 == ((unsigned int *)/*NULL*/0))) { - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_9; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code105_10; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp597; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 0; /* for PHI node */ - goto llvm_cbe_bb5201; - } else { - goto llvm_cbe_cond_true603; - } - -llvm_cbe_cond_true603: - llvm_cbe_tmp605 = *llvm_cbe_iftmp_509_0; - *llvm_cbe_iftmp_509_0 = (((((unsigned int )(unsigned long)llvm_cbe_code105_10)) - (((unsigned int )(unsigned long)llvm_cbe_last_code_15771_1))) + llvm_cbe_tmp605); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_reqbyte103_59784_9; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_firstbyte102_39829_9; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code105_10; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp597; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 0; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true680: - llvm_cbe_tmp681 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp683 = *(&llvm_cbe_tmp681[((unsigned int )1)]); - *llvm_cbe_errorcodeptr = ((((llvm_cbe_tmp683 == ((unsigned char )58))) ? (((unsigned int )13)) : (((unsigned int )31)))); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp681; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true784: - *llvm_cbe_errorcodeptr = ((unsigned int )31); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp778; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true861: - *llvm_cbe_errorcodeptr = ((unsigned int )30); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp800; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true1402: - *llvm_cbe_errorcodeptr = ((unsigned int )7); - llvm_cbe_tmp519812479 = *(&llvm_cbe_ptr106); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp519812479; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true1582: - *llvm_cbe_errorcodeptr = ((unsigned int )8); - llvm_cbe_tmp519812520 = *(&llvm_cbe_ptr106); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp519812520; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true1723: - *llvm_cbe_errorcodeptr = ((unsigned int )6); - llvm_cbe_tmp519812532 = *(&llvm_cbe_ptr106); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp519812532; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true1928: - *llvm_cbe_errorcodeptr = ((unsigned int )9); - llvm_cbe_tmp519812674 = *(&llvm_cbe_ptr106); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp519812674; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true2501: - *llvm_cbe_errorcodeptr = ((unsigned int )55); - llvm_cbe_tmp519813229 = *(&llvm_cbe_ptr106); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp519813229; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true2509: - *llvm_cbe_errorcodeptr = ((unsigned int )50); - llvm_cbe_tmp519813230 = *(&llvm_cbe_ptr106); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp519813230; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_false3045: - *llvm_cbe_errorcodeptr = ((unsigned int )11); - llvm_cbe_tmp519813331 = *(&llvm_cbe_ptr106); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp519813331; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true3217: - *llvm_cbe_errorcodeptr = ((unsigned int )18); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_storemerge; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true3339: - *llvm_cbe_errorcodeptr = ((unsigned int )28); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp3328; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_bb3418: - llvm_cbe_tmp3419 = *(&llvm_cbe_ptr106); - llvm_cbe_tmp3420 = &llvm_cbe_tmp3419[((unsigned int )-1)]; - *(&llvm_cbe_ptr106) = llvm_cbe_tmp3420; - *llvm_cbe_errorcodeptr = ((unsigned int )26); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp3420; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true3438: - *llvm_cbe_errorcodeptr = ((unsigned int )58); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp3416; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true3456: - *llvm_cbe_errorcodeptr = ((unsigned int )15); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp3416; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true3580: - *llvm_cbe_errorcodeptr = ((unsigned int )15); - llvm_cbe_tmp519813360 = *(&llvm_cbe_ptr106); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp519813360; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true3603: - *llvm_cbe_errorcodeptr = ((unsigned int )15); - llvm_cbe_tmp519813361 = *(&llvm_cbe_ptr106); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp519813361; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_false3676: - *llvm_cbe_errorcodeptr = ((((llvm_cbe_recno_7_lcssa == ((unsigned int )0))) ? (((unsigned int )35)) : (((unsigned int )15)))); - llvm_cbe_tmp519813362 = *(&llvm_cbe_ptr106); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp519813362; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_next3725: - *(&llvm_cbe_ptr106) = llvm_cbe_tmp3700; - *llvm_cbe_errorcodeptr = ((unsigned int )24); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp3700; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true3765: - *llvm_cbe_errorcodeptr = ((unsigned int )39); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp3760; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true3772: - *llvm_cbe_errorcodeptr = ((unsigned int )38); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp3760; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true3837: - *llvm_cbe_errorcodeptr = ((unsigned int )41); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp3813; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true3888: - *llvm_cbe_errorcodeptr = ((unsigned int )42); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp3881; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true3897: - *llvm_cbe_errorcodeptr = ((unsigned int )49); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp3881; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true3917: - *llvm_cbe_errorcodeptr = ((unsigned int )48); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp3881; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true3951_split: - llvm_cbe_slot_913437_0_us_le62 = &llvm_cbe_tmp3924[llvm_cbe_slot_913437_0_us_rec]; - *llvm_cbe_errorcodeptr = ((unsigned int )43); - llvm_cbe_tmp519813452 = *(&llvm_cbe_ptr106); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us_le62; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp519813452; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true4066: - *llvm_cbe_errorcodeptr = ((unsigned int )42); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp4059; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true4073: - *llvm_cbe_errorcodeptr = ((unsigned int )48); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp4059; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true4154: - *llvm_cbe_errorcodeptr = ((unsigned int )15); - llvm_cbe_tmp519813472 = *(&llvm_cbe_ptr106); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp519813472; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true4238: - *llvm_cbe_errorcodeptr = ((unsigned int )29); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp4233; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true4250: - *llvm_cbe_errorcodeptr = ((unsigned int )58); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp4233; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true4263: - *llvm_cbe_errorcodeptr = ((unsigned int )15); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp4233; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true4276: - *llvm_cbe_errorcodeptr = ((unsigned int )58); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp4233; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true4325: - *llvm_cbe_errorcodeptr = ((unsigned int )15); - llvm_cbe_tmp519813477 = *(&llvm_cbe_ptr106); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp519813477; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true4430: - *llvm_cbe_errorcodeptr = ((unsigned int )40); - llvm_cbe_tmp519813478 = *(&llvm_cbe_ptr106); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp519813478; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_bb4531: - *llvm_cbe_errorcodeptr = ((unsigned int )12); - *(&llvm_cbe_ptr106) = llvm_cbe_tmp4537; - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp4537; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true4746: - *llvm_cbe_errorcodeptr = ((unsigned int )54); - llvm_cbe_tmp519813489 = *(&llvm_cbe_ptr106); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_3; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_3; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp519813489; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true4754: - *llvm_cbe_errorcodeptr = ((unsigned int )27); - llvm_cbe_tmp519813490 = *(&llvm_cbe_ptr106); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_3; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_3; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp519813490; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_true4771: - *llvm_cbe_errorcodeptr = ((unsigned int )14); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_3; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_3; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp4766; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_bb5071: - *llvm_cbe_errorcodeptr = ((unsigned int )45); - llvm_cbe_tmp519813504 = *(&llvm_cbe_ptr106); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_13; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_13; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp519813504; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_FAILED: - llvm_cbe_slot_913437_0_us61_12 = llvm_cbe_slot_913437_0_us61_12__PHI_TEMPORARY; - llvm_cbe_slot_913437_059_12 = llvm_cbe_slot_913437_059_12__PHI_TEMPORARY; - llvm_cbe_tmp5198 = *(&llvm_cbe_ptr106); - llvm_cbe_slot_913437_0_us61_7__PHI_TEMPORARY = llvm_cbe_slot_913437_0_us61_12; /* for PHI node */ - llvm_cbe_slot_913437_059_7__PHI_TEMPORARY = llvm_cbe_slot_913437_059_12; /* for PHI node */ - llvm_cbe_options_addr_25789_6__PHI_TEMPORARY = llvm_cbe_options_addr_25789_9; /* for PHI node */ - llvm_cbe_branchreqbyte_5__PHI_TEMPORARY = llvm_cbe_branchreqbyte_413514_1; /* for PHI node */ - llvm_cbe_branchfirstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_113557_1; /* for PHI node */ - llvm_cbe_code_6__PHI_TEMPORARY = llvm_cbe_code_2; /* for PHI node */ - llvm_cbe_ptr_1__PHI_TEMPORARY = llvm_cbe_tmp5198; /* for PHI node */ - llvm_cbe_tmp_0__PHI_TEMPORARY = 1; /* for PHI node */ - goto llvm_cbe_bb5201; - -llvm_cbe_cond_next5289: - llvm_cbe_branchreqbyte_1 = llvm_cbe_branchreqbyte_1__PHI_TEMPORARY; - llvm_cbe_reqbyte_0 = llvm_cbe_reqbyte_0__PHI_TEMPORARY; - llvm_cbe_firstbyte_0 = llvm_cbe_firstbyte_0__PHI_TEMPORARY; - if ((llvm_cbe_lookbehind == ((unsigned int )0))) { - llvm_cbe_branchreqbyte_2__PHI_TEMPORARY = llvm_cbe_branchreqbyte_1; /* for PHI node */ - llvm_cbe_reqbyte_1__PHI_TEMPORARY = llvm_cbe_reqbyte_0; /* for PHI node */ - llvm_cbe_firstbyte_1__PHI_TEMPORARY = llvm_cbe_firstbyte_0; /* for PHI node */ - goto llvm_cbe_cond_next5328; - } else { - goto llvm_cbe_cond_true5294; - } - -llvm_cbe_cond_true5227: - llvm_cbe_tmp5229 = *llvm_cbe_last_branch_413917_1; - if ((llvm_cbe_tmp5229 == ((unsigned char )83))) { - goto llvm_cbe_cond_false5236; - } else { - llvm_cbe_branchreqbyte_1__PHI_TEMPORARY = llvm_cbe_branchreqbyte_5; /* for PHI node */ - llvm_cbe_reqbyte_0__PHI_TEMPORARY = llvm_cbe_branchreqbyte_5; /* for PHI node */ - llvm_cbe_firstbyte_0__PHI_TEMPORARY = llvm_cbe_branchfirstbyte_0; /* for PHI node */ - goto llvm_cbe_cond_next5289; - } - -llvm_cbe_cond_next5256: - llvm_cbe_reqbyte_5 = llvm_cbe_reqbyte_5__PHI_TEMPORARY; - llvm_cbe_firstbyte_4 = llvm_cbe_firstbyte_4__PHI_TEMPORARY; - llvm_cbe_branchreqbyte_0 = (((((((signed int )llvm_cbe_branchfirstbyte_0) > ((signed int )((unsigned int )-1))) & (((signed int )llvm_cbe_branchreqbyte_5) < ((signed int )((unsigned int )0)))) & (((signed int )llvm_cbe_firstbyte_4) < ((signed int )((unsigned int )0))))) ? (llvm_cbe_branchfirstbyte_0) : (llvm_cbe_branchreqbyte_5)); - if ((((llvm_cbe_branchreqbyte_0 ^ llvm_cbe_reqbyte_5) & ((unsigned int )-513)) == ((unsigned int )0))) { - goto llvm_cbe_cond_false5284; - } else { - llvm_cbe_branchreqbyte_1__PHI_TEMPORARY = llvm_cbe_branchreqbyte_0; /* for PHI node */ - llvm_cbe_reqbyte_0__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - llvm_cbe_firstbyte_0__PHI_TEMPORARY = llvm_cbe_firstbyte_4; /* for PHI node */ - goto llvm_cbe_cond_next5289; - } - -llvm_cbe_cond_false5236: - if (((llvm_cbe_firstbyte_313911_1 == llvm_cbe_branchfirstbyte_0) | (((signed int )llvm_cbe_firstbyte_313911_1) < ((signed int )((unsigned int )0))))) { - llvm_cbe_reqbyte_5__PHI_TEMPORARY = llvm_cbe_reqbyte_313907_1; /* for PHI node */ - llvm_cbe_firstbyte_4__PHI_TEMPORARY = llvm_cbe_firstbyte_313911_1; /* for PHI node */ - goto llvm_cbe_cond_next5256; - } else { - goto llvm_cbe_cond_true5247; - } - -llvm_cbe_cond_true5247: - if ((((signed int )llvm_cbe_reqbyte_313907_1) < ((signed int )((unsigned int )0)))) { - goto llvm_cbe_cond_true5252; - } else { - llvm_cbe_reqbyte_5__PHI_TEMPORARY = llvm_cbe_reqbyte_313907_1; /* for PHI node */ - llvm_cbe_firstbyte_4__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_cond_next5256; - } - -llvm_cbe_cond_true5252: - llvm_cbe_reqbyte_5__PHI_TEMPORARY = llvm_cbe_firstbyte_313911_1; /* for PHI node */ - llvm_cbe_firstbyte_4__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_cond_next5256; - -llvm_cbe_cond_false5284: - llvm_cbe_tmp5287 = llvm_cbe_branchreqbyte_0 | llvm_cbe_reqbyte_5; - llvm_cbe_branchreqbyte_1__PHI_TEMPORARY = llvm_cbe_branchreqbyte_0; /* for PHI node */ - llvm_cbe_reqbyte_0__PHI_TEMPORARY = llvm_cbe_tmp5287; /* for PHI node */ - llvm_cbe_firstbyte_0__PHI_TEMPORARY = llvm_cbe_firstbyte_4; /* for PHI node */ - goto llvm_cbe_cond_next5289; - -llvm_cbe_cond_next5316: - *llvm_cbe_reverse_count_0 = (((unsigned char )(((unsigned int )(((unsigned int )llvm_cbe_tmp5298) >> ((unsigned int )((unsigned int )8))))))); - *(&llvm_cbe_reverse_count_0[((unsigned int )1)]) = (((unsigned char )llvm_cbe_tmp5298)); - llvm_cbe_branchreqbyte_2__PHI_TEMPORARY = llvm_cbe_branchreqbyte_1; /* for PHI node */ - llvm_cbe_reqbyte_1__PHI_TEMPORARY = llvm_cbe_reqbyte_0; /* for PHI node */ - llvm_cbe_firstbyte_1__PHI_TEMPORARY = llvm_cbe_firstbyte_0; /* for PHI node */ - goto llvm_cbe_cond_next5328; - -llvm_cbe_cond_true5294: - *llvm_cbe_code_6 = ((unsigned char )0); - llvm_cbe_tmp5298 = find_fixedlength(llvm_cbe_last_branch_413917_1); - if ((((signed int )llvm_cbe_tmp5298) < ((signed int )((unsigned int )0)))) { - goto llvm_cbe_cond_true5303; - } else { - goto llvm_cbe_cond_next5316; - } - -llvm_cbe_cond_false5459: - *llvm_cbe_code_6 = ((unsigned char )83); - *(&llvm_cbe_code_6[((unsigned int )1)]) = (((unsigned char )(((unsigned int )(((unsigned int )((((unsigned int )(unsigned long)llvm_cbe_code_6)) - (((unsigned int )(unsigned long)llvm_cbe_last_branch_413917_1)))) >> ((unsigned int )((unsigned int )8))))))); - *(&llvm_cbe_code_6[((unsigned int )2)]) = (((unsigned char )((((unsigned char )(unsigned long)llvm_cbe_code_6)) - (((unsigned char )(unsigned long)llvm_cbe_last_branch_413917_1))))); - *llvm_cbe_tmp11 = llvm_cbe_code_6; - llvm_cbe_tmp5484 = &llvm_cbe_code_6[((unsigned int )3)]; - llvm_cbe_code_5__PHI_TEMPORARY = llvm_cbe_tmp5484; /* for PHI node */ - llvm_cbe_last_branch_3__PHI_TEMPORARY = llvm_cbe_code_6; /* for PHI node */ - goto llvm_cbe_cond_next5485; - - } while (1); /* end of syntactic loop 'cond_next' */ -llvm_cbe_cond_true150: - *llvm_cbe_errorcodeptr = ((unsigned int )52); - llvm_cbe_tmp51985596 = *(&llvm_cbe_ptr106); - llvm_cbe_ptr_15625_2__PHI_TEMPORARY = llvm_cbe_tmp51985596; /* for PHI node */ - goto llvm_cbe_cond_true5206; - -llvm_cbe_cond_true5206: - llvm_cbe_ptr_15625_2 = llvm_cbe_ptr_15625_2__PHI_TEMPORARY; - *llvm_cbe_ptrptr = llvm_cbe_ptr_15625_2; - return ((unsigned int )0); -llvm_cbe_cond_true5303: - *llvm_cbe_errorcodeptr = ((((llvm_cbe_tmp5298 == ((unsigned int )-2))) ? (((unsigned int )36)) : (((unsigned int )25)))); - *llvm_cbe_ptrptr = llvm_cbe_ptr_1; - return ((unsigned int )0); -llvm_cbe_cond_true5334: - if ((llvm_cbe_lengthptr == ((unsigned int *)/*NULL*/0))) { - goto llvm_cbe_cond_true5339; - } else { - goto llvm_cbe_cond_next5376; - } - -llvm_cbe_cond_true5339: - llvm_cbe_tmp5344 = (((unsigned int )(unsigned long)llvm_cbe_code_6)) - (((unsigned int )(unsigned long)llvm_cbe_last_branch_413917_1)); - llvm_cbe_last_branch_0_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - llvm_cbe_branch_length_2__PHI_TEMPORARY = llvm_cbe_tmp5344; /* for PHI node */ - goto llvm_cbe_bb5345; - - do { /* Syntactic loop 'bb5345' to make GCC happy */ -llvm_cbe_bb5345: - llvm_cbe_last_branch_0_rec = llvm_cbe_last_branch_0_rec__PHI_TEMPORARY; - llvm_cbe_branch_length_2 = llvm_cbe_branch_length_2__PHI_TEMPORARY; - llvm_cbe_tmp5347 = &llvm_cbe_last_branch_413917_1[(llvm_cbe_last_branch_0_rec + ((unsigned int )1))]; - llvm_cbe_tmp5348 = *llvm_cbe_tmp5347; - llvm_cbe_tmp5352 = &llvm_cbe_last_branch_413917_1[(llvm_cbe_last_branch_0_rec + ((unsigned int )2))]; - llvm_cbe_tmp5353 = *llvm_cbe_tmp5352; - llvm_cbe_tmp5355 = ((((unsigned int )(unsigned char )llvm_cbe_tmp5348)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp5353)); - *llvm_cbe_tmp5347 = (((unsigned char )(((unsigned int )(((unsigned int )llvm_cbe_branch_length_2) >> ((unsigned int )((unsigned int )8))))))); - *llvm_cbe_tmp5352 = (((unsigned char )llvm_cbe_branch_length_2)); - if ((((signed int )llvm_cbe_tmp5355) > ((signed int )((unsigned int )0)))) { - llvm_cbe_last_branch_0_rec__PHI_TEMPORARY = (llvm_cbe_last_branch_0_rec - llvm_cbe_tmp5355); /* for PHI node */ - llvm_cbe_branch_length_2__PHI_TEMPORARY = llvm_cbe_tmp5355; /* for PHI node */ - goto llvm_cbe_bb5345; - } else { - goto llvm_cbe_cond_next5376; - } - - } while (1); /* end of syntactic loop 'bb5345' */ -llvm_cbe_cond_next5376: - *llvm_cbe_code_6 = ((unsigned char )84); - *(&llvm_cbe_code_6[((unsigned int )1)]) = (((unsigned char )(((unsigned int )(((unsigned int )((((unsigned int )(unsigned long)llvm_cbe_code_6)) - (((unsigned int )(unsigned long)llvm_cbe_tmp5)))) >> ((unsigned int )((unsigned int )8))))))); - *(&llvm_cbe_code_6[((unsigned int )2)]) = (((unsigned char )((((unsigned char )(unsigned long)llvm_cbe_code_6)) - (((unsigned char )(unsigned long)llvm_cbe_tmp5))))); - llvm_cbe_tmp5398 = &llvm_cbe_code_6[((unsigned int )3)]; - if (((llvm_cbe_options_addr_25789_6 & ((unsigned int )7)) == llvm_cbe_oldims)) { - llvm_cbe_code_4__PHI_TEMPORARY = llvm_cbe_tmp5398; /* for PHI node */ - goto llvm_cbe_cond_next5421; - } else { - goto llvm_cbe_cond_true5405; - } - -llvm_cbe_cond_true5405: - llvm_cbe_tmp5407 = *llvm_cbe_ptr_1; - if ((llvm_cbe_tmp5407 == ((unsigned char )41))) { - goto llvm_cbe_cond_true5411; - } else { - llvm_cbe_code_4__PHI_TEMPORARY = llvm_cbe_tmp5398; /* for PHI node */ - goto llvm_cbe_cond_next5421; - } - -llvm_cbe_cond_true5411: - *llvm_cbe_tmp5398 = ((unsigned char )24); - *(&llvm_cbe_code_6[((unsigned int )4)]) = (((unsigned char )llvm_cbe_oldims)); - llvm_cbe_tmp5417 = &llvm_cbe_code_6[((unsigned int )5)]; - llvm_cbe_tmp5418 = *(&llvm_cbe_length); - *(&llvm_cbe_length) = (llvm_cbe_tmp5418 + ((unsigned int )2)); - llvm_cbe_code_4__PHI_TEMPORARY = llvm_cbe_tmp5417; /* for PHI node */ - goto llvm_cbe_cond_next5421; - -llvm_cbe_cond_next5421: - llvm_cbe_code_4 = llvm_cbe_code_4__PHI_TEMPORARY; - *llvm_cbe_tmp24 = llvm_cbe_max_bracount_0; - *llvm_cbe_codeptr = llvm_cbe_code_4; - *llvm_cbe_ptrptr = llvm_cbe_ptr_1; - *llvm_cbe_firstbyteptr = llvm_cbe_firstbyte_1; - *llvm_cbe_reqbyteptr = llvm_cbe_reqbyte_1; - if ((llvm_cbe_lengthptr == ((unsigned int *)/*NULL*/0))) { - goto llvm_cbe_UnifiedReturnBlock; - } else { - goto llvm_cbe_cond_true5437; - } - -llvm_cbe_cond_true5437: - llvm_cbe_tmp5439 = *llvm_cbe_lengthptr; - llvm_cbe_tmp5440 = *(&llvm_cbe_length); - *llvm_cbe_lengthptr = (llvm_cbe_tmp5440 + llvm_cbe_tmp5439); - return ((unsigned int )1); -llvm_cbe_UnifiedReturnBlock: - return ((unsigned int )1); -} - - -static unsigned int is_anchored(unsigned char *llvm_cbe_code, unsigned int *llvm_cbe_options, unsigned int llvm_cbe_bracket_map, unsigned int llvm_cbe_backref_map) { - unsigned int llvm_cbe_code_addr_0_rec; - unsigned int llvm_cbe_code_addr_0_rec__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp2; - unsigned char llvm_cbe_tmp5; - unsigned char *llvm_cbe_tmp10; - unsigned char llvm_cbe_tmp12; - unsigned int llvm_cbe_tmp1213; - unsigned int llvm_cbe_tmp21; - unsigned char llvm_cbe_tmp34; - unsigned char llvm_cbe_tmp39; - unsigned int llvm_cbe_tmp41; - unsigned int llvm_cbe_tmp59; - unsigned int llvm_cbe_tmp89; - unsigned int llvm_cbe_tmp114; - unsigned char llvm_cbe_tmp125; - unsigned int llvm_cbe_tmp148; - unsigned char llvm_cbe_tmp171; - unsigned char llvm_cbe_tmp176; - unsigned int llvm_cbe_tmp180_rec; - unsigned char llvm_cbe_tmp182; - unsigned int llvm_cbe_retval_0; - unsigned int llvm_cbe_retval_0__PHI_TEMPORARY; - - llvm_cbe_code_addr_0_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb; - - do { /* Syntactic loop 'bb' to make GCC happy */ -llvm_cbe_bb: - llvm_cbe_code_addr_0_rec = llvm_cbe_code_addr_0_rec__PHI_TEMPORARY; - llvm_cbe_tmp2 = *(&llvm_cbe_code[llvm_cbe_code_addr_0_rec]); - llvm_cbe_tmp5 = *(&_pcre_OP_lengths[(((unsigned int )(unsigned char )llvm_cbe_tmp2))]); - llvm_cbe_tmp10 = /*tail*/ first_significant_code((&llvm_cbe_code[(llvm_cbe_code_addr_0_rec + (((unsigned int )(unsigned char )llvm_cbe_tmp5)))]), llvm_cbe_options, ((unsigned int )2), ((unsigned int )0)); - llvm_cbe_tmp12 = *llvm_cbe_tmp10; - llvm_cbe_tmp1213 = ((unsigned int )(unsigned char )llvm_cbe_tmp12); - switch (llvm_cbe_tmp12) { - default: - goto llvm_cbe_bb96; -; - case ((unsigned char )93): - goto llvm_cbe_cond_true; - break; - case ((unsigned char )94): - goto llvm_cbe_cond_true31; - case ((unsigned char )87): - goto llvm_cbe_bb84; - case ((unsigned char )92): - goto llvm_cbe_bb84; - case ((unsigned char )95): - goto llvm_cbe_bb84; - } -llvm_cbe_cond_next168: - llvm_cbe_tmp171 = *(&llvm_cbe_code[(llvm_cbe_code_addr_0_rec + ((unsigned int )1))]); - llvm_cbe_tmp176 = *(&llvm_cbe_code[(llvm_cbe_code_addr_0_rec + ((unsigned int )2))]); - llvm_cbe_tmp180_rec = llvm_cbe_code_addr_0_rec + (((((unsigned int )(unsigned char )llvm_cbe_tmp171)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp176))); - llvm_cbe_tmp182 = *(&llvm_cbe_code[llvm_cbe_tmp180_rec]); - if ((llvm_cbe_tmp182 == ((unsigned char )83))) { - llvm_cbe_code_addr_0_rec__PHI_TEMPORARY = llvm_cbe_tmp180_rec; /* for PHI node */ - goto llvm_cbe_bb; - } else { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_return; - } - -llvm_cbe_cond_true: - llvm_cbe_tmp21 = /*tail*/ is_anchored(llvm_cbe_tmp10, llvm_cbe_options, llvm_cbe_bracket_map, llvm_cbe_backref_map); - if ((llvm_cbe_tmp21 == ((unsigned int )0))) { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - } else { - goto llvm_cbe_cond_next168; - } - -llvm_cbe_cond_true31: - llvm_cbe_tmp34 = *(&llvm_cbe_tmp10[((unsigned int )3)]); - llvm_cbe_tmp39 = *(&llvm_cbe_tmp10[((unsigned int )4)]); - llvm_cbe_tmp41 = ((((unsigned int )(unsigned char )llvm_cbe_tmp34)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp39)); - llvm_cbe_tmp59 = /*tail*/ is_anchored(llvm_cbe_tmp10, llvm_cbe_options, (((((((signed int )llvm_cbe_tmp41) < ((signed int )((unsigned int )32)))) ? ((((unsigned int )1) << llvm_cbe_tmp41)) : (((unsigned int )1)))) | llvm_cbe_bracket_map), llvm_cbe_backref_map); - if ((llvm_cbe_tmp59 == ((unsigned int )0))) { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - } else { - goto llvm_cbe_cond_next168; - } - -llvm_cbe_bb84: - llvm_cbe_tmp89 = /*tail*/ is_anchored(llvm_cbe_tmp10, llvm_cbe_options, llvm_cbe_bracket_map, llvm_cbe_backref_map); - if ((llvm_cbe_tmp89 == ((unsigned int )0))) { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - } else { - goto llvm_cbe_cond_next168; - } - -llvm_cbe_cond_next122: - llvm_cbe_tmp125 = *(&llvm_cbe_tmp10[((unsigned int )1)]); - if (((llvm_cbe_tmp125 == ((unsigned char )12)) & ((llvm_cbe_backref_map & llvm_cbe_bracket_map) == ((unsigned int )0)))) { - goto llvm_cbe_cond_next168; - } else { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - } - -llvm_cbe_cond_next112: - llvm_cbe_tmp114 = *llvm_cbe_options; - if (((llvm_cbe_tmp114 & ((unsigned int )4)) == ((unsigned int )0))) { - goto llvm_cbe_bb140; - } else { - goto llvm_cbe_cond_next122; - } - -llvm_cbe_bb96: - if (((((unsigned int )(llvm_cbe_tmp1213 + ((unsigned int )-56))) < ((unsigned int )((unsigned int )2))) | (llvm_cbe_tmp12 == ((unsigned char )65)))) { - goto llvm_cbe_cond_next112; - } else { - goto llvm_cbe_bb140; - } - -llvm_cbe_bb140: - if ((((unsigned int )(llvm_cbe_tmp1213 + ((unsigned int )-1))) > ((unsigned int )((unsigned int )1)))) { - goto llvm_cbe_cond_true146; - } else { - goto llvm_cbe_cond_next168; - } - -llvm_cbe_cond_true146: - llvm_cbe_tmp148 = *llvm_cbe_options; - if ((((llvm_cbe_tmp148 & ((unsigned int )2)) != ((unsigned int )0)) | (llvm_cbe_tmp12 != ((unsigned char )25)))) { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - } else { - goto llvm_cbe_cond_next168; - } - - } while (1); /* end of syntactic loop 'bb' */ -llvm_cbe_return: - llvm_cbe_retval_0 = llvm_cbe_retval_0__PHI_TEMPORARY; - return llvm_cbe_retval_0; -} - - -static unsigned int is_startline(unsigned char *llvm_cbe_code, unsigned int llvm_cbe_bracket_map, unsigned int llvm_cbe_backref_map) { - unsigned int llvm_cbe_code_addr_0_us_rec; - unsigned int llvm_cbe_code_addr_0_us_rec__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp2_us; - unsigned char llvm_cbe_tmp5_us; - unsigned char *llvm_cbe_tmp9_us; - unsigned char llvm_cbe_tmp11_us; - unsigned char llvm_cbe_tmp137_us; - unsigned char llvm_cbe_tmp142_us; - unsigned int llvm_cbe_tmp146_us_rec; - unsigned char llvm_cbe_tmp148_us; - unsigned int llvm_cbe_tmp19_us; - unsigned char llvm_cbe_tmp32_us; - unsigned char llvm_cbe_tmp37_us; - unsigned int llvm_cbe_tmp39_us; - unsigned int llvm_cbe_tmp55_us; - unsigned int llvm_cbe_tmp85_us; - unsigned char llvm_cbe_tmp108_us; - unsigned int llvm_cbe_code_addr_0_rec; - unsigned int llvm_cbe_code_addr_0_rec__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp2; - unsigned char llvm_cbe_tmp5; - unsigned char *llvm_cbe_tmp9; - unsigned char llvm_cbe_tmp11; - unsigned int llvm_cbe_tmp19; - unsigned char llvm_cbe_tmp32; - unsigned char llvm_cbe_tmp37; - unsigned int llvm_cbe_tmp39; - unsigned int llvm_cbe_tmp55; - unsigned int llvm_cbe_tmp85; - unsigned char llvm_cbe_tmp137; - unsigned char llvm_cbe_tmp142; - unsigned int llvm_cbe_tmp146_rec; - unsigned char llvm_cbe_tmp148; - unsigned int llvm_cbe_retval_0; - unsigned int llvm_cbe_retval_0__PHI_TEMPORARY; - - if (((llvm_cbe_backref_map & llvm_cbe_bracket_map) == ((unsigned int )0))) { - llvm_cbe_code_addr_0_us_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb_us; - } else { - llvm_cbe_code_addr_0_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb; - } - - do { /* Syntactic loop 'bb.us' to make GCC happy */ -llvm_cbe_bb_us: - llvm_cbe_code_addr_0_us_rec = llvm_cbe_code_addr_0_us_rec__PHI_TEMPORARY; - llvm_cbe_tmp2_us = *(&llvm_cbe_code[llvm_cbe_code_addr_0_us_rec]); - llvm_cbe_tmp5_us = *(&_pcre_OP_lengths[(((unsigned int )(unsigned char )llvm_cbe_tmp2_us))]); - llvm_cbe_tmp9_us = /*tail*/ first_significant_code((&llvm_cbe_code[(llvm_cbe_code_addr_0_us_rec + (((unsigned int )(unsigned char )llvm_cbe_tmp5_us)))]), ((unsigned int *)/*NULL*/0), ((unsigned int )0), ((unsigned int )0)); - llvm_cbe_tmp11_us = *llvm_cbe_tmp9_us; - switch (llvm_cbe_tmp11_us) { - default: - goto llvm_cbe_bb92_us; -; - case ((unsigned char )93): - goto llvm_cbe_cond_true_us; - case ((unsigned char )94): - goto llvm_cbe_cond_true29_us; - case ((unsigned char )87): - goto llvm_cbe_bb81_us; - case ((unsigned char )92): - goto llvm_cbe_bb81_us; - case ((unsigned char )95): - goto llvm_cbe_bb81_us; - } -llvm_cbe_cond_next134_us: - llvm_cbe_tmp137_us = *(&llvm_cbe_code[(llvm_cbe_code_addr_0_us_rec + ((unsigned int )1))]); - llvm_cbe_tmp142_us = *(&llvm_cbe_code[(llvm_cbe_code_addr_0_us_rec + ((unsigned int )2))]); - llvm_cbe_tmp146_us_rec = llvm_cbe_code_addr_0_us_rec + (((((unsigned int )(unsigned char )llvm_cbe_tmp137_us)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp142_us))); - llvm_cbe_tmp148_us = *(&llvm_cbe_code[llvm_cbe_tmp146_us_rec]); - if ((llvm_cbe_tmp148_us == ((unsigned char )83))) { - llvm_cbe_code_addr_0_us_rec__PHI_TEMPORARY = llvm_cbe_tmp146_us_rec; /* for PHI node */ - goto llvm_cbe_bb_us; - } else { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_return; - } - -llvm_cbe_cond_true_us: - llvm_cbe_tmp19_us = /*tail*/ is_startline(llvm_cbe_tmp9_us, llvm_cbe_bracket_map, llvm_cbe_backref_map); - if ((llvm_cbe_tmp19_us == ((unsigned int )0))) { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - } else { - goto llvm_cbe_cond_next134_us; - } - -llvm_cbe_cond_true29_us: - llvm_cbe_tmp32_us = *(&llvm_cbe_tmp9_us[((unsigned int )3)]); - llvm_cbe_tmp37_us = *(&llvm_cbe_tmp9_us[((unsigned int )4)]); - llvm_cbe_tmp39_us = ((((unsigned int )(unsigned char )llvm_cbe_tmp32_us)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp37_us)); - llvm_cbe_tmp55_us = /*tail*/ is_startline(llvm_cbe_tmp9_us, (((((((signed int )llvm_cbe_tmp39_us) < ((signed int )((unsigned int )32)))) ? ((((unsigned int )1) << llvm_cbe_tmp39_us)) : (((unsigned int )1)))) | llvm_cbe_bracket_map), llvm_cbe_backref_map); - if ((llvm_cbe_tmp55_us == ((unsigned int )0))) { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - } else { - goto llvm_cbe_cond_next134_us; - } - -llvm_cbe_bb81_us: - llvm_cbe_tmp85_us = /*tail*/ is_startline(llvm_cbe_tmp9_us, llvm_cbe_bracket_map, llvm_cbe_backref_map); - if ((llvm_cbe_tmp85_us == ((unsigned int )0))) { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - } else { - goto llvm_cbe_cond_next134_us; - } - -llvm_cbe_cond_true105_us: - llvm_cbe_tmp108_us = *(&llvm_cbe_tmp9_us[((unsigned int )1)]); - if ((llvm_cbe_tmp108_us == ((unsigned char )12))) { - goto llvm_cbe_cond_next134_us; - } else { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - } - -llvm_cbe_bb92_us: - if (((((unsigned int )((((unsigned int )(unsigned char )llvm_cbe_tmp11_us)) + ((unsigned int )-56))) < ((unsigned int )((unsigned int )2))) | (llvm_cbe_tmp11_us == ((unsigned char )65)))) { - goto llvm_cbe_cond_true105_us; - } else { - goto llvm_cbe_cond_false123_us; - } - -llvm_cbe_cond_false123_us: - if ((llvm_cbe_tmp11_us == ((unsigned char )25))) { - goto llvm_cbe_cond_next134_us; - } else { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - } - - } while (1); /* end of syntactic loop 'bb.us' */ - do { /* Syntactic loop 'bb' to make GCC happy */ -llvm_cbe_bb: - llvm_cbe_code_addr_0_rec = llvm_cbe_code_addr_0_rec__PHI_TEMPORARY; - llvm_cbe_tmp2 = *(&llvm_cbe_code[llvm_cbe_code_addr_0_rec]); - llvm_cbe_tmp5 = *(&_pcre_OP_lengths[(((unsigned int )(unsigned char )llvm_cbe_tmp2))]); - llvm_cbe_tmp9 = /*tail*/ first_significant_code((&llvm_cbe_code[(llvm_cbe_code_addr_0_rec + (((unsigned int )(unsigned char )llvm_cbe_tmp5)))]), ((unsigned int *)/*NULL*/0), ((unsigned int )0), ((unsigned int )0)); - llvm_cbe_tmp11 = *llvm_cbe_tmp9; - switch (llvm_cbe_tmp11) { - default: - goto llvm_cbe_bb92; -; - case ((unsigned char )93): - goto llvm_cbe_cond_true; - break; - case ((unsigned char )94): - goto llvm_cbe_cond_true29; - case ((unsigned char )87): - goto llvm_cbe_bb81; - case ((unsigned char )92): - goto llvm_cbe_bb81; - case ((unsigned char )95): - goto llvm_cbe_bb81; - } -llvm_cbe_cond_next134: - llvm_cbe_tmp137 = *(&llvm_cbe_code[(llvm_cbe_code_addr_0_rec + ((unsigned int )1))]); - llvm_cbe_tmp142 = *(&llvm_cbe_code[(llvm_cbe_code_addr_0_rec + ((unsigned int )2))]); - llvm_cbe_tmp146_rec = llvm_cbe_code_addr_0_rec + (((((unsigned int )(unsigned char )llvm_cbe_tmp137)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp142))); - llvm_cbe_tmp148 = *(&llvm_cbe_code[llvm_cbe_tmp146_rec]); - if ((llvm_cbe_tmp148 == ((unsigned char )83))) { - llvm_cbe_code_addr_0_rec__PHI_TEMPORARY = llvm_cbe_tmp146_rec; /* for PHI node */ - goto llvm_cbe_bb; - } else { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )1); /* for PHI node */ - goto llvm_cbe_return; - } - -llvm_cbe_cond_true: - llvm_cbe_tmp19 = /*tail*/ is_startline(llvm_cbe_tmp9, llvm_cbe_bracket_map, llvm_cbe_backref_map); - if ((llvm_cbe_tmp19 == ((unsigned int )0))) { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - } else { - goto llvm_cbe_cond_next134; - } - -llvm_cbe_cond_true29: - llvm_cbe_tmp32 = *(&llvm_cbe_tmp9[((unsigned int )3)]); - llvm_cbe_tmp37 = *(&llvm_cbe_tmp9[((unsigned int )4)]); - llvm_cbe_tmp39 = ((((unsigned int )(unsigned char )llvm_cbe_tmp32)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp37)); - llvm_cbe_tmp55 = /*tail*/ is_startline(llvm_cbe_tmp9, (((((((signed int )llvm_cbe_tmp39) < ((signed int )((unsigned int )32)))) ? ((((unsigned int )1) << llvm_cbe_tmp39)) : (((unsigned int )1)))) | llvm_cbe_bracket_map), llvm_cbe_backref_map); - if ((llvm_cbe_tmp55 == ((unsigned int )0))) { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - } else { - goto llvm_cbe_cond_next134; - } - -llvm_cbe_bb81: - llvm_cbe_tmp85 = /*tail*/ is_startline(llvm_cbe_tmp9, llvm_cbe_bracket_map, llvm_cbe_backref_map); - if ((llvm_cbe_tmp85 == ((unsigned int )0))) { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - } else { - goto llvm_cbe_cond_next134; - } - -llvm_cbe_cond_false123: - if ((llvm_cbe_tmp11 == ((unsigned char )25))) { - goto llvm_cbe_cond_next134; - } else { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_return; - } - -llvm_cbe_bb92: - if (((((unsigned int )((((unsigned int )(unsigned char )llvm_cbe_tmp11)) + ((unsigned int )-56))) < ((unsigned int )((unsigned int )2))) | (llvm_cbe_tmp11 == ((unsigned char )65)))) { - goto llvm_cbe_cond_true105; - } else { - goto llvm_cbe_cond_false123; - } - - } while (1); /* end of syntactic loop 'bb' */ -llvm_cbe_cond_true105: - return ((unsigned int )0); -llvm_cbe_return: - llvm_cbe_retval_0 = llvm_cbe_retval_0__PHI_TEMPORARY; - return llvm_cbe_retval_0; -} - - -static unsigned int find_firstassertedchar(unsigned char *llvm_cbe_code, unsigned int *llvm_cbe_options, unsigned int llvm_cbe_inassert) { - unsigned int llvm_cbe_c_1; - unsigned int llvm_cbe_c_1__PHI_TEMPORARY; - unsigned int llvm_cbe_code_addr_0_rec; - unsigned int llvm_cbe_code_addr_0_rec__PHI_TEMPORARY; - unsigned char *llvm_cbe_tmp5; - unsigned char llvm_cbe_tmp7; - unsigned int llvm_cbe_tmp22; - unsigned char *llvm_cbe_tmp44; - unsigned char *llvm_cbe_scode_1; - unsigned char *llvm_cbe_scode_1__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp64; - unsigned int llvm_cbe_tmp6465; - unsigned int llvm_cbe_tmp67; - unsigned int llvm_cbe_tmp73; - unsigned int llvm_cbe_c_0; - unsigned int llvm_cbe_c_0__PHI_TEMPORARY; - unsigned char llvm_cbe_tmp92; - unsigned char llvm_cbe_tmp97; - unsigned int llvm_cbe_tmp101_rec; - unsigned char llvm_cbe_tmp103; - unsigned int llvm_cbe_retval_0; - unsigned int llvm_cbe_retval_0__PHI_TEMPORARY; - - llvm_cbe_c_1__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - llvm_cbe_code_addr_0_rec__PHI_TEMPORARY = ((unsigned int )0); /* for PHI node */ - goto llvm_cbe_bb; - - do { /* Syntactic loop 'bb' to make GCC happy */ -llvm_cbe_bb: - llvm_cbe_c_1 = llvm_cbe_c_1__PHI_TEMPORARY; - llvm_cbe_code_addr_0_rec = llvm_cbe_code_addr_0_rec__PHI_TEMPORARY; - llvm_cbe_tmp5 = /*tail*/ first_significant_code((&llvm_cbe_code[(llvm_cbe_code_addr_0_rec + ((unsigned int )3))]), llvm_cbe_options, ((unsigned int )1), ((unsigned int )1)); - llvm_cbe_tmp7 = *llvm_cbe_tmp5; - switch ((((unsigned int )(unsigned char )llvm_cbe_tmp7))) { - default: - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_return; -; - case ((unsigned int )27): - llvm_cbe_scode_1__PHI_TEMPORARY = llvm_cbe_tmp5; /* for PHI node */ - goto llvm_cbe_bb49; - case ((unsigned int )28): - llvm_cbe_scode_1__PHI_TEMPORARY = llvm_cbe_tmp5; /* for PHI node */ - goto llvm_cbe_bb49; - case ((unsigned int )32): - llvm_cbe_scode_1__PHI_TEMPORARY = llvm_cbe_tmp5; /* for PHI node */ - goto llvm_cbe_bb49; - case ((unsigned int )33): - llvm_cbe_scode_1__PHI_TEMPORARY = llvm_cbe_tmp5; /* for PHI node */ - goto llvm_cbe_bb49; - case ((unsigned int )38): - goto llvm_cbe_bb42; - case ((unsigned int )40): - llvm_cbe_scode_1__PHI_TEMPORARY = llvm_cbe_tmp5; /* for PHI node */ - goto llvm_cbe_bb49; - case ((unsigned int )87): - goto llvm_cbe_bb16; - break; - case ((unsigned int )92): - goto llvm_cbe_bb16; - break; - case ((unsigned int )93): - goto llvm_cbe_bb16; - break; - case ((unsigned int )94): - goto llvm_cbe_bb16; - break; - case ((unsigned int )95): - goto llvm_cbe_bb16; - break; - } -llvm_cbe_bb89: - llvm_cbe_c_0 = llvm_cbe_c_0__PHI_TEMPORARY; - llvm_cbe_tmp92 = *(&llvm_cbe_code[(llvm_cbe_code_addr_0_rec + ((unsigned int )1))]); - llvm_cbe_tmp97 = *(&llvm_cbe_code[(llvm_cbe_code_addr_0_rec + ((unsigned int )2))]); - llvm_cbe_tmp101_rec = llvm_cbe_code_addr_0_rec + (((((unsigned int )(unsigned char )llvm_cbe_tmp92)) << ((unsigned int )8)) | (((unsigned int )(unsigned char )llvm_cbe_tmp97))); - llvm_cbe_tmp103 = *(&llvm_cbe_code[llvm_cbe_tmp101_rec]); - if ((llvm_cbe_tmp103 == ((unsigned char )83))) { - llvm_cbe_c_1__PHI_TEMPORARY = llvm_cbe_c_0; /* for PHI node */ - llvm_cbe_code_addr_0_rec__PHI_TEMPORARY = llvm_cbe_tmp101_rec; /* for PHI node */ - goto llvm_cbe_bb; - } else { - llvm_cbe_retval_0__PHI_TEMPORARY = llvm_cbe_c_0; /* for PHI node */ - goto llvm_cbe_return; - } - -llvm_cbe_cond_next: - if ((((signed int )llvm_cbe_c_1) < ((signed int )((unsigned int )0)))) { - llvm_cbe_c_0__PHI_TEMPORARY = llvm_cbe_tmp22; /* for PHI node */ - goto llvm_cbe_bb89; - } else { - goto llvm_cbe_cond_false; - } - -llvm_cbe_bb16: - llvm_cbe_tmp22 = /*tail*/ find_firstassertedchar(llvm_cbe_tmp5, llvm_cbe_options, (((unsigned int )(bool )(llvm_cbe_tmp7 == ((unsigned char )87))))); - if ((((signed int )llvm_cbe_tmp22) < ((signed int )((unsigned int )0)))) { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_return; - } else { - goto llvm_cbe_cond_next; - } - -llvm_cbe_cond_false: - if ((llvm_cbe_c_1 == llvm_cbe_tmp22)) { - llvm_cbe_c_0__PHI_TEMPORARY = llvm_cbe_c_1; /* for PHI node */ - goto llvm_cbe_bb89; - } else { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_return; - } - -llvm_cbe_cond_true61: - llvm_cbe_tmp67 = *llvm_cbe_options; - if (((llvm_cbe_tmp67 & ((unsigned int )1)) == ((unsigned int )0))) { - llvm_cbe_c_0__PHI_TEMPORARY = llvm_cbe_tmp6465; /* for PHI node */ - goto llvm_cbe_bb89; - } else { - goto llvm_cbe_cond_true71; - } - -llvm_cbe_cond_next56: - llvm_cbe_tmp64 = *(&llvm_cbe_scode_1[((unsigned int )1)]); - llvm_cbe_tmp6465 = ((unsigned int )(unsigned char )llvm_cbe_tmp64); - if ((((signed int )llvm_cbe_c_1) < ((signed int )((unsigned int )0)))) { - goto llvm_cbe_cond_true61; - } else { - goto llvm_cbe_cond_false75; - } - -llvm_cbe_bb49: - llvm_cbe_scode_1 = llvm_cbe_scode_1__PHI_TEMPORARY; - if ((llvm_cbe_inassert == ((unsigned int )0))) { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_return; - } else { - goto llvm_cbe_cond_next56; - } - -llvm_cbe_bb42: - llvm_cbe_tmp44 = &llvm_cbe_tmp5[((unsigned int )2)]; - llvm_cbe_scode_1__PHI_TEMPORARY = llvm_cbe_tmp44; /* for PHI node */ - goto llvm_cbe_bb49; - -llvm_cbe_cond_true71: - llvm_cbe_tmp73 = llvm_cbe_tmp6465 | ((unsigned int )256); - llvm_cbe_c_0__PHI_TEMPORARY = llvm_cbe_tmp73; /* for PHI node */ - goto llvm_cbe_bb89; - -llvm_cbe_cond_false75: - if ((llvm_cbe_tmp6465 == llvm_cbe_c_1)) { - llvm_cbe_c_0__PHI_TEMPORARY = llvm_cbe_c_1; /* for PHI node */ - goto llvm_cbe_bb89; - } else { - llvm_cbe_retval_0__PHI_TEMPORARY = ((unsigned int )-1); /* for PHI node */ - goto llvm_cbe_return; - } - - } while (1); /* end of syntactic loop 'bb' */ -llvm_cbe_return: - llvm_cbe_retval_0 = llvm_cbe_retval_0__PHI_TEMPORARY; - return llvm_cbe_retval_0; -} - diff --git a/test/Replay/klee-replay/GenBout.c b/test/Replay/klee-replay/KTestGen.c similarity index 90% rename from test/Replay/klee-replay/GenBout.c rename to test/Replay/klee-replay/KTestGen.c index 1f60ed0ca3..de03150164 100644 --- a/test/Replay/klee-replay/GenBout.c +++ b/test/Replay/klee-replay/KTestGen.c @@ -5,7 +5,7 @@ // RUN: echo -n aaaa > %t.out/aaaa.txt // RUN: echo -n bbbb > %t.out/bbbb.txt // RUN: echo -n cccc > %t.out/cccc.txt -// RUN: %gen-bout -o -p -q file1 --bout-file %t.bout --sym-stdin %t.out/aaaa.txt --sym-file %t.out/bbbb.txt --sym-stdout %t.out/cccc.txt +// RUN: %ktest-gen -o -p -q file1 --bout-file %t.bout --sym-stdin %t.out/aaaa.txt --sym-file %t.out/bbbb.txt --sym-stdout %t.out/cccc.txt // RUN: %cc %s -O0 -o %t // RUN: %klee-replay %t %t.bout 2> %t.out/out.txt // RUN: FileCheck --input-file=%t.out/out.txt %s diff --git a/test/Replay/klee-replay/GenRandomBout.c b/test/Replay/klee-replay/KTestRandGen.c similarity index 82% rename from test/Replay/klee-replay/GenRandomBout.c rename to test/Replay/klee-replay/KTestRandGen.c index 9f609a40a5..fdb8c15a57 100644 --- a/test/Replay/klee-replay/GenRandomBout.c +++ b/test/Replay/klee-replay/KTestRandGen.c @@ -1,25 +1,25 @@ // -- Core testing commands // RUN: rm -f %t.bout -// RUN: %gen-random-bout 100 -sym-arg 4 -sym-files 2 20 -sym-arg 5 -sym-stdin 8 -sym-stdout -sym-arg 6 -sym-args 1 4 5 -bout-file %t.bout +// RUN: %ktest-randgen 100 -sym-arg 4 -sym-files 2 20 -sym-arg 5 -sym-stdin 8 -sym-stdout -sym-arg 6 -sym-args 1 4 5 -bout-file %t.bout // RUN: %cc %s -O0 -o %t // RUN: %klee-replay %t %t.bout 2> %t.out // RUN: FileCheck --input-file=%t.out %s // CHECK: KLEE-REPLAY: NOTE: EXIT STATUS: NORMAL // // -- Option error handling tests -// RUN: not %gen-random-bout 2> %t1 +// RUN: not %ktest-randgen 2> %t1 // RUN: FileCheck -check-prefix=CHECK-USAGE -input-file=%t1 %s // CHECK-USAGE: Usage // -// RUN: not %gen-random-bout 0 --unexpected-option 2> %t2 +// RUN: not %ktest-randgen 0 --unexpected-option 2> %t2 // RUN: FileCheck -check-prefix=CHECK-UNEXPECTED -input-file=%t2 %s // CHECK-UNEXPECTED: Unexpected // -// RUN: not %gen-random-bout 100 --sym-args 5 3 2> %t3 +// RUN: not %ktest-randgen 100 --sym-args 5 3 2> %t3 // RUN: FileCheck -check-prefix=CHECK-RANOUT -input-file=%t3 %s // CHECK-RANOUT: ran out of // -// RUN: not %gen-random-bout 100 --sym-args 5 3 10 2> %t4 +// RUN: not %ktest-randgen 100 --sym-args 5 3 10 2> %t4 // RUN: FileCheck -check-prefix=CHECK-NOMORE -input-file=%t4 %s // CHECK-NOMORE: should be no more diff --git a/test/Replay/klee-replay/KleeZesti.c b/test/Replay/klee-replay/KleeZesti.c index a6e0cb26f9..a964b951c7 100644 --- a/test/Replay/klee-replay/KleeZesti.c +++ b/test/Replay/klee-replay/KleeZesti.c @@ -86,7 +86,7 @@ int main(int argc, char **argv) { } // File sizes get increased to the highest among files, so even B has file size 4. - // This is due to the limitaiton of posix-runtime API + // This is due to the limitation of posix-runtime API if (check_file(argv[5], 4, "ccc") == 0) { // CHECK-DAG: Got B file size printf("Got B file size\n"); diff --git a/test/Replay/libkleeruntest/replay_cex_after_assumed_malloc.c b/test/Replay/libkleeruntest/replay_cex_after_assumed_malloc.c index 09d60e79df..1ccff177ca 100644 --- a/test/Replay/libkleeruntest/replay_cex_after_assumed_malloc.c +++ b/test/Replay/libkleeruntest/replay_cex_after_assumed_malloc.c @@ -3,6 +3,7 @@ // RUN: %klee --output-dir=%t.klee-out %t.ll // KLEE just must not fail #include "klee/klee.h" +#include int main() { char i; diff --git a/test/Replay/libkleeruntest/replay_klee_prefer_cex.c b/test/Replay/libkleeruntest/replay_klee_prefer_cex.c index c2f0be134a..ae20252901 100644 --- a/test/Replay/libkleeruntest/replay_klee_prefer_cex.c +++ b/test/Replay/libkleeruntest/replay_klee_prefer_cex.c @@ -29,11 +29,11 @@ int main(int argc, char** argv) { if (y == 0) { klee_assume(x == 0); x++; - // It's fine if the prefered value cannot be used + // It's fine if the preferred value cannot be used // CHECK_3: x=1, y=0 } else { printf("x is allowed to be 33\n"); - // The prefered value should be used if it can be + // The preferred value should be used if it can be // CHECK_2: x=33 } } else { diff --git a/test/Replay/libkleeruntest/replay_posix_runtime.c b/test/Replay/libkleeruntest/replay_posix_runtime.c index 570462575c..39b8d18ff8 100644 --- a/test/Replay/libkleeruntest/replay_posix_runtime.c +++ b/test/Replay/libkleeruntest/replay_posix_runtime.c @@ -27,9 +27,8 @@ int main(int argc, char** argv) { return 0; } -// CHECKMODEL: num objects: 2 -// CHECKMODEL: object 0: name: {{b*}}'model_version' -// CHECKMODEL: object 1: name: {{b*}}'x' +// CHECKMODEL: num objects: 1 +// CHECKMODEL: object 0: name: {{b*}}'x' // TESTONE: x is not 0 // TESTTWO: x is 0 diff --git a/test/Runtime/FreeStanding/memcpy_chk_err.c b/test/Runtime/FreeStanding/memcpy_chk_err.c index b6071469bb..997499ec13 100644 --- a/test/Runtime/FreeStanding/memcpy_chk_err.c +++ b/test/Runtime/FreeStanding/memcpy_chk_err.c @@ -1,14 +1,16 @@ // This test checks that __memcpy_chk find the kind of errors it was // designed to find -// It requires clang >= 10, otherwise a direct call to memcpy is -// emitted instead of to __memcpy_chk -// REQUIRES: geq-llvm-10.0 +// On FreeBSD, a direct call to memcpy is emitted instead of to __memcpy_chk +// REQUIRES: not-freebsd // RUN: %clang %s -emit-llvm -O2 -g -c -D_FORTIFY_SOURCE=1 -o %t2.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out %t2.bc +// RUN: FileCheck --check-prefix=CHECK-BC --input-file %t.klee-out/assembly.ll %s +// CHECK-BC: @__memcpy_chk + // RUN: test -f %t.klee-out/test000001.ptr.err // RUN: FileCheck --input-file %t.klee-out/test000001.ptr.err %s // CHECK: memcpy overflow @@ -21,7 +23,7 @@ int main() { char d[5]; - char* s = "1234567890"; + char *s = "1234567890"; memcpy(d, s, 10); } diff --git a/test/Runtime/POSIX/FDNumbers.c b/test/Runtime/POSIX/FDNumbers.c index 42f0f5aea2..4e0fa79a0e 100644 --- a/test/Runtime/POSIX/FDNumbers.c +++ b/test/Runtime/POSIX/FDNumbers.c @@ -1,10 +1,10 @@ // RUN: %clang %s -emit-llvm %O0opt -c -o %t2.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --posix-runtime --exit-on-error %t2.bc --sym-files 1 10 - #include -#include #include +#include +#include int main(int argc, char **argv) { int fd = open("A", O_TRUNC); diff --git a/test/Runtime/POSIX/Fcntl.c b/test/Runtime/POSIX/Fcntl.c index 53246a15ca..737d5da532 100644 --- a/test/Runtime/POSIX/Fcntl.c +++ b/test/Runtime/POSIX/Fcntl.c @@ -1,7 +1,7 @@ // RUN: %clang %s -emit-llvm %O0opt -c -o %t2.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --posix-runtime --exit-on-error %t2.bc --sym-files 1 10 - +#include "klee/klee.h" #include #include diff --git a/test/Runtime/POSIX/FilePerm.c b/test/Runtime/POSIX/FilePerm.c index 418e3717db..5fc9924f75 100644 --- a/test/Runtime/POSIX/FilePerm.c +++ b/test/Runtime/POSIX/FilePerm.c @@ -1,21 +1,26 @@ +/* This test checks that when opening a symbolic file in R/W mode, we return exactly twice: + once successfully, and the other time with a permission error */ + // RUN: %clang %s -emit-llvm %O0opt -c -o %t.bc // RUN: rm -rf %t.klee-out -// RUN: %klee --output-dir=%t.klee-out --posix-runtime %t.bc --sym-files 1 10 --sym-stdout 2>%t.log +// RUN: %klee --output-dir=%t.klee-out --posix-runtime %t.bc --sym-files 1 10 | FileCheck %s // RUN: test -f %t.klee-out/test000001.ktest // RUN: test -f %t.klee-out/test000002.ktest -// RUN: test -f %t.klee-out/test000003.ktest +// RUN: not test -f %t.klee-out/test000003.ktest #include #include #include #include +#include int main(int argc, char** argv) { int fd = open("A", O_RDWR); if (fd != -1) - fprintf(stderr, "File 'A' opened successfully\n"); - else fprintf(stderr, "Cannot open file 'A'\n"); - + printf("File 'A' opened successfully\n"); + // CHECK-DAG: File 'A' opened successfully + else printf("Cannot open file 'A'\n"); + // CHECK-DAG: Cannot open file 'A' if (fd != -1) close(fd); } diff --git a/test/Runtime/POSIX/FreeArgv.c b/test/Runtime/POSIX/FreeArgv.c index 93ed697e2b..cdc5487f06 100644 --- a/test/Runtime/POSIX/FreeArgv.c +++ b/test/Runtime/POSIX/FreeArgv.c @@ -4,7 +4,8 @@ // RUN: test -f %t.klee-out/test000001.free.err // RUN: test -f %t.klee-out/test000002.free.err // RUN: test -f %t.klee-out/test000003.free.err - +#include "klee/klee.h" +#include int main(int argc, char **argv) { switch (klee_range(0, 3, "range")) { case 0: diff --git a/test/Runtime/POSIX/Getenv.c b/test/Runtime/POSIX/Getenv.c index 6dff3c24f2..d5db7c3926 100644 --- a/test/Runtime/POSIX/Getenv.c +++ b/test/Runtime/POSIX/Getenv.c @@ -1,9 +1,10 @@ // RUN: %clang %s -emit-llvm %O0opt -c -o %t2.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --libc=klee --posix-runtime --exit-on-error %t2.bc --sym-files 1 10 - #include - +#include +#include +#include int main(int argc, char **argv) { char *g = getenv("PWD"); if (g) { diff --git a/test/Runtime/POSIX/Openat.c b/test/Runtime/POSIX/Openat.c index 2341527e41..67ff78bde9 100644 --- a/test/Runtime/POSIX/Openat.c +++ b/test/Runtime/POSIX/Openat.c @@ -2,9 +2,10 @@ // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --posix-runtime --exit-on-error %t2.bc --sym-files 1 10 // RUN: test -f %t.klee-out/test000001.ktest - +#include "klee/klee.h" #include #include +#include int main(int argc, char **argv) { int fd = openat(AT_FDCWD, "A", O_RDWR|O_TRUNC); diff --git a/test/Runtime/POSIX/Replay.c b/test/Runtime/POSIX/Replay.c index 61862c5fc7..fb1b400c2e 100644 --- a/test/Runtime/POSIX/Replay.c +++ b/test/Runtime/POSIX/Replay.c @@ -8,6 +8,7 @@ // REPLAY: Yes #ifdef KLEE_EXECUTION +#include "klee/klee.h" #define EXIT klee_silent_exit #else #include diff --git a/test/Runtime/POSIX/SeedAndFail.c b/test/Runtime/POSIX/SeedAndFail.c index c9ef016856..b39a8bd540 100644 --- a/test/Runtime/POSIX/SeedAndFail.c +++ b/test/Runtime/POSIX/SeedAndFail.c @@ -2,7 +2,7 @@ // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --libc=uclibc --posix-runtime %t.bc --sym-files 1 10 2>%t.log // RUN: rm -rf %t.klee-out-2 -// RUN: %klee --output-dir=%t.klee-out-2 --seed-dir=%t.klee-out --zero-seed-extension --libc=uclibc --posix-runtime %t.bc --sym-files 1 10 --max-fail 1 +// RUN: %klee --output-dir=%t.klee-out-2 --seed-dir=%t.klee-out --allow-seed-extension --libc=uclibc --posix-runtime %t.bc --sym-files 1 10 --max-fail 1 // RUN: ls %t.klee-out-2 | grep -c assert | grep 4 #include diff --git a/test/Runtime/POSIX/Stdin.c b/test/Runtime/POSIX/Stdin.c index 6d84baffbb..84caab3a2e 100644 --- a/test/Runtime/POSIX/Stdin.c +++ b/test/Runtime/POSIX/Stdin.c @@ -9,11 +9,12 @@ // RUN: grep "mode:lnk" %t.log // RUN: grep "read:sym:yes" %t.log // RUN: grep "read:sym:no" %t.log - -#include +#include #include +#include +#include #include -#include +#include int main(int argc, char **argv) { struct stat stats; diff --git a/test/Runtime/POSIX/SymFileConsistency.c b/test/Runtime/POSIX/SymFileConsistency.c index 0d4501d656..d97f65f0fb 100644 --- a/test/Runtime/POSIX/SymFileConsistency.c +++ b/test/Runtime/POSIX/SymFileConsistency.c @@ -3,7 +3,7 @@ // RUN: rm -rf %t.klee-out-tmp // RUN: %klee --output-dir=%t.klee-out-tmp --libc=uclibc --posix-runtime --exit-on-error %t.bc --sym-files 1 1 > %t1.log -// This test checks that symbolic files can be resolved both with a relatve path +// This test checks that symbolic files can be resolved both with a relative path // ie. 'A' or by its full path ie. '/full/path/to/cwd/A' #include "klee/klee.h" diff --git a/test/Runtime/POSIX/Write1.c b/test/Runtime/POSIX/Write1.c index 5fc4ff8f6c..7f1e6f200e 100644 --- a/test/Runtime/POSIX/Write1.c +++ b/test/Runtime/POSIX/Write1.c @@ -2,8 +2,10 @@ // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --exit-on-error --libc=uclibc --posix-runtime %t.bc --sym-files 1 10 --sym-stdout 2>%t.log -#include +#include "klee/klee.h" #include +#include +#include int main(int argc, char** argv) { char buf[32]; diff --git a/test/Runtime/POSIX/Write2.c b/test/Runtime/POSIX/Write2.c index 04698f21eb..e9eb6f6ba6 100644 --- a/test/Runtime/POSIX/Write2.c +++ b/test/Runtime/POSIX/Write2.c @@ -1,9 +1,9 @@ // RUN: %clang %s -emit-llvm %O0opt -c -o %t.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --exit-on-error --libc=uclibc --posix-runtime %t.bc --sym-files 1 10 --sym-stdout 2>%t.log - -#include +#include "klee/klee.h" #include +#include int main(int argc, char** argv) { const char* msg = "This will eventually overflow stdout. "; diff --git a/test/Runtime/POSIX/_exit.c b/test/Runtime/POSIX/_exit.c new file mode 100644 index 0000000000..236aff9ad7 --- /dev/null +++ b/test/Runtime/POSIX/_exit.c @@ -0,0 +1,28 @@ +// RUN: %clang %s -g -emit-llvm %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --posix-runtime --libc=klee %t.bc 2>&1 | FileCheck %s +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --posix-runtime --libc=uclibc %t.bc 2>&1 | FileCheck %s +#include "klee/klee.h" +#include +#include +#include + +void foo() { printf("called foo\n"); } + +int main() { + atexit(foo); + + int x; + klee_make_symbolic(&x, sizeof(x), "x"); + + // CHECK-NOT: called foo + + if (x == 0) { + _exit(0); + } else { + _Exit(0); + } + + // CHECK: KLEE: done: completed paths = 2 +} diff --git a/test/Runtime/Uclibc/2008-03-04-libc-atexit-uses-dso-handle.c b/test/Runtime/Uclibc/2008-03-04-libc-atexit-uses-dso-handle.c index 3b66dd21ed..26bb1dcec9 100644 --- a/test/Runtime/Uclibc/2008-03-04-libc-atexit-uses-dso-handle.c +++ b/test/Runtime/Uclibc/2008-03-04-libc-atexit-uses-dso-handle.c @@ -3,6 +3,7 @@ // RUN: %klee --output-dir=%t.klee-out --exit-on-error --libc=uclibc %t1.bc // just make sure atexit works ok +#include void boo() { } diff --git a/test/Runtime/klee-libc/bcmp.c b/test/Runtime/klee-libc/bcmp.c index d0f5d7e59e..1cc72aa189 100644 --- a/test/Runtime/klee-libc/bcmp.c +++ b/test/Runtime/klee-libc/bcmp.c @@ -4,6 +4,8 @@ // test bcmp for sizes including zero +#include "klee/klee.h" + #include #include #include diff --git a/test/Solver/2016-04-12-array-parsing-bug.kquery b/test/Solver/2016-04-12-array-parsing-bug.kquery index d53fa35ff0..3df785b8e9 100644 --- a/test/Solver/2016-04-12-array-parsing-bug.kquery +++ b/test/Solver/2016-04-12-array-parsing-bug.kquery @@ -1,8 +1,8 @@ # RUN: %kleaver %s > %t # RUN: %kleaver --clear-array-decls-after-query %s > %t -array A-data[8] : w32 -> w8 = symbolic -array A-data-stat[144] : w32 -> w8 = symbolic +array A_data[8] : w32 -> w8 = symbolic +array A_data_stat[144] : w32 -> w8 = symbolic array arg0[3] : w32 -> w8 = symbolic array arg1[3] : w32 -> w8 = symbolic array const_arr1[768] : w32 -> w8 = [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 3 32 2 32 2 32 2 32 2 32 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 0 1 96 4 192 4 192 4 192 4 192 4 192 4 192 4 192 4 192 4 192 4 192 4 192 4 192 4 192 4 192 4 192 8 216 8 216 8 216 8 216 8 216 8 216 8 216 8 216 8 216 8 216 4 192 4 192 4 192 4 192 4 192 4 192 4 192 8 213 8 213 8 213 8 213 8 213 8 213 8 197 8 197 8 197 8 197 8 197 8 197 8 197 8 197 8 197 8 197 8 197 8 197 8 197 8 197 8 197 8 197 8 197 8 197 8 197 8 197 4 192 4 192 4 192 4 192 4 192 4 192 8 214 8 214 8 214 8 214 8 214 8 214 8 198 8 198 8 198 8 198 8 198 8 198 8 198 8 198 8 198 8 198 8 198 8 198 8 198 8 198 8 198 8 198 8 198 8 198 8 198 8 198 4 192 4 192 4 192 4 192 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] @@ -11,9 +11,9 @@ array model_version[4] : w32 -> w8 = symbolic array n_args[4] : w32 -> w8 = symbolic array n_args_1[4] : w32 -> w8 = symbolic array stdin[8] : w32 -> w8 = symbolic -array stdin-stat[144] : w32 -> w8 = symbolic +array stdin_stat[144] : w32 -> w8 = symbolic array stdout[1024] : w32 -> w8 = symbolic -array stdout-stat[144] : w32 -> w8 = symbolic +array stdout_stat[144] : w32 -> w8 = symbolic (query [(Ult N0:(ReadLSB w32 0 n_args) 2) (Eq false (Slt 0 N0)) @@ -23,21 +23,21 @@ array stdout-stat[144] : w32 -> w8 = symbolic (Slt 1 N1) (Eq false (Eq 0 - (And w64 (ReadLSB w64 8 A-data-stat) + (And w64 (ReadLSB w64 8 A_data_stat) 2147483647))) - (Ult (ReadLSB w64 56 A-data-stat) + (Ult (ReadLSB w64 56 A_data_stat) 65536) (Eq false (Eq 0 - (And w64 (ReadLSB w64 8 stdin-stat) + (And w64 (ReadLSB w64 8 stdin_stat) 2147483647))) - (Ult (ReadLSB w64 56 stdin-stat) + (Ult (ReadLSB w64 56 stdin_stat) 65536) (Eq false (Eq 0 - (And w64 (ReadLSB w64 8 stdout-stat) + (And w64 (ReadLSB w64 8 stdout_stat) 2147483647))) - (Ult (ReadLSB w64 56 stdout-stat) + (Ult (ReadLSB w64 56 stdout_stat) 65536) (Eq 1 (ReadLSB w32 0 model_version)) @@ -83,25 +83,25 @@ array stdout-stat[144] : w32 -> w8 = symbolic n_args_1 arg0 arg1 - A-data - A-data-stat + A_data + A_data_stat stdin - stdin-stat + stdin_stat stdout - stdout-stat + stdout_stat model_version]) -array A-data[8] : w32 -> w8 = symbolic -array A-data-stat[144] : w32 -> w8 = symbolic +array A_data[8] : w32 -> w8 = symbolic +array A_data_stat[144] : w32 -> w8 = symbolic array arg0[11] : w32 -> w8 = symbolic array arg1[3] : w32 -> w8 = symbolic array model_version[4] : w32 -> w8 = symbolic array n_args[4] : w32 -> w8 = symbolic array n_args_1[4] : w32 -> w8 = symbolic array stdin[8] : w32 -> w8 = symbolic -array stdin-stat[144] : w32 -> w8 = symbolic +array stdin_stat[144] : w32 -> w8 = symbolic array stdout[1024] : w32 -> w8 = symbolic -array stdout-stat[144] : w32 -> w8 = symbolic +array stdout_stat[144] : w32 -> w8 = symbolic (query [(Ult N0:(ReadLSB w32 0 n_args) 2) (Slt 0 N0) @@ -111,21 +111,21 @@ array stdout-stat[144] : w32 -> w8 = symbolic (Eq false (Slt 1 N1)) (Eq false (Eq 0 - (And w64 (ReadLSB w64 8 A-data-stat) + (And w64 (ReadLSB w64 8 A_data_stat) 2147483647))) - (Ult (ReadLSB w64 56 A-data-stat) + (Ult (ReadLSB w64 56 A_data_stat) 65536) (Eq false (Eq 0 - (And w64 (ReadLSB w64 8 stdin-stat) + (And w64 (ReadLSB w64 8 stdin_stat) 2147483647))) - (Ult (ReadLSB w64 56 stdin-stat) + (Ult (ReadLSB w64 56 stdin_stat) 65536) (Eq false (Eq 0 - (And w64 (ReadLSB w64 8 stdout-stat) + (And w64 (ReadLSB w64 8 stdout_stat) 2147483647))) - (Ult (ReadLSB w64 56 stdout-stat) + (Ult (ReadLSB w64 56 stdout_stat) 65536) (Eq 1 (ReadLSB w32 0 model_version)) @@ -218,10 +218,10 @@ array stdout-stat[144] : w32 -> w8 = symbolic arg0 n_args_1 arg1 - A-data - A-data-stat + A_data + A_data_stat stdin - stdin-stat + stdin_stat stdout - stdout-stat + stdout_stat model_version]) \ No newline at end of file diff --git a/test/Solver/CrosscheckCoreStpZ3.c b/test/Solver/CrosscheckCoreStpZ3.c new file mode 100644 index 0000000000..9847d8a69b --- /dev/null +++ b/test/Solver/CrosscheckCoreStpZ3.c @@ -0,0 +1,10 @@ +// REQUIRES: stp +// REQUIRES: z3 +// RUN: %clang %s -emit-llvm %O0opt -c -o %t1.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --solver-backend=stp --use-forked-solver=false --debug-crosscheck-core-solver=z3 %t1.bc + +#include "ExerciseSolver.c.inc" + +// CHECK: KLEE: done: completed paths = 15 +// CHECK: KLEE: done: partially completed paths = 0 diff --git a/test/Solver/DummySolver.c b/test/Solver/DummySolver.c new file mode 100644 index 0000000000..f6fe3671be --- /dev/null +++ b/test/Solver/DummySolver.c @@ -0,0 +1,8 @@ +// RUN: %clang %s -emit-llvm %O0opt -c -o %t1.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --solver-backend=dummy %t1.bc + +#include "ExerciseSolver.c.inc" + +// CHECK: KLEE: done: completed paths = 0 +// CHECK: KLEE: done: partially completed paths = 1 diff --git a/test/Solver/ExerciseSolver.c.inc b/test/Solver/ExerciseSolver.c.inc new file mode 100644 index 0000000000..0cd16a25cf --- /dev/null +++ b/test/Solver/ExerciseSolver.c.inc @@ -0,0 +1,35 @@ +#include "klee/klee.h" + +#include +#include + +// just play around with a few symbolic values to exercise the solver a bit +int main(int argc, char **argv) { + unsigned arr[4]; + klee_make_symbolic(arr, sizeof(arr), "arr"); + + arr[0] ^= arr[1]; + arr[2] += arr[3]; + arr[3] %= 8191; + + { + size_t i; + klee_make_symbolic(&i, sizeof(i), "i"); + if (i < sizeof(arr) / sizeof(*arr)) { + arr[i] = 0; + } else { + arr[0] = 0; + } + } + + if (arr[0] + 8192 == arr[1]) { + arr[3] *= 2; + } + + unsigned minimum = arr[0]; + for (size_t i = 1; i < sizeof(arr) / sizeof(*arr); ++i) { + if (arr[i] < minimum) { + minimum = arr[i]; + } + } +} diff --git a/test/Solver/FastCexSolver.kquery b/test/Solver/FastCexSolver.kquery index b3ec63e3c8..0fc1d7047c 100644 --- a/test/Solver/FastCexSolver.kquery +++ b/test/Solver/FastCexSolver.kquery @@ -4,7 +4,7 @@ array arr1[4] : w32 -> w8 = symbolic (query [] (Not (Eq 4096 (ReadLSB w32 0 arr1)))) -array A-data[2] : w32 -> w8 = symbolic -(query [(Ule (Add w8 208 N0:(Read w8 0 A-data)) +array A_data[2] : w32 -> w8 = symbolic +(query [(Ule (Add w8 208 N0:(Read w8 0 A_data)) 9)] (Eq 52 N0)) diff --git a/test/Solver/NoSTP.c b/test/Solver/NoSTP.c new file mode 100644 index 0000000000..0e0a90c5dc --- /dev/null +++ b/test/Solver/NoSTP.c @@ -0,0 +1,10 @@ +// REQUIRES: not-stp +// RUN: %clang %s -emit-llvm %O0opt -c -o %t1.bc +// RUN: rm -rf %t.klee-out +// RUN: not %klee --output-dir=%t.klee-out --solver-backend=stp %t1.bc 2>&1 | FileCheck %s +// CHECK: Not compiled with STP support +// CHECK: ERROR: Failed to create core solver + +int main(int argc, char **argv) { + return 0; +} diff --git a/test/Solver/NoZ3.c b/test/Solver/NoZ3.c new file mode 100644 index 0000000000..6e8d447991 --- /dev/null +++ b/test/Solver/NoZ3.c @@ -0,0 +1,10 @@ +// REQUIRES: not-z3 +// RUN: %clang %s -emit-llvm %O0opt -c -o %t1.bc +// RUN: rm -rf %t.klee-out +// RUN: not %klee --output-dir=%t.klee-out --solver-backend=z3 %t1.bc 2>&1 | FileCheck %s +// CHECK: Not compiled with Z3 support +// CHECK: ERROR: Failed to create core solver + +int main(int argc, char **argv) { + return 0; +} diff --git a/test/Solver/STPswitchSAT.c b/test/Solver/STPswitchSAT.c new file mode 100644 index 0000000000..f205aca71b --- /dev/null +++ b/test/Solver/STPswitchSAT.c @@ -0,0 +1,31 @@ +// REQUIRES: stp +// RUN: %clang %s -emit-llvm %O0opt -c -o %t1.bc +// +// RUN: rm -rf %t.klee-out-minisat +// RUN: %klee --output-dir=%t.klee-out-minisat -solver-backend=stp --stp-sat-solver=minisat %t1.bc +// RUN: cat %t.klee-out-minisat/messages.txt %t.klee-out-minisat/warnings.txt > %t.klee-out-minisat/all.txt +// RUN: FileCheck --input-file=%t.klee-out-minisat/all.txt --check-prefix=MINISAT %s +// +// RUN: rm -rf %t.klee-out-riss +// RUN: %klee --output-dir=%t.klee-out-riss -solver-backend=stp --stp-sat-solver=riss %t1.bc +// RUN: cat %t.klee-out-riss/messages.txt %t.klee-out-riss/warnings.txt > %t.klee-out-riss/all.txt +// RUN: FileCheck --input-file=%t.klee-out-riss/all.txt --check-prefix=RISS %s + +#include "klee/klee.h" + +int main(void) { + int foo; + int bar = 42; + klee_make_symbolic(&foo, sizeof(foo), "foo"); + + if (foo) bar -= 17; + else bar += 5; + + return bar; +} + +// MINISAT: KLEE: Using STP solver backend +// MINISAT: {{KLEE: SAT solver: MiniSat|KLEE: Fallback SAT solver}} + +// RISS: KLEE: Using STP solver backend +// RISS: {{KLEE: SAT solver: RISS|KLEE: Fallback SAT solver}} diff --git a/test/Solver/ValidatingSolver.c b/test/Solver/ValidatingSolver.c new file mode 100644 index 0000000000..86799a85f2 --- /dev/null +++ b/test/Solver/ValidatingSolver.c @@ -0,0 +1,8 @@ +// RUN: %clang %s -emit-llvm %O0opt -c -o %t1.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --debug-validate-solver --debug-assignment-validating-solver %t1.bc + +#include "ExerciseSolver.c.inc" + +// CHECK: KLEE: done: completed paths = 15 +// CHECK: KLEE: done: partially completed paths = 0 \ No newline at end of file diff --git a/test/Solver/Z3ConstantArray.c b/test/Solver/Z3ConstantArray.c index d94957959f..c49bbd1b14 100644 --- a/test/Solver/Z3ConstantArray.c +++ b/test/Solver/Z3ConstantArray.c @@ -9,10 +9,10 @@ #include "klee/klee.h" int main(int argc, char **argv) { - // CHECK-DAG: (assert (= (select const_arr11 #x00000000) #x67)) - // CHECK-DAG: (assert (= (select const_arr11 #x00000001) #x79)) - // CHECK-DAG: (assert (= (select const_arr11 #x00000002) #x7a)) - // CHECK-DAG: (assert (= (select const_arr11 #x00000003) #x00)) + // CHECK-DAG: (assert (= (select const_arr1_1 #x00000000) #x67)) + // CHECK-DAG: (assert (= (select const_arr1_1 #x00000001) #x79)) + // CHECK-DAG: (assert (= (select const_arr1_1 #x00000002) #x7a)) + // CHECK-DAG: (assert (= (select const_arr1_1 #x00000003) #x00)) // TEST-CASE-DAG: (assert (= (select const_arr1 (_ bv0 32) ) (_ bv103 8) ) ) // TEST-CASE-DAG: (assert (= (select const_arr1 (_ bv1 32) ) (_ bv121 8) ) ) // TEST-CASE-DAG: (assert (= (select const_arr1 (_ bv2 32) ) (_ bv122 8) ) ) diff --git a/test/UBSan/ubsan_alignment-assumption.c b/test/UBSan/ubsan_alignment-assumption.c new file mode 100644 index 0000000000..439101f9ae --- /dev/null +++ b/test/UBSan/ubsan_alignment-assumption.c @@ -0,0 +1,21 @@ +// RUN: %clang %s -fsanitize=alignment -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --emit-all-errors --ubsan-runtime %t.bc 2>&1 | FileCheck %s +// RUN: ls %t.klee-out/ | grep .ktest | wc -l | grep 2 +// RUN: ls %t.klee-out/ | grep .ptr.err | wc -l | grep 1 + +#include "klee/klee.h" +#include + +int main() { + size_t address; + + klee_make_symbolic(&address, sizeof(address), "address"); + + char *ptr = (char *)address; + + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: alignment-assumption + __builtin_assume_aligned(ptr, 0x8000); + + return 0; +} diff --git a/test/UBSan/ubsan_alignment-assumption_with_offset.c b/test/UBSan/ubsan_alignment-assumption_with_offset.c new file mode 100644 index 0000000000..4cf2142eba --- /dev/null +++ b/test/UBSan/ubsan_alignment-assumption_with_offset.c @@ -0,0 +1,21 @@ +// RUN: %clang %s -fsanitize=alignment -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --emit-all-errors --ubsan-runtime %t.bc 2>&1 | FileCheck %s +// RUN: ls %t.klee-out/ | grep .ktest | wc -l | grep 2 +// RUN: ls %t.klee-out/ | grep .ptr.err | wc -l | grep 1 + +#include "klee/klee.h" +#include + +int main() { + size_t address; + + klee_make_symbolic(&address, sizeof(address), "address"); + + char *ptr = (char *)address; + + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: alignment-assumption + __builtin_assume_aligned(ptr, 0x8000, 1); + + return 0; +} diff --git a/test/UBSan/ubsan_alignment-type-mismatch.c b/test/UBSan/ubsan_alignment-type-mismatch.c new file mode 100644 index 0000000000..4b5a46cde7 --- /dev/null +++ b/test/UBSan/ubsan_alignment-type-mismatch.c @@ -0,0 +1,20 @@ +// RUN: %clang %s -fsanitize=alignment -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --emit-all-errors --ubsan-runtime %t.bc 2>&1 | FileCheck %s +// RUN: ls %t.klee-out/ | grep .ktest | wc -l | grep 2 +// RUN: ls %t.klee-out/ | grep .ptr.err | wc -l | grep 1 + +#include "klee/klee.h" +#include + +int main() { + int x = klee_range(0, 5, "x"); + volatile int result; + + char c[] __attribute__((aligned(8))) = {0, 0, 0, 0, 1, 2, 3, 4, 5}; + int *p = (int *)&c[x]; + + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: misaligned-pointer-use + result = *p; + return 0; +} diff --git a/test/UBSan/ubsan_array_bounds.c b/test/UBSan/ubsan_array_bounds.c new file mode 100644 index 0000000000..8b067afa5e --- /dev/null +++ b/test/UBSan/ubsan_array_bounds.c @@ -0,0 +1,25 @@ +// RUN: %clang %s -fsanitize=array-bounds -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --emit-all-errors --ubsan-runtime %t.bc 2>&1 | FileCheck %s +// RUN: ls %t.klee-out/ | grep .ktest | wc -l | grep 2 +// RUN: ls %t.klee-out/ | grep .ptr.err | wc -l | grep 1 + +#include "klee/klee.h" + +unsigned int array_index(unsigned int n) { + unsigned int a[4] = {0}; + + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: out-of-bounds-index + return a[n]; +} + +int main() { + unsigned int x; + volatile unsigned int result; + + klee_make_symbolic(&x, sizeof(x), "x"); + + result = array_index(x); + + return 0; +} diff --git a/test/UBSan/ubsan_bool.c b/test/UBSan/ubsan_bool.c new file mode 100644 index 0000000000..2e2ab86c87 --- /dev/null +++ b/test/UBSan/ubsan_bool.c @@ -0,0 +1,19 @@ +// RUN: %clang %s -fsanitize=bool -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --emit-all-errors --ubsan-runtime %t.bc 2>&1 | FileCheck %s +// RUN: ls %t.klee-out/ | grep .ktest | wc -l | grep 2 +// RUN: ls %t.klee-out/ | grep .invalid_load.err | wc -l | grep 1 + +#include "klee/klee.h" + +int main() { + unsigned char x; + volatile _Bool result; + + klee_make_symbolic(&x, sizeof(x), "x"); + + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: load invalid value + result = *(_Bool *)&x; + + return 0; +} diff --git a/test/UBSan/ubsan_builtin.c b/test/UBSan/ubsan_builtin.c new file mode 100644 index 0000000000..b400bd687f --- /dev/null +++ b/test/UBSan/ubsan_builtin.c @@ -0,0 +1,20 @@ +// The test currently fails on the macOS version used in the CI: the compiler does not generate a call to __ubsan_handle_invalid_builtin. This seems to be an issue with Clang rather than KLEE. +// REQUIRES: not-darwin + +// RUN: %clang %s -fsanitize=builtin -w -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --emit-all-errors --ubsan-runtime %t.bc 2>&1 | FileCheck %s +// RUN: ls %t.klee-out/ | grep .ktest | wc -l | grep 2 +// RUN: ls %t.klee-out/ | grep .invalid_builtin_use.err | wc -l | grep 1 + +#include "klee/klee.h" + +int main() { + signed int x; + + klee_make_symbolic(&x, sizeof(x), "x"); + + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: invalid-builtin-use + __builtin_ctz(x); + return 0; +} diff --git a/test/UBSan/ubsan_enum.cpp b/test/UBSan/ubsan_enum.cpp new file mode 100644 index 0000000000..18efce2d18 --- /dev/null +++ b/test/UBSan/ubsan_enum.cpp @@ -0,0 +1,24 @@ +// RUN: %clangxx %s -fsanitize=enum -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --emit-all-errors --ubsan-runtime %t.bc 2>&1 | FileCheck %s +// RUN: ls %t.klee-out/ | grep .ktest | wc -l | grep 2 +// RUN: ls %t.klee-out/ | grep .invalid_load.err | wc -l | grep 1 + +#include "klee/klee.h" + +enum E { a = 1 } e; + +int main() { + unsigned char x; + volatile bool result; + + klee_make_symbolic(&x, sizeof(x), "x"); + + for (unsigned char *p = (unsigned char *)&e; p != (unsigned char *)(&e + 1); ++p) + *p = x; + + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: load invalid value + result = (int)e != -1; + + return 0; +} diff --git a/test/UBSan/ubsan_float_cast_overflow.c b/test/UBSan/ubsan_float_cast_overflow.c new file mode 100644 index 0000000000..707a9782a4 --- /dev/null +++ b/test/UBSan/ubsan_float_cast_overflow.c @@ -0,0 +1,20 @@ +// RUN: %clang %s -fsanitize=float-cast-overflow -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --emit-all-errors --ubsan-runtime %t.bc 2>&1 | FileCheck %s +// RUN: ls %t.klee-out/ | grep .ktest | wc -l | grep 1 +// RUN: ls %t.klee-out/ | grep .overflow.err | wc -l | grep 1 + +#include "klee/klee.h" + +int main() { + float f = 0x7fffff80; + volatile int result; + + // TODO: uncomment when support for floating points is integrated + + // klee_make_symbolic(&f, sizeof(f), "f"); + + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: float-cast-overflow + result = f + 0x80; + return 0; +} diff --git a/test/UBSan/ubsan_float_divide_by_zero.c b/test/UBSan/ubsan_float_divide_by_zero.c new file mode 100644 index 0000000000..4c68eb75df --- /dev/null +++ b/test/UBSan/ubsan_float_divide_by_zero.c @@ -0,0 +1,19 @@ +// RUN: %clang %s -fsanitize=float-divide-by-zero -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --emit-all-errors --ubsan-runtime %t.bc 2>&1 | FileCheck %s +// RUN: ls %t.klee-out/ | grep .ktest | wc -l | grep 1 +// RUN: ls %t.klee-out/ | grep .div.err | wc -l | grep 1 + +#include "klee/klee.h" + +int main() { + float x = 1.0; + + // TODO: uncomment when support for floating points is integrated + + // klee_make_symbolic(&x, sizeof(x), "x"); + // klee_assume(x != 0.0); + + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: float-divide-by-zero + volatile float result = x / 0; +} diff --git a/test/UBSan/ubsan_implicit_integer_sign_change.c b/test/UBSan/ubsan_implicit_integer_sign_change.c new file mode 100644 index 0000000000..9423970ff8 --- /dev/null +++ b/test/UBSan/ubsan_implicit_integer_sign_change.c @@ -0,0 +1,22 @@ +// RUN: %clang %s -fsanitize=implicit-integer-sign-change -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --emit-all-errors --ubsan-runtime %t.bc 2>&1 | FileCheck %s +// RUN: ls %t.klee-out/ | grep .ktest | wc -l | grep 2 +// RUN: ls %t.klee-out/ | grep .implicit_conversion.err | wc -l | grep 1 + +#include "klee/klee.h" + +signed int convert_unsigned_int_to_signed_int(unsigned int x) { + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: implicit-integer-sign-change + return x; +} + +int main() { + unsigned int x; + volatile signed int result; + + klee_make_symbolic(&x, sizeof(x), "x"); + + result = convert_unsigned_int_to_signed_int(x); + return 0; +} \ No newline at end of file diff --git a/test/UBSan/ubsan_implicit_signed_integer_truncation.c b/test/UBSan/ubsan_implicit_signed_integer_truncation.c new file mode 100644 index 0000000000..d2ff1e765a --- /dev/null +++ b/test/UBSan/ubsan_implicit_signed_integer_truncation.c @@ -0,0 +1,22 @@ +// RUN: %clang %s -fsanitize=implicit-signed-integer-truncation -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --emit-all-errors --ubsan-runtime %t.bc 2>&1 | FileCheck %s +// RUN: ls %t.klee-out/ | grep .ktest | wc -l | grep 2 +// RUN: ls %t.klee-out/ | grep .implicit_truncation.err | wc -l | grep 1 + +#include "klee/klee.h" + +unsigned char convert_signed_int_to_unsigned_char(signed int x) { + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: implicit-signed-integer-truncation + return x; +} + +int main() { + signed int x; + volatile unsigned char result; + + klee_make_symbolic(&x, sizeof(x), "x"); + + result = convert_signed_int_to_unsigned_char(x); + return 0; +} \ No newline at end of file diff --git a/test/UBSan/ubsan_implicit_unsigned_integer_truncation.c b/test/UBSan/ubsan_implicit_unsigned_integer_truncation.c new file mode 100644 index 0000000000..edbb9a81a0 --- /dev/null +++ b/test/UBSan/ubsan_implicit_unsigned_integer_truncation.c @@ -0,0 +1,22 @@ +// RUN: %clang %s -fsanitize=implicit-unsigned-integer-truncation -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --emit-all-errors --ubsan-runtime %t.bc 2>&1 | FileCheck %s +// RUN: ls %t.klee-out/ | grep .ktest | wc -l | grep 2 +// RUN: ls %t.klee-out/ | grep .implicit_truncation.err | wc -l | grep 1 + +#include "klee/klee.h" + +unsigned char convert_unsigned_int_to_unsigned_char(unsigned int x) { + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: implicit-unsigned-integer-truncation + return x; +} + +int main() { + unsigned int x; + volatile unsigned char result; + + klee_make_symbolic(&x, sizeof(x), "x"); + + result = convert_unsigned_int_to_unsigned_char(x); + return 0; +} \ No newline at end of file diff --git a/test/UBSan/ubsan_integer_divide_by_zero.c b/test/UBSan/ubsan_integer_divide_by_zero.c new file mode 100644 index 0000000000..aa0bf43fe7 --- /dev/null +++ b/test/UBSan/ubsan_integer_divide_by_zero.c @@ -0,0 +1,18 @@ +// RUN: %clang %s -fsanitize=integer-divide-by-zero -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --emit-all-errors --ubsan-runtime --check-div-zero=false %t.bc 2>&1 | FileCheck %s +// RUN: ls %t.klee-out/ | grep .ktest | wc -l | grep 1 +// RUN: ls %t.klee-out/ | grep .overflow.err | wc -l | grep 1 + +#include "klee/klee.h" + +int main() { + int x; + volatile int result; + + klee_make_symbolic(&x, sizeof(x), "x"); + + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: integer division overflow + result = x / 0; + return 0; +} diff --git a/test/UBSan/ubsan_nonnull_attribute.c b/test/UBSan/ubsan_nonnull_attribute.c new file mode 100644 index 0000000000..d619456766 --- /dev/null +++ b/test/UBSan/ubsan_nonnull_attribute.c @@ -0,0 +1,23 @@ +// RUN: %clang %s -fsanitize=nonnull-attribute -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --emit-all-errors --ubsan-runtime %t.bc 2>&1 | FileCheck %s +// RUN: ls %t.klee-out/ | grep .ktest | wc -l | grep 2 +// RUN: ls %t.klee-out/ | grep .nullable_attribute.err | wc -l | grep 1 + +#include "klee/klee.h" + +__attribute__((nonnull)) int func(int *nonnull) { return *nonnull; } + +int main() { + _Bool null; + volatile int result; + + klee_make_symbolic(&null, sizeof(null), "null"); + + int local = 0; + int *arg = null ? 0x0 : &local; + + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: invalid-null-argument + result = func(arg); + return 0; +} diff --git a/test/UBSan/ubsan_null.c b/test/UBSan/ubsan_null.c new file mode 100644 index 0000000000..459e3e0dcb --- /dev/null +++ b/test/UBSan/ubsan_null.c @@ -0,0 +1,21 @@ +// RUN: %clang %s -fsanitize=null -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --emit-all-errors --ubsan-runtime %t.bc 2>&1 | FileCheck %s +// RUN: ls %t.klee-out/ | grep .ktest | wc -l | grep 2 +// RUN: ls %t.klee-out/ | grep .ptr.err | wc -l | grep 1 + +#include "klee/klee.h" + +int main() { + _Bool null; + volatile int result; + + klee_make_symbolic(&null, sizeof(null), "null"); + + int local = 0; + int *arg = null ? 0x0 : &local; + + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: null-pointer-use + result = *arg; + return 0; +} diff --git a/test/UBSan/ubsan_nullability_arg.c b/test/UBSan/ubsan_nullability_arg.c new file mode 100644 index 0000000000..f311967ecf --- /dev/null +++ b/test/UBSan/ubsan_nullability_arg.c @@ -0,0 +1,21 @@ +// RUN: %clang %s -fsanitize=nullability-arg -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --emit-all-errors --ubsan-runtime %t.bc 2>&1 | FileCheck %s +// RUN: ls %t.klee-out/ | grep .ktest | wc -l | grep 2 +// RUN: ls %t.klee-out/ | grep .nullable_attribute.err | wc -l | grep 1 + +#include "klee/klee.h" + +void nonnull_arg(int *_Nonnull p) {} + +int main() { + _Bool null; + + klee_make_symbolic(&null, sizeof(null), "null"); + + int local = 0; + int *arg = null ? 0x0 : &local; + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: invalid-null-argument + nonnull_arg(arg); + return 0; +} diff --git a/test/UBSan/ubsan_nullability_assign.c b/test/UBSan/ubsan_nullability_assign.c new file mode 100644 index 0000000000..03908cd34d --- /dev/null +++ b/test/UBSan/ubsan_nullability_assign.c @@ -0,0 +1,25 @@ +// RUN: %clang %s -fsanitize=nullability-assign -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --emit-all-errors --ubsan-runtime %t.bc 2>&1 | FileCheck %s +// RUN: ls %t.klee-out/ | grep .ktest | wc -l | grep 2 +// RUN: ls %t.klee-out/ | grep .ptr.err | wc -l | grep 1 + +#include "klee/klee.h" + +void nonnull_assign(int *p) { + volatile int *_Nonnull local; + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: null-pointer-use + local = p; +} + +int main() { + _Bool null; + + klee_make_symbolic(&null, sizeof(null), "null"); + + int local = 0; + int *arg = null ? 0x0 : &local; + + nonnull_assign(arg); + return 0; +} diff --git a/test/UBSan/ubsan_nullability_return.c b/test/UBSan/ubsan_nullability_return.c new file mode 100644 index 0000000000..bf38b45f04 --- /dev/null +++ b/test/UBSan/ubsan_nullability_return.c @@ -0,0 +1,25 @@ +// RUN: %clang %s -fsanitize=nullability-return -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --emit-all-errors --ubsan-runtime %t.bc 2>&1 | FileCheck %s +// RUN: ls %t.klee-out/ | grep .ktest | wc -l | grep 2 +// RUN: ls %t.klee-out/ | grep .nullable_attribute.err | wc -l | grep 1 + +#include "klee/klee.h" + +int *_Nonnull nonnull_retval(int *p) { + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: invalid-null-return + return p; +} + +int main() { + _Bool null; + volatile int *result; + + klee_make_symbolic(&null, sizeof(null), "null"); + + int local = 0; + int *arg = null ? 0x0 : &local; + + result = nonnull_retval(arg); + return 0; +} diff --git a/test/UBSan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer.c b/test/UBSan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer.c new file mode 100644 index 0000000000..6109fcd72d --- /dev/null +++ b/test/UBSan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer.c @@ -0,0 +1,22 @@ +// RUN: %clang %s -fsanitize=pointer-overflow -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --emit-all-errors --ubsan-runtime %t.bc 2>&1 | FileCheck %s +// RUN: ls %t.klee-out/ | grep .ktest | wc -l | grep 2 +// RUN: ls %t.klee-out/ | grep .ptr.err | wc -l | grep 1 + +#include "klee/klee.h" +#include + +int main() { + size_t address; + volatile char *result; + + klee_make_symbolic(&address, sizeof(address), "address"); + klee_assume(address != 0); + + char *ptr = (char *)address; + + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: nullptr-after-nonzero-offset + result = ptr + 1; + return 0; +} diff --git a/test/UBSan/ubsan_pointer_overflow-applying_nonzero_offset_to_null_pointer.c b/test/UBSan/ubsan_pointer_overflow-applying_nonzero_offset_to_null_pointer.c new file mode 100644 index 0000000000..f4f097450b --- /dev/null +++ b/test/UBSan/ubsan_pointer_overflow-applying_nonzero_offset_to_null_pointer.c @@ -0,0 +1,22 @@ +// RUN: %clang %s -fsanitize=pointer-overflow -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --emit-all-errors --ubsan-runtime %t.bc 2>&1 | FileCheck %s +// RUN: ls %t.klee-out/ | grep .ktest | wc -l | grep 1 +// RUN: ls %t.klee-out/ | grep .ptr.err | wc -l | grep 1 + +#include "klee/klee.h" +#include + +int main() { + size_t address; + volatile char *result; + + klee_make_symbolic(&address, sizeof(address), "address"); + klee_assume(address == 0); + + char *ptr = (char *)address; + + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: nullptr-with-nonzero-offset + result = ptr + 1; + return 0; +} diff --git a/test/UBSan/ubsan_pointer_overflow-applying_zero_offset_to_null_pointer.c b/test/UBSan/ubsan_pointer_overflow-applying_zero_offset_to_null_pointer.c new file mode 100644 index 0000000000..627dc80141 --- /dev/null +++ b/test/UBSan/ubsan_pointer_overflow-applying_zero_offset_to_null_pointer.c @@ -0,0 +1,22 @@ +// RUN: %clang %s -fsanitize=pointer-overflow -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --emit-all-errors --ubsan-runtime %t.bc 2>&1 | FileCheck %s +// RUN: ls %t.klee-out/ | grep .ktest | wc -l | grep 1 +// RUN: ls %t.klee-out/ | grep .ptr.err | wc -l | grep 1 + +#include "klee/klee.h" +#include + +int main() { + size_t address; + volatile char *result; + + klee_make_symbolic(&address, sizeof(address), "address"); + klee_assume(address == 0); + + char *ptr = (char *)address; + + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: nullptr-with-offset + result = ptr + 0; + return 0; +} diff --git a/test/UBSan/ubsan_pointer_overflow-pointer_arithmetic.c b/test/UBSan/ubsan_pointer_overflow-pointer_arithmetic.c new file mode 100644 index 0000000000..c50c788882 --- /dev/null +++ b/test/UBSan/ubsan_pointer_overflow-pointer_arithmetic.c @@ -0,0 +1,24 @@ +// RUN: %clang %s -fsanitize=pointer-overflow -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --emit-all-errors --ubsan-runtime %t.bc 2>&1 | FileCheck %s +// RUN: ls %t.klee-out/ | grep .ktest | wc -l | grep 2 +// RUN: ls %t.klee-out/ | grep .ptr.err | wc -l | grep 1 + +#include "klee/klee.h" +#include + +int main() { + char c; + char* ptr = &c; + + size_t offset; + volatile char* result; + + klee_make_symbolic(&offset, sizeof(offset), "offset"); + klee_assume((size_t)(ptr) + offset != 0); + + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: pointer-overflow + result = ptr + offset; + + return 0; +} diff --git a/test/UBSan/ubsan_return.cpp b/test/UBSan/ubsan_return.cpp new file mode 100644 index 0000000000..8342f8b475 --- /dev/null +++ b/test/UBSan/ubsan_return.cpp @@ -0,0 +1,16 @@ +// RUN: %clangxx %s -fsanitize=return -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --emit-all-errors --ubsan-runtime %t.bc 2>&1 | FileCheck %s +// RUN: ls %t.klee-out/ | grep .ktest | wc -l | grep 1 +// RUN: ls %t.klee-out/ | grep .missing_return.err | wc -l | grep 1 + +#include "klee/klee.h" + +int no_return() { + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: missing-return +} + +int main() { + volatile int result = no_return(); + return 0; +} diff --git a/test/UBSan/ubsan_returns_nonnull_attribute.c b/test/UBSan/ubsan_returns_nonnull_attribute.c new file mode 100644 index 0000000000..3ee4dadabc --- /dev/null +++ b/test/UBSan/ubsan_returns_nonnull_attribute.c @@ -0,0 +1,24 @@ +// RUN: %clang %s -fsanitize=returns-nonnull-attribute -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --emit-all-errors --ubsan-runtime %t.bc 2>&1 | FileCheck %s +// RUN: ls %t.klee-out/ | grep .ktest | wc -l | grep 2 +// RUN: ls %t.klee-out/ | grep .nullable_attribute.err | wc -l | grep 1 + +#include "klee/klee.h" + +__attribute__((returns_nonnull)) char *foo(char *a) { + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: invalid-null-return + return a; +} + +int main() { + _Bool null; + volatile char *result; + + klee_make_symbolic(&null, sizeof(null), "null"); + + char local = 0; + char *arg = null ? 0x0 : &local; + result = foo(arg); + return 0; +} \ No newline at end of file diff --git a/test/UBSan/ubsan_shift_base.c b/test/UBSan/ubsan_shift_base.c new file mode 100644 index 0000000000..00c55ac3d6 --- /dev/null +++ b/test/UBSan/ubsan_shift_base.c @@ -0,0 +1,31 @@ +// RUN: %clang %s -fsanitize=shift-base -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --emit-all-errors --ubsan-runtime --check-overshift=false %t.bc 2>&1 | FileCheck %s +// +// There may be 2 or 3 test cases depending on the search heuristic, so we don't check the number of tests. +// For example, 2 test cases may be as follows: +// (1) b <= 31 without overflow, (2) a > 0 and b > 31 with overflow +// For example, 3 test cases may be as follows: +// (1) a = 0 and b > 31 without overflow, (2) b < 31 without overflow, (3) a > 0 and b > 31 with overflow +// +// RUN: ls %t.klee-out/ | grep .overflow.err | wc -l | grep 1 + +#include "klee/klee.h" + +int lsh_overflow(signed int a, signed int b) { + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: shift out of bounds + return a << b; +} + +int main() { + signed int a; + signed int b; + volatile signed int result; + + klee_make_symbolic(&a, sizeof(a), "a"); + klee_make_symbolic(&b, sizeof(b), "b"); + + result = lsh_overflow(a, b); + + return 0; +} diff --git a/test/UBSan/ubsan_shift_exponent.c b/test/UBSan/ubsan_shift_exponent.c new file mode 100644 index 0000000000..3b5011b94e --- /dev/null +++ b/test/UBSan/ubsan_shift_exponent.c @@ -0,0 +1,25 @@ +// RUN: %clang %s -fsanitize=shift-exponent -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --emit-all-errors --ubsan-runtime --check-overshift=false %t.bc 2>&1 | FileCheck %s +// RUN: ls %t.klee-out/ | grep .ktest | wc -l | grep 2 +// RUN: ls %t.klee-out/ | grep .overflow.err | wc -l | grep 1 + +#include "klee/klee.h" + +int rsh_inbounds(signed int a, signed int b) { + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: shift out of bounds + return a >> b; +} + +int main() { + signed int a; + signed int b; + volatile signed int result; + + klee_make_symbolic(&a, sizeof(a), "a"); + klee_make_symbolic(&b, sizeof(b), "b"); + + result = rsh_inbounds(a, b); + + return 0; +} diff --git a/test/UBSan/ubsan_signed_integer_overflow.c b/test/UBSan/ubsan_signed_integer_overflow.c new file mode 100644 index 0000000000..3b0b94f93e --- /dev/null +++ b/test/UBSan/ubsan_signed_integer_overflow.c @@ -0,0 +1,30 @@ +// RUN: %clang %s -fsanitize=signed-integer-overflow -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --emit-all-errors --ubsan-runtime %t.bc 2>&1 | FileCheck %s +// RUN: ls %t.klee-out/ | grep .ktest | wc -l | grep 5 +// RUN: ls %t.klee-out/ | grep .overflow.err | wc -l | grep 4 + +#include "klee/klee.h" + +int main() { + signed int x; + signed int y; + volatile signed int result; + + klee_make_symbolic(&x, sizeof(x), "x"); + klee_make_symbolic(&y, sizeof(y), "y"); + + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: signed-integer-overflow + result = x + y; + + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: signed-integer-overflow + result = x - y; + + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: signed-integer-overflow + result = x * y; + + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: signed-integer-overflow + result = -x; + + return 0; +} diff --git a/test/UBSan/ubsan_unreachable.c b/test/UBSan/ubsan_unreachable.c new file mode 100644 index 0000000000..8f975261aa --- /dev/null +++ b/test/UBSan/ubsan_unreachable.c @@ -0,0 +1,18 @@ +// RUN: %clang %s -fsanitize=unreachable -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --emit-all-errors --ubsan-runtime %t.bc 2>&1 | FileCheck %s +// RUN: ls %t.klee-out/ | grep .ktest | wc -l | grep 1 +// RUN: ls %t.klee-out/ | grep .unreachable_call.err | wc -l | grep 1 + +#include "klee/klee.h" + +void _Noreturn f() { + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: unreachable-call + __builtin_unreachable(); +} + +int main() { + f(); + + return 0; +} diff --git a/test/UBSan/ubsan_unsigned_integer_overflow.c b/test/UBSan/ubsan_unsigned_integer_overflow.c new file mode 100644 index 0000000000..83afac79d7 --- /dev/null +++ b/test/UBSan/ubsan_unsigned_integer_overflow.c @@ -0,0 +1,30 @@ +// RUN: %clang %s -fsanitize=unsigned-integer-overflow -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --emit-all-errors --ubsan-runtime %t.bc 2>&1 | FileCheck %s +// RUN: ls %t.klee-out/ | grep .ktest | wc -l | grep 5 +// RUN: ls %t.klee-out/ | grep .overflow.err | wc -l | grep 4 + +#include "klee/klee.h" + +int main() { + unsigned int x; + unsigned int y; + volatile unsigned int result; + + klee_make_symbolic(&x, sizeof(x), "x"); + klee_make_symbolic(&y, sizeof(y), "y"); + + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: unsigned-integer-overflow + result = x + y; + + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: unsigned-integer-overflow + result = x - y; + + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: unsigned-integer-overflow + result = x * y; + + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: unsigned-integer-overflow + result = -x; + + return 0; +} diff --git a/test/UBSan/ubsan_unsigned_shift_base.c b/test/UBSan/ubsan_unsigned_shift_base.c new file mode 100644 index 0000000000..a591bff0b8 --- /dev/null +++ b/test/UBSan/ubsan_unsigned_shift_base.c @@ -0,0 +1,27 @@ +// REQUIRES: geq-llvm-12.0 + +// RUN: %clang %s -fsanitize=unsigned-shift-base -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --emit-all-errors --ubsan-runtime --check-overshift=false %t.bc 2>&1 | FileCheck %s +// RUN: ls %t.klee-out/ | grep .ktest | wc -l | grep 2 +// RUN: ls %t.klee-out/ | grep .overflow.err | wc -l | grep 1 + +#include "klee/klee.h" + +int lsh_overflow(unsigned int a, unsigned int b) { + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: shift out of bounds + return a << b; +} + +int main() { + unsigned int a; + unsigned int b; + volatile unsigned int result; + + klee_make_symbolic(&a, sizeof(a), "a"); + klee_make_symbolic(&b, sizeof(b), "b"); + + result = lsh_overflow(a, b); + + return 0; +} diff --git a/test/UBSan/ubsan_vla_bound.c b/test/UBSan/ubsan_vla_bound.c new file mode 100644 index 0000000000..72336a3b7a --- /dev/null +++ b/test/UBSan/ubsan_vla_bound.c @@ -0,0 +1,20 @@ +// RUN: %clang %s -fsanitize=vla-bound -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --emit-all-errors --ubsan-runtime %t.bc 2>&1 | FileCheck %s +// RUN: ls %t.klee-out/ | grep .ktest | wc -l | grep 3 +// RUN: ls %t.klee-out/ | grep .ptr.err | wc -l | grep 1 +// RUN: ls %t.klee-out/ | grep .model.err | wc -l | grep 1 + +#include "klee/klee.h" + +int main() { + int x; + volatile int result; + + x = klee_range(-10, 10, "x"); + + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: non-positive-vla-index + int arr[x]; + result = arr[0]; + return 0; +} diff --git a/test/Feature/FunctionAliasVarArg.c b/test/VarArgs/FunctionAliasVarArg.c similarity index 95% rename from test/Feature/FunctionAliasVarArg.c rename to test/VarArgs/FunctionAliasVarArg.c index 423c251669..5098a93fd1 100644 --- a/test/Feature/FunctionAliasVarArg.c +++ b/test/VarArgs/FunctionAliasVarArg.c @@ -1,3 +1,6 @@ +// Variadic functions are not currently supported on Apple Silicon +// REQUIRES: not-darwin + // RUN: %clang %s -emit-llvm %O0opt -c -o %t.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out -function-alias=printf:highlight_prefix_printf %t.bc 2>&1 | FileCheck --check-prefix=CHECK-HIGHLIGHT %s diff --git a/test/Feature/VarArg.c b/test/VarArgs/VarArg.c similarity index 93% rename from test/Feature/VarArg.c rename to test/VarArgs/VarArg.c index 0b8b669802..805d4c9608 100644 --- a/test/Feature/VarArg.c +++ b/test/VarArgs/VarArg.c @@ -1,3 +1,6 @@ +// Variadic functions are only supported on x86_64 +// REQUIRES: x86_64 + /* This test needs deterministic allocation with enough spacing between the allocations. Otherwise, if by coincidence the allocated vararg memory object is directly before another valid @@ -7,7 +10,7 @@ // RUN: %clang %s -emit-llvm %O0opt -c -g -o %t1.bc // RUN: rm -rf %t.klee-out -// RUN: %klee --output-dir=%t.klee-out --allocate-determ=true --allocate-determ-start-address=0x0 %t1.bc | FileCheck %s +// RUN: %klee --output-dir=%t.klee-out --kdalloc %t1.bc | FileCheck %s // RUN: test -f %t.klee-out/test000001.ptr.err #include diff --git a/test/Feature/VarArgAlignment.c b/test/VarArgs/VarArgAlignment.c similarity index 97% rename from test/Feature/VarArgAlignment.c rename to test/VarArgs/VarArgAlignment.c index a048336fa1..35329bdc32 100644 --- a/test/Feature/VarArgAlignment.c +++ b/test/VarArgs/VarArgAlignment.c @@ -1,3 +1,6 @@ +// Variadic functions are only supported on x86_64 +// REQUIRES: x86_64 + /* This test is for the alignment of variadic arguments. In particular, on x86 arguments > 8 bytes (long double arguments in test1) should be 16-byte aligned, unless they are passed byval with diff --git a/test/Feature/VarArgByVal.c b/test/VarArgs/VarArgByVal.c similarity index 75% rename from test/Feature/VarArgByVal.c rename to test/VarArgs/VarArgByVal.c index 43c815b577..5fb33b3860 100644 --- a/test/Feature/VarArgByVal.c +++ b/test/VarArgs/VarArgByVal.c @@ -1,12 +1,18 @@ -/* This test checks that KLEE correctly handles variadic arguments with the +// Variadic functions are only supported on x86_64 +// REQUIRES: x86_64 + +// REQUIRES: geq-llvm-15.0 +/* This test checks that KLEE correctly handles variadic arguments with the byval attribute */ // RUN: %clang %s -emit-llvm %O0opt -c -g -o %t1.bc // RUN: rm -rf %t.klee-out // RUN: %klee --exit-on-error --output-dir=%t.klee-out %t1.bc -// RUN FileCheck %s klee-last/assembly.ll -// CHECK: @test(i32 -1, %struct.bar* byval - +// RUN: FileCheck %s --input-file=%t.klee-out/assembly.ll +// +// TODO: Make noundef unconditional when LLVM 14 is the oldest supported version. +// CHECK: call void (ptr, i32, ...) @test1(ptr sret(%struct.foo) align 8 {{.*}}, i32 noundef -1, ptr noundef byval(%struct.foo) align 8 {{.*}}, ptr noundef byval(%struct.bar) align 8 {{.*}}) +// CHECK: call void (ptr, i32, i64, ...) @test2(ptr sret(%struct.foo) align 8 {{.*}}, i32 noundef {{.*}}, i64 noundef {{.*}}, i32 noundef {{.*}}, ptr noundef byval(%struct.foo) align 8 {{.*}}, i64 noundef {{.*}}, ptr noundef byval(%struct.bar) align 8 {{.*}}, ptr noundef byval(%struct.foo) align 8 {{.*}}, ptr noundef byval(%struct.bar) align 8 {{.*}}) #include #include #include diff --git a/test/VarArgs/VarArgByValOld.c b/test/VarArgs/VarArgByValOld.c new file mode 100644 index 0000000000..3fd458c5d1 --- /dev/null +++ b/test/VarArgs/VarArgByValOld.c @@ -0,0 +1,134 @@ +// Variadic functions are only supported on x86_64 +// REQUIRES: x86_64 + +// REQUIRES: lt-llvm-15.0 +/* This test checks that KLEE correctly handles variadic arguments with the + byval attribute */ + +// RUN: %clang %s -emit-llvm %O0opt -c -g -o %t1.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --exit-on-error --output-dir=%t.klee-out %t1.bc +// RUN: FileCheck %s --input-file=%t.klee-out/assembly.ll +// +// TODO: Make noundef unconditional when LLVM 14 is the oldest supported version. +// CHECK: @test1({{.*}}, i32 {{(noundef )?}}-1, %struct.foo* {{(noundef )?}}byval{{.*}} %struct.bar* {{(noundef )?}}byval +// CHECK: @test2({{.*}}, %struct.foo* {{(noundef )?}}byval{{.*}} %struct.bar* {{(noundef )?}}byval +#include +#include +#include + +struct foo { + char f1; + long long f2; + long long f3; + char f4; + long f5; + int f6; + char f7; +}; + +struct bar { + long long int f1; + char f2; + long long f3; + char f4; + long f5; +}; + +struct foo test1(int x, ...) { + va_list ap; + va_start(ap, x); + assert(x == -1); + + struct foo f = va_arg(ap, struct foo); + assert(f.f1 == 1); + assert(f.f2 == 2); + assert(f.f3 == 3); + assert(f.f4 == 4); + assert(f.f5 == 5); + assert(f.f6 == 6); + assert(f.f7 == 7); + + struct bar b = va_arg(ap, struct bar); + assert(b.f1 == 11); + assert(b.f2 == 12); + assert(b.f3 == 13); + assert(b.f4 == 14); + assert(b.f5 == 15); + + va_end(ap); + + f.f1++; + return f; +} + +struct foo test2(int x, long long int l, ...) { + va_list ap; + va_start(ap, l); + assert(x == 10); + assert(l == 1000); + + int i = va_arg(ap, int); + assert(i == 10); + + struct foo f = va_arg(ap, struct foo); + assert(f.f1 == 1); + assert(f.f2 == 2); + assert(f.f3 == 3); + assert(f.f4 == 4); + assert(f.f5 == 5); + assert(f.f6 == 6); + assert(f.f7 == 7); + + l = va_arg(ap, long long int); + assert(l == 1000); + + struct bar b = va_arg(ap, struct bar); + assert(b.f1 == 11); + assert(b.f2 == 12); + assert(b.f3 == 13); + assert(b.f4 == 14); + assert(b.f5 == 15); + + f = va_arg(ap, struct foo); + assert(f.f1 == 10); + assert(f.f2 == 20); + assert(f.f3 == 30); + assert(f.f4 == 40); + assert(f.f5 == 50); + assert(f.f6 == 60); + assert(f.f7 == 70); + + b = va_arg(ap, struct bar); + assert(b.f1 == 1); + assert(b.f2 == 3); + assert(b.f3 == 5); + assert(b.f4 == 7); + assert(b.f5 == 9); + + va_end(ap); + + f.f1++; + return f; +} + +int main() { + struct foo f = {1, 2, 3, 4, 5, 6, 7}; + struct bar b = {11, 12, 13, 14, 15}; + struct foo res = test1(-1, f, b); + assert(res.f1 == 2); + assert(res.f2 == 2); + assert(res.f3 == 3); + assert(res.f4 == 4); + assert(res.f5 == 5); + assert(res.f6 == 6); + assert(res.f7 == 7); + // check that f was not modified, as it's passed by value + assert(f.f1 == 1); + + int i = 10; + long long int l = 1000; + struct foo f2 = {10, 20, 30, 40, 50, 60, 70}; + struct bar b2 = {1, 3, 5, 7, 9}; + test2(i, l, i, f, l, b, f2, b2); +} diff --git a/test/Feature/VarArgByValReported.c b/test/VarArgs/VarArgByValReported.c similarity index 93% rename from test/Feature/VarArgByValReported.c rename to test/VarArgs/VarArgByValReported.c index bf2ad374e7..1c2df293e3 100644 --- a/test/Feature/VarArgByValReported.c +++ b/test/VarArgs/VarArgByValReported.c @@ -1,3 +1,6 @@ +// Variadic functions are only supported on x86_64 +// REQUIRES: x86_64 + /* This is the test reported in https://github.com/klee/klee/issues/189, checking the correctness of variadic arguments passed with the byval attribute */ diff --git a/test/Feature/VarArgLongDouble.c b/test/VarArgs/VarArgLongDouble.c similarity index 92% rename from test/Feature/VarArgLongDouble.c rename to test/VarArgs/VarArgLongDouble.c index 7452b90808..313d00ce15 100644 --- a/test/Feature/VarArgLongDouble.c +++ b/test/VarArgs/VarArgLongDouble.c @@ -1,3 +1,6 @@ +// Variadic functions are only supported on x86_64 +// REQUIRES: x86_64 + // RUN: %clang %s -emit-llvm %O0opt -c -o %t.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out %t.bc | FileCheck %s diff --git a/test/VectorInstructions/external_call.c b/test/VectorInstructions/external_call.c new file mode 100644 index 0000000000..e3b46e0eba --- /dev/null +++ b/test/VectorInstructions/external_call.c @@ -0,0 +1,79 @@ +// RUN: %clang -DDYNAMIC_LIBRARY=1 %s -shared -o %t1.so +// RUN: %clang %s -emit-llvm %O0opt -g -c -o %t1.bc +// RUN: rm -rf %t.klee-out +// NOTE: Have to pass `--optimize=false` to avoid vector operations being +// constant folded away. +// RUN: export LD_PRELOAD=%t1.so +// RUN: export DYLD_INSERT_LIBRARIES=%t1.so +// RUN: %klee --output-dir=%t.klee-out --optimize=false --exit-on-error --external-calls=all %t1.bc + +#include + +typedef uint32_t v4ui __attribute__((vector_size(16))); // 128-bit vector +typedef uint32_t v8ui __attribute__((vector_size(32))); // 256-bit vector +typedef uint32_t v16ui __attribute__((vector_size(64))); // 512-bit vector + +v4ui call4(v4ui v); + +v8ui call8(v8ui v); + +v16ui call16(v16ui v); + +int call_mixed(v16ui v16, v8ui v8, v4ui v4); + +#ifdef DYNAMIC_LIBRARY + +v4ui call4(v4ui v) { + return v; +} + +v8ui call8(v8ui v) { + return v; +} + +v16ui call16(v16ui v) { + return v; +} + +int call_mixed(v16ui v16, v8ui v8, v4ui v4) { + return v16[15] + v8[7] + v4[3]; +} + +#else + +#include "assert.h" +#include "klee/klee.h" + +int main() { + v4ui v4 = {1, 2, 3, 4}; + { + v4ui r = call4(v4); + for (int i = 0; i < 4; ++i) { + klee_assert(r[i] == v4[i]); + } + } + + v8ui v8 = {1, 2, 3, 4, 5, 6, 7, 8}; + { + v8ui r = call8(v8); + for (int i = 0; i < 8; ++i) { + klee_assert(r[i] == v8[i]); + } + } + + v16ui v16 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; + { + v16ui r = call16(v16); + for (int i = 0; i < 16; ++i) { + klee_assert(r[i] == v16[i]); + } + } + + { + int r = call_mixed(v16, v8, v4); + klee_assert(r == 28); + } + return 0; +} + +#endif diff --git a/test/VectorInstructions/insert_element.c b/test/VectorInstructions/insert_element.c index df09819d71..35054fd9db 100644 --- a/test/VectorInstructions/insert_element.c +++ b/test/VectorInstructions/insert_element.c @@ -5,9 +5,10 @@ // RUN: %klee --output-dir=%t.klee-out --optimize=false %t1.bc > %t.stdout.log 2> %t.stderr.log // RUN: FileCheck -check-prefix=CHECK-STDOUT -input-file=%t.stdout.log %s // RUN: FileCheck -check-prefix=CHECK-STDERR -input-file=%t.stderr.log %s +#include "klee/klee.h" #include -#include #include +#include typedef uint32_t v4ui __attribute__ ((vector_size (16))); int main() { diff --git a/test/VectorInstructions/oob-llvm-lt11.c b/test/VectorInstructions/oob-llvm-lt11.c deleted file mode 100644 index 9d80ef7d56..0000000000 --- a/test/VectorInstructions/oob-llvm-lt11.c +++ /dev/null @@ -1,44 +0,0 @@ -// REQUIRES: lt-llvm-11.0 -// RUN: %clang %s -emit-llvm %O0opt -g -c -o %t1.bc -// RUN: rm -rf %t.klee-out -// NOTE: Have to pass `--optimize=false` to avoid vector operations being -// constant folded away. -// RUN: %klee --output-dir=%t.klee-out --optimize=false %t1.bc > %t.stdout.log 2> %t.stderr.log -// RUN: FileCheck -input-file=%t.stderr.log %s - -#include "klee/klee.h" - -#include -#include -#include - -typedef uint32_t v4ui __attribute__((vector_size(16))); -int main() { - v4ui f = {1, 2, 3, 4}; - int k = klee_range(0, 10, "k"); - - if (k == 0) { - // CHECK-DAG: [[@LINE+1]]: Out of bounds write when inserting element - f[4] = 255; // Out of bounds write - } - - if (k == 1) { - // CHECK-DAG: [[@LINE+1]]: Out of bounds read when extracting element - printf("f[4] = %u\n", f[5]); // Out of bounds - } - - if (k > 6) { - // Performing read should be ExtractElement instruction. - // For now this is an expected limitation. - // CHECK-DAG: [[@LINE+1]]: ExtractElement, support for symbolic index not implemented - uint32_t readValue = f[k]; - } - else { - // Performing write should be InsertElement instructions. - // For now this is an expected limitation. - // CHECK-DAG: [[@LINE+1]]: InsertElement, support for symbolic index not implemented - f[k] = 255; - } - - return 0; -} diff --git a/test/VectorInstructions/oob-read-llvm-geq11.c b/test/VectorInstructions/oob-read.c similarity index 96% rename from test/VectorInstructions/oob-read-llvm-geq11.c rename to test/VectorInstructions/oob-read.c index 309e05b1f1..2584b3a03b 100644 --- a/test/VectorInstructions/oob-read-llvm-geq11.c +++ b/test/VectorInstructions/oob-read.c @@ -1,5 +1,4 @@ -// REQUIRES: geq-llvm-11.0 -// XFAIL: geq-llvm-11.0 +// XFAIL: * /* The scalarizer pass in LLVM 11 was changed to generate, for a read f[k], with k symbolic and f a 4-element vector: diff --git a/test/VectorInstructions/oob-write-llvm-geq11.c b/test/VectorInstructions/oob-write.c similarity index 97% rename from test/VectorInstructions/oob-write-llvm-geq11.c rename to test/VectorInstructions/oob-write.c index 5c3e691c9d..6906dc62b5 100644 --- a/test/VectorInstructions/oob-write-llvm-geq11.c +++ b/test/VectorInstructions/oob-write.c @@ -1,5 +1,3 @@ -// REQUIRES: geq-llvm-11.0 - /* The scalarizer pass in LLVM 11 was changed to generate, for a write of the form f[k] = v, with f a 4-element vector: if k == 0 => f[0] = v diff --git a/test/Expr/Evaluate.kquery b/test/kleaver/Evaluate.kquery similarity index 100% rename from test/Expr/Evaluate.kquery rename to test/kleaver/Evaluate.kquery diff --git a/test/Expr/Evaluate2.kquery b/test/kleaver/Evaluate2.kquery similarity index 100% rename from test/Expr/Evaluate2.kquery rename to test/kleaver/Evaluate2.kquery diff --git a/test/Expr/Lexer/Numbers.kquery b/test/kleaver/Lexer/Numbers.kquery similarity index 100% rename from test/Expr/Lexer/Numbers.kquery rename to test/kleaver/Lexer/Numbers.kquery diff --git a/test/Expr/Parser/Concat64.kquery b/test/kleaver/Parser/Concat64.kquery similarity index 100% rename from test/Expr/Parser/Concat64.kquery rename to test/kleaver/Parser/Concat64.kquery diff --git a/test/Expr/Parser/ConstantFolding.kquery b/test/kleaver/Parser/ConstantFolding.kquery similarity index 100% rename from test/Expr/Parser/ConstantFolding.kquery rename to test/kleaver/Parser/ConstantFolding.kquery diff --git a/test/Expr/Parser/Exprs.kquery b/test/kleaver/Parser/Exprs.kquery similarity index 100% rename from test/Expr/Parser/Exprs.kquery rename to test/kleaver/Parser/Exprs.kquery diff --git a/test/Expr/Parser/MultiByteReads.kquery b/test/kleaver/Parser/MultiByteReads.kquery similarity index 100% rename from test/Expr/Parser/MultiByteReads.kquery rename to test/kleaver/Parser/MultiByteReads.kquery diff --git a/test/Expr/Parser/Simplify.kquery b/test/kleaver/Parser/Simplify.kquery similarity index 100% rename from test/Expr/Parser/Simplify.kquery rename to test/kleaver/Parser/Simplify.kquery diff --git a/test/Expr/Parser/TypeChecking.kquery b/test/kleaver/Parser/TypeChecking.kquery similarity index 100% rename from test/Expr/Parser/TypeChecking.kquery rename to test/kleaver/Parser/TypeChecking.kquery diff --git a/test/Expr/print-smt-let.kquery b/test/kleaver/print-smt-let.kquery similarity index 100% rename from test/Expr/print-smt-let.kquery rename to test/kleaver/print-smt-let.kquery diff --git a/test/Expr/print-smt-let.smt2.good b/test/kleaver/print-smt-let.smt2.good similarity index 100% rename from test/Expr/print-smt-let.smt2.good rename to test/kleaver/print-smt-let.smt2.good diff --git a/test/Expr/print-smt-named.kquery b/test/kleaver/print-smt-named.kquery similarity index 100% rename from test/Expr/print-smt-named.kquery rename to test/kleaver/print-smt-named.kquery diff --git a/test/Expr/print-smt-named.smt2.good b/test/kleaver/print-smt-named.smt2.good similarity index 100% rename from test/Expr/print-smt-named.smt2.good rename to test/kleaver/print-smt-named.smt2.good diff --git a/test/Expr/print-smt-none.kquery b/test/kleaver/print-smt-none.kquery similarity index 100% rename from test/Expr/print-smt-none.kquery rename to test/kleaver/print-smt-none.kquery diff --git a/test/Expr/print-smt-none.smt2.good b/test/kleaver/print-smt-none.smt2.good similarity index 100% rename from test/Expr/print-smt-none.smt2.good rename to test/kleaver/print-smt-none.smt2.good diff --git a/test/klee-exec-tree/KleeExecTreeBogus.test b/test/klee-exec-tree/KleeExecTreeBogus.test new file mode 100644 index 0000000000..5926d128b2 --- /dev/null +++ b/test/klee-exec-tree/KleeExecTreeBogus.test @@ -0,0 +1,65 @@ +REQUIRES: sqlite3 + +fail on broken db (not sqlite) +RUN: not %klee-exec-tree tree-info %S/exec-tree-dbs/not_a.db 2> %t.err +RUN: FileCheck -check-prefix=CHECK-CORRUPT -input-file=%t.err %s +CHECK-CORRUPT: Cannot prepare read statement: file is not a database + +empty tree +RUN: rm -f %t.db +RUN: %sqlite3 -separator ',' %t.db ".import %S/exec-tree-dbs/empty_db.csv nodes" +RUN: %klee-exec-tree tree-info %t.db > %t.err +RUN: FileCheck -check-prefix=CHECK-EMPTY -input-file=%t.err %s +CHECK-EMPTY: Empty tree. + +fail on tree with duplicate node IDs +RUN: rm -f %t.db +RUN: %sqlite3 -separator ',' %t.db ".import %S/exec-tree-dbs/duplicated_node.csv nodes" +RUN: not %klee-exec-tree tree-info %t.db 2> %t.err +RUN: FileCheck -check-prefix=CHECK-DUP -input-file=%t.err %s +CHECK-DUP: ExecutionTree DB contains duplicate child reference or circular structure. Affected node: 2 + +fail on invalid branch type +RUN: rm -f %t.db +RUN: %sqlite3 -separator ',' %t.db ".import %S/exec-tree-dbs/invalid_btype.csv nodes" +RUN: not %klee-exec-tree tree-info %t.db 2> %t.err +RUN: FileCheck -check-prefix=CHECK-BTYPE -input-file=%t.err %s +CHECK-BTYPE: ExecutionTree DB contains unknown branch type (123) in node 1 + +fail on invalid termination type +RUN: rm -f %t.db +RUN: %sqlite3 -separator ',' %t.db ".import %S/exec-tree-dbs/invalid_ttype.csv nodes" +RUN: not %klee-exec-tree tree-info %t.db 2> %t.err +RUN: FileCheck -check-prefix=CHECK-TTYPE -input-file=%t.err %s +CHECK-TTYPE: ExecutionTree DB contains unknown termination type (123) in node 3 + +fail on tree with looping nodes +RUN: rm -f %t.db +RUN: %sqlite3 -separator ',' %t.db ".import %S/exec-tree-dbs/loop.csv nodes" +RUN: not %klee-exec-tree tree-info %t.db 2> %t.err +RUN: FileCheck -check-prefix=CHECK-LOOP -input-file=%t.err %s +CHECK-LOOP: ExecutionTree DB contains duplicate child reference or circular structure. Affected node: 1 + +fail on tree with missing node (child node ID > max. ID) +RUN: rm -f %t.db +RUN: %sqlite3 -separator ',' %t.db ".import %S/exec-tree-dbs/missing_after_max.csv nodes" +RUN: not %klee-exec-tree tree-info %t.db 2> %t.err +RUN: FileCheck -check-prefix=CHECK-MISSA -input-file=%t.err %s +CHECK-MISSA: ExecutionTree DB contains references to non-existing nodes (> max. ID) in node 3 + +fail on tree with missing node (child node ID < max. ID) +RUN: rm -f %t.db +RUN: %sqlite3 -separator ',' %t.db ".import %S/exec-tree-dbs/missing_before_max.csv nodes" +RUN: not %klee-exec-tree tree-info %t.db 2> %t.err +RUN: FileCheck -check-prefix=CHECK-MISSB -input-file=%t.err %s +CHECK-MISSB: ExecutionTree DB references undefined node. Affected node: 4 + +fail on illegal node ID (0) +RUN: rm -f %t.db +RUN: %sqlite3 -separator ',' %t.db ".import %S/exec-tree-dbs/node_id0.csv nodes" +RUN: not %klee-exec-tree tree-info %t.db 2> %t.err +RUN: FileCheck -check-prefix=CHECK-ID0 -input-file=%t.err %s +CHECK-ID0: ExecutionTree DB contains illegal node ID (0) + +cleanup +RUN rm -f %t.db diff --git a/test/klee-exec-tree/WriteExecutionTree.c b/test/klee-exec-tree/WriteExecutionTree.c new file mode 100644 index 0000000000..42f531a5fe --- /dev/null +++ b/test/klee-exec-tree/WriteExecutionTree.c @@ -0,0 +1,78 @@ +// RUN: %clang %s -emit-llvm %O0opt -g -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee -write-exec-tree --output-dir=%t.klee-out %t.bc +// RUN: %klee-exec-tree branches %t.klee-out/exec_tree.db | FileCheck --check-prefix=CHECK-BRANCH %s +// RUN: %klee-exec-tree depths %t.klee-out | FileCheck --check-prefix=CHECK-DEPTH %s +// RUN: %klee-exec-tree instructions %t.klee-out | FileCheck --check-prefix=CHECK-INSTR %s +// RUN: %klee-exec-tree terminations %t.klee-out | FileCheck --check-prefix=CHECK-TERM %s +// RUN: %klee-exec-tree tree-dot %t.klee-out | FileCheck --check-prefix=CHECK-DOT %s +// RUN: %klee-exec-tree tree-info %t.klee-out | FileCheck --check-prefix=CHECK-TINFO %s +// RUN: not %klee-exec-tree dot %t.klee-out/exec-tree-doesnotexist.db + +#include "klee/klee.h" + +#include + +int main(void) { + int a = 42; + int c0, c1, c2, c3; + klee_make_symbolic(&c0, sizeof(c0), "c0"); + klee_make_symbolic(&c1, sizeof(c1), "c1"); + klee_make_symbolic(&c2, sizeof(c2), "c2"); + klee_make_symbolic(&c3, sizeof(c3), "c3"); + + if (c0) { + a += 17; + } else { + a -= 4; + } + + if (c1) { + klee_assume(!c1); + } else if (c2) { + char *p = NULL; + p[4711] = '!'; + } else if (c3) { + klee_silent_exit(0); + } else { + return a; + } + + return 0; +} + +// CHECK-BRANCH: branch type,count +// CHECK-BRANCH: Conditional,7 + +// CHECK-DEPTH: depth,count +// CHECK-DEPTH: 3,2 +// CHECK-DEPTH: 4,2 +// CHECK-DEPTH: 5,4 + +// CHECK-INSTR: asm line,branches,terminations,termination types +// CHECK-INSTR-DAG: {{[0-9]+}},0,2,User(2) +// CHECK-INSTR-DAG: {{[0-9]+}},0,2,Ptr(2) +// CHECK-INSTR-DAG: {{[0-9]+}},0,2,SilentExit(2) +// CHECK-INSTR-DAG: {{[0-9]+}},0,2,Exit(2) + +// CHECK-TERM: termination type,count +// CHECK-TERM-DAG: Exit,2 +// CHECK-TERM-DAG: Ptr,2 +// CHECK-TERM-DAG: User,2 +// CHECK-TERM-DAG: SilentExit,2 + +// CHECK-DOT: strict digraph ExecutionTree { +// CHECK-DOT: node[shape=point,width=0.15,color=darkgrey]; +// CHECK-DOT: edge[color=darkgrey]; +// CHECK-DOT-DAG: N{{[0-9]+}}[tooltip="Conditional\nnode: {{[0-9]+}}\nstate: 0\nasm: {{[0-9]+}}"]; +// CHECK-DOT-DAG: N{{[0-9]+}}[tooltip="Exit\nnode: {{[0-9]+}}\nstate: {{[0-9]+}}\nasm: {{[0-9]+}}",color=green]; +// CHECK-DOT-DAG: N{{[0-9]+}}[tooltip="SilentExit\nnode: {{[0-9]+}}\nstate: {{[0-9]+}}\nasm: {{[0-9]+}}",color=orange]; +// CHECK-DOT-DAG: N{{[0-9]+}}[tooltip="Ptr\nnode: {{[0-9]+}}\nstate: {{[0-9]+}}\nasm: {{[0-9]+}}",color=red]; +// CHECK-DOT-DAG: N{{[0-9]+}}[tooltip="User\nnode: {{[0-9]+}}\nstate: {{[0-9]+}}\nasm: {{[0-9]+}}",color=blue]; +// CHECK-DOT-DAG: N{{[0-9]+}}->{N{{[0-9]+}} N{{[0-9]+}}}; +// CHECK-DOT-DAG: } + +// CHECK-TINFO: nodes: 15 +// CHECK-TINFO: leaf nodes: 8 +// CHECK-TINFO: max. depth: 5 +// CHECK-TINFO: avg. depth: 4.2 diff --git a/test/klee-exec-tree/exec-tree-dbs/duplicated_node.csv b/test/klee-exec-tree/exec-tree-dbs/duplicated_node.csv new file mode 100644 index 0000000000..7882b911e2 --- /dev/null +++ b/test/klee-exec-tree/exec-tree-dbs/duplicated_node.csv @@ -0,0 +1,5 @@ +ID,stateID,leftID,rightID,asmLine,kind +1,0,2,3,44,1 +2,0,0,0,61,36 +3,1,4,2,62,1 +4,1,0,0,63,80 diff --git a/test/klee-exec-tree/exec-tree-dbs/empty_db.csv b/test/klee-exec-tree/exec-tree-dbs/empty_db.csv new file mode 100644 index 0000000000..4dac8a1748 --- /dev/null +++ b/test/klee-exec-tree/exec-tree-dbs/empty_db.csv @@ -0,0 +1 @@ +ID,stateID,leftID,rightID,asmLine,kind diff --git a/test/klee-exec-tree/exec-tree-dbs/invalid_btype.csv b/test/klee-exec-tree/exec-tree-dbs/invalid_btype.csv new file mode 100644 index 0000000000..01ee428cc9 --- /dev/null +++ b/test/klee-exec-tree/exec-tree-dbs/invalid_btype.csv @@ -0,0 +1,4 @@ +ID,stateID,leftID,rightID,asmLine,kind +1,0,2,3,44,123 +2,0,0,0,61,36 +3,1,0,0,61,1 diff --git a/test/klee-exec-tree/exec-tree-dbs/invalid_ttype.csv b/test/klee-exec-tree/exec-tree-dbs/invalid_ttype.csv new file mode 100644 index 0000000000..0d185bee80 --- /dev/null +++ b/test/klee-exec-tree/exec-tree-dbs/invalid_ttype.csv @@ -0,0 +1,4 @@ +ID,stateID,leftID,rightID,asmLine,kind +1,0,2,3,44,1 +2,0,0,0,61,36 +3,1,0,0,61,123 diff --git a/test/klee-exec-tree/exec-tree-dbs/loop.csv b/test/klee-exec-tree/exec-tree-dbs/loop.csv new file mode 100644 index 0000000000..4fc2b9f281 --- /dev/null +++ b/test/klee-exec-tree/exec-tree-dbs/loop.csv @@ -0,0 +1,5 @@ +ID,stateID,leftID,rightID,asmLine,kind +1,0,2,3,44,1 +2,0,0,0,61,36 +3,1,4,1,62,1 +4,1,0,0,63,80 diff --git a/test/klee-exec-tree/exec-tree-dbs/missing_after_max.csv b/test/klee-exec-tree/exec-tree-dbs/missing_after_max.csv new file mode 100644 index 0000000000..16e99a357c --- /dev/null +++ b/test/klee-exec-tree/exec-tree-dbs/missing_after_max.csv @@ -0,0 +1,5 @@ +ID,stateID,leftID,rightID,asmLine,kind +1,0,2,3,44,1 +2,0,0,0,61,36 +3,1,4,5,62,1 +4,1,0,0,63,80 diff --git a/test/klee-exec-tree/exec-tree-dbs/missing_before_max.csv b/test/klee-exec-tree/exec-tree-dbs/missing_before_max.csv new file mode 100644 index 0000000000..2131ea56f9 --- /dev/null +++ b/test/klee-exec-tree/exec-tree-dbs/missing_before_max.csv @@ -0,0 +1,5 @@ +ID,stateID,leftID,rightID,asmLine,kind +1,0,2,3,44,1 +2,0,0,0,61,36 +3,1,4,5,62,1 +5,1,0,0,63,80 diff --git a/test/klee-exec-tree/exec-tree-dbs/node_id0.csv b/test/klee-exec-tree/exec-tree-dbs/node_id0.csv new file mode 100644 index 0000000000..51a31e4996 --- /dev/null +++ b/test/klee-exec-tree/exec-tree-dbs/node_id0.csv @@ -0,0 +1,6 @@ +ID,stateID,leftID,rightID,asmLine,kind +0,0,2,3,44,1 +2,0,0,0,61,36 +3,1,4,5,62,1 +4,1,0,0,63,80 +5,2,0,0,63,36 diff --git a/test/klee-exec-tree/exec-tree-dbs/not_a.db b/test/klee-exec-tree/exec-tree-dbs/not_a.db new file mode 100644 index 0000000000..d81cc0710e --- /dev/null +++ b/test/klee-exec-tree/exec-tree-dbs/not_a.db @@ -0,0 +1 @@ +42 diff --git a/test/Feature/KleeStats.c b/test/klee-stats/KleeStats.c similarity index 96% rename from test/Feature/KleeStats.c rename to test/klee-stats/KleeStats.c index e54542e3ba..8045f22eb8 100644 --- a/test/Feature/KleeStats.c +++ b/test/klee-stats/KleeStats.c @@ -29,7 +29,7 @@ int main(){ // First check we find a line with the expected format // CHECK-STATS: Path,Instrs,Time(s),ICov(%),BCov(%),ICount,TSolver(%),ActiveStates,MaxActiveStates,Mem(MiB),MaxMem(MiB) // Check there is a line with .klee-out dir, non zero instruction, less than 1 second execution time and 100 ICov. -// CHECK-STATS: {{.*\.klee-out,[1-9]+,0\.([0-9]+),100\.00}} +// CHECK-STATS: {{.*\.klee-out,[1-9][0-9]+,[0-9]+\.([0-9]+),100\.00}} // Check other formats // CHECK-STATS-ABS-TIMES: Path,Time(s),TUser(s),TResolve(s),TCex(s),TSolver(s),TFork(s) diff --git a/test/klee-stats/KleeStatsBranches.c b/test/klee-stats/KleeStatsBranches.c new file mode 100644 index 0000000000..a1bf2721f5 --- /dev/null +++ b/test/klee-stats/KleeStatsBranches.c @@ -0,0 +1,84 @@ +// RUN: %clang %s -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --write-no-tests --output-dir=%t.klee-out %t.bc 2> %t.log +// RUN: %klee-stats --print-columns 'BrConditional,BrIndirect,BrSwitch,BrCall,BrMemOp,BrResolvePointer,BrAlloc,BrRealloc,BrFree,BrGetVal' --table-format=csv %t.klee-out > %t.stats +// RUN: FileCheck -check-prefix=CHECK-STATS -input-file=%t.stats %s + +#include "klee/klee.h" + +#include + + +void foo(void) {} +void bar(void) {} + +int memop(void) { + int *p; + klee_make_symbolic(&p, sizeof(p), "p"); + return *p; +} + + +int main(void) { + // alloc + size_t size0; + klee_make_symbolic(&size0, sizeof(size_t), "size0"); + klee_assume(size0 < 10); + void *p; + + // realloc + size_t size1; + klee_make_symbolic(&size1, sizeof(size_t), "size1"); + klee_assume(size1 < 20); + + // conditional + int cond; + klee_make_symbolic(&cond, sizeof(cond), "cond"); + + // switch + int sw_cond; + klee_make_symbolic(&sw_cond, sizeof(sw_cond), "sw_cond"); + + // call + void (*fptr)(void); + klee_make_symbolic(&fptr, sizeof(fptr), "fptr"); + klee_assume((fptr == &foo) | (fptr == &bar)); + + // indirectbr + void *lptr; + klee_make_symbolic(&lptr, sizeof(lptr), "lptr"); + klee_assume((lptr == &&one) | (lptr == &&two)); + goto *lptr; + + +one: + p = malloc(size0); + if (p) { + p = realloc(p, size1); + if (p) { + // free + klee_make_symbolic(&p, sizeof(p), "p"); + free(p); + } + } + + return 1; + +two: + switch (sw_cond) { + case 8: memop(); break; // memop + case 15: (*fptr)(); break; + default: { + int c = 42; + // conditional + if (cond) c++; + return c; + } + } + + return 2; +} + +// Check that we create branches +// CHECK-STATS: BrConditional,BrIndirect,BrSwitch,BrCall,BrMemOp,BrResolvePointer,BrAlloc,BrRealloc,BrFree,BrGetVal +// CHECK-STATS: 1,1,2,1,{{[1-9][0-9]*}},{{[1-9][0-9]*}},2,1,1,0 diff --git a/test/klee-stats/KleeStatsColumns.test b/test/klee-stats/KleeStatsColumns.test new file mode 100644 index 0000000000..88e71ad7bc --- /dev/null +++ b/test/klee-stats/KleeStatsColumns.test @@ -0,0 +1,10 @@ +// sqlite databases must be opened with write permissions, so we copy the test cases to the output dir +RUN: rm -rf %t.klee-stats +RUN: mkdir %t.klee-stats +RUN: cp -r %S/missing_column %S/run %S/additional_column %t.klee-stats/ +RUN %klee-stats --print-all %t.klee-stats/missing_column %t.klee-stats/run %t.klee-stats/additional_column | FileCheck %s + +// Path, Instrs, ..., extra_column +CHECK: {{^}}| missing_column | |{{.*}}| |{{$}} +CHECK: {{^}}| run | 3|{{.*}}| |{{$}} +CHECK: {{^}}|additional_column| 3|{{.*}}| 4711|{{$}} diff --git a/test/Feature/KleeStatsCsv.test b/test/klee-stats/KleeStatsCsv.test similarity index 55% rename from test/Feature/KleeStatsCsv.test rename to test/klee-stats/KleeStatsCsv.test index 26bfac0985..591278f2bc 100644 --- a/test/Feature/KleeStatsCsv.test +++ b/test/klee-stats/KleeStatsCsv.test @@ -1,5 +1,9 @@ -RUN: %klee-stats --table-format=csv %S/klee-stats/run | FileCheck --check-prefix=CHECK-CSV %s -RUN: %klee-stats --table-format=readable-csv %S/klee-stats/run | FileCheck --check-prefix=CHECK-READABLECSV %s +// sqlite databases must be opened with write permissions, so we copy the test cases to the output dir +RUN: rm -rf %t.klee-stats +RUN: mkdir %t.klee-stats +RUN: cp -r %S/run %t.klee-stats/ +RUN: %klee-stats --table-format=csv %t.klee-stats/run | FileCheck --check-prefix=CHECK-CSV %s +RUN: %klee-stats --table-format=readable-csv %t.klee-stats/run | FileCheck --check-prefix=CHECK-READABLECSV %s CHECK-CSV: Path,Instrs,Time(s),ICov(%),BCov(%),ICount,TSolver(%) CHECK-CSV: klee-stats/run,3,0.00,100.00,100.00,3,0.00 diff --git a/test/klee-stats/KleeStatsEmpty.test b/test/klee-stats/KleeStatsEmpty.test new file mode 100644 index 0000000000..716972cd70 --- /dev/null +++ b/test/klee-stats/KleeStatsEmpty.test @@ -0,0 +1,8 @@ +// sqlite databases must be opened with write permissions, so we copy the test cases to the output dir +RUN: rm -rf %t.klee-stats +RUN: mkdir %t.klee-stats +RUN: cp -r %S/empty %t.klee-stats/ +RUN: %klee-stats %t.klee-stats/empty | FileCheck %s + +CHECK: {{^}}|{{ *}}Path{{ *}}|{{$}} +CHECK: {{^}}|{{.*}}empty{{ *}}|{{$}} diff --git a/test/Feature/KleeStatsNoBr.c b/test/klee-stats/KleeStatsNoBr.c similarity index 100% rename from test/Feature/KleeStatsNoBr.c rename to test/klee-stats/KleeStatsNoBr.c diff --git a/test/klee-stats/KleeStatsTermClasses.c b/test/klee-stats/KleeStatsTermClasses.c new file mode 100644 index 0000000000..1606128c05 --- /dev/null +++ b/test/klee-stats/KleeStatsTermClasses.c @@ -0,0 +1,89 @@ +// RUN: %clang %s -fsanitize=unsigned-integer-overflow -emit-llvm -g %O0opt -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --max-stack-frames=15 --switch-type=simple --search=dfs --use-merge --ubsan-runtime --write-no-tests --output-dir=%t.klee-out %t.bc 2> %t.log +// RUN: %klee-stats --print-columns 'TermExit,TermEarly,TermSolverErr,TermProgrErr,TermUserErr,TermExecErr,TermEarlyAlgo,TermEarlyUser' --table-format=csv %t.klee-out > %t.stats +// RUN: FileCheck -check-prefix=CHECK-STATS -input-file=%t.stats %s + + +#pragma GCC diagnostic ignored "-Wimplicit-function-declaration" +#pragma GCC diagnostic ignored "-Winfinite-recursion" + +// do not #include "klee/klee.h" to misuse API + +#include +#include +#include +#include + +const char *ro_str = "hi"; +int global[3]; + + +void max_depth(int a) { + max_depth(a + 1); // Early (MaxDepth) +} + +unsigned mul(unsigned a, unsigned b) { + uint32_t r = a * b; + return r; +} + +void merge() { + int cond; + int a = 42; + klee_make_symbolic(&cond, sizeof(cond), "merge_cond"); + + klee_open_merge(); + if (cond == 8) a++; + else a--; + klee_close_merge(); // EarlyAlgorithm (Merge) + // (normal) Exit +} + +void bogus_external(); + + +int main(void) { + int cond; + klee_make_symbolic(&cond, sizeof(cond), "cond"); + + switch(cond) { + case __LINE__: + max_depth(17); + case __LINE__: + assert(0); // ProgErr (Assert) + break; + case __LINE__: + abort(); // ProgErr (Abort) + case __LINE__: + free(global); // ProgErr (Free) + case __LINE__: { + unsigned a = UINT_MAX, b = UINT_MAX, c; + c = mul(a, b); // ProgErr (Overflow) + } + case __LINE__: + free((void*)0xdeadbeef); // ProgErr (Ptr) + break; + case __LINE__: { + char *p = (char*)ro_str; + p[0] = '!'; // ProgErr (ReadOnly) + } + case __LINE__: + klee_report_error(__FILE__, __LINE__, "Report Error", "report.err"); // ProgErr (Report) + case __LINE__: + klee_make_symbolic(1); // UserErr + case __LINE__: + bogus_external(); // ExecErr (External) + case __LINE__: + merge(); + break; + case __LINE__: + klee_silent_exit(0); // EarlyUser + default: + return 0; // (normal) Exit + } +} + +// Check termination classes +// CHECK-STATS: TermExit,TermEarly,TermSolverErr,TermProgrErr,TermUserErr,TermExecErr,TermEarlyAlgo,TermEarlyUser +// CHECK-STATS: 2,1,0,7,1,1,1,1 diff --git a/test/Feature/klee-stats/additional_column/info b/test/klee-stats/additional_column/info similarity index 100% rename from test/Feature/klee-stats/additional_column/info rename to test/klee-stats/additional_column/info diff --git a/test/Feature/klee-stats/additional_column/run.stats b/test/klee-stats/additional_column/run.stats similarity index 100% rename from test/Feature/klee-stats/additional_column/run.stats rename to test/klee-stats/additional_column/run.stats diff --git a/test/Feature/klee-stats/empty/info b/test/klee-stats/empty/info similarity index 100% rename from test/Feature/klee-stats/empty/info rename to test/klee-stats/empty/info diff --git a/test/Feature/klee-stats/empty/run.stats b/test/klee-stats/empty/run.stats similarity index 100% rename from test/Feature/klee-stats/empty/run.stats rename to test/klee-stats/empty/run.stats diff --git a/test/Feature/klee-stats/missing_column/info b/test/klee-stats/missing_column/info similarity index 100% rename from test/Feature/klee-stats/missing_column/info rename to test/klee-stats/missing_column/info diff --git a/test/Feature/klee-stats/missing_column/run.stats b/test/klee-stats/missing_column/run.stats similarity index 100% rename from test/Feature/klee-stats/missing_column/run.stats rename to test/klee-stats/missing_column/run.stats diff --git a/test/Feature/klee-stats/run/info b/test/klee-stats/run/info similarity index 100% rename from test/Feature/klee-stats/run/info rename to test/klee-stats/run/info diff --git a/test/Feature/klee-stats/run/run.stats b/test/klee-stats/run/run.stats similarity index 100% rename from test/Feature/klee-stats/run/run.stats rename to test/klee-stats/run/run.stats diff --git a/test/lit.cfg b/test/lit.cfg index 0d7aa1ed55..524bed2887 100644 --- a/test/lit.cfg +++ b/test/lit.cfg @@ -56,7 +56,7 @@ if klee_obj_root is not None: config.environment['PATH'] = path -# Propogate some environment variable to test environment. +# Propagate some environment variable to test environment. def addEnv(name): if name in os.environ: config.environment[name] = os.environ[name] @@ -78,6 +78,10 @@ addEnv('TSAN_OPTIONS') addEnv('C_INCLUDE_PATH') addEnv('CPLUS_INCLUDE_PATH') +# Without an appropriate `PYTHONPATH`, the various python-based tools, such as +# `klee-stats` might not be able to resolve the python packages they depend on +addEnv('PYTHONPATH') + # Check that the object root is known. if config.test_exec_root is None: lit_config.fatal('test execution root not set!') @@ -103,6 +107,10 @@ config.substitutions.append( config.substitutions.append( ('%llvmar', os.path.join(llvm_tools_dir, 'llvm-ar')) ) +# Add a substitution for llvm-link +config.substitutions.append( + ('%llvmlink', os.path.join(llvm_tools_dir, 'llvm-link')) +) # Add a substition for libkleeruntest config.substitutions.append( @@ -112,6 +120,11 @@ config.substitutions.append( ('%libkleeruntest', config.libkleeruntest) ) +# Add a substition for sqlite3 +config.substitutions.append( + ('%sqlite3', os.path.abspath(config.sqlite3)) +) + # Get KLEE and Kleaver specific parameters passed on llvm-lit cmd line # e.g. llvm-lit --param klee_opts=--help klee_extra_params = lit_config.params.get('klee_opts',"") @@ -130,13 +143,14 @@ if len(kleaver_extra_params) != 0: # If a tool's name is a prefix of another, the longer name has # to come first, e.g., klee-replay should come before klee subs = [ ('%kleaver', 'kleaver', kleaver_extra_params), + ('%klee-exec-tree', 'klee-exec-tree', ''), ('%klee-replay', 'klee-replay', ''), ('%klee-stats', 'klee-stats', ''), ('%klee-zesti', 'klee-zesti', ''), ('%klee','klee', klee_extra_params), ('%ktest-tool', 'ktest-tool', ''), - ('%gen-random-bout', 'gen-random-bout', ''), - ('%gen-bout', 'gen-bout', '') + ('%ktest-randgen', 'ktest-randgen', ''), + ('%ktest-gen', 'ktest-gen', '') ] for s,basename,extra_args in subs: config.substitutions.append( @@ -152,12 +166,15 @@ config.substitutions.append( ('%gentmp', os.path.join(klee_src_root, 'scripts/genTempFiles.sh')) ) +# Prepare the full include expression, i.e. for all given paths. For example, ["path1","path2"] +# becomes "-I path1 -I path2" config.substitutions.append( - ('%libcxx_include', getattr(config, 'libcxx_include_dir', None))) + ('%libcxx_includes', " ".join( ["-I "+ p for p in getattr(config, 'libcxx_include_dirs', [])] )) + ) # Add feature for the LLVM version in use, so it can be tested in REQUIRES and # XFAIL checks. We also add "not-XXX" variants, for the same reason. -known_llvm_versions = { "6.0", "7.0", "7.1", "8.0", "9.0", "10.0", "11.0", "11.1", "12.0", "13.0" } +known_llvm_versions = { "11.0", "11.1", "12.0", "13.0", "14.0", "15.0", "16.0", "17.0" } current_llvm_version_tuple = (int(config.llvm_version_major), int(config.llvm_version_minor)) current_llvm_version = "%s.%s" % current_llvm_version_tuple @@ -204,6 +221,12 @@ if config.enable_libcxx: if config.enable_eh_cxx: config.available_features.add('eh-cxx') +# Architectures supported +supported_archs = ['x86_64', 'arm'] +for arch in supported_archs: + if config.target_triple.find(arch) != -1: + config.available_features.add(arch) + # Target operating system features supported_targets = ['linux', 'darwin', 'freebsd'] for target in supported_targets: @@ -220,7 +243,15 @@ if 'WSL_DISTRO_NAME' in os.environ and 'WSL_INTEROP' in os.environ: else: config.available_features.add('not-wsl-2') +# m32 support +config.available_features.add('{}target-x86'.format('' if config.target_triple.find("i386") != -1 else 'not-')) +config.available_features.add('{}32bit-support'.format('' if config.have_32bit_support else 'not-')) + + # Sanitizer config.available_features.add('{}asan'.format('' if config.have_asan else 'not-')) config.available_features.add('{}ubsan'.format('' if config.have_ubsan else 'not-')) config.available_features.add('{}msan'.format('' if config.have_msan else 'not-')) + +# SQLite +config.available_features.add('{}sqlite3'.format('' if config.have_sqlite3 else 'not-')) diff --git a/test/lit.site.cfg.in b/test/lit.site.cfg.in index 849062b1ca..5c8d77caef 100644 --- a/test/lit.site.cfg.in +++ b/test/lit.site.cfg.in @@ -9,7 +9,9 @@ config.klee_obj_root = "@KLEE_BINARY_DIR@" config.klee_tools_dir = "@KLEE_TOOLS_DIR@" config.llvm_tools_dir = "@LLVM_TOOLS_DIR@" -config.libcxx_include_dir = "@KLEE_LIBCXX_INCLUDE_DIR@" +config.libcxx_include_dirs = ["@KLEE_LIBCXX_INCLUDE_PATH@"] +if len("@KLEE_LIBCXX_PLATFORM_INCLUDE_PATH@") > 0: + config.libcxx_include_dirs.append("@KLEE_LIBCXX_PLATFORM_INCLUDE_PATH@") # Needed to check if a hack needs to be applied config.llvm_version_major = "@LLVM_VERSION_MAJOR@" @@ -26,6 +28,8 @@ config.cxx = "@NATIVE_CXX@" # test/Concrete/CMakeLists.txt config.O0opt = "-O0 -Xclang -disable-O0-optnone" +config.sqlite3 = "@SQLITE_CLI@" + # Features config.enable_uclibc = True if @SUPPORT_KLEE_UCLIBC@ == 1 else False config.enable_posix_runtime = True if @ENABLE_POSIX_RUNTIME@ == 1 else False @@ -38,6 +42,8 @@ config.enable_zlib = True if @HAVE_ZLIB_H@ == 1 else False config.have_asan = True if @IS_ASAN_BUILD@ == 1 else False config.have_ubsan = True if @IS_UBSAN_BUILD@ == 1 else False config.have_msan = True if @IS_MSAN_BUILD@ == 1 else False +config.have_32bit_support = True if @M32_SUPPORTED@ == 1 else False +config.have_sqlite3 = True if "@SQLITE_CLI@".strip() != "" else False # Add sanitizer list config.environment['LSAN_OPTIONS'] = "suppressions=@KLEE_UTILS_DIR@/sanitizers/lsan.txt" diff --git a/test/regression/2007-07-25-invalid-stp-array-binding-to-objectstate.c b/test/regression/2007-07-25-invalid-stp-array-binding-to-objectstate.c index 1897266a59..ac32063cbc 100644 --- a/test/regression/2007-07-25-invalid-stp-array-binding-to-objectstate.c +++ b/test/regression/2007-07-25-invalid-stp-array-binding-to-objectstate.c @@ -2,6 +2,7 @@ // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out %t1.bc +#include "klee/klee.h" #include int main(void) { diff --git a/test/regression/2007-07-30-unflushed-byte.c b/test/regression/2007-07-30-unflushed-byte.c index bb480b9ac0..2d2f1e8c88 100644 --- a/test/regression/2007-07-30-unflushed-byte.c +++ b/test/regression/2007-07-30-unflushed-byte.c @@ -1,7 +1,7 @@ // RUN: %clang %s -emit-llvm %O0opt -c -o %t1.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out %t1.bc - +#include "klee/klee.h" #include int main() { diff --git a/test/regression/2007-08-01-bool-zext-in-call.ll b/test/regression/2007-08-01-bool-zext-in-call.ll index d8b2cec094..ee77d80cbf 100644 --- a/test/regression/2007-08-01-bool-zext-in-call.ll +++ b/test/regression/2007-08-01-bool-zext-in-call.ll @@ -1,5 +1,5 @@ ; RUN: rm -rf %t.klee-out -; RUN: llvm-as -f %s -o - | %klee --output-dir=%t.klee-out +; RUN: %llvmas -f %s -o - | %klee --output-dir=%t.klee-out ; RUN: not test -f %t.klee-out/test0001.abort.err target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" diff --git a/test/regression/2007-08-01-cache-unclear-on-overwrite-flushed.c b/test/regression/2007-08-01-cache-unclear-on-overwrite-flushed.c index 96115557e7..73ceec918c 100644 --- a/test/regression/2007-08-01-cache-unclear-on-overwrite-flushed.c +++ b/test/regression/2007-08-01-cache-unclear-on-overwrite-flushed.c @@ -2,6 +2,7 @@ // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out %t1.bc +#include "klee/klee.h" #include #include diff --git a/test/regression/2007-08-06-64bit-shift.c b/test/regression/2007-08-06-64bit-shift.c index f072e453a7..675211fd59 100644 --- a/test/regression/2007-08-06-64bit-shift.c +++ b/test/regression/2007-08-06-64bit-shift.c @@ -2,6 +2,7 @@ // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out %t1.bc +#include "klee/klee.h" #include int main() { diff --git a/test/regression/2007-08-06-access-after-free.c b/test/regression/2007-08-06-access-after-free.c index 7d1f81dbeb..ef47c868d3 100644 --- a/test/regression/2007-08-06-access-after-free.c +++ b/test/regression/2007-08-06-access-after-free.c @@ -2,7 +2,9 @@ // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out %t1.bc +#include "klee/klee.h" #include +#include int main() { int a; diff --git a/test/regression/2007-08-16-invalid-constant-value.c b/test/regression/2007-08-16-invalid-constant-value.c index 28f8126894..f5474f7a4e 100644 --- a/test/regression/2007-08-16-invalid-constant-value.c +++ b/test/regression/2007-08-16-invalid-constant-value.c @@ -1,14 +1,12 @@ // RUN: rm -f %t4.out %t4.err %t4.log -// RUN: %clang %s -emit-llvm -O2 -c -o %t1.bc -// RUN: llvm-as -f %p/../Feature/_utils._ll -o %t2.bc -// RUN: llvm-link %t1.bc %t2.bc -o %t3.bc +// RUN: %clang %s -std=c89 -emit-llvm -O2 -c -o %t1.bc +// RUN: %llvmas -f %p/../Feature/_utils._ll -o %t2.bc +// RUN: %llvmlink %t1.bc %t2.bc -o %t3.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out %t3.bc #include -#include "../Feature/utils.h" - int main() { unsigned char a; diff --git a/test/regression/2007-08-16-valid-write-to-freed-object.c b/test/regression/2007-08-16-valid-write-to-freed-object.c index 6b6efecbfc..2a43a24097 100644 --- a/test/regression/2007-08-16-valid-write-to-freed-object.c +++ b/test/regression/2007-08-16-valid-write-to-freed-object.c @@ -2,6 +2,8 @@ // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out %t1.bc +#include "klee/klee.h" +#include unsigned sym() { unsigned x; klee_make_symbolic(&x, sizeof x, "x"); diff --git a/test/regression/2007-10-11-free-of-alloca.c b/test/regression/2007-10-11-free-of-alloca.c index 6aa6cdb30c..cecdeef2b2 100644 --- a/test/regression/2007-10-11-free-of-alloca.c +++ b/test/regression/2007-10-11-free-of-alloca.c @@ -2,7 +2,7 @@ // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out %t1.bc 2>&1 | FileCheck %s // RUN: test -f %t.klee-out/test000001.free.err - +#include int main() { int buf[4]; // CHECK: 2007-10-11-free-of-alloca.c:9: free of alloca diff --git a/test/regression/2007-10-11-illegal-access-after-free-and-branch.c b/test/regression/2007-10-11-illegal-access-after-free-and-branch.c index 0b4f0833dc..851c578dd3 100644 --- a/test/regression/2007-10-11-illegal-access-after-free-and-branch.c +++ b/test/regression/2007-10-11-illegal-access-after-free-and-branch.c @@ -1,21 +1,21 @@ // RUN: %clang %s -emit-llvm -g -c -o %t1.bc // RUN: rm -rf %t.klee-out -// RUN: %klee --output-dir=%t.klee-out --optimize %t1.bc 2>&1 | FileCheck %s +// RUN: %klee --output-dir=%t.klee-out --kdalloc --optimize %t1.bc 2>&1 | FileCheck %s // RUN: test -f %t.klee-out/test000001.ptr.err +#include "klee/klee.h" + #include -#include -#include int main(int argc, char **argv) { unsigned char *buf = malloc(3); klee_make_symbolic(buf, 3, "buf"); - if (buf[0]>4) klee_silent_exit(0); + if (buf[0] > 4) + klee_silent_exit(0); unsigned char x = buf[1]; free(buf); - if (x) - { - // CHECK: 2007-10-11-illegal-access-after-free-and-branch.c:19: memory error: out of bound pointer + if (x) { + // CHECK: 2007-10-11-illegal-access-after-free-and-branch.c:[[@LINE+1]]: memory error: use after free return buf[2]; } klee_silent_exit(0); diff --git a/test/regression/2007-10-12-failed-make-symbolic-after-copy.c b/test/regression/2007-10-12-failed-make-symbolic-after-copy.c index 64cae9f4d1..77f9b9f6c0 100644 --- a/test/regression/2007-10-12-failed-make-symbolic-after-copy.c +++ b/test/regression/2007-10-12-failed-make-symbolic-after-copy.c @@ -2,7 +2,7 @@ // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out %t1.bc // RUN: test -f %t.klee-out/test000001.ktest - +#include "klee/klee.h" int main() { unsigned x, y[4]; diff --git a/test/regression/2008-03-04-free-of-global.c b/test/regression/2008-03-04-free-of-global.c index 995e7173b1..fb4a2df806 100644 --- a/test/regression/2008-03-04-free-of-global.c +++ b/test/regression/2008-03-04-free-of-global.c @@ -3,10 +3,11 @@ // RUN: %klee --output-dir=%t.klee-out %t1.bc 2>&1 | FileCheck %s // RUN: test -f %t.klee-out/test000001.free.err +#include int buf[4]; int main() { - // CHECK: 2008-03-04-free-of-global.c:10: free of global + // CHECK: 2008-03-04-free-of-global.c:[[@LINE+1]]: free of global free(buf); // this should give runtime error, not crash return 0; } diff --git a/test/regression/2008-03-11-free-of-malloc-zero.c b/test/regression/2008-03-11-free-of-malloc-zero.c index e90baa2c85..cdd2ef35e8 100644 --- a/test/regression/2008-03-11-free-of-malloc-zero.c +++ b/test/regression/2008-03-11-free-of-malloc-zero.c @@ -1,7 +1,7 @@ // RUN: %clang %s -emit-llvm %O0opt -c -o %t1.bc // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --exit-on-error %t1.bc - +#include "klee/klee.h" #include int main() { diff --git a/test/regression/2008-04-10-bad-alloca-free.c b/test/regression/2008-04-10-bad-alloca-free.c index 5049f47ce8..d20d07d215 100644 --- a/test/regression/2008-04-10-bad-alloca-free.c +++ b/test/regression/2008-04-10-bad-alloca-free.c @@ -2,6 +2,7 @@ // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out --exit-on-error %t1.bc +#include "klee/klee.h" void f(int *addr) { klee_make_symbolic(addr, sizeof *addr, "moo"); } diff --git a/test/regression/2012-05-13-asm-causes-aborts.c b/test/regression/2012-05-13-asm-causes-aborts.c deleted file mode 100644 index 53fd0da902..0000000000 --- a/test/regression/2012-05-13-asm-causes-aborts.c +++ /dev/null @@ -1,9 +0,0 @@ -// RUN: %clang %s -emit-llvm %O0opt -c -o %t1.bc -// RUN: rm -rf %t.klee-out -// RUN: %klee --output-dir=%t.klee-out %t1.bc - -int main(int argc, char *argv[]){ - __asm__ __volatile__ ("movl %eax, %eax"); - return 0; -} - diff --git a/test/regression/2014-07-04-unflushed-error-report.c b/test/regression/2014-07-04-unflushed-error-report.c index c929328d85..2374d554fa 100644 --- a/test/regression/2014-07-04-unflushed-error-report.c +++ b/test/regression/2014-07-04-unflushed-error-report.c @@ -6,6 +6,8 @@ /* This test checks that the error file isn't empty and contains the * right content. */ +#include "klee/klee.h" + int main() { unsigned int x = 15; unsigned int y; diff --git a/test/regression/2014-09-13-debug-info.c b/test/regression/2014-09-13-debug-info.c index 60b9c7f4f7..0b89e41312 100644 --- a/test/regression/2014-09-13-debug-info.c +++ b/test/regression/2014-09-13-debug-info.c @@ -5,7 +5,7 @@ // RUN: %klee --output-dir=%t.klee-out --only-output-states-covering-new %t1.bc // We expect 4 different output states, one for each named value and one "other" -// one with the prefered CEX. We verify this by using ktest-tool to dump the +// one with the preferred CEX. We verify this by using ktest-tool to dump the // values, and then checking the output. // // RUN: %ktest-tool %t.klee-out/*.ktest | FileCheck %s diff --git a/test/regression/2015-08-05-invalid-fork.c b/test/regression/2015-08-05-invalid-fork.c index a165cab283..5c09cbfc5e 100644 --- a/test/regression/2015-08-05-invalid-fork.c +++ b/test/regression/2015-08-05-invalid-fork.c @@ -3,6 +3,7 @@ is printed a single time. */ #include "klee/klee.h" +#include // RUN: %clang %s -emit-llvm -g %O0opt -c -o %t.bc // RUN: rm -rf %t.klee-out diff --git a/test/regression/2015-08-30-empty-constraints.c b/test/regression/2015-08-30-empty-constraints.c index f92b69785b..b01fee5e13 100644 --- a/test/regression/2015-08-30-empty-constraints.c +++ b/test/regression/2015-08-30-empty-constraints.c @@ -10,6 +10,8 @@ * are generated. * Make sure we are able to generate an input. */ +#include "klee/klee.h" + int main() { int d; diff --git a/test/regression/2015-08-30-sdiv-1.c b/test/regression/2015-08-30-sdiv-1.c index 7356e74c2a..5fa407f38d 100644 --- a/test/regression/2015-08-30-sdiv-1.c +++ b/test/regression/2015-08-30-sdiv-1.c @@ -7,7 +7,9 @@ /* Division by constant can be optimized.using mul/shift * For signed division, div by 1 or -1 cannot be optimized like that. */ +#include "klee/klee.h" #include + int main() { int32_t dividend; klee_make_symbolic(÷nd, sizeof dividend, "Dividend"); diff --git a/test/regression/2016-03-22-independence-solver-missing-objects-for-assignment.kquery b/test/regression/2016-03-22-independence-solver-missing-objects-for-assignment.kquery index 9116ea4730..d2deabbec8 100644 --- a/test/regression/2016-03-22-independence-solver-missing-objects-for-assignment.kquery +++ b/test/regression/2016-03-22-independence-solver-missing-objects-for-assignment.kquery @@ -1,15 +1,15 @@ # RUN: %kleaver %s 2>&1 | FileCheck %s array n_args[4] : w32 -> w8 = symbolic array n_args_1[4] : w32 -> w8 = symbolic -array A-data-stat[144] : w32 -> w8 = symbolic -array stdin-stat[144] : w32 -> w8 = symbolic +array A_data_stat[144] : w32 -> w8 = symbolic +array stdin_stat[144] : w32 -> w8 = symbolic (query [(Ult N0:(ReadLSB w32 0 n_args) 2) (Slt 0 N0) (Ult N1:(ReadLSB w32 0 n_args_1) 3) (Slt 0 N1) (Slt 1 N1) -(Eq false (Eq 0 (And w64 (ReadLSB w64 8 A-data-stat) 2147483647))) -(Ult (ReadLSB w64 56 A-data-stat) 65536) -(Eq false (Eq 0 (And w64 (ReadLSB w64 8 stdin-stat) 2147483647)))] -(Eq false (Ult (ReadLSB w64 56 stdin-stat) 65536)) [] [n_args]) +(Eq false (Eq 0 (And w64 (ReadLSB w64 8 A_data_stat) 2147483647))) +(Ult (ReadLSB w64 56 A_data_stat) 65536) +(Eq false (Eq 0 (And w64 (ReadLSB w64 8 stdin_stat) 2147483647)))] +(Eq false (Ult (ReadLSB w64 56 stdin_stat) 65536)) [] [n_args]) # CHECK: INVALID diff --git a/test/regression/2016-06-28-div-zero-bug.c b/test/regression/2016-06-28-div-zero-bug.c index 6e2e8c5ec5..dfab14d38c 100644 --- a/test/regression/2016-06-28-div-zero-bug.c +++ b/test/regression/2016-06-28-div-zero-bug.c @@ -6,6 +6,8 @@ // See https://github.com/klee/klee/issues/308 // and https://github.com/stp/stp/issues/206 +#include "klee/klee.h" + int b, a, g; int *c = &b, *d = &b, *f = &a; diff --git a/test/regression/2016-11-24-bitcast-weak-alias.c b/test/regression/2016-11-24-bitcast-weak-alias.c index 8fffa4a570..4bbb3f95a9 100644 --- a/test/regression/2016-11-24-bitcast-weak-alias.c +++ b/test/regression/2016-11-24-bitcast-weak-alias.c @@ -4,8 +4,8 @@ // RUN: %klee --output-dir=%t.klee-out -exit-on-error -search=nurs:covnew %t.bc DUMMY_ARG >%t1.log 2>&1 // RUN: FileCheck -input-file=%t1.log %s -// This test case is designed to cover code in `klee::getDirectCallTarget(CallSite)`. -// In particular it designed to test the case where a bitcasted function call, calls +// This test case is designed to cover code in `klee::getDirectCallTarget(CallBase)`. +// In particular, it's designed to test the case where a bitcasted function call calls // a weak alias. struct v1 { int c; diff --git a/test/regression/2017-02-21-pathOS-id.c b/test/regression/2017-02-21-pathOS-id.c index b6ee269afa..2430f67581 100644 --- a/test/regression/2017-02-21-pathOS-id.c +++ b/test/regression/2017-02-21-pathOS-id.c @@ -5,6 +5,10 @@ // RUN: cat %t.klee-out/test000002.path | wc -l | grep -q 1 // RUN: cat %t.klee-out/test000003.path | wc -l | grep -q 1 // RUN: cat %t.klee-out/test000004.path | wc -l | grep -q 1 + +#include "klee/klee.h" +#include "stdlib.h" + int main(){ int a, b; klee_make_symbolic (&a, sizeof(int), "a"); diff --git a/test/regression/2017-11-01-test-with-empty-varname.c b/test/regression/2017-11-01-test-with-empty-varname.c index 89108d9db7..2aa9754e51 100644 --- a/test/regression/2017-11-01-test-with-empty-varname.c +++ b/test/regression/2017-11-01-test-with-empty-varname.c @@ -2,6 +2,7 @@ // RUN: rm -rf %t.klee-out // RUN: %klee --output-dir=%t.klee-out %t1.bc // RUN: FileCheck %s --input-file=%t.klee-out/warnings.txt +#include "klee/klee.h" int main() { unsigned a; diff --git a/test/regression/2018-10-28-alias-to-alias.ll b/test/regression/2018-10-28-alias-to-alias.ll index a1af6d1613..44264845b1 100644 --- a/test/regression/2018-10-28-alias-to-alias.ll +++ b/test/regression/2018-10-28-alias-to-alias.ll @@ -1,5 +1,5 @@ ; RUN: rm -rf %t.klee-out -; RUN: llvm-as -f %s -o - | %klee --output-dir=%t.klee-out +; RUN: %llvmas -f %s -o - | %klee --output-dir=%t.klee-out target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" diff --git a/test/regression/2018-10-30-llvm-pr39177.ll b/test/regression/2018-10-30-llvm-pr39177.ll index 601a37bd0f..b28947ab66 100644 --- a/test/regression/2018-10-30-llvm-pr39177.ll +++ b/test/regression/2018-10-30-llvm-pr39177.ll @@ -1,5 +1,7 @@ +; REQUIRES: lt-llvm-15.0 +; The optimizer is more efficient and uses fwrite directly in newer LLVM versions ; RUN: rm -rf %t.klee-out -; RUN: llvm-as -f %s -o - | %klee -optimize -output-dir=%t.klee-out | FileCheck %s +; RUN: %klee -optimize -output-dir=%t.klee-out %s | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" diff --git a/test/regression/2019-08-01-trap-instruction.ll b/test/regression/2019-08-01-trap-instruction.ll index 2ef57aa211..46dcda866c 100644 --- a/test/regression/2019-08-01-trap-instruction.ll +++ b/test/regression/2019-08-01-trap-instruction.ll @@ -1,5 +1,5 @@ ; RUN: rm -rf %t.klee-out -; RUN: llvm-as -f %s -o - | %klee --output-dir=%t.klee-out +; RUN: %llvmas -f %s -o - | %klee --output-dir=%t.klee-out target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" @@ -20,4 +20,4 @@ entry: ret i32 0 } -declare void @llvm.trap() noreturn nounwind \ No newline at end of file +declare void @llvm.trap() noreturn nounwind diff --git a/test/regression/2019-08-02-missing-switch-default.ll b/test/regression/2019-08-02-missing-switch-default.ll index b8a88db4b2..55e4224db2 100644 --- a/test/regression/2019-08-02-missing-switch-default.ll +++ b/test/regression/2019-08-02-missing-switch-default.ll @@ -1,5 +1,5 @@ ; RUN: rm -rf %t.klee-out -; RUN: llvm-as -f %s -o %t.bc +; RUN: %llvmas -f %s -o %t.bc ; RUN: %klee --switch-type=internal --output-dir=%t.klee-out %t.bc ; RUN: FileCheck --input-file=%t.klee-out/info %s ; CHECK: KLEE: done: completed paths = 3 diff --git a/test/regression/2020-04-11-batching-search-zero-time-budget.c b/test/regression/2020-04-11-batching-search-zero-time-budget.c new file mode 100644 index 0000000000..46043f31d5 --- /dev/null +++ b/test/regression/2020-04-11-batching-search-zero-time-budget.c @@ -0,0 +1,16 @@ +// RUN: %clang %s -emit-llvm %O0opt -g -c -o %t.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out --use-batching-search --batch-time=0 --batch-instructions=1 %t.bc 2>&1 | FileCheck %s + +#include + +#include "klee/klee.h" + +int main(void) { + for (int i = 0; i < 10; ++i) { + struct timespec ts = {.tv_sec = 0, .tv_nsec = 10000000}; // 10 ms + nanosleep(&ts, NULL); + } + // CHECK-NOT: increased time budget + return 0; +} diff --git a/test/regression/2020-04-27-stp-array-names.c b/test/regression/2020-04-27-stp-array-names.c index f06e1b1a09..a256441c1d 100644 --- a/test/regression/2020-04-27-stp-array-names.c +++ b/test/regression/2020-04-27-stp-array-names.c @@ -1,4 +1,4 @@ -// RUN: %clang %s -emit-llvm %O0opt -g -c -o %t.bc +// RUN: %clang -std=c89 %s -emit-llvm %O0opt -g -c -o %t.bc // RUN: rm -rf %t.klee-out // RUN: %klee -output-dir=%t.klee-out --search=bfs --max-instructions=1000 %t.bc b; diff --git a/test/regression/2022-06-28-asm-causes-error.c b/test/regression/2022-06-28-asm-causes-error.c new file mode 100644 index 0000000000..7b60a86592 --- /dev/null +++ b/test/regression/2022-06-28-asm-causes-error.c @@ -0,0 +1,9 @@ +// RUN: %clang %s -g -emit-llvm %O0opt -c -o %t1.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --external-calls=none --output-dir=%t.klee-out %t1.bc 2>&1 | FileCheck %s + +int main(int argc, char *argv[]) { + // CHECK: 2022-06-28-asm-causes-error.c:[[@LINE+1]]: external calls disallowed (in particular inline asm) + __asm__ __volatile__("movl %eax, %eax"); + return 0; +} diff --git a/test/regression/2023-11-20-solver.c b/test/regression/2023-11-20-solver.c new file mode 100644 index 0000000000..ceef818092 --- /dev/null +++ b/test/regression/2023-11-20-solver.c @@ -0,0 +1,36 @@ +// Test case based on #1668, generates array names as part of the solver builder that collide. +// This depends on the order of expression evaluation. +// +// RUN: %clang %s -g -emit-llvm %O0opt -c -o %t1.bc +// RUN: rm -rf %t.klee-out +// RUN: %klee --output-dir=%t.klee-out -silent-klee-assume --use-branch-cache=false --use-cex-cache=false --use-independent-solver=false %t1.bc 2>&1 | FileCheck %s +#include "klee/klee.h" +#include + +int main() { + int p1 = klee_int("val"); + int p2 = klee_int("val"); + int p3 = klee_int("val"); + int p4 = klee_int("val"); + int p5 = klee_int("val"); + int p6 = klee_int("val"); + int p7 = klee_int("val"); + int p8 = klee_int("val"); + int p9 = klee_int("val"); + int p10 = klee_int("val"); + int p11 = klee_int("val"); + int p12 = klee_int("val"); + int p13 = klee_int("val"); + int p14 = klee_int("val"); + int p15 = klee_int("val"); + int cond = klee_int("val"); + klee_assume(p12 > p14); + klee_assume(p6 > p3); + // klee_assume(p2 > 0); + klee_assume(p7 != 0); + klee_assume(p11 < p14 & p15 < p13); + klee_assume(cond > p5); + klee_assume(0 > p4); + // CHECK: [[@LINE+1]]: ASSERTION FAIL + assert(p2 > p11); +} \ No newline at end of file diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index a400569b49..8c9128b4db 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -6,10 +6,11 @@ # License. See LICENSE.TXT for details. # #===------------------------------------------------------------------------===# -add_subdirectory(gen-bout) -add_subdirectory(gen-random-bout) +add_subdirectory(ktest-gen) +add_subdirectory(ktest-randgen) add_subdirectory(kleaver) add_subdirectory(klee) +add_subdirectory(klee-exec-tree) add_subdirectory(klee-replay) add_subdirectory(klee-stats) add_subdirectory(klee-zesti) diff --git a/tools/kleaver/CMakeLists.txt b/tools/kleaver/CMakeLists.txt index c079c2a4e9..c2960a7e88 100644 --- a/tools/kleaver/CMakeLists.txt +++ b/tools/kleaver/CMakeLists.txt @@ -10,10 +10,14 @@ add_executable(kleaver main.cpp ) -set(KLEE_LIBS - kleaverSolver -) +llvm_config(kleaver "${USE_LLVM_SHARED}" core support) + +target_link_libraries(kleaver PRIVATE kleaverSolver) +target_include_directories(kleaver PRIVATE ${KLEE_INCLUDE_DIRS} ${LLVM_INCLUDE_DIRS}) +target_compile_options(kleaver PRIVATE ${KLEE_COMPONENT_CXX_FLAGS}) +target_compile_definitions(kleaver PRIVATE ${KLEE_COMPONENT_CXX_DEFINES}) + +target_compile_definitions(kleaver PRIVATE ${KLEE_COMPONENT_CXX_DEFINES}) -target_link_libraries(kleaver ${KLEE_LIBS}) install(TARGETS kleaver RUNTIME DESTINATION bin) diff --git a/tools/kleaver/main.cpp b/tools/kleaver/main.cpp index 22c23422e8..42ca0c5576 100644 --- a/tools/kleaver/main.cpp +++ b/tools/kleaver/main.cpp @@ -29,12 +29,11 @@ #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/raw_ostream.h" +#include "llvm/Support/Signals.h" #include #include - - -#include "llvm/Support/Signals.h" +#include using namespace llvm; using namespace klee; @@ -200,7 +199,7 @@ static bool EvaluateInputAST(const char *Filename, if (!success) return false; - Solver *coreSolver = klee::createCoreSolver(CoreSolverToUse); + std::unique_ptr coreSolver = klee::createCoreSolver(CoreSolverToUse); if (CoreSolverToUse != DUMMY_SOLVER) { const time::Span maxCoreSolverTime(MaxCoreSolverTime); @@ -209,11 +208,11 @@ static bool EvaluateInputAST(const char *Filename, } } - Solver *S = constructSolverChain(coreSolver, - getQueryLogPath(ALL_QUERIES_SMT2_FILE_NAME), - getQueryLogPath(SOLVER_QUERIES_SMT2_FILE_NAME), - getQueryLogPath(ALL_QUERIES_KQUERY_FILE_NAME), - getQueryLogPath(SOLVER_QUERIES_KQUERY_FILE_NAME)); + std::unique_ptr S = constructSolverChain( + std::move(coreSolver), getQueryLogPath(ALL_QUERIES_SMT2_FILE_NAME), + getQueryLogPath(SOLVER_QUERIES_SMT2_FILE_NAME), + getQueryLogPath(ALL_QUERIES_KQUERY_FILE_NAME), + getQueryLogPath(SOLVER_QUERIES_KQUERY_FILE_NAME)); unsigned Index = 0; for (std::vector::iterator it = Decls.begin(), @@ -294,9 +293,7 @@ static bool EvaluateInputAST(const char *Filename, delete *it; delete P; - delete S; - - if (uint64_t queries = *theStatisticManager->getStatisticByName("Queries")) { + if (uint64_t queries = *theStatisticManager->getStatisticByName("SolverQueries")) { llvm::outs() << "--\n" << "total queries = " << queries << '\n' @@ -385,11 +382,7 @@ static bool printInputAsSMTLIBv2(const char *Filename, } int main(int argc, char **argv) { -#if LLVM_VERSION_CODE >= LLVM_VERSION(13, 0) - KCommandLine::HideOptions(llvm::cl::getGeneralCategory()); -#else - KCommandLine::HideOptions(llvm::cl::GeneralCategory); -#endif + KCommandLine::KeepOnlyCategories({&ExprCat, &SolvingCat}); bool success = true; diff --git a/tools/klee-exec-tree/CMakeLists.txt b/tools/klee-exec-tree/CMakeLists.txt new file mode 100644 index 0000000000..0c473d9293 --- /dev/null +++ b/tools/klee-exec-tree/CMakeLists.txt @@ -0,0 +1,16 @@ +#===------------------------------------------------------------------------===# +# +# The KLEE Symbolic Virtual Machine +# +# This file is distributed under the University of Illinois Open Source +# License. See LICENSE.TXT for details. +# +#===------------------------------------------------------------------------===# + +add_executable(klee-exec-tree main.cpp Tree.cpp DFSVisitor.cpp Printers.cpp) + +target_compile_features(klee-exec-tree PRIVATE cxx_std_17) +target_include_directories(klee-exec-tree PRIVATE ${KLEE_INCLUDE_DIRS} ${SQLite3_INCLUDE_DIRS}) +target_link_libraries(klee-exec-tree PUBLIC ${SQLite3_LIBRARIES}) + +install(TARGETS klee-exec-tree DESTINATION bin) diff --git a/tools/klee-exec-tree/DFSVisitor.cpp b/tools/klee-exec-tree/DFSVisitor.cpp new file mode 100644 index 0000000000..c87afc3ebf --- /dev/null +++ b/tools/klee-exec-tree/DFSVisitor.cpp @@ -0,0 +1,46 @@ +//===-- DFSVisitor.cpp ------------------------------------------*- C++ -*-===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "DFSVisitor.h" + +#include + +DFSVisitor::DFSVisitor(const Tree &tree, callbackT cb_intermediate, + callbackT cb_leaf) noexcept + : tree{tree}, + cb_intermediate{std::move(cb_intermediate)}, cb_leaf{std::move(cb_leaf)} { + run(); +} + +void DFSVisitor::run() const noexcept { + // empty tree + if (tree.nodes.size() <= 1) + return; + + std::vector> stack{ + {1, 1}}; // (id, depth) + while (!stack.empty()) { + std::uint32_t id, depth; + std::tie(id, depth) = stack.back(); + stack.pop_back(); + const auto &node = tree.nodes[id]; + + if (node.left || node.right) { + if (cb_intermediate) + cb_intermediate(id, node, depth); + if (node.right) + stack.emplace_back(node.right, depth + 1); + if (node.left) + stack.emplace_back(node.left, depth + 1); + } else { + if (cb_leaf) + cb_leaf(id, node, depth); + } + } +} diff --git a/tools/klee-exec-tree/DFSVisitor.h b/tools/klee-exec-tree/DFSVisitor.h new file mode 100644 index 0000000000..a61a3ff221 --- /dev/null +++ b/tools/klee-exec-tree/DFSVisitor.h @@ -0,0 +1,31 @@ +//===-- DFSVisitor.h --------------------------------------------*- C++ -*-===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#pragma once + +#include "Tree.h" + +#include + +/// @brief Traverses an execution tree and calls registered callbacks for +/// intermediate and leaf nodes (not the classical Visitor pattern). +class DFSVisitor { + // void _(node ID, node, depth) + using callbackT = std::function; + + const Tree &tree; + callbackT cb_intermediate; + callbackT cb_leaf; + void run() const noexcept; + +public: + DFSVisitor(const Tree &tree, callbackT cb_intermediate, + callbackT cb_leaf) noexcept; + ~DFSVisitor() = default; +}; diff --git a/tools/klee-exec-tree/Printers.cpp b/tools/klee-exec-tree/Printers.cpp new file mode 100644 index 0000000000..70a84017d5 --- /dev/null +++ b/tools/klee-exec-tree/Printers.cpp @@ -0,0 +1,266 @@ +//===-- Printers.cpp --------------------------------------------*- C++ -*-===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "Printers.h" + +#include "DFSVisitor.h" +#include "klee/Core/BranchTypes.h" +#include "klee/Core/TerminationTypes.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +// branches + +void printBranches(const Tree &tree) { + if (tree.nodes.size() <= 1) { + std::cout << "Empty tree.\n"; + return; + } + + std::unordered_map branchTypes; + + DFSVisitor visitor( + tree, + [&branchTypes](std::uint32_t id, Node node, std::uint32_t depth) { + branchTypes[std::get(node.kind)]++; + }, + nullptr); + + // sort output + std::vector> sortedBranchTypes( + branchTypes.begin(), branchTypes.end()); + std::sort(sortedBranchTypes.begin(), sortedBranchTypes.end(), + [](const auto &lhs, const auto &rhs) { + return (lhs.second > rhs.second) || + (lhs.second == rhs.second && lhs.first < rhs.first); + }); + + std::cout << "branch type,count\n"; + for (const auto &[branchType, count] : sortedBranchTypes) + std::cout << branchTypeNames[branchType] << ',' << count << '\n'; +} + +// depths + +struct DepthInfo { + std::vector depths; + std::uint32_t maxDepth{0}; + std::uint32_t noLeaves{0}; + std::uint32_t noNodes{0}; +}; + +DepthInfo getDepthInfo(const Tree &tree) { + DepthInfo I; + + DFSVisitor visitor( + tree, + [&](std::uint32_t id, Node node, std::uint32_t depth) { ++I.noNodes; }, + [&I](std::uint32_t id, Node node, std::uint32_t depth) { + ++I.noLeaves; + ++I.noNodes; + if (depth > I.maxDepth) + I.maxDepth = depth; + if (depth >= I.depths.size()) + I.depths.resize(depth + 1, 0); + ++I.depths[depth]; + }); + + return I; +} + +void printDepths(const Tree &tree) { + if (tree.nodes.size() <= 1) { + std::cout << "Empty tree.\n"; + return; + } + + const auto DI = getDepthInfo(tree); + std::cout << "depth,count\n"; + for (size_t depth = 1; depth <= DI.maxDepth; ++depth) { + auto count = DI.depths[depth]; + if (count) + std::cout << depth << ',' << count << '\n'; + } +} + +// dot + +std::array NodeColours = {"green", "orange", "red", + "blue", "darkblue", "darkgrey"}; + +std::string_view terminationTypeColour(StateTerminationType type) { + // Exit + if (type == StateTerminationType::Exit) + return NodeColours[0]; + + // Early + if ((StateTerminationType::EXIT < type && + type <= StateTerminationType::EARLY) || + (StateTerminationType::EXECERR < type && + type <= StateTerminationType::END)) { + return NodeColours[1]; + } + + // Program error + if (StateTerminationType::SOLVERERR < type && + type <= StateTerminationType::PROGERR) + return NodeColours[2]; + + // User error + if (StateTerminationType::PROGERR < type && + type <= StateTerminationType::USERERR) + return NodeColours[3]; + + // Execution/Solver error + if ((StateTerminationType::USERERR < type && + type <= StateTerminationType::EXECERR) || + (StateTerminationType::EARLY < type && + type <= StateTerminationType::SOLVERERR)) + return NodeColours[4]; + + return NodeColours[5]; +} + +void printIntermediateNode(std::uint32_t id, Node node, std::uint32_t depth) { + std::cout << 'N' << id << '[' << "tooltip=\"" + << branchTypeNames[std::get(node.kind)] << "\\n" + << "node: " << id << "\\nstate: " << node.stateID + << "\\nasm: " << node.asmLine << "\"];\n"; +} + +void printLeafNode(std::uint32_t id, Node node, std::uint32_t depth) { + const auto terminationType = std::get(node.kind); + const auto colour = terminationTypeColour(terminationType); + std::cout << 'N' << id << '[' << "tooltip=\"" + << terminationTypeNames[terminationType] << "\\n" + << "node: " << id << "\\nstate: " << node.stateID + << "\\nasm: " << node.asmLine << "\",color=" << colour << "];\n"; +} + +void printEdges(std::uint32_t id, Node node, std::uint32_t depth) { + std::cout << 'N' << id << "->{"; + if (node.left && node.right) { + std::cout << 'N' << node.left << " N" << node.right; + } else { + std::cout << 'N' << (node.left ? node.left : node.right); + } + std::cout << "};\n"; +} + +void printDOT(const Tree &tree) { + // header + // - style defaults to intermediate nodes + std::cout << "strict digraph ExecutionTree {\n" + "node[shape=point,width=0.15,color=darkgrey];\n" + "edge[color=darkgrey];\n\n"; + + // nodes + // - change colour for leaf nodes + // - attach branch and location info as tooltips + DFSVisitor nodeVisitor(tree, printIntermediateNode, printLeafNode); + + // edges + DFSVisitor edgeVisitor(tree, printEdges, nullptr); + + // footer + std::cout << '}' << std::endl; +} + +// instructions + +struct Info { + std::uint32_t noBranches{0}; + std::uint32_t noTerminations{0}; + std::map terminationTypes; +}; + +void printInstructions(const Tree &tree) { + std::map asmInfo; + + DFSVisitor visitor( + tree, + [&asmInfo](std::uint32_t id, Node node, std::uint32_t depth) { + asmInfo[node.asmLine].noBranches++; + }, + [&asmInfo](std::uint32_t id, Node node, std::uint32_t depth) { + auto &info = asmInfo[node.asmLine]; + info.noTerminations++; + info.terminationTypes[std::get(node.kind)]++; + }); + + std::cout << "asm line,branches,terminations,termination types\n"; + for (const auto &[asmLine, info] : asmInfo) { + std::cout << asmLine << ',' << info.noBranches << ',' << info.noTerminations + << ','; + std::string sep{""}; + for (const auto &[terminationType, count] : info.terminationTypes) { + std::cout << sep << terminationTypeNames[terminationType] << '(' << count + << ')'; + sep = ";"; + } + std::cout << '\n'; + } +} + +// terminations + +void printTerminations(const Tree &tree) { + if (tree.nodes.size() <= 1) { + std::cout << "Empty tree.\n"; + return; + } + + std::map terminations; + + DFSVisitor visitor( + tree, nullptr, + [&terminations](std::uint32_t id, Node node, std::uint32_t depth) { + terminations[std::get(node.kind)]++; + }); + + std::cout << "termination type,count\n"; + for (const auto &[terminationType, count] : terminations) + std::cout << terminationTypeNames[terminationType] << ',' << count << '\n'; +} + +// tree info + +void printTreeInfo(const Tree &tree) { + if (tree.nodes.size() <= 1) { + std::cout << "Empty tree.\n"; + return; + } + + const auto DI = getDepthInfo(tree); + + // determine average depth + std::uint64_t sum{0}; + for (size_t depth = 1; depth <= DI.maxDepth; ++depth) { + auto count = DI.depths[depth]; + if (count) + sum += count * depth; + } + double avgDepth = (double)sum / DI.noLeaves; + + std::cout << "nodes: " << DI.noNodes << '\n' + << "leaf nodes: " << DI.noLeaves + << (DI.noNodes && (DI.noLeaves != DI.noNodes / 2 + 1) + ? " (not a binary tree?!)" + : "") + << '\n' + << "max. depth: " << DI.maxDepth << '\n' + << "avg. depth: " << std::setprecision(2) << avgDepth << '\n'; +} diff --git a/tools/klee-exec-tree/Printers.h b/tools/klee-exec-tree/Printers.h new file mode 100644 index 0000000000..d20db4a107 --- /dev/null +++ b/tools/klee-exec-tree/Printers.h @@ -0,0 +1,30 @@ +//===-- Printers.h ----------------------------------------------*- C++ -*-===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#pragma once + +#include "Tree.h" + +/// print branch types in csv format +void printBranches(const Tree &tree); + +/// print depths in csv format +void printDepths(const Tree &tree); + +/// print tree in dot format +void printDOT(const Tree &tree); + +/// print instruction information in csv format +void printInstructions(const Tree &tree); + +/// print termination types in csv format +void printTerminations(const Tree &tree); + +/// print tree/node information +void printTreeInfo(const Tree &tree); diff --git a/tools/klee-exec-tree/Tree.cpp b/tools/klee-exec-tree/Tree.cpp new file mode 100644 index 0000000000..42b03ba24b --- /dev/null +++ b/tools/klee-exec-tree/Tree.cpp @@ -0,0 +1,209 @@ +//===-- Tree.cpp ------------------------------------------------*- C++ -*-===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "Tree.h" + +#include + +#include +#include +#include + +Tree::Tree(const std::filesystem::path &path) { + // open db + ::sqlite3 *db; + if (sqlite3_open_v2(path.c_str(), &db, SQLITE_OPEN_READONLY, nullptr) != + SQLITE_OK) { + std::cerr << "Cannot open execution tree database: " << sqlite3_errmsg(db) + << std::endl; + exit(EXIT_FAILURE); + } + + // initialise prepared statement + ::sqlite3_stmt *readStmt; + std::string query{ + "SELECT ID, stateID, leftID, rightID, asmLine, kind FROM nodes;"}; + if (sqlite3_prepare_v3(db, query.c_str(), -1, SQLITE_PREPARE_PERSISTENT, + &readStmt, nullptr) != SQLITE_OK) { + std::cerr << "Cannot prepare read statement: " << sqlite3_errmsg(db) + << std::endl; + exit(EXIT_FAILURE); + } + + ::sqlite3_stmt *maxStmt; + query = "SELECT MAX(ID) FROM nodes;"; + if (sqlite3_prepare_v3(db, query.c_str(), -1, SQLITE_PREPARE_PERSISTENT, + &maxStmt, nullptr) != SQLITE_OK) { + std::cerr << "Cannot prepare max statement: " << sqlite3_errmsg(db) + << std::endl; + exit(EXIT_FAILURE); + } + + // read max id + int rc; + std::uint64_t maxID; + if ((rc = sqlite3_step(maxStmt)) == SQLITE_ROW) { + maxID = static_cast(sqlite3_column_int(maxStmt, 0)); + } else { + std::cerr << "Cannot read maximum ID: " << sqlite3_errmsg(db) << std::endl; + exit(EXIT_FAILURE); + } + + // reserve space + nodes.resize(maxID + 1, {}); + + // read rows into vector + while ((rc = sqlite3_step(readStmt)) == SQLITE_ROW) { + const auto ID = static_cast(sqlite3_column_int(readStmt, 0)); + const auto stateID = + static_cast(sqlite3_column_int(readStmt, 1)); + const auto left = + static_cast(sqlite3_column_int(readStmt, 2)); + const auto right = + static_cast(sqlite3_column_int(readStmt, 3)); + const auto asmLine = + static_cast(sqlite3_column_int(readStmt, 4)); + const auto tmpKind = + static_cast(sqlite3_column_int(readStmt, 5)); + + // sanity checks: valid indices + if (ID == 0) { + std::cerr << "ExecutionTree DB contains illegal node ID (0)" << std::endl; + exit(EXIT_FAILURE); + } + + if (left > maxID || right > maxID) { + std::cerr << "ExecutionTree DB contains references to non-existing nodes " + "(> max. ID) in node " + << ID << std::endl; + exit(EXIT_FAILURE); + } + + if ((left == 0 && right != 0) || (left != 0 && right == 0)) { + std::cerr << "Warning: ExecutionTree DB contains ambiguous node " + "(0 vs. non-0 children): " + << ID << std::endl; + } + + // determine node kind (branch or leaf node) + decltype(Node::kind) kind; + if (left == 0 && right == 0) { + kind = static_cast(tmpKind); + } else { + kind = static_cast(tmpKind); + } + + // store children + nodes[ID] = {.left = left, + .right = right, + .stateID = stateID, + .asmLine = asmLine, + .kind = kind}; + } + + if (rc != SQLITE_DONE) { + std::cerr << "Error while reading database: " << sqlite3_errmsg(db) + << std::endl; + exit(EXIT_FAILURE); + } + + // close db + sqlite3_finalize(maxStmt); + sqlite3_finalize(readStmt); + sqlite3_close(db); + + // initialise global sets/maps and sanity check + initialiseValidTypes(); + sanityCheck(); + initialiseTypeNames(); +} + +void Tree::initialiseTypeNames() { +// branch types +#undef BTYPE +#define BTYPE(Name, I) branchTypeNames[BranchType::Name] = #Name; + BRANCH_TYPES + +// termination types +#undef TTYPE +#define TTYPE(Name, I, S) \ + terminationTypeNames[StateTerminationType::Name] = #Name; + TERMINATION_TYPES +} + +void Tree::initialiseValidTypes() { +// branch types +#undef BTYPE +#define BTYPE(Name, I) validBranchTypes.insert(BranchType::Name); + BRANCH_TYPES + +// termination types +#undef TTYPE +#define TTYPE(Name, I, S) \ + validTerminationTypes.insert(StateTerminationType::Name); + TERMINATION_TYPES +} + +void Tree::sanityCheck() { + if (nodes.size() <= 1) // [0] is unused + return; + + std::vector stack{1}; // root ID + std::unordered_set visited; + while (!stack.empty()) { + const auto id = stack.back(); + stack.pop_back(); + + if (!visited.insert(id).second) { + std::cerr + << "ExecutionTree DB contains duplicate child reference or circular " + "structure. Affected node: " + << id << std::endl; + exit(EXIT_FAILURE); + } + + const auto &node = nodes[id]; + + // default constructed "gap" in vector + if (!node.left && !node.right && + std::holds_alternative(node.kind) && + static_cast(std::get(node.kind)) == 0u) { + std::cerr << "ExecutionTree DB references undefined node. Affected node: " + << id << std::endl; + exit(EXIT_FAILURE); + } + + if (node.left || node.right) { + if (node.right) + stack.push_back(node.right); + if (node.left) + stack.push_back(node.left); + // valid branch types + assert(std::holds_alternative(node.kind)); + const auto branchType = std::get(node.kind); + if (validBranchTypes.count(branchType) == 0) { + std::cerr << "ExecutionTree DB contains unknown branch type (" + << (unsigned)static_cast(branchType) + << ") in node " << id << std::endl; + exit(EXIT_FAILURE); + } + } else { + // valid termination types + assert(std::holds_alternative(node.kind)); + const auto terminationType = std::get(node.kind); + if (validTerminationTypes.count(terminationType) == 0 || + terminationType == StateTerminationType::RUNNING) { + std::cerr << "ExecutionTree DB contains unknown termination type (" + << (unsigned)static_cast(terminationType) + << ") in node " << id << std::endl; + exit(EXIT_FAILURE); + } + } + } +} diff --git a/tools/klee-exec-tree/Tree.h b/tools/klee-exec-tree/Tree.h new file mode 100644 index 0000000000..40e04389dd --- /dev/null +++ b/tools/klee-exec-tree/Tree.h @@ -0,0 +1,53 @@ +//===-- Tree.h --------------------------------------------------*- C++ -*-===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#pragma once + +#include "klee/Core/BranchTypes.h" +#include "klee/Core/TerminationTypes.h" + +#include +#include +#include +#include +#include +#include + +inline std::unordered_set validBranchTypes; +inline std::unordered_set validTerminationTypes; +inline std::unordered_map branchTypeNames; +inline std::unordered_map + terminationTypeNames; + +///@brief A Tree node representing an ExecutionTreeNode +struct Node final { + std::uint32_t left{0}; + std::uint32_t right{0}; + std::uint32_t stateID{0}; + std::uint32_t asmLine{0}; + std::variant kind{BranchType::NONE}; +}; + +///@brief An in-memory representation of a complete execution tree +class Tree final { + /// Creates branchTypeNames and terminationTypeNames maps + static void initialiseTypeNames(); + /// Creates validBranchTypes and validTerminationTypes sets + static void initialiseValidTypes(); + /// Checks tree properties (e.g. valid branch/termination types) + void sanityCheck(); + +public: + /// sorted vector of Nodes default initialised with BranchType::NONE + std::vector nodes; // ExecutionTree node IDs start with 1! + + /// Reads complete exec-tree.db into memory + explicit Tree(const std::filesystem::path &path); + ~Tree() = default; +}; diff --git a/tools/klee-exec-tree/main.cpp b/tools/klee-exec-tree/main.cpp new file mode 100644 index 0000000000..efe28d044c --- /dev/null +++ b/tools/klee-exec-tree/main.cpp @@ -0,0 +1,68 @@ +//===-- main.cpp ------------------------------------------------*- C++ -*-===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include +#include +#include + +#include "Printers.h" + +namespace fs = std::filesystem; + +void print_usage() { + std::cout << "Usage: klee-exec-tree