From 35e1f18d33435d526ec647ebcdec07c9c84de260 Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Mon, 4 Apr 2022 13:52:34 +0100 Subject: [PATCH 001/320] Set version number to 3.0-pre --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 16793af9a0..728bf922bc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,8 +38,8 @@ include(CheckLibraryExists) ############################################################################### # Project version ############################################################################### -set(KLEE_VERSION_MAJOR 2) -set(KLEE_VERSION_MINOR 3) +set(KLEE_VERSION_MAJOR 3) +set(KLEE_VERSION_MINOR 0-pre) set(KLEE_VERSION "${KLEE_VERSION_MAJOR}.${KLEE_VERSION_MINOR}") # If a patch is needed, we can add KLEE_VERSION_PATCH From ee94e78a5bde3b491282db7acf1620c224119459 Mon Sep 17 00:00:00 2001 From: Ryan Riley Date: Thu, 14 Apr 2022 13:42:39 +0300 Subject: [PATCH 002/320] Update the Dockerfile to use the correct path for llvm-110 --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 0076f9f464..575a089910 100644 --- a/Dockerfile +++ b/Dockerfile @@ -51,7 +51,7 @@ COPY --chown=klee:klee . /tmp/klee_src/ 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/* -ENV PATH="$PATH:/tmp/llvm-90-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" ENV BASE=/tmp # Add KLEE header files to system standard include folder From 33bac31837938c0fdc143022ae8498beb57510a8 Mon Sep 17 00:00:00 2001 From: Frank Busse Date: Fri, 18 Mar 2022 09:06:48 +0000 Subject: [PATCH 003/320] use mallinfo2 if available --- CMakeLists.txt | 1 + include/klee/Config/config.h.cmin | 3 +++ lib/Support/MemoryUsage.cpp | 6 +++++- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 728bf922bc..a92c2f2e8e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -409,6 +409,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) diff --git a/include/klee/Config/config.h.cmin b/include/klee/Config/config.h.cmin index 0043111787..272b090acf 100644 --- a/include/klee/Config/config.h.cmin +++ b/include/klee/Config/config.h.cmin @@ -22,6 +22,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@ 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) From 1a1b60e82f351baf5b72bf5d7cf740e34378f0bc Mon Sep 17 00:00:00 2001 From: Gleb Popov <6yearold@gmail.com> Date: Mon, 28 Feb 2022 14:39:48 +0300 Subject: [PATCH 004/320] Make Uclibc support a runtime option, not a compile-time one. --- CMakeLists.txt | 32 +++++++------------------------ README-CMake.md | 2 -- include/klee/Config/config.h.cmin | 3 --- scripts/build/p-klee.inc | 2 -- test/CMakeLists.txt | 8 +++++++- tools/klee/main.cpp | 8 -------- 6 files changed, 14 insertions(+), 41 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a92c2f2e8e..16e33ea9fe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -507,11 +507,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() @@ -519,38 +514,25 @@ 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") +list(APPEND KLEE_COMPONENT_CXX_DEFINES + -DKLEE_UCLIBC_BCA_NAME=\"${KLEE_UCLIBC_BCA_NAME}\") +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() ################################################################################ diff --git a/README-CMake.md b/README-CMake.md index 71984e4d43..4ea57421ed 100644 --- a/README-CMake.md +++ b/README-CMake.md @@ -49,8 +49,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. diff --git a/include/klee/Config/config.h.cmin b/include/klee/Config/config.h.cmin index 272b090acf..b9fdf7c38a 100644 --- a/include/klee/Config/config.h.cmin +++ b/include/klee/Config/config.h.cmin @@ -89,9 +89,6 @@ /* 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@ diff --git a/scripts/build/p-klee.inc b/scripts/build/p-klee.inc index 4137cac027..1c7d39a564 100644 --- a/scripts/build/p-klee.inc +++ b/scripts/build/p-klee.inc @@ -34,13 +34,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 diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index a62347c18e..16d20e1cbf 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -28,10 +28,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 diff --git a/tools/klee/main.cpp b/tools/klee/main.cpp index 5984c2f9f4..c66b707db1 100644 --- a/tools/klee/main.cpp +++ b/tools/klee/main.cpp @@ -1026,13 +1026,6 @@ static void halt_via_gdb(int pid) { perror("system"); } -#ifndef SUPPORT_KLEE_UCLIBC -static void -linkWithUclibc(StringRef libDir, std::string opt_suffix, - std::vector> &modules) { - klee_error("invalid libc, no uclibc support!\n"); -} -#else static void replaceOrRenameFunction(llvm::Module *module, const char *old_name, const char *new_name) { @@ -1149,7 +1142,6 @@ linkWithUclibc(StringRef libDir, std::string opt_suffix, klee_error("error loading the fortify library '%s': %s", FortifyPath.c_str(), errorMsg.c_str()); } -#endif int main(int argc, char **argv, char **envp) { atexit(llvm_shutdown); // Call llvm_shutdown() on exit. From b4d84e54d2a72a3d3d7218b4c9ab25c9be17a8a8 Mon Sep 17 00:00:00 2001 From: Gleb Popov <6yearold@gmail.com> Date: Thu, 5 May 2022 09:36:31 +0300 Subject: [PATCH 005/320] Switch FreeBSD 12 CI to a supported release. --- .cirrus.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.cirrus.yml b/.cirrus.yml index e4bd46137a..4f26394660 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -1,7 +1,7 @@ task: freebsd_instance: matrix: - - image_family: freebsd-12-2-snap + - image_family: freebsd-12-3-snap - image_family: freebsd-13-0-snap deps_script: - sed -i.bak -e 's/quarterly/latest/' /etc/pkg/FreeBSD.conf From 5536893ba57604dac1cc2a527e3137336bb96ae6 Mon Sep 17 00:00:00 2001 From: Frank Busse Date: Thu, 17 Mar 2022 11:01:12 +0000 Subject: [PATCH 006/320] cl flags: document default values, remove dead option: --replay-keep-symbolic --- lib/Module/KModule.cpp | 2 +- tools/klee/main.cpp | 10 ++-------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/lib/Module/KModule.cpp b/lib/Module/KModule.cpp index 06b6e2f925..139149e5a0 100644 --- a/lib/Module/KModule.cpp +++ b/lib/Module/KModule.cpp @@ -74,7 +74,7 @@ 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)); diff --git a/tools/klee/main.cpp b/tools/klee/main.cpp index c66b707db1..dd839de685 100644 --- a/tools/klee/main.cpp +++ b/tools/klee/main.cpp @@ -225,12 +225,6 @@ namespace { cl::OptionCategory ReplayCat("Replaying options", "These options impact replaying of test cases."); - cl::opt - ReplayKeepSymbolic("replay-keep-symbolic", - cl::desc("Replay the test cases only by asserting " - "the bytes, not necessarily making them concrete."), - cl::cat(ReplayCat)); - cl::list ReplayKTestFile("replay-ktest-file", cl::desc("Specify a ktest file to use for replay"), @@ -277,8 +271,8 @@ namespace { cl::opt Watchdog("watchdog", - cl::desc("Use a watchdog process to enforce --max-time."), - cl::init(0), + cl::desc("Use a watchdog process to enforce --max-time (default=false)"), + cl::init(false), cl::cat(TerminationCat)); cl::opt From 0ceea620c91c53a5167af83deddc97571bb67808 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Zaoral?= Date: Thu, 21 Apr 2022 11:44:58 +0200 Subject: [PATCH 007/320] cmake: try using system installation of GTest if it's present This is a patch that I made few months ago as Fedora forbids bundling and using pieces of software provided by other packages in its repositories but forgot to upstream it at that time. [1] It has been rebased and improved so that it also reflects changes made in #1458. This should also make the compilation of unittests easier for our users as they don't need to clone googletest from GitHub anymore and just use package manager in the distro of their choice, provided that the gtest package includes a corresponding CMake module. [1]: https://src.fedoraproject.org/rpms/klee/blob/4c81b78/f/use-system-gtest.patch --- unittests/CMakeLists.txt | 39 +++++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/unittests/CMakeLists.txt b/unittests/CMakeLists.txt index 511511419e..4ee90146d5 100644 --- a/unittests/CMakeLists.txt +++ b/unittests/CMakeLists.txt @@ -107,6 +107,12 @@ else() target_include_directories(gtest BEFORE PRIVATE ${LLVM_INCLUDE_DIRS}) # we cannot disable gtest_main, but will not use it later target_include_directories(gtest_main BEFORE PRIVATE ${LLVM_INCLUDE_DIRS}) + endif() + + # try using system installation of GTest instead + find_package(GTest QUIET) + if (GTest_FOUND) + message(STATUS "Found GTest ${GTest_VERSION}") else() # try to find Google Test, as GTEST_SRC_DIR is not manually specified find_path(GTEST_SRC_DIR @@ -124,7 +130,7 @@ else() endif() endif() - if (NOT TARGET gtest) + if (NOT TARGET gtest AND NOT GTest_FOUND) # building from GTEST_SRC_DIR, not from LLVM's utils directory find_path(GTEST_INCLUDE_DIR "gtest/gtest.h" @@ -153,9 +159,11 @@ else() add_vanilla_googletest_subdirectory(${GTEST_SRC_DIR}) endif() - # build Google Test with KLEE's defines and compile flags - target_compile_definitions(gtest PRIVATE ${KLEE_COMPONENT_CXX_DEFINES}) - target_compile_options(gtest PRIVATE ${KLEE_COMPONENT_CXX_FLAGS}) + if (NOT GTest_FOUND) + # build Google Test with KLEE's defines and compile flags + target_compile_definitions(gtest PRIVATE ${KLEE_COMPONENT_CXX_DEFINES}) + target_compile_options(gtest PRIVATE ${KLEE_COMPONENT_CXX_FLAGS}) + endif() endif() @@ -168,18 +176,33 @@ define_property(GLOBAL FULL_DOCS "KLEE unit tests" ) -if (NOT IS_DIRECTORY "${GTEST_INCLUDE_DIR}") +if (NOT GTest_FOUND) + # GTEST_INCLUDE_DIR is defined only when we build from sources. + if (NOT IS_DIRECTORY "${GTEST_INCLUDE_DIR}") + message(FATAL_ERROR + "Cannot find Google Test include directory \"${GTEST_INCLUDE_DIR}\"") + endif() + message(STATUS "GTEST_INCLUDE_DIR: ${GTEST_INCLUDE_DIR}") +endif() + +if (TARGET gtest) + set(GTEST_TARGET_NAME gtest) +elseif (TARGET GTest::gtest) + set(GTEST_TARGET_NAME GTest::gtest) +elseif (TARGET GTest::GTest) + set(GTEST_TARGET_NAME GTest::GTest) +else() message(FATAL_ERROR - "Cannot find Google Test include directory \"${GTEST_INCLUDE_DIR}\"") + "Cannot determine name of the Google Test CMake target (tried 'gtest', \ + 'GTest::gtest' and 'GTest::GTest')") endif() -message(STATUS "GTEST_INCLUDE_DIR: ${GTEST_INCLUDE_DIR}") add_library(unittest_main) target_sources(unittest_main PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/TestMain.cpp") klee_get_llvm_libs(UNITTEST_MAIN_LIBS Support) target_link_libraries(unittest_main PUBLIC - gtest + ${GTEST_TARGET_NAME} PRIVATE ${UNITTEST_MAIN_LIBS} From 3515cb00c750ec5f081d4d0e3a1c386080ccda7e Mon Sep 17 00:00:00 2001 From: Frank Busse Date: Fri, 25 Mar 2022 14:05:56 +0000 Subject: [PATCH 008/320] tests: make function pointer tests more robust --- test/Feature/FunctionAliasExit.c | 4 +++- test/Feature/FunctionPointer.c | 6 +++--- 2 files changed, 6 insertions(+), 4 deletions(-) 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!"); } From f94309c1fcbbd77a210e66fe9d1d26e83a948a8a Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Fri, 25 Mar 2022 22:00:51 +0000 Subject: [PATCH 009/320] Renamed gen-bout to ktest-gen --- tools/CMakeLists.txt | 2 +- tools/{gen-bout => ktest-gen}/CMakeLists.txt | 8 ++++---- tools/{gen-bout/gen-bout.cpp => ktest-gen/ktest-gen.cpp} | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) rename tools/{gen-bout => ktest-gen}/CMakeLists.txt (72%) rename tools/{gen-bout/gen-bout.cpp => ktest-gen/ktest-gen.cpp} (99%) diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index a400569b49..4e561c0830 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -6,7 +6,7 @@ # License. See LICENSE.TXT for details. # #===------------------------------------------------------------------------===# -add_subdirectory(gen-bout) +add_subdirectory(ktest-gen) add_subdirectory(gen-random-bout) add_subdirectory(kleaver) add_subdirectory(klee) diff --git a/tools/gen-bout/CMakeLists.txt b/tools/ktest-gen/CMakeLists.txt similarity index 72% rename from tools/gen-bout/CMakeLists.txt rename to tools/ktest-gen/CMakeLists.txt index 07cfb3c721..084d551d69 100644 --- a/tools/gen-bout/CMakeLists.txt +++ b/tools/ktest-gen/CMakeLists.txt @@ -6,12 +6,12 @@ # License. See LICENSE.TXT for details. # #===------------------------------------------------------------------------===# -add_executable(gen-bout - gen-bout.cpp +add_executable(ktest-gen + ktest-gen.cpp ) set(KLEE_LIBS kleeBasic) -target_link_libraries(gen-bout ${KLEE_LIBS}) +target_link_libraries(ktest-gen ${KLEE_LIBS}) -install(TARGETS gen-bout RUNTIME DESTINATION bin) +install(TARGETS ktest-gen RUNTIME DESTINATION bin) diff --git a/tools/gen-bout/gen-bout.cpp b/tools/ktest-gen/ktest-gen.cpp similarity index 99% rename from tools/gen-bout/gen-bout.cpp rename to tools/ktest-gen/ktest-gen.cpp index f8fa5d4e14..a9f4be7c23 100644 --- a/tools/gen-bout/gen-bout.cpp +++ b/tools/ktest-gen/ktest-gen.cpp @@ -1,4 +1,4 @@ -//===-- gen-bout.cpp --------------------------------------------*- C++ -*-===// +//===-- ktest-gen.cpp -------------------------------------------*- C++ -*-===// // // The KLEE Symbolic Virtual Machine // From c0d6062f3c9620b6a612938866cb24b17ec7daa9 Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Fri, 25 Mar 2022 22:16:50 +0000 Subject: [PATCH 010/320] Updated klee-zesti to use ktest-gen instead of gen-bout --- tools/klee-zesti/klee-zesti | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tools/klee-zesti/klee-zesti b/tools/klee-zesti/klee-zesti index c43314036d..f5f958b214 100755 --- a/tools/klee-zesti/klee-zesti +++ b/tools/klee-zesti/klee-zesti @@ -14,23 +14,23 @@ WARNING this script is not equivalent to ZESTI in ICSE 2012. It just provides a KLEE="klee" -GEN_BOUT="gen-bout" +KTEST_GEN="ktest-gen" def find_klee_bin_dir(): global KLEE - global GEN_BOUT + global KTEST_GEN bin_dir = os.path.dirname(os.path.realpath(__file__)) KLEE = bin_dir + "/klee" - GEN_BOUT = bin_dir + "/gen-bout" + KTEST_GEN = bin_dir + "/ktest-gen" if not os.path.isfile(KLEE): print("WARNING can't find klee at " + KLEE) KLEE= shutil.which("klee") print("Using klee in PATH", KLEE) - if not os.path.isfile(GEN_BOUT): - print("WARNING can't find gen-bout at " + GEN_BOUT) - GEN_BOUT= shutil.which("gen-bout") - print("Using gen-bout in PATH", GEN_BOUT) - if GEN_BOUT is None or KLEE is None: + if not os.path.isfile(KTEST_GEN): + print("WARNING can't find ktest-gen at " + KTEST_GEN) + KTEST_GEN= shutil.which("ktest-gen") + print("Using ktest-gen in PATH", KTEST_GEN) + if KTEST_GEN is None or KLEE is None: print("Failed to find KLEE at this script location or in PATH. Quitting ...") sys.exit(1) print("Using", KLEE) @@ -94,7 +94,7 @@ def prog_args_to_posix(prog_args): def create_ktest_file(gen_out_args, tmpdir): out_file=tmpdir + "/test.ktest" - subprocess.run([GEN_BOUT, "--bout-file", out_file] + gen_out_args, check=True) + subprocess.run([KTEST_GEN, "--bout-file", out_file] + gen_out_args, check=True) return out_file From 80d67650524c92a378227d0f842a9e9a17fee599 Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Fri, 25 Mar 2022 22:17:30 +0000 Subject: [PATCH 011/320] Updated tests to use ktest-gen instead of gen-bout --- test/CMakeLists.txt | 2 +- test/Replay/klee-replay/{GenBout.c => KTestGen.c} | 2 +- test/lit.cfg | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename test/Replay/klee-replay/{GenBout.c => KTestGen.c} (90%) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 16d20e1cbf..42b28a7ca7 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -151,7 +151,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-replay kleeRuntest ktest-gen gen-random-bout COMMENT "Running system tests" USES_TERMINAL ) 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/lit.cfg b/test/lit.cfg index 0d7aa1ed55..c44575c03c 100644 --- a/test/lit.cfg +++ b/test/lit.cfg @@ -136,7 +136,7 @@ subs = [ ('%kleaver', 'kleaver', kleaver_extra_params), ('%klee','klee', klee_extra_params), ('%ktest-tool', 'ktest-tool', ''), ('%gen-random-bout', 'gen-random-bout', ''), - ('%gen-bout', 'gen-bout', '') + ('%ktest-gen', 'ktest-gen', '') ] for s,basename,extra_args in subs: config.substitutions.append( From d704b59fa0082d1783dd4c921d87cddad6620d78 Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Fri, 25 Mar 2022 22:24:05 +0000 Subject: [PATCH 012/320] Renamed gen-random-bout to ktest-randgen --- tools/CMakeLists.txt | 2 +- tools/{gen-random-bout => ktest-randgen}/CMakeLists.txt | 8 ++++---- .../ktest-randgen.cpp} | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) rename tools/{gen-random-bout => ktest-randgen}/CMakeLists.txt (69%) rename tools/{gen-random-bout/gen-random-bout.cpp => ktest-randgen/ktest-randgen.cpp} (98%) diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 4e561c0830..b641885cc1 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -7,7 +7,7 @@ # #===------------------------------------------------------------------------===# add_subdirectory(ktest-gen) -add_subdirectory(gen-random-bout) +add_subdirectory(ktest-randgen) add_subdirectory(kleaver) add_subdirectory(klee) add_subdirectory(klee-replay) diff --git a/tools/gen-random-bout/CMakeLists.txt b/tools/ktest-randgen/CMakeLists.txt similarity index 69% rename from tools/gen-random-bout/CMakeLists.txt rename to tools/ktest-randgen/CMakeLists.txt index c4596bc99f..8b15c275c1 100644 --- a/tools/gen-random-bout/CMakeLists.txt +++ b/tools/ktest-randgen/CMakeLists.txt @@ -6,12 +6,12 @@ # License. See LICENSE.TXT for details. # #===------------------------------------------------------------------------===# -add_executable(gen-random-bout - gen-random-bout.cpp +add_executable(ktest-randgen + ktest-randgen.cpp ) set(KLEE_LIBS kleeBasic) -target_link_libraries(gen-random-bout ${KLEE_LIBS}) +target_link_libraries(ktest-randgen ${KLEE_LIBS}) -install(TARGETS gen-random-bout RUNTIME DESTINATION bin) +install(TARGETS ktest-randgen RUNTIME DESTINATION bin) diff --git a/tools/gen-random-bout/gen-random-bout.cpp b/tools/ktest-randgen/ktest-randgen.cpp similarity index 98% rename from tools/gen-random-bout/gen-random-bout.cpp rename to tools/ktest-randgen/ktest-randgen.cpp index 5fb4fe2743..04cf53e66d 100644 --- a/tools/gen-random-bout/gen-random-bout.cpp +++ b/tools/ktest-randgen/ktest-randgen.cpp @@ -1,4 +1,4 @@ -//===-- gen-random-bout.cpp -------------------------------------*- C++ -*-===// +//===-- ktest-randgen.cpp ---------------------------------------*- C++ -*-===// // // The KLEE Symbolic Virtual Machine // @@ -94,7 +94,7 @@ static void push_range(KTest *b, const char *name, unsigned value) { } void create_stat(size_t size, struct stat *s) { - char filename_template[] = "/tmp/klee-gen-random-bout-XXXXXX"; + char filename_template[] = "/tmp/ktest-randgen-XXXXXX"; char *filename; int fd; unsigned char *buf; From fa5367b92e379886eda68d8c754d1abcf1c5aa66 Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Fri, 25 Mar 2022 22:29:36 +0000 Subject: [PATCH 013/320] Updated tests to use ktest-randgen instead of gen-random-bout --- test/CMakeLists.txt | 2 +- .../klee-replay/{GenRandomBout.c => KTestRandGen.c} | 10 +++++----- test/lit.cfg | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) rename test/Replay/klee-replay/{GenRandomBout.c => KTestRandGen.c} (82%) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 42b28a7ca7..6a625935e0 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -151,7 +151,7 @@ file(GENERATE add_custom_target(systemtests COMMAND "${LIT_TOOL}" ${LIT_ARGS} "${CMAKE_CURRENT_BINARY_DIR}" - DEPENDS klee kleaver klee-replay kleeRuntest ktest-gen gen-random-bout + DEPENDS klee kleaver klee-replay kleeRuntest ktest-gen ktest-randgen COMMENT "Running system tests" USES_TERMINAL ) 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/lit.cfg b/test/lit.cfg index c44575c03c..cd56527c51 100644 --- a/test/lit.cfg +++ b/test/lit.cfg @@ -135,7 +135,7 @@ subs = [ ('%kleaver', 'kleaver', kleaver_extra_params), ('%klee-zesti', 'klee-zesti', ''), ('%klee','klee', klee_extra_params), ('%ktest-tool', 'ktest-tool', ''), - ('%gen-random-bout', 'gen-random-bout', ''), + ('%ktest-randgen', 'ktest-randgen', ''), ('%ktest-gen', 'ktest-gen', '') ] for s,basename,extra_args in subs: From 5138eba863665fea1548eb769f6e3910c69ec604 Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Tue, 5 Apr 2022 10:18:51 +0100 Subject: [PATCH 014/320] Utilise Docker build artifact cache for more components --- Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 575a089910..a09ebe1b3e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,10 @@ 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/tcmalloc:2.9.1_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 klee/z3:4.8.15_ubuntu_bionic-20200807 as z3_base +FROM klee/libcxx:110_ubuntu_bionic-20200807 as libcxx_base FROM llvm_base as intermediate COPY --from=gtest_base /tmp /tmp/ COPY --from=uclibc_base /tmp /tmp/ From 862e0871bcc50eff526f20582f1855bf5788b471 Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Tue, 5 Apr 2022 10:20:14 +0100 Subject: [PATCH 015/320] Switch to newer KLEE uClibc release Instead of using a branch that doesn't allow build artifact caching, use the newer released version instead. --- .github/workflows/build.yaml | 2 +- Dockerfile | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index ea21f1ee40..7e7abd27f1 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -24,7 +24,7 @@ env: SOLVERS: STP:Z3 STP_VERSION: 2.3.3 TCMALLOC_VERSION: 2.7 - UCLIBC_VERSION: klee_uclibc_v1.2 + UCLIBC_VERSION: klee_uclibc_v1.3 USE_TCMALLOC: 1 USE_LIBCXX: 1 Z3_VERSION: 4.8.14 diff --git a/Dockerfile b/Dockerfile index a09ebe1b3e..33c822b7cb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ 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/uclibc:klee_uclibc_v1.3_110_ubuntu_bionic-20200807 as uclibc_base FROM klee/tcmalloc:2.9.1_ubuntu_bionic-20200807 as tcmalloc_base FROM klee/stp:2.3.3_ubuntu_bionic-20200807 as stp_base FROM klee/z3:4.8.15_ubuntu_bionic-20200807 as z3_base @@ -23,7 +23,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 From fd19e44a5cab0d914864f5d49289fa63b50b53b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Zaoral?= Date: Sat, 11 Jun 2022 13:31:51 +0200 Subject: [PATCH 016/320] tests: invoke LLVM tools through their corresponding macros --- test/Feature/BitcastAlias.ll | 2 +- test/Feature/BitcastAliasMD2U.ll | 2 +- test/Feature/ConstantArray.ll | 2 +- test/Feature/ConstantStruct.ll | 2 +- test/Feature/GetElementPtr.ll | 2 +- test/Feature/GlobalVariable.ll | 2 +- test/Feature/ImpliedValue.c.failing | 4 ++-- test/Feature/InsertExtractValue.ll | 2 +- test/Feature/asm_lifting.ll | 2 +- test/Intrinsics/IntrinsicTrap.ll | 2 +- test/Intrinsics/Overflow.ll | 2 +- test/Intrinsics/OverflowMul.ll | 2 +- test/Intrinsics/Saturating.ll | 2 +- test/lit.cfg | 4 ++++ test/regression/2007-08-01-bool-zext-in-call.ll | 2 +- test/regression/2007-08-16-invalid-constant-value.c | 4 ++-- test/regression/2018-10-28-alias-to-alias.ll | 2 +- test/regression/2018-10-30-llvm-pr39177.ll | 2 +- test/regression/2019-08-01-trap-instruction.ll | 4 ++-- test/regression/2019-08-02-missing-switch-default.ll | 2 +- 20 files changed, 26 insertions(+), 22 deletions(-) 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/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/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/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/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/asm_lifting.ll b/test/Feature/asm_lifting.ll index 4f414eeb30..d99db0cfe3 100644 --- a/test/Feature/asm_lifting.ll +++ b/test/Feature/asm_lifting.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/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/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..15aad409de 100644 --- a/test/Intrinsics/Saturating.ll +++ b/test/Intrinsics/Saturating.ll @@ -1,5 +1,5 @@ ; 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/lit.cfg b/test/lit.cfg index cd56527c51..84ad0c7922 100644 --- a/test/lit.cfg +++ b/test/lit.cfg @@ -103,6 +103,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( 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-16-invalid-constant-value.c b/test/regression/2007-08-16-invalid-constant-value.c index 28f8126894..c49357f8c7 100644 --- a/test/regression/2007-08-16-invalid-constant-value.c +++ b/test/regression/2007-08-16-invalid-constant-value.c @@ -1,7 +1,7 @@ // 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: %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 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..027d0d3014 100644 --- a/test/regression/2018-10-30-llvm-pr39177.ll +++ b/test/regression/2018-10-30-llvm-pr39177.ll @@ -1,5 +1,5 @@ ; RUN: rm -rf %t.klee-out -; RUN: llvm-as -f %s -o - | %klee -optimize -output-dir=%t.klee-out | FileCheck %s +; RUN: %llvmas -f %s -o - | %klee -optimize -output-dir=%t.klee-out | 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 From f57c93a7e38db4c6d87cfc88c0e1d4f4112c065f Mon Sep 17 00:00:00 2001 From: Chaoqi Zhang Date: Wed, 25 May 2022 23:56:18 +0800 Subject: [PATCH 017/320] Update SpecialFunctionHandler.cpp use size() to get N in bind(), just like the way in prepare(). --- lib/Core/SpecialFunctionHandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Core/SpecialFunctionHandler.cpp b/lib/Core/SpecialFunctionHandler.cpp index e2ff9cb203..2b788d60f2 100644 --- a/lib/Core/SpecialFunctionHandler.cpp +++ b/lib/Core/SpecialFunctionHandler.cpp @@ -204,7 +204,7 @@ void SpecialFunctionHandler::prepare( } void SpecialFunctionHandler::bind() { - unsigned N = sizeof(handlerInfo)/sizeof(handlerInfo[0]); + unsigned N = size(); for (unsigned i=0; i Date: Fri, 22 Apr 2022 17:17:37 +0100 Subject: [PATCH 018/320] .err files: minor readability changes to stack trace output --- lib/Core/ExecutionState.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/Core/ExecutionState.cpp b/lib/Core/ExecutionState.cpp index 54fe752e88..5231f7fb71 100644 --- a/lib/Core/ExecutionState.cpp +++ b/lib/Core/ExecutionState.cpp @@ -327,18 +327,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 != "") From d677b57d384a66781aca9c897e440f7e23ab44c4 Mon Sep 17 00:00:00 2001 From: Frank Busse Date: Fri, 22 Apr 2022 17:22:16 +0100 Subject: [PATCH 019/320] tests: add StackTraceOutput.c --- test/Feature/StackTraceOutput.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 test/Feature/StackTraceOutput.c diff --git a/test/Feature/StackTraceOutput.c b/test/Feature/StackTraceOutput.c new file mode 100644 index 0000000000..3d4e3c510e --- /dev/null +++ b/test/Feature/StackTraceOutput.c @@ -0,0 +1,29 @@ +// REQUIRES: geq-llvm-7.0 +// 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; + assert(0); + // CHECK-DISCARD: {{.*}} in foo(symbolic, 12) at {{.*}}.c:18 + // CHECK-DISCARD: {{.*}} in main() at {{.*}}.c:28 + // CHECK-NODISCARD: {{.*}} in foo(i=symbolic, k=12) at {{.*}}.c:18 + // CHECK-NODISCARD: {{.*}} in main() at {{.*}}.c:28 +} + +int main(void) { + int i, k=12; + klee_make_symbolic(&i, sizeof(i), "i"); + foo(i,k); +} From 63fe39a9d0ce842ef13d2736efe31d5661f63829 Mon Sep 17 00:00:00 2001 From: m-davis Date: Sat, 26 Mar 2022 00:49:50 -0500 Subject: [PATCH 020/320] Spelling Fixes --- lib/Core/ImpliedValue.cpp | 2 +- lib/Solver/FastCexSolver.cpp | 148 +++++++++--------- lib/Solver/IndependentSolver.cpp | 2 +- lib/Solver/Solver.cpp | 2 +- test/Expr/ReadExprConsistency.c | 2 +- test/Replay/klee-replay/KleeZesti.c | 2 +- .../libkleeruntest/replay_klee_prefer_cex.c | 4 +- test/Runtime/POSIX/SymFileConsistency.c | 2 +- test/regression/2014-09-13-debug-info.c | 2 +- unittests/Expr/ArrayExprTest.cpp | 4 +- 10 files changed, 86 insertions(+), 84 deletions(-) diff --git a/lib/Core/ImpliedValue.cpp b/lib/Core/ImpliedValue.cpp index 4baec51299..6e5a52dc72 100644 --- a/lib/Core/ImpliedValue.cpp +++ b/lib/Core/ImpliedValue.cpp @@ -134,7 +134,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/Solver/FastCexSolver.cpp b/lib/Solver/FastCexSolver.cpp index a45a8f17e4..382774ce60 100644 --- a/lib/Solver/FastCexSolver.cpp +++ b/lib/Solver/FastCexSolver.cpp @@ -440,17 +440,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 +495,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 +522,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 +541,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 +564,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 +579,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 +590,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 +600,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 +619,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 +653,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 +685,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 +696,7 @@ class CexData { // range? range = CexValueData(0, value - 1); } - propogatePossibleValues(be->right, range); + propagatePossibleValues(be->right, range); } } else { // XXX what now @@ -705,7 +708,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 +728,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 +760,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 +791,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 +811,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 +825,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 +888,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 +905,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 +946,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 +993,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 +1058,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 +1070,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 +1102,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 +1112,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); diff --git a/lib/Solver/IndependentSolver.cpp b/lib/Solver/IndependentSolver.cpp index ed36816c3a..812aefb6c7 100644 --- a/lib/Solver/IndependentSolver.cpp +++ b/lib/Solver/IndependentSolver.cpp @@ -442,7 +442,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); diff --git a/lib/Solver/Solver.cpp b/lib/Solver/Solver.cpp index 12cfb180b0..5fe973fe38 100644 --- a/lib/Solver/Solver.cpp +++ b/lib/Solver/Solver.cpp @@ -101,7 +101,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/test/Expr/ReadExprConsistency.c b/test/Expr/ReadExprConsistency.c index f71483ba48..9b794ee546 100644 --- a/test/Expr/ReadExprConsistency.c +++ b/test/Expr/ReadExprConsistency.c @@ -8,7 +8,7 @@ /* 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 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_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/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/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/unittests/Expr/ArrayExprTest.cpp b/unittests/Expr/ArrayExprTest.cpp index c7f3806a7b..bfc472199e 100644 --- a/unittests/Expr/ArrayExprTest.cpp +++ b/unittests/Expr/ArrayExprTest.cpp @@ -56,8 +56,8 @@ TEST(ArrayExprTest, HashCollisions) { std::vector value = {6, 0, 0, 0}; std::vector> values = {value}; - std::vector assigmentArrays = {symArray}; - auto a = std::make_unique(assigmentArrays, values, + std::vector assignmentArrays = {symArray}; + auto a = std::make_unique(assignmentArrays, values, /*_allowFreeValues=*/true); EXPECT_NE(a->evaluate(updatedRead), a->evaluate(firstRead)); From 790dd728a67b36e3006f83d89fd6fef357bc3868 Mon Sep 17 00:00:00 2001 From: kt218 <93427283+kt218@users.noreply.github.com> Date: Fri, 17 Jun 2022 13:07:39 +0100 Subject: [PATCH 021/320] Update Dockerfile to install tabulate Install tabulate package for klee-stats to work when used within KLEE Docker. --- Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Dockerfile b/Dockerfile index 33c822b7cb..567dd63dfc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -51,6 +51,9 @@ COPY --chown=klee:klee . /tmp/klee_src/ 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/* +# Install tabulate for klee-stats +RUN pip3 install tabulate + ENV PATH="$PATH:/tmp/llvm-110-install_O_D_A/bin:/home/klee/klee_build/bin" ENV BASE=/tmp From 19f40fefaba602d1db2e26ad77df1a85a1a69c21 Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Mon, 20 Jun 2022 13:55:34 +0100 Subject: [PATCH 022/320] Use `klee` user to install system dependencies As a follow-up to recent build script enhancements (https://github.com/klee/klee/commit/818275b7249250780ddd5ed021cae64288514270), finally build KLEE inside of the Docker image as artefact owned by the `klee` user, including user-installed Python3 modules. This fixes issues with non-writable build directories. In addition `$HOME/.local/bin` directory is made available in search path. --- Dockerfile | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/Dockerfile b/Dockerfile index 567dd63dfc..6926b133f8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -47,25 +47,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/* -# Install tabulate for klee-stats -RUN pip3 install tabulate -ENV PATH="$PATH:/tmp/llvm-110-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 # 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 From 42bca7ee2db48b0fc080cdb4af6a05cb666efb8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Zaoral?= Date: Wed, 15 Jun 2022 21:17:46 +0200 Subject: [PATCH 023/320] Intrinsics: Add support for @llvm.f{ma,muladd}.f* --- lib/Core/Executor.cpp | 35 +++++++++++++++++++++ lib/Module/IntrinsicCleaner.cpp | 2 ++ test/Intrinsics/FMulAdd.ll | 55 +++++++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 test/Intrinsics/FMulAdd.ll diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp index 1a16d389ed..a2928864e2 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -1680,6 +1680,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())) diff --git a/lib/Module/IntrinsicCleaner.cpp b/lib/Module/IntrinsicCleaner.cpp index 7836c2028d..adef513ed1 100644 --- a/lib/Module/IntrinsicCleaner.cpp +++ b/lib/Module/IntrinsicCleaner.cpp @@ -66,6 +66,8 @@ bool IntrinsicCleanerPass::runOnBasicBlock(BasicBlock &b, Module &M) { case Intrinsic::vastart: case Intrinsic::vaend: case Intrinsic::fabs: + case Intrinsic::fma: + case Intrinsic::fmuladd: #if LLVM_VERSION_CODE >= LLVM_VERSION(7, 0) case Intrinsic::fshr: case Intrinsic::fshl: 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) From 44ebccb0529e2fd9f063bf544c8535104b9b0419 Mon Sep 17 00:00:00 2001 From: Saveliy Grigoryev Date: Mon, 27 Jun 2022 17:04:39 +0300 Subject: [PATCH 024/320] Fix error with empty EntryPoint --- test/Feature/EntryPoint.c | 10 ++++++++-- tools/klee/main.cpp | 4 ++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/test/Feature/EntryPoint.c b/test/Feature/EntryPoint.c index 8265973350..8a10d36fff 100644 --- a/test/Feature/EntryPoint.c +++ b/test/Feature/EntryPoint.c @@ -1,11 +1,17 @@ // 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: %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; } + +// CHECK-EMPTY: KLEE: ERROR: entry-point cannot be empty diff --git a/tools/klee/main.cpp b/tools/klee/main.cpp index dd839de685..3b0731c80f 100644 --- a/tools/klee/main.cpp +++ b/tools/klee/main.cpp @@ -1151,6 +1151,10 @@ int main(int argc, char **argv, char **envp) { parseArguments(argc, argv); sys::PrintStackTraceOnErrorSignal(argv[0]); + if (EntryPoint.empty()) { + klee_error("entry-point cannot be empty"); + } + if (Watchdog) { if (MaxTime.empty()) { klee_error("--watchdog used without --max-time"); From 885997a9841ab666ccf1f1b573b980aa8c84a339 Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Sat, 25 Jun 2022 21:15:57 +0100 Subject: [PATCH 025/320] Define stat64 to be stat on MacOS. This fixes compilation on more recent macOS versions, where stat64 is not defined anymore. --- runtime/POSIX/fd.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/runtime/POSIX/fd.h b/runtime/POSIX/fd.h index a5e15c9bcf..39307cebc6 100644 --- a/runtime/POSIX/fd.h +++ b/runtime/POSIX/fd.h @@ -23,7 +23,12 @@ #include #endif +#include + #ifdef __APPLE__ +#ifndef stat64 +#define stat64 stat +#endif #include #endif #ifdef __FreeBSD__ From 95a9886b32c1b0086b60f828f3f2c139dd863211 Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Fri, 24 Jun 2022 15:27:25 +0100 Subject: [PATCH 026/320] Implement getArrayForUpdate iteratively --- lib/Solver/MetaSMTBuilder.h | 39 ++++++++++++++++++++++++------------- lib/Solver/STPBuilder.cpp | 38 ++++++++++++++++++++++-------------- lib/Solver/Z3Builder.cpp | 34 ++++++++++++++++++++------------ 3 files changed, 70 insertions(+), 41 deletions(-) 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/STPBuilder.cpp b/lib/Solver/STPBuilder.cpp index 13a425135c..9a38183d6a 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 @@ -465,26 +466,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/Z3Builder.cpp b/lib/Solver/Z3Builder.cpp index 950bd87976..e19371585c 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; @@ -427,22 +428,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, From 7a6100d388e18ba58daef45f3590fe7f218c9ef0 Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Mon, 27 Jun 2022 22:24:27 +0100 Subject: [PATCH 027/320] Remove the CI target metaSMT(Boolector). metaSMT(STP) already runs the test suite with all solvers supported by metaSMT, so the extra target provides marginal benefits. --- .github/workflows/build.yaml | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 7e7abd27f1..78fbc8e311 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -47,8 +47,7 @@ jobs: "UBSan", "MSan", "Z3 only", - "metaSMT STP", - "metaSMT Boolector", + "metaSMT", "STP master", "Latest klee-uclibc", "Asserts enabled", @@ -105,16 +104,11 @@ jobs: env: SOLVERS: Z3 # Test just using metaSMT - - name: "metaSMT STP" + - name: "metaSMT" env: 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: From 71b0e70464ceb9105535b796feede63c5800252c Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Tue, 28 Jun 2022 22:52:33 +0100 Subject: [PATCH 028/320] forward ci environment variables used to exercise metasmt backends into the docker container --- scripts/build/run-tests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build/run-tests.sh b/scripts/build/run-tests.sh index 76500da79b..7eb8b4fab4 100755 --- a/scripts/build/run-tests.sh +++ b/scripts/build/run-tests.sh @@ -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") From b8539333fdaf32b0f4911d6569ad56a0443190bb Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Tue, 28 Jun 2022 15:07:34 +0100 Subject: [PATCH 029/320] Perform coverage analysis for z3 as well --- .github/workflows/build.yaml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 78fbc8e311..0dfd089153 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -165,6 +165,19 @@ jobs: Coverage: runs-on: ubuntu-latest + strategy: + matrix: + name: [ + "STP", + "Z3", + ] + include: + - name: "STP" + env: + SOLVERS: STP + - name: "Z3" + env: + SOLVERS: Z3 env: ENABLE_OPTIMIZED: 0 COVERAGE: 1 @@ -172,6 +185,7 @@ jobs: - name: Checkout KLEE source code uses: actions/checkout@v2 - 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 From 6cc8ee707c1b4337120aa2972e2ad13a4861bbc3 Mon Sep 17 00:00:00 2001 From: Frank Busse Date: Mon, 13 Jun 2022 10:42:51 +0100 Subject: [PATCH 030/320] remove LLVM < 9 --- .github/workflows/build.yaml | 12 -- CMakeLists.txt | 14 +-- cmake/workaround_llvm_pr39177.cmake | 133 --------------------- cmake/workaround_llvm_pr39177.ll | 18 --- include/klee/Config/config.h.cmin | 3 - include/klee/Support/Casting.h | 7 -- include/klee/Support/ModuleUtil.h | 20 +--- lib/Core/Executor.cpp | 38 ------ lib/Core/ExternalDispatcher.cpp | 10 -- lib/Core/StatsTracker.cpp | 17 +-- lib/Module/CMakeLists.txt | 4 - lib/Module/IntrinsicCleaner.cpp | 12 -- lib/Module/KModule.cpp | 22 ---- lib/Module/ModuleUtil.cpp | 16 +-- lib/Module/Optimize.cpp | 14 +-- lib/Module/Passes.h | 12 -- lib/Module/RaiseAsm.cpp | 4 - lib/Module/WorkaroundLLVMPR39177.cpp | 92 -------------- lib/Solver/SolverCmdLine.cpp | 5 - lib/Support/CompressionStream.cpp | 5 - lib/Support/FileHandling.cpp | 6 - scripts/build/p-clang-linux-ubuntu.inc | 6 +- scripts/build/p-clang-linux.inc | 10 +- scripts/build/p-klee.inc | 3 - scripts/build/p-llvm-linux-ubuntu.inc | 20 +--- scripts/build/p-sanitizer-linux-ubuntu.inc | 6 +- scripts/build/p-sanitizer-linux.inc | 8 +- scripts/build/patches/llvm60.patch | 13 -- scripts/build/patches/llvm70.patch | 13 -- scripts/build/patches/llvm80.patch | 12 -- test/Feature/FNeg.ll | 1 - test/Intrinsics/IsConstant.ll | 1 - test/Intrinsics/Saturating.ll | 1 - test/Intrinsics/fshlr.ll | 1 - test/Intrinsics/objectsize.leq80.ll | 40 ------- test/Intrinsics/objectsize.ll | 1 - test/lit.cfg | 2 +- tools/klee/main.cpp | 8 -- 38 files changed, 23 insertions(+), 587 deletions(-) delete mode 100644 cmake/workaround_llvm_pr39177.cmake delete mode 100644 cmake/workaround_llvm_pr39177.ll delete mode 100644 lib/Module/WorkaroundLLVMPR39177.cpp delete mode 100644 scripts/build/patches/llvm60.patch delete mode 100644 scripts/build/patches/llvm70.patch delete mode 100644 scripts/build/patches/llvm80.patch delete mode 100644 test/Intrinsics/objectsize.leq80.ll diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 0dfd089153..8448d6b09a 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -40,9 +40,6 @@ jobs: "LLVM 11, Doxygen", "LLVM 10", "LLVM 9", - "LLVM 8", - "LLVM 7", - "LLVM 6", "ASan", "UBSan", "MSan", @@ -70,15 +67,6 @@ jobs: - 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 - name: "ASan" env: diff --git a/CMakeLists.txt b/CMakeLists.txt index 16e33ea9fe..89054a8646 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -454,11 +454,6 @@ else() set(HAVE_SELINUX 0) endif() -################################################################################ -# Workarounds -################################################################################ -include(${CMAKE_SOURCE_DIR}/cmake/workaround_llvm_pr39177.cmake) - ################################################################################ # KLEE runtime support ################################################################################ @@ -612,13 +607,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 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/include/klee/Config/config.h.cmin b/include/klee/Config/config.h.cmin index b9fdf7c38a..24dc87e8ad 100644 --- a/include/klee/Config/config.h.cmin +++ b/include/klee/Config/config.h.cmin @@ -86,9 +86,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@ - /* libcxx is supported */ #cmakedefine SUPPORT_KLEE_LIBCXX @SUPPORT_KLEE_LIBCXX@ 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/ModuleUtil.h b/include/klee/Support/ModuleUtil.h index 40c58f4e7b..328b9aeb6e 100644 --- a/include/klee/Support/ModuleUtil.h +++ b/include/klee/Support/ModuleUtil.h @@ -12,11 +12,7 @@ #include "klee/Config/Version.h" -#if LLVM_VERSION_CODE >= LLVM_VERSION(8, 0) #include "llvm/IR/InstrTypes.h" -#else -#include "llvm/IR/CallSite.h" -#endif #include "llvm/IR/Module.h" #include @@ -44,17 +40,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/lib/Core/Executor.cpp b/lib/Core/Executor.cpp index a2928864e2..529f8b4318 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -56,9 +56,6 @@ #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" @@ -1782,7 +1779,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; @@ -1807,7 +1803,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 @@ -1928,21 +1923,10 @@ 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 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 argWidth = kmodule->targetData->getTypeSizeInBits(t); } else { argWidth = arguments[k]->getWidth(); @@ -2152,13 +2136,7 @@ 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 // XXX need to check other param attrs ? bool isSExt = cs.hasRetAttr(llvm::Attribute::SExt); @@ -2416,14 +2394,8 @@ 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); @@ -2830,8 +2802,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"); @@ -2843,7 +2813,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, @@ -4643,14 +4612,7 @@ size_t Executor::getAllocationAlignment(const llvm::Value *allocSite) const { 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 llvm::Function *fn = klee::getDirectCallTarget(cs, /*moduleIsFullyLinked=*/true); if (fn) diff --git a/lib/Core/ExternalDispatcher.cpp b/lib/Core/ExternalDispatcher.cpp index aadb340d8c..c58e2ec8bf 100644 --- a/lib/Core/ExternalDispatcher.cpp +++ b/lib/Core/ExternalDispatcher.cpp @@ -10,9 +10,6 @@ #include "ExternalDispatcher.h" #include "klee/Config/Version.h" -#if LLVM_VERSION_CODE < LLVM_VERSION(8, 0) -#include "llvm/IR/CallSite.h" -#endif #include "llvm/IR/Constants.h" #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/IRBuilder.h" @@ -258,14 +255,7 @@ Function *ExternalDispatcherImpl::createDispatcher(Function *target, if (!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()]; std::vector nullary; diff --git a/lib/Core/StatsTracker.cpp b/lib/Core/StatsTracker.cpp index 28c52b7fbf..11199db1f7 100644 --- a/lib/Core/StatsTracker.cpp +++ b/lib/Core/StatsTracker.cpp @@ -29,9 +29,6 @@ #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" @@ -139,13 +136,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; } @@ -794,13 +786,8 @@ 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 // We can never call through here so assume no targets // (which should be correct anyhow). callTargets.insert(std::make_pair(inst, diff --git a/lib/Module/CMakeLists.txt b/lib/Module/CMakeLists.txt index f78575fb3e..6c2a24b319 100644 --- a/lib/Module/CMakeLists.txt +++ b/lib/Module/CMakeLists.txt @@ -22,10 +22,6 @@ set(KLEE_MODULE_COMPONENT_SRCS RaiseAsm.cpp ) -if (USE_WORKAROUND_LLVM_PR39177) - list(APPEND KLEE_MODULE_COMPONENT_SRCS WorkaroundLLVMPR39177.cpp) -endif() - klee_add_component(kleeModule ${KLEE_MODULE_COMPONENT_SRCS} ) diff --git a/lib/Module/IntrinsicCleaner.cpp b/lib/Module/IntrinsicCleaner.cpp index adef513ed1..bdaca4259e 100644 --- a/lib/Module/IntrinsicCleaner.cpp +++ b/lib/Module/IntrinsicCleaner.cpp @@ -68,10 +68,8 @@ bool IntrinsicCleanerPass::runOnBasicBlock(BasicBlock &b, Module &M) { case Intrinsic::fabs: case Intrinsic::fma: case Intrinsic::fmuladd: -#if LLVM_VERSION_CODE >= LLVM_VERSION(7, 0) case Intrinsic::fshr: case Intrinsic::fshl: -#endif #if LLVM_VERSION_CODE >= LLVM_VERSION(12, 0) case Intrinsic::abs: case Intrinsic::smax: @@ -216,7 +214,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: @@ -284,17 +281,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(); } @@ -326,7 +318,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); @@ -336,7 +327,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 @@ -352,9 +342,7 @@ 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 diff --git a/lib/Module/KModule.cpp b/lib/Module/KModule.cpp index 139149e5a0..049c67440c 100644 --- a/lib/Module/KModule.cpp +++ b/lib/Module/KModule.cpp @@ -23,9 +23,6 @@ #include "klee/Support/ModuleUtil.h" #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" @@ -40,13 +37,9 @@ #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 #include @@ -138,14 +131,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)) @@ -303,11 +290,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 } /* Build shadow structures */ @@ -468,13 +451,8 @@ 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(); ki->operands = new int[numArgs+1]; ki->operands[0] = getOperandNum(val, registerMap, km, ki); diff --git a/lib/Module/ModuleUtil.cpp b/lib/Module/ModuleUtil.cpp index 87a9c917ec..e1c6e8bd70 100644 --- a/lib/Module/ModuleUtil.cpp +++ b/lib/Module/ModuleUtil.cpp @@ -270,17 +270,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 bool moduleIsFullyLinked) { -#if LLVM_VERSION_CODE >= LLVM_VERSION(8, 0) Value *v = cs.getCalledOperand(); -#else - Value *v = cs.getCalledValue(); -#endif bool viaConstantExpr = false; // Walk through aliases and bitcasts to try to find // the function being called. @@ -318,16 +310,10 @@ 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 + // Make sure that the value is only the target of this call and // not an argument. if (cs.hasArgument(v)) diff --git a/lib/Module/Optimize.cpp b/lib/Module/Optimize.cpp index a58d245999..c982b73de4 100644 --- a/lib/Module/Optimize.cpp +++ b/lib/Module/Optimize.cpp @@ -18,10 +18,6 @@ #include "klee/Config/Version.h" #include "klee/Support/OptionCategories.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" @@ -33,15 +29,13 @@ #include "llvm/Support/DynamicLibrary.h" #include "llvm/Support/PluginLoader.h" #include "llvm/Target/TargetMachine.h" +#include "llvm/Transforms/InstCombine/InstCombine.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; @@ -167,10 +161,6 @@ void Optimize(Module *M, llvm::ArrayRef preservedFunctions) { 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); diff --git a/lib/Module/Passes.h b/lib/Module/Passes.h index ae1ce6fd8a..3eb43ec3fd 100644 --- a/lib/Module/Passes.h +++ b/lib/Module/Passes.h @@ -185,18 +185,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..98e580a871 100644 --- a/lib/Module/RaiseAsm.cpp +++ b/lib/Module/RaiseAsm.cpp @@ -42,11 +42,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; 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/SolverCmdLine.cpp b/lib/Solver/SolverCmdLine.cpp index d91261dc07..b0bff6e69a 100644 --- a/lib/Solver/SolverCmdLine.cpp +++ b/lib/Solver/SolverCmdLine.cpp @@ -117,12 +117,7 @@ void KCommandLine::HideOptions(llvm::cl::OptionCategory &Category) { StringMap &map = cl::getRegisteredOptions(); for (auto &elem : map) { -#if LLVM_VERSION_CODE >= LLVM_VERSION(9, 0) for (auto &cat : elem.second->Categories) { -#else - { - auto &cat = elem.second->Category; -#endif if (cat == &Category) { elem.second->setHiddenFlag(cl::Hidden); } 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/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/scripts/build/p-clang-linux-ubuntu.inc b/scripts/build/p-clang-linux-ubuntu.inc index 9dac1352e8..286246ca30 100644 --- a/scripts/build/p-clang-linux-ubuntu.inc +++ b/scripts/build/p-clang-linux-ubuntu.inc @@ -1,10 +1,6 @@ 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" diff --git a/scripts/build/p-clang-linux.inc b/scripts/build/p-clang-linux.inc index 25f468fa41..6481fdd837 100644 --- a/scripts/build/p-clang-linux.inc +++ b/scripts/build/p-clang-linux.inc @@ -1,9 +1,6 @@ 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 @@ -21,10 +18,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-klee.inc b/scripts/build/p-klee.inc index 1c7d39a564..a69f654a4f 100644 --- a/scripts/build/p-klee.inc +++ b/scripts/build/p-klee.inc @@ -52,9 +52,6 @@ if [ "${USE_LIBCXX}" -eq 1 ]; then "-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+=( "-DENABLE_KLEE_EH_CXX=TRUE" "-DKLEE_LIBCXXABI_SRC_DIR=${LIBCXX_SRC}/libcxxabi" ) diff --git a/scripts/build/p-llvm-linux-ubuntu.inc b/scripts/build/p-llvm-linux-ubuntu.inc index 421fe8cdd5..48a0083f31 100644 --- a/scripts/build/p-llvm-linux-ubuntu.inc +++ b/scripts/build/p-llvm-linux-ubuntu.inc @@ -60,9 +60,7 @@ install_binary_artifact_llvm() { ) 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}" + local version="-${LLVM_VERSION_MAJOR}" # Add LLVM upstream repository if available codename="$(lsb_release --codename --short)" @@ -105,12 +103,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 +130,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 @@ -158,11 +149,8 @@ is_installed_llvm() { 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 diff --git a/scripts/build/p-sanitizer-linux-ubuntu.inc b/scripts/build/p-sanitizer-linux-ubuntu.inc index bb6187ea11..30e153bbb2 100644 --- a/scripts/build/p-sanitizer-linux-ubuntu.inc +++ b/scripts/build/p-sanitizer-linux-ubuntu.inc @@ -5,11 +5,7 @@ install_binary_artifact_sanitizer() { 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}" + local version="-${SANITIZER_LLVM_VERSION_MAJOR}" # Add certificate with_sudo apt update -y diff --git a/scripts/build/p-sanitizer-linux.inc b/scripts/build/p-sanitizer-linux.inc index b7a7718e2e..fa9f35f367 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 @@ -33,9 +31,7 @@ is_installed_sanitizer() { 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/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/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/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/Saturating.ll b/test/Intrinsics/Saturating.ll index 15aad409de..306ec93b51 100644 --- a/test/Intrinsics/Saturating.ll +++ b/test/Intrinsics/Saturating.ll @@ -1,4 +1,3 @@ -; REQUIRES: geq-llvm-8.0 ; 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/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/lit.cfg b/test/lit.cfg index 84ad0c7922..4d7382cf74 100644 --- a/test/lit.cfg +++ b/test/lit.cfg @@ -161,7 +161,7 @@ config.substitutions.append( # 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 = { "9.0", "10.0", "11.0", "11.1", "12.0", "13.0" } current_llvm_version_tuple = (int(config.llvm_version_major), int(config.llvm_version_minor)) current_llvm_version = "%s.%s" % current_llvm_version_tuple diff --git a/tools/klee/main.cpp b/tools/klee/main.cpp index 3b0731c80f..8dc2fd278f 100644 --- a/tools/klee/main.cpp +++ b/tools/klee/main.cpp @@ -914,11 +914,7 @@ void externalsAndGlobalsCheck(const llvm::Module *m) { for (BasicBlock::const_iterator it = bbIt->begin(), ie = bbIt->end(); it != ie; ++it) { if (const CallInst *ci = dyn_cast(it)) { -#if LLVM_VERSION_CODE >= LLVM_VERSION(8, 0) if (isa(ci->getCalledOperand())) { -#else - if (isa(ci->getCalledValue())) { -#endif klee_warning_once(&*fnIt, "function \"%s\" has inline asm", fnIt->getName().data()); @@ -1088,11 +1084,7 @@ createLibCWrapper(std::vector> &modules, std::vector args; args.push_back(llvm::ConstantExpr::getBitCast( -#if LLVM_VERSION_CODE >= LLVM_VERSION(9, 0) cast(inModuleReference.getCallee()), -#else - inModuleReference, -#endif ft->getParamType(0))); args.push_back(&*(stub->arg_begin())); // argc auto arg_it = stub->arg_begin(); From 3a8b3bb1e8f8601e8a5598a652fad6d8d510fb30 Mon Sep 17 00:00:00 2001 From: Frank Busse Date: Tue, 14 Jun 2022 11:27:30 +0100 Subject: [PATCH 031/320] rename CallSite to CallBase --- lib/Core/Executor.cpp | 28 +++++++++---------- lib/Core/ExternalDispatcher.cpp | 6 ++-- lib/Core/StatsTracker.cpp | 6 ++-- lib/Module/KModule.cpp | 8 +++--- lib/Module/ModuleUtil.cpp | 10 +++---- .../2016-11-24-bitcast-weak-alias.c | 4 +-- 6 files changed, 31 insertions(+), 31 deletions(-) diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp index 529f8b4318..11ad902e91 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -1923,10 +1923,10 @@ 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 - const CallBase &cs = cast(*i); + const CallBase &cb = cast(*i); for (unsigned k = funcArgs; k < callingArgs; k++) { - if (cs.isByValArgument(k)) { - Type *t = cs.getParamByValType(k); + if (cb.isByValArgument(k)) { + Type *t = cb.getParamByValType(k); argWidth = kmodule->targetData->getTypeSizeInBits(t); } else { argWidth = arguments[k]->getWidth(); @@ -1937,10 +1937,10 @@ void Executor::executeCall(ExecutionState &state, KInstruction *ki, Function *f, size += Expr::getMinBytesForWidth(argWidth); } else { #if LLVM_VERSION_CODE >= LLVM_VERSION(11, 0) - MaybeAlign ma = cs.getParamAlign(k); + MaybeAlign ma = cb.getParamAlign(k); unsigned alignment = ma ? ma->value() : 0; #else - unsigned alignment = cs.getParamAlignment(k); + unsigned alignment = cb.getParamAlignment(k); #endif // AMD64-ABI 3.5.7p5: Step 7. Align l->overflow_arg_area upwards to a @@ -1984,7 +1984,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]); @@ -2136,10 +2136,10 @@ void Executor::executeInstruction(ExecutionState &state, KInstruction *ki) { Expr::Width to = getWidthForLLVMType(t); if (from != to) { - const CallBase &cs = cast(*caller); + 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 { @@ -2394,9 +2394,9 @@ void Executor::executeInstruction(ExecutionState &state, KInstruction *ki) { if (isa(i)) break; - const CallBase &cs = cast(*i); - Value *fp = cs.getCalledOperand(); - unsigned numArgs = cs.arg_size(); + const CallBase &cb = cast(*i); + Value *fp = cb.getCalledOperand(); + unsigned numArgs = cb.arg_size(); Function *f = getTargetFunction(fp, state); if (isa(fp)) { @@ -2434,7 +2434,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 { @@ -4612,9 +4612,9 @@ size_t Executor::getAllocationAlignment(const llvm::Value *allocSite) const { type = AI->getAllocatedType(); } else if (isa(allocSite) || isa(allocSite)) { // FIXME: Model the semantics of the call to use the right alignment - const CallBase &cs = cast(*allocSite); + const CallBase &cb = cast(*allocSite); llvm::Function *fn = - klee::getDirectCallTarget(cs, /*moduleIsFullyLinked=*/true); + klee::getDirectCallTarget(cb, /*moduleIsFullyLinked=*/true); if (fn) allocationSiteName = fn->getName().str(); diff --git a/lib/Core/ExternalDispatcher.cpp b/lib/Core/ExternalDispatcher.cpp index c58e2ec8bf..13b17337ff 100644 --- a/lib/Core/ExternalDispatcher.cpp +++ b/lib/Core/ExternalDispatcher.cpp @@ -255,8 +255,8 @@ Function *ExternalDispatcherImpl::createDispatcher(Function *target, if (!resolveSymbol(target->getName().str())) return 0; - const CallBase &cs = cast(*inst); - Value **args = new Value *[cs.arg_size()]; + const CallBase &cb = cast(*inst); + Value **args = new Value *[cb.arg_size()]; std::vector nullary; @@ -286,7 +286,7 @@ Function *ExternalDispatcherImpl::createDispatcher(Function *target, // 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. diff --git a/lib/Core/StatsTracker.cpp b/lib/Core/StatsTracker.cpp index 11199db1f7..539b913c42 100644 --- a/lib/Core/StatsTracker.cpp +++ b/lib/Core/StatsTracker.cpp @@ -786,14 +786,14 @@ void StatsTracker::computeReachableUncovered() { it != ie; ++it) { Instruction *inst = &*it; if (isa(inst) || isa(inst)) { - const CallBase &cs = cast(*inst); - if (isa(cs.getCalledOperand())) { + 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/Module/KModule.cpp b/lib/Module/KModule.cpp index 049c67440c..294968a329 100644 --- a/lib/Module/KModule.cpp +++ b/lib/Module/KModule.cpp @@ -451,13 +451,13 @@ KFunction::KFunction(llvm::Function *_function, ki->dest = registerMap[inst]; if (isa(it) || isa(it)) { - const CallBase &cs = cast(*inst); - Value *val = cs.getCalledOperand(); - 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/ModuleUtil.cpp b/lib/Module/ModuleUtil.cpp index e1c6e8bd70..155b117fd7 100644 --- a/lib/Module/ModuleUtil.cpp +++ b/lib/Module/ModuleUtil.cpp @@ -270,9 +270,9 @@ klee::linkModules(std::vector> &modules, } Function *klee::getDirectCallTarget( - const CallBase &cs, + const CallBase &cb, bool moduleIsFullyLinked) { - Value *v = cs.getCalledOperand(); + Value *v = cb.getCalledOperand(); bool viaConstantExpr = false; // Walk through aliases and bitcasts to try to find // the function being called. @@ -311,12 +311,12 @@ Function *klee::getDirectCallTarget( static bool valueIsOnlyCalled(const Value *v) { for (auto user : v->users()) { // Make sure the instruction is a call or invoke. - if (const auto *cs_ptr = dyn_cast(user)) { - const CallBase &cs = *cs_ptr; + 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/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; From b4d9a72a8be631c45aff20c95e2b78259e519d13 Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Thu, 30 Jun 2022 02:24:25 +0100 Subject: [PATCH 032/320] update github checkout action to v3 --- .github/workflows/build.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 8448d6b09a..b47995c8d4 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -118,7 +118,7 @@ jobs: KLEE_RUNTIME_BUILD: "Release+Debug+Asserts" steps: - name: Checkout KLEE source code - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Build KLEE env: ${{ matrix.env }} run: scripts/build/build.sh klee --docker --create-final-image @@ -137,7 +137,7 @@ jobs: - name: Install newer version of Bash run: brew install bash - name: Checkout KLEE source code - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Build KLEE run: scripts/build/build.sh klee --debug --install-system-deps - name: Run tests @@ -147,7 +147,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout KLEE Code - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Build Docker image run: docker build . @@ -171,7 +171,7 @@ jobs: COVERAGE: 1 steps: - name: Checkout KLEE source code - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Build KLEE env: ${{ matrix.env }} run: scripts/build/build.sh klee --docker --create-final-image From fe97779a06ab7499eb3d4c5c6360778e6b6d337b Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Thu, 30 Jun 2022 02:27:05 +0100 Subject: [PATCH 033/320] checkout KLEE with depth > 1 when running codecov --- .github/workflows/build.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index b47995c8d4..307dd8f2dc 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -172,6 +172,11 @@ jobs: steps: - name: Checkout KLEE source code uses: actions/checkout@v3 + 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 From 3d0033f099c907bcd5d4d2c2a7562037071ec2bf Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Thu, 30 Jun 2022 03:59:57 +0100 Subject: [PATCH 034/320] Fix memory leak in crosscheck core solver mechanism --- include/klee/Solver/Solver.h | 2 +- lib/Solver/ConstructSolverChain.cpp | 2 +- lib/Solver/ValidatingSolver.cpp | 18 ++++++++++++------ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/include/klee/Solver/Solver.h b/include/klee/Solver/Solver.h index 263f16266e..a2256028e2 100644 --- a/include/klee/Solver/Solver.h +++ b/include/klee/Solver/Solver.h @@ -221,7 +221,7 @@ 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); + Solver *createValidatingSolver(Solver *s, Solver *oracle, bool ownsOracle = false); /// createAssignmentValidatingSolver - Create a solver that when requested /// for an assignment will check that the computed assignment satisfies diff --git a/lib/Solver/ConstructSolverChain.cpp b/lib/Solver/ConstructSolverChain.cpp index 3dab0361c5..999edda44a 100644 --- a/lib/Solver/ConstructSolverChain.cpp +++ b/lib/Solver/ConstructSolverChain.cpp @@ -71,7 +71,7 @@ Solver *constructSolverChain(Solver *coreSolver, } if (DebugCrossCheckCoreSolverWith != NO_SOLVER) { Solver *oracleSolver = createCoreSolver(DebugCrossCheckCoreSolverWith); - solver = createValidatingSolver(/*s=*/solver, /*oracle=*/oracleSolver); + solver = createValidatingSolver(solver, oracleSolver, true); } return solver; diff --git a/lib/Solver/ValidatingSolver.cpp b/lib/Solver/ValidatingSolver.cpp index 5d4dab3902..d95b89428f 100644 --- a/lib/Solver/ValidatingSolver.cpp +++ b/lib/Solver/ValidatingSolver.cpp @@ -18,18 +18,24 @@ namespace klee { class ValidatingSolver : public SolverImpl { private: Solver *solver, *oracle; + bool ownsOracle; public: - ValidatingSolver(Solver *_solver, Solver *_oracle) - : solver(_solver), oracle(_oracle) {} - ~ValidatingSolver() { delete solver; } + ValidatingSolver(Solver *solver, Solver *oracle, bool ownsOracle = false) + : solver(solver), oracle(oracle), ownsOracle(ownsOracle) {} + ~ValidatingSolver() { + delete solver; + if (ownsOracle) { + delete oracle; + } + } bool computeValidity(const Query &, Solver::Validity &result); bool computeTruth(const Query &, bool &isValid); bool computeValue(const Query &, ref &result); bool computeInitialValues(const Query &, const std::vector &objects, - std::vector > &values, + std::vector> &values, bool &hasSolution); SolverRunStatus getOperationStatusCode(); char *getConstraintLog(const Query &); @@ -136,7 +142,7 @@ void ValidatingSolver::setCoreSolverTimeout(time::Span timeout) { solver->impl->setCoreSolverTimeout(timeout); } -Solver *createValidatingSolver(Solver *s, Solver *oracle) { - return new Solver(new ValidatingSolver(s, oracle)); +Solver *createValidatingSolver(Solver *s, Solver *oracle, bool ownsOracle) { + return new Solver(new ValidatingSolver(s, oracle, ownsOracle)); } } From 99c522b14dbbf6b26be35b6e7bb8da7b29070287 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Wed, 8 Jun 2022 16:36:28 +0300 Subject: [PATCH 035/320] Inline asm external call --- include/klee/Module/KCallable.h | 71 +++++++++++++++++++ include/klee/Module/KModule.h | 16 ++++- lib/Core/Executor.cpp | 47 +++++++----- lib/Core/Executor.h | 3 +- lib/Core/ExternalDispatcher.cpp | 35 +++++---- lib/Core/ExternalDispatcher.h | 4 +- lib/Module/KModule.cpp | 4 +- test/Feature/InlineAsm.c | 25 +++++++ .../regression/2012-05-13-asm-causes-aborts.c | 9 --- test/regression/2022-06-28-asm-causes-error.c | 9 +++ tools/klee/main.cpp | 13 ---- 11 files changed, 176 insertions(+), 60 deletions(-) create mode 100644 include/klee/Module/KCallable.h create mode 100644 test/Feature/InlineAsm.c delete mode 100644 test/regression/2012-05-13-asm-causes-aborts.c create mode 100644 test/regression/2022-06-28-asm-causes-error.c diff --git a/include/klee/Module/KCallable.h b/include/klee/Module/KCallable.h new file mode 100644 index 0000000000..bf8b17eae2 --- /dev/null +++ b/include/klee/Module/KCallable.h @@ -0,0 +1,71 @@ +//===-- 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 "llvm/ADT/Twine.h" +#include "llvm/IR/Function.h" +#include "llvm/IR/InlineAsm.h" +#include "llvm/IR/LLVMContext.h" + +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::PointerType *getType() 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::PointerType *getType() const override { return value->getType(); } + + 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..71fe8a0ace 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,23 @@ 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::PointerType *getType() const override { return function->getType(); } + + llvm::Value *getValue() override { return function; } + + static bool classof(const KCallable *callable) { + return callable->getKind() == CK_Function; + } }; diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp index 11ad902e91..4240598205 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -37,6 +37,7 @@ #include "klee/Expr/ExprUtil.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" @@ -59,6 +60,7 @@ #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" @@ -1658,10 +1660,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"); @@ -2399,10 +2402,6 @@ void Executor::executeInstruction(ExecutionState &state, KInstruction *ki) { unsigned numArgs = cb.arg_size(); Function *f = getTargetFunction(fp, state); - if (isa(fp)) { - terminateStateOnExecError(state, "inline assembly is unsupported"); - break; - } // evaluate arguments std::vector< ref > arguments; arguments.reserve(numArgs); @@ -2410,6 +2409,16 @@ 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()); @@ -3784,16 +3793,18 @@ static std::set okExternals(okExternalsList, void Executor::callExternalFunction(ExecutionState &state, KInstruction *target, - Function *function, + KCallable *callable, std::vector< ref > &arguments) { // check if specialFunctionHandler wants it - if (specialFunctionHandler->handle(state, function, target, arguments)) - return; + if (const auto *func = dyn_cast(callable)) { + if (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; } @@ -3835,7 +3846,7 @@ void Executor::callExternalFunction(ExecutionState &state, } else { terminateStateOnExecError(state, "external call with symbolic argument: " + - function->getName()); + callable->getName()); return; } } @@ -3856,7 +3867,7 @@ void Executor::callExternalFunction(ExecutionState &state, if (!errnoValue) { terminateStateOnExecError(state, "external call with errno value symbolic: " + - function->getName()); + callable->getName()); return; } @@ -3868,7 +3879,7 @@ void Executor::callExternalFunction(ExecutionState &state, std::string TmpStr; llvm::raw_string_ostream os(TmpStr); - os << "calling external: " << function->getName().str() << "("; + os << "calling external: " << callable->getName().str() << "("; for (unsigned i=0; igetValue(), "%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(), + terminateStateOnError(state, "failed external call: " + callable->getName(), StateTerminationType::External); return; } @@ -3903,7 +3914,7 @@ void Executor::callExternalFunction(ExecutionState &state, #endif Type *resultType = target->inst->getType(); - if (resultType != Type::getVoidTy(function->getContext())) { + if (resultType != Type::getVoidTy(kmodule->module->getContext())) { ref e = ConstantExpr::fromMemory((void*) args, getWidthForLLVMType(resultType)); bindLocal(target, state, e); diff --git a/lib/Core/Executor.h b/lib/Core/Executor.h index 7da4f63cba..279d8bee00 100644 --- a/lib/Core/Executor.h +++ b/lib/Core/Executor.h @@ -64,6 +64,7 @@ namespace klee { class ExternalDispatcher; class Expr; class InstructionInfoTable; + class KCallable; struct KFunction; struct KInstruction; class KInstIterator; @@ -240,7 +241,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, diff --git a/lib/Core/ExternalDispatcher.cpp b/lib/Core/ExternalDispatcher.cpp index 13b17337ff..7a0d8e148b 100644 --- a/lib/Core/ExternalDispatcher.cpp +++ b/lib/Core/ExternalDispatcher.cpp @@ -9,10 +9,13 @@ #include "ExternalDispatcher.h" #include "klee/Config/Version.h" +#include "klee/Module/KCallable.h" +#include "klee/Module/KModule.h" #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" @@ -45,7 +48,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; @@ -59,7 +62,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(); @@ -153,7 +156,7 @@ 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) { dispatchers_ty::iterator it = dispatchers.find(i); if (it != dispatchers.end()) { @@ -180,7 +183,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 @@ -249,10 +252,10 @@ 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; const CallBase &cb = cast(*inst); @@ -309,10 +312,18 @@ Function *ExternalDispatcherImpl::createDispatcher(Function *target, 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())); @@ -336,9 +347,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/Module/KModule.cpp b/lib/Module/KModule.cpp index 294968a329..2e96c68a35 100644 --- a/lib/Module/KModule.cpp +++ b/lib/Module/KModule.cpp @@ -303,7 +303,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)); @@ -406,7 +405,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) { diff --git a/test/Feature/InlineAsm.c b/test/Feature/InlineAsm.c new file mode 100644 index 0000000000..25e0e72e7e --- /dev/null +++ b/test/Feature/InlineAsm.c @@ -0,0 +1,25 @@ +// 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 + +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/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/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/tools/klee/main.cpp b/tools/klee/main.cpp index 8dc2fd278f..d94cdc7695 100644 --- a/tools/klee/main.cpp +++ b/tools/klee/main.cpp @@ -909,19 +909,6 @@ void externalsAndGlobalsCheck(const llvm::Module *m) { fnIt != fn_ie; ++fnIt) { if (fnIt->isDeclaration() && !fnIt->use_empty()) externals.insert(std::make_pair(fnIt->getName(), false)); - for (Function::const_iterator bbIt = fnIt->begin(), bb_ie = fnIt->end(); - bbIt != bb_ie; ++bbIt) { - for (BasicBlock::const_iterator it = bbIt->begin(), ie = bbIt->end(); - it != ie; ++it) { - if (const CallInst *ci = dyn_cast(it)) { - if (isa(ci->getCalledOperand())) { - klee_warning_once(&*fnIt, - "function \"%s\" has inline asm", - fnIt->getName().data()); - } - } - } - } } for (Module::const_global_iterator From d2f5906da4ae37a41ae257e5308d50e19689877b Mon Sep 17 00:00:00 2001 From: Frank Busse Date: Fri, 18 Mar 2022 09:46:14 +0000 Subject: [PATCH 036/320] POSIX runtime: fstatat: check for nonnull path APIs --- cmake/fstatat.c | 9 +++++++++ runtime/POSIX/CMakeLists.txt | 5 +++++ runtime/POSIX/fd.c | 15 ++++++++++----- 3 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 cmake/fstatat.c diff --git a/cmake/fstatat.c b/cmake/fstatat.c new file mode 100644 index 0000000000..58aa93014a --- /dev/null +++ b/cmake/fstatat.c @@ -0,0 +1,9 @@ +#include +#include +#include + +int main(void) { + struct stat buf; + #pragma GCC diagnostic error "-Wnonnull" + fstatat(0, NULL, &buf, 0); +} diff --git a/runtime/POSIX/CMakeLists.txt b/runtime/POSIX/CMakeLists.txt index 02d06736fa..d8208d9b04 100644 --- a/runtime/POSIX/CMakeLists.txt +++ b/runtime/POSIX/CMakeLists.txt @@ -20,6 +20,11 @@ set(SRC_FILES stubs.c ) +try_compile (FSTATAT_PATH_ACCEPTS_NULL + ${CMAKE_BINARY_DIR} + ${PROJECT_SOURCE_DIR}/cmake/fstatat.c + ) + # 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/POSIX/fd.c b/runtime/POSIX/fd.c index 35d0d31519..0aba0ade9c 100644 --- a/runtime/POSIX/fd.c +++ b/runtime/POSIX/fd.c @@ -568,16 +568,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) { From 64dfbcd7073e0286e8c0145e1750f9fe3abc7565 Mon Sep 17 00:00:00 2001 From: Gleb Popov <6yearold@gmail.com> Date: Mon, 4 Jul 2022 09:10:28 +0300 Subject: [PATCH 037/320] Switch FreeBSD CI to 13.1 and Python 3.9 --- .cirrus.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index 4f26394660..8ac70fe5d9 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -2,11 +2,11 @@ task: freebsd_instance: matrix: - image_family: freebsd-12-3-snap - - image_family: freebsd-13-0-snap + - image_family: freebsd-13-1-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 llvm90 gmake z3 cmake pkgconf google-perftools python3 py39-sqlite3 py39-tabulate build_script: - mkdir build - cd build From c9de012b07426435b8bd3bb29082fbceddf403a3 Mon Sep 17 00:00:00 2001 From: Pavel Date: Tue, 29 Mar 2022 12:03:02 +0400 Subject: [PATCH 038/320] Support arguments of width 128, 256 and 512 bits for external calls --- include/klee/Expr/Expr.h | 8 ++- lib/Core/Executor.cpp | 8 ++- lib/Expr/Expr.cpp | 31 +++++++--- test/VectorInstructions/external_call.c | 79 +++++++++++++++++++++++++ 4 files changed, 115 insertions(+), 11 deletions(-) create mode 100644 test/VectorInstructions/external_call.c diff --git a/include/klee/Expr/Expr.h b/include/klee/Expr/Expr.h index b509294c10..ae2760a23d 100644 --- a/include/klee/Expr/Expr.h +++ b/include/klee/Expr/Expr.h @@ -95,7 +95,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 +105,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 { diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp index 4240598205..6fad883020 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -3810,11 +3810,13 @@ void Executor::callExternalFunction(ExecutionState &state, } // 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) { diff --git a/lib/Expr/Expr.cpp b/lib/Expr/Expr.cpp index 50020fb193..d82cbee34a 100644 --- a/lib/Expr/Expr.cpp +++ b/lib/Expr/Expr.cpp @@ -16,6 +16,7 @@ // 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" @@ -311,6 +312,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,23 +340,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()) { + auto width = getWidth(); + switch (width) { default: assert(0 && "invalid type"); case Expr::Bool: *(( uint8_t*) address) = getZExtValue(1); break; case Expr::Int8: *(( uint8_t*) address) = getZExtValue(8); break; @@ -363,6 +376,10 @@ void ConstantExpr::toMemory(void *address) { case Expr::Fl80: *((long double*) address) = *(const long double*) value.getRawData(); break; + case Expr::Int128: + case Expr::Int256: + case Expr::Int512: + memcpy(address, value.getRawData(), width / 8); } } 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 From 62680274c68ca6aa08c138d4c0fd12a09b73fe2a Mon Sep 17 00:00:00 2001 From: Pavel Date: Thu, 4 Aug 2022 12:36:15 +0400 Subject: [PATCH 039/320] Corrected wrong usage of klee_report_error in __cxa_atexit handler --- runtime/klee-libc/__cxa_atexit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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; From 39f8069db879e1f859c60c821092452748b4ba37 Mon Sep 17 00:00:00 2001 From: Jerry James Date: Fri, 19 Aug 2022 13:01:18 -0600 Subject: [PATCH 040/320] Use true instead of Z3_TRUE (removed in z3 4.11.0) --- lib/Solver/Z3Solver.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Solver/Z3Solver.cpp b/lib/Solver/Z3Solver.cpp index 87ffbdf3a4..b628b86ba2 100644 --- a/lib/Solver/Z3Solver.cpp +++ b/lib/Solver/Z3Solver.cpp @@ -362,7 +362,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 +432,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. From 4ccb533158d40e15db9e9f2ade9bb28c3f83f38e Mon Sep 17 00:00:00 2001 From: Pavel Yatcheniy Date: Thu, 28 Jan 2021 17:51:04 +0300 Subject: [PATCH 041/320] Support UBSan-enabled binaries --- lib/Core/SpecialFunctionHandler.cpp | 37 +- lib/Core/SpecialFunctionHandler.h | 6 +- runtime/CMakeLists.txt | 3 + runtime/Sanitizer/CMakeLists.txt | 18 + .../sanitizer_common/sanitizer_common.h | 20 + .../sanitizer_internal_defs.h | 51 ++ .../sanitizer_common/sanitizer_platform.h | 21 + runtime/Sanitizer/ubsan/ubsan_checks.inc | 97 ++++ runtime/Sanitizer/ubsan/ubsan_diag.h | 36 ++ runtime/Sanitizer/ubsan/ubsan_handlers.cpp | 500 ++++++++++++++++++ runtime/Sanitizer/ubsan/ubsan_handlers.h | 115 ++++ runtime/Sanitizer/ubsan/ubsan_value.h | 76 +++ .../ubsan/ubsan_alignment-assumption.c | 21 + .../ubsan_alignment-assumption_with_offset.c | 21 + .../ubsan/ubsan_alignment-type-mismatch.c | 18 + test/Feature/ubsan/ubsan_array_bounds.c | 23 + test/Feature/ubsan/ubsan_bool.c | 17 + test/Feature/ubsan/ubsan_builtin.c | 17 + test/Feature/ubsan/ubsan_enum.c | 22 + .../Feature/ubsan/ubsan_float_cast_overflow.c | 16 + .../ubsan/ubsan_float_divide_by_zero.c | 15 + .../ubsan_implicit_integer_sign_change.c | 22 + ...ubsan_implicit_signed_integer_truncation.c | 22 + ...san_implicit_unsigned_integer_truncation.c | 22 + .../ubsan/ubsan_integer_divide_by_zero.c | 20 + test/Feature/ubsan/ubsan_nonnull_attribute.c | 21 + test/Feature/ubsan/ubsan_null.c | 19 + test/Feature/ubsan/ubsan_nullability_arg.c | 21 + test/Feature/ubsan/ubsan_nullability_assign.c | 25 + test/Feature/ubsan/ubsan_nullability_return.c | 25 + ...plying_nonzero_offset_to_nonnull_pointer.c | 22 + ...ing_nonzero_offset_to_nonnull_pointer_10.c | 21 + ...-applying_nonzero_offset_to_null_pointer.c | 21 + ...low-applying_zero_offset_to_null_pointer.c | 21 + ...bsan_pointer_overflow-pointer_arithmetic.c | 24 + test/Feature/ubsan/ubsan_return.c | 14 + .../ubsan/ubsan_returns_nonnull_attribute.c | 22 + test/Feature/ubsan/ubsan_shift_base.c | 23 + test/Feature/ubsan/ubsan_shift_exponent.c | 23 + .../ubsan/ubsan_signed_integer_overflow.c | 28 + test/Feature/ubsan/ubsan_unreachable.c | 16 + .../ubsan/ubsan_unsigned_integer_overflow.c | 28 + .../Feature/ubsan/ubsan_unsigned_shift_base.c | 25 + test/Feature/ubsan/ubsan_vla_bound.c | 17 + test/Feature/ubsan_signed_overflow.c | 25 - test/Feature/ubsan_unsigned_overflow.c | 25 - tools/klee/main.cpp | 17 +- 47 files changed, 1624 insertions(+), 95 deletions(-) create mode 100644 runtime/Sanitizer/CMakeLists.txt create mode 100644 runtime/Sanitizer/sanitizer_common/sanitizer_common.h create mode 100644 runtime/Sanitizer/sanitizer_common/sanitizer_internal_defs.h create mode 100644 runtime/Sanitizer/sanitizer_common/sanitizer_platform.h create mode 100644 runtime/Sanitizer/ubsan/ubsan_checks.inc create mode 100644 runtime/Sanitizer/ubsan/ubsan_diag.h create mode 100644 runtime/Sanitizer/ubsan/ubsan_handlers.cpp create mode 100644 runtime/Sanitizer/ubsan/ubsan_handlers.h create mode 100644 runtime/Sanitizer/ubsan/ubsan_value.h create mode 100644 test/Feature/ubsan/ubsan_alignment-assumption.c create mode 100644 test/Feature/ubsan/ubsan_alignment-assumption_with_offset.c create mode 100644 test/Feature/ubsan/ubsan_alignment-type-mismatch.c create mode 100644 test/Feature/ubsan/ubsan_array_bounds.c create mode 100644 test/Feature/ubsan/ubsan_bool.c create mode 100644 test/Feature/ubsan/ubsan_builtin.c create mode 100644 test/Feature/ubsan/ubsan_enum.c create mode 100644 test/Feature/ubsan/ubsan_float_cast_overflow.c create mode 100644 test/Feature/ubsan/ubsan_float_divide_by_zero.c create mode 100644 test/Feature/ubsan/ubsan_implicit_integer_sign_change.c create mode 100644 test/Feature/ubsan/ubsan_implicit_signed_integer_truncation.c create mode 100644 test/Feature/ubsan/ubsan_implicit_unsigned_integer_truncation.c create mode 100644 test/Feature/ubsan/ubsan_integer_divide_by_zero.c create mode 100644 test/Feature/ubsan/ubsan_nonnull_attribute.c create mode 100644 test/Feature/ubsan/ubsan_null.c create mode 100644 test/Feature/ubsan/ubsan_nullability_arg.c create mode 100644 test/Feature/ubsan/ubsan_nullability_assign.c create mode 100644 test/Feature/ubsan/ubsan_nullability_return.c create mode 100644 test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer.c create mode 100644 test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer_10.c create mode 100644 test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_null_pointer.c create mode 100644 test/Feature/ubsan/ubsan_pointer_overflow-applying_zero_offset_to_null_pointer.c create mode 100644 test/Feature/ubsan/ubsan_pointer_overflow-pointer_arithmetic.c create mode 100644 test/Feature/ubsan/ubsan_return.c create mode 100644 test/Feature/ubsan/ubsan_returns_nonnull_attribute.c create mode 100644 test/Feature/ubsan/ubsan_shift_base.c create mode 100644 test/Feature/ubsan/ubsan_shift_exponent.c create mode 100644 test/Feature/ubsan/ubsan_signed_integer_overflow.c create mode 100644 test/Feature/ubsan/ubsan_unreachable.c create mode 100644 test/Feature/ubsan/ubsan_unsigned_integer_overflow.c create mode 100644 test/Feature/ubsan/ubsan_unsigned_shift_base.c create mode 100644 test/Feature/ubsan/ubsan_vla_bound.c delete mode 100644 test/Feature/ubsan_signed_overflow.c delete mode 100644 test/Feature/ubsan_unsigned_overflow.c diff --git a/lib/Core/SpecialFunctionHandler.cpp b/lib/Core/SpecialFunctionHandler.cpp index 2b788d60f2..f4b09f367e 100644 --- a/lib/Core/SpecialFunctionHandler.cpp +++ b/lib/Core/SpecialFunctionHandler.cpp @@ -32,7 +32,7 @@ #include "llvm/IR/Instructions.h" #include "llvm/IR/Module.h" -#include +#include #include using namespace llvm; @@ -139,13 +139,6 @@ 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 }; @@ -878,31 +871,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..9487fdf54c 100644 --- a/lib/Core/SpecialFunctionHandler.h +++ b/lib/Core/SpecialFunctionHandler.h @@ -34,7 +34,7 @@ namespace klee { KInstruction *target, std::vector > &arguments); - typedef std::map > handlers_ty; handlers_ty handlers; @@ -144,10 +144,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/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/Sanitizer/CMakeLists.txt b/runtime/Sanitizer/CMakeLists.txt new file mode 100644 index 0000000000..39031dfbab --- /dev/null +++ b/runtime/Sanitizer/CMakeLists.txt @@ -0,0 +1,18 @@ +#===------------------------------------------------------------------------===# +# +# The KLEE Symbolic Virtual Machine +# +# This file is distributed under the University of Illinois Open Source +# License. See LICENSE.TXT for details. +# +#===------------------------------------------------------------------------===# +# Set up +set(LIB_PREFIX "UBSan") +set(SRC_FILES + ubsan/ubsan_handlers.cpp + ) + +# 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/sanitizer_common/sanitizer_common.h b/runtime/Sanitizer/sanitizer_common/sanitizer_common.h new file mode 100644 index 0000000000..ebb88600ca --- /dev/null +++ b/runtime/Sanitizer/sanitizer_common/sanitizer_common.h @@ -0,0 +1,20 @@ +//===-- 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. +//===----------------------------------------------------------------------===// +#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..d0817abec8 --- /dev/null +++ b/runtime/Sanitizer/sanitizer_common/sanitizer_internal_defs.h @@ -0,0 +1,51 @@ +//===-- 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. +//===----------------------------------------------------------------------===// +#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..074d2b7467 --- /dev/null +++ b/runtime/Sanitizer/sanitizer_common/sanitizer_platform.h @@ -0,0 +1,21 @@ +//===-- 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. +//===----------------------------------------------------------------------===// + +#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..b426beea10 --- /dev/null +++ b/runtime/Sanitizer/ubsan/ubsan_checks.inc @@ -0,0 +1,97 @@ +//===-- 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. +// +//===----------------------------------------------------------------------===// + +#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") +#if LLVM_VERSION_MAJOR >= 11 +UBSAN_CHECK(NullPointerUseWithNullability, "null-pointer-use", + "nullability-assign") +#endif +#if LLVM_VERSION_MAJOR >= 10 +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") +#endif +#if LLVM_VERSION_MAJOR >= 5 +UBSAN_CHECK(PointerOverflow, "pointer-overflow", "pointer-overflow") +#endif +UBSAN_CHECK(MisalignedPointerUse, "misaligned-pointer-use", "alignment") +#if LLVM_VERSION_MAJOR >= 8 +UBSAN_CHECK(AlignmentAssumption, "alignment-assumption", "alignment") +#endif +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") +#if LLVM_VERSION_MAJOR >= 6 +UBSAN_CHECK(InvalidBuiltin, "invalid-builtin-use", "invalid-builtin-use") +#endif +#if LLVM_VERSION_MAJOR >= 11 +UBSAN_CHECK(InvalidObjCCast, "invalid-objc-cast", "invalid-objc-cast") +#endif +#if LLVM_VERSION_MAJOR >= 8 +UBSAN_CHECK(ImplicitUnsignedIntegerTruncation, + "implicit-unsigned-integer-truncation", + "implicit-unsigned-integer-truncation") +UBSAN_CHECK(ImplicitSignedIntegerTruncation, + "implicit-signed-integer-truncation", + "implicit-signed-integer-truncation") +#elif LLVM_VERSION_MAJOR >= 7 +UBSAN_CHECK(ImplicitIntegerTruncation, "implicit-integer-truncation", + "implicit-integer-truncation") +#endif +#if LLVM_VERSION_MAJOR >= 8 +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") +#endif +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") +#if LLVM_VERSION_MAJOR >= 11 +UBSAN_CHECK(InvalidNullReturnWithNullability, "invalid-null-return", + "nullability-return") +#endif +UBSAN_CHECK(InvalidNullArgument, "invalid-null-argument", "nonnull-attribute") +#if LLVM_VERSION_MAJOR >= 11 +UBSAN_CHECK(InvalidNullArgumentWithNullability, "invalid-null-argument", + "nullability-arg") +#endif +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..71219ab7c5 --- /dev/null +++ b/runtime/Sanitizer/ubsan/ubsan_diag.h @@ -0,0 +1,36 @@ +//===-- 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. +// +//===----------------------------------------------------------------------===// +#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..3cc9af2a54 --- /dev/null +++ b/runtime/Sanitizer/ubsan/ubsan_handlers.cpp @@ -0,0 +1,500 @@ +//===-- 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. +// +//===----------------------------------------------------------------------===// + +#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 + } + // UNREACHABLE("unknown ErrorType!"); +} + +__attribute__((noreturn)) static void +report_error(const char *msg, const char *suffix = "undefined_behavior.err") { + klee_report_error(__FILE__, __LINE__, msg, suffix); +} + +__attribute__((noreturn)) static void report_error_type(ErrorType ET) { + report_error(ConvertTypeToString(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) { +#if LLVM_VERSION_MAJOR >= 4 + uptr Alignment = (uptr)1 << Data->LogAlignment; +#endif + ErrorType ET; + if (!Pointer) +#if LLVM_VERSION_MAJOR >= 11 + ET = (Data->TypeCheckKind == TCK_NonnullAssign) + ? ErrorType::NullPointerUseWithNullability + : ErrorType::NullPointerUse; +#else + ET = ErrorType::NullPointerUse; +#endif +#if LLVM_VERSION_MAJOR >= 4 + else if (Pointer & (Alignment - 1)) +#else + else if (Data->Alignment && (Pointer & (Data->Alignment - 1))) +#endif + ET = ErrorType::MisalignedPointerUse; + else + ET = ErrorType::InsufficientObjectSize; + + report_error_type(ET); +} + +#if LLVM_VERSION_MAJOR >= 4 +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); +} +#else +extern "C" void __ubsan_handle_type_mismatch(TypeMismatchData *Data, + ValueHandle Pointer) { + handleTypeMismatchImpl(Data, Pointer); +} + +extern "C" void __ubsan_handle_type_mismatch_abort(TypeMismatchData *Data, + ValueHandle Pointer) { + handleTypeMismatchImpl(Data, Pointer); +} +#endif + +#if LLVM_VERSION_MAJOR >= 8 +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); +} +#endif + +/// \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*/) { + ErrorType ET; + if (Data->Type.isIntegerTy()) + report_error("integer division overflow"); + else + 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"); +} + +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"); +} + +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); +} + +#if LLVM_VERSION_MAJOR >= 7 +static void handleImplicitConversion(ImplicitConversionData *Data, + ValueHandle /*Src*/, ValueHandle /*Dst*/) { + ErrorType ET = ErrorType::GenericUB; + +#if LLVM_VERSION_MAJOR >= 8 + 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; + } +#else + switch (Data->Kind) { + case ICCK_IntegerTruncation: + ET = ErrorType::ImplicitIntegerTruncation; + break; + } +#endif + 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); +} +#endif + +#if LLVM_VERSION_MAJOR >= 6 +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); +} +#endif + +#if LLVM_VERSION_MAJOR >= 5 +static void handleNonNullReturn(NonNullReturnData * /*Data*/, + SourceLocation * /*LocPtr*/, bool IsAttr) { +#if LLVM_VERSION_MAJOR >= 11 + ErrorType ET = IsAttr ? ErrorType::InvalidNullReturn + : ErrorType::InvalidNullReturnWithNullability; +#else + ErrorType ET = ErrorType::InvalidNullReturn; +#endif + 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); +} +#else +static void handleNonNullReturn(NonNullReturnData * /*Data*/) { + ErrorType ET = ErrorType::InvalidNullReturn; + report_error_type(ET); +} + +extern "C" void __ubsan_handle_nonnull_return(NonNullReturnData *Data) { + handleNonNullReturn(Data); +} + +extern "C" void __ubsan_handle_nonnull_return_abort(NonNullReturnData *Data) { + handleNonNullReturn(Data); +} +#endif + +#if LLVM_VERSION_MAJOR >= 5 +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); +} +#endif + +static void handleNonNullArg(NonNullArgData * /*Data*/, bool IsAttr) { +#if LLVM_VERSION_MAJOR >= 11 + ErrorType ET = IsAttr ? ErrorType::InvalidNullArgument + : ErrorType::InvalidNullArgumentWithNullability; +#else + ErrorType ET = ErrorType::InvalidNullArgument; +#endif + 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); +} + +#if LLVM_VERSION_MAJOR >= 5 +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); +} +#endif + +#if LLVM_VERSION_MAJOR >= 5 +static void handlePointerOverflowImpl(PointerOverflowData * /*Data*/, + ValueHandle Base, ValueHandle Result) { +#if LLVM_VERSION_MAJOR >= 10 + 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; +#else + ErrorType ET = ErrorType::PointerOverflow; +#endif + 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); +} +#endif + +} // 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..be2b8225e9 --- /dev/null +++ b/runtime/Sanitizer/ubsan/ubsan_handlers.h @@ -0,0 +1,115 @@ +//===-- 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. +// +//===----------------------------------------------------------------------===// +#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; +#if LLVM_VERSION_MAJOR >= 4 + unsigned char LogAlignment; +#else + uptr Alignment; +#endif + unsigned char TypeCheckKind; +}; + +#if LLVM_VERSION_MAJOR >= 8 +struct AlignmentAssumptionData { + SourceLocation Loc; + SourceLocation AssumptionLoc; + const TypeDescriptor &Type; +}; +#endif + +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; +}; + +#if LLVM_VERSION_MAJOR >= 7 +/// 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, +}; +#endif + +#if LLVM_VERSION_MAJOR >= 7 +struct ImplicitConversionData { + SourceLocation Loc; + const TypeDescriptor &FromType; + const TypeDescriptor &ToType; + /* ImplicitConversionCheckKind */ unsigned char Kind; +}; +#endif + +#if LLVM_VERSION_MAJOR >= 6 +struct InvalidBuiltinData { + SourceLocation Loc; + unsigned char Kind; +}; +#endif + +struct NonNullReturnData { + SourceLocation AttrLoc; +}; + +struct NonNullArgData { + SourceLocation Loc; + SourceLocation AttrLoc; + int ArgIndex; +}; + +#if LLVM_VERSION_MAJOR >= 5 +struct PointerOverflowData { + SourceLocation Loc; +}; +#endif + +#endif // UBSAN_HANDLERS_H \ No newline at end of file diff --git a/runtime/Sanitizer/ubsan/ubsan_value.h b/runtime/Sanitizer/ubsan/ubsan_value.h new file mode 100644 index 0000000000..5474961ed3 --- /dev/null +++ b/runtime/Sanitizer/ubsan/ubsan_value.h @@ -0,0 +1,76 @@ +//===-- 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. +// +//===----------------------------------------------------------------------===// +#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/test/Feature/ubsan/ubsan_alignment-assumption.c b/test/Feature/ubsan/ubsan_alignment-assumption.c new file mode 100644 index 0000000000..b48929ac01 --- /dev/null +++ b/test/Feature/ubsan/ubsan_alignment-assumption.c @@ -0,0 +1,21 @@ +// REQUIRES: geq-llvm-8.0 + +// 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 + +#include "klee/klee.h" +#include + +int main() { + size_t address; + + klee_make_symbolic(&address, sizeof(address), "address"); + + char *ptr = (char *)address; + + // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: alignment-assumption + __builtin_assume_aligned(ptr, 0x8000); + + return 0; +} diff --git a/test/Feature/ubsan/ubsan_alignment-assumption_with_offset.c b/test/Feature/ubsan/ubsan_alignment-assumption_with_offset.c new file mode 100644 index 0000000000..587c510814 --- /dev/null +++ b/test/Feature/ubsan/ubsan_alignment-assumption_with_offset.c @@ -0,0 +1,21 @@ +// REQUIRES: geq-llvm-8.0 + +// 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 + +#include "klee/klee.h" +#include + +int main() { + size_t address; + + klee_make_symbolic(&address, sizeof(address), "address"); + + char *ptr = (char *)address; + + // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: alignment-assumption + __builtin_assume_aligned(ptr, 0x8000, 1); + + return 0; +} diff --git a/test/Feature/ubsan/ubsan_alignment-type-mismatch.c b/test/Feature/ubsan/ubsan_alignment-type-mismatch.c new file mode 100644 index 0000000000..37eb09278a --- /dev/null +++ b/test/Feature/ubsan/ubsan_alignment-type-mismatch.c @@ -0,0 +1,18 @@ +// 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 + +#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: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: misaligned-pointer-use + result = *p; + return 0; +} diff --git a/test/Feature/ubsan/ubsan_array_bounds.c b/test/Feature/ubsan/ubsan_array_bounds.c new file mode 100644 index 0000000000..626d016baa --- /dev/null +++ b/test/Feature/ubsan/ubsan_array_bounds.c @@ -0,0 +1,23 @@ +// 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 + +#include "klee/klee.h" + +unsigned int array_index(unsigned int n) { + unsigned int a[4] = {0}; + + // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: 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/Feature/ubsan/ubsan_bool.c b/test/Feature/ubsan/ubsan_bool.c new file mode 100644 index 0000000000..4c2a9dbbee --- /dev/null +++ b/test/Feature/ubsan/ubsan_bool.c @@ -0,0 +1,17 @@ +// 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 + +#include "klee/klee.h" + +int main() { + unsigned char x; + volatile _Bool result; + + klee_make_symbolic(&x, sizeof(x), "x"); + + // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: load invalid value + result = *(_Bool *)&x; + + return 0; +} diff --git a/test/Feature/ubsan/ubsan_builtin.c b/test/Feature/ubsan/ubsan_builtin.c new file mode 100644 index 0000000000..85cf02a8be --- /dev/null +++ b/test/Feature/ubsan/ubsan_builtin.c @@ -0,0 +1,17 @@ +// REQUIRES: geq-llvm-6.0 +// +// 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 + +#include "klee/klee.h" + +int main() { + signed int x; + + klee_make_symbolic(&x, sizeof(x), "x"); + + // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: invalid-builtin-use + __builtin_ctz(x); + return 0; +} diff --git a/test/Feature/ubsan/ubsan_enum.c b/test/Feature/ubsan/ubsan_enum.c new file mode 100644 index 0000000000..d6422fcbe5 --- /dev/null +++ b/test/Feature/ubsan/ubsan_enum.c @@ -0,0 +1,22 @@ +// 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 + +#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: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: load invalid value + result = (int)e != -1; + + return 0; +} diff --git a/test/Feature/ubsan/ubsan_float_cast_overflow.c b/test/Feature/ubsan/ubsan_float_cast_overflow.c new file mode 100644 index 0000000000..749a340eee --- /dev/null +++ b/test/Feature/ubsan/ubsan_float_cast_overflow.c @@ -0,0 +1,16 @@ +// 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 + +#include "klee/klee.h" + +int main() { + float f = 0x7fffff80; + volatile int result; + + // klee_make_symbolic(&f, sizeof(f), "f"); + + // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: float-cast-overflow + result = f + 0x80; + return 0; +} diff --git a/test/Feature/ubsan/ubsan_float_divide_by_zero.c b/test/Feature/ubsan/ubsan_float_divide_by_zero.c new file mode 100644 index 0000000000..eec443938b --- /dev/null +++ b/test/Feature/ubsan/ubsan_float_divide_by_zero.c @@ -0,0 +1,15 @@ +// 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 + +#include "klee/klee.h" + +int main() { + float x = 1.0; + + // klee_make_symbolic(&x, sizeof(x), "x"); + // klee_assume(x != 0.0); + + // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: float-divide-by-zero + volatile float result = x / 0; +} diff --git a/test/Feature/ubsan/ubsan_implicit_integer_sign_change.c b/test/Feature/ubsan/ubsan_implicit_integer_sign_change.c new file mode 100644 index 0000000000..d8e99e54f2 --- /dev/null +++ b/test/Feature/ubsan/ubsan_implicit_integer_sign_change.c @@ -0,0 +1,22 @@ +// REQUIRES: geq-llvm-8.0 + +// 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 + +#include "klee/klee.h" + +signed int convert_unsigned_int_to_signed_int(unsigned int x) { + // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: 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/Feature/ubsan/ubsan_implicit_signed_integer_truncation.c b/test/Feature/ubsan/ubsan_implicit_signed_integer_truncation.c new file mode 100644 index 0000000000..3d6ffcd1ec --- /dev/null +++ b/test/Feature/ubsan/ubsan_implicit_signed_integer_truncation.c @@ -0,0 +1,22 @@ +// REQUIRES: geq-llvm-8.0 + +// 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 + +#include "klee/klee.h" + +unsigned char convert_signed_int_to_unsigned_char(signed int x) { + // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: 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/Feature/ubsan/ubsan_implicit_unsigned_integer_truncation.c b/test/Feature/ubsan/ubsan_implicit_unsigned_integer_truncation.c new file mode 100644 index 0000000000..5421d10f0a --- /dev/null +++ b/test/Feature/ubsan/ubsan_implicit_unsigned_integer_truncation.c @@ -0,0 +1,22 @@ +// REQUIRES: geq-llvm-8.0 + +// 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 + +#include "klee/klee.h" + +unsigned char convert_unsigned_int_to_unsigned_char(unsigned int x) { + // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: 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/Feature/ubsan/ubsan_integer_divide_by_zero.c b/test/Feature/ubsan/ubsan_integer_divide_by_zero.c new file mode 100644 index 0000000000..ff5458abae --- /dev/null +++ b/test/Feature/ubsan/ubsan_integer_divide_by_zero.c @@ -0,0 +1,20 @@ +// 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 %t.bc 2>&1 | FileCheck %s + +#if defined(__SIZEOF_INT128__) && !defined(_WIN32) +typedef __int128 intmax; +#else +typedef long long intmax; +#endif + +int main() { + intmax x; + volatile intmax result; + + klee_make_symbolic(&x, sizeof(x), "x"); + + // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: integer division overflow + result = x / 0; + return 0; +} diff --git a/test/Feature/ubsan/ubsan_nonnull_attribute.c b/test/Feature/ubsan/ubsan_nonnull_attribute.c new file mode 100644 index 0000000000..0e1c841146 --- /dev/null +++ b/test/Feature/ubsan/ubsan_nonnull_attribute.c @@ -0,0 +1,21 @@ +// 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 + +#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: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: invalid-null-argument + result = func(arg); + return 0; +} diff --git a/test/Feature/ubsan/ubsan_null.c b/test/Feature/ubsan/ubsan_null.c new file mode 100644 index 0000000000..5f3a516fc7 --- /dev/null +++ b/test/Feature/ubsan/ubsan_null.c @@ -0,0 +1,19 @@ +// 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 + +#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: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: null-pointer-use + result = *arg; + return 0; +} diff --git a/test/Feature/ubsan/ubsan_nullability_arg.c b/test/Feature/ubsan/ubsan_nullability_arg.c new file mode 100644 index 0000000000..38227a8b78 --- /dev/null +++ b/test/Feature/ubsan/ubsan_nullability_arg.c @@ -0,0 +1,21 @@ +// REQUIRES: geq-llvm-5.0 + +// 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 + +#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: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: invalid-null-argument + nonnull_arg(arg); + return 0; +} diff --git a/test/Feature/ubsan/ubsan_nullability_assign.c b/test/Feature/ubsan/ubsan_nullability_assign.c new file mode 100644 index 0000000000..a2a9c5e417 --- /dev/null +++ b/test/Feature/ubsan/ubsan_nullability_assign.c @@ -0,0 +1,25 @@ +// REQUIRES: geq-llvm-5.0 + +// 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 + +#include "klee/klee.h" + +void nonnull_assign(int *p) { + volatile int *_Nonnull local; + // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: 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/Feature/ubsan/ubsan_nullability_return.c b/test/Feature/ubsan/ubsan_nullability_return.c new file mode 100644 index 0000000000..ffd7886c79 --- /dev/null +++ b/test/Feature/ubsan/ubsan_nullability_return.c @@ -0,0 +1,25 @@ +// REQUIRES: geq-llvm-5.0 + +// 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 + +#include "klee/klee.h" + +int *_Nonnull nonnull_retval(int *p) { + // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: 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/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer.c b/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer.c new file mode 100644 index 0000000000..caee33af65 --- /dev/null +++ b/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer.c @@ -0,0 +1,22 @@ +// REQUIRES: geq-llvm-5.0 +// REQUIRES: lt-llvm-10.0 + +// 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 + +#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: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: pointer-overflow + result = ptr + 1; + return 0; +} diff --git a/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer_10.c b/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer_10.c new file mode 100644 index 0000000000..529c0d11b2 --- /dev/null +++ b/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer_10.c @@ -0,0 +1,21 @@ +// REQUIRES: geq-llvm-10.0 + +// 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 + +#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: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: nullptr-after-nonzero-offset + result = ptr + 1; + return 0; +} diff --git a/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_null_pointer.c b/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_null_pointer.c new file mode 100644 index 0000000000..dc9ff50fab --- /dev/null +++ b/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_null_pointer.c @@ -0,0 +1,21 @@ +// REQUIRES: geq-llvm-10.0 + +// 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 + +#include "klee/klee.h" +#include + +int main() { + size_t address; + volatile char *result; + + klee_make_symbolic(&address, sizeof(address), "address"); + + char *ptr = (char *)address; + + // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: nullptr-after-nonzero-offset + result = ptr + 1; + return 0; +} diff --git a/test/Feature/ubsan/ubsan_pointer_overflow-applying_zero_offset_to_null_pointer.c b/test/Feature/ubsan/ubsan_pointer_overflow-applying_zero_offset_to_null_pointer.c new file mode 100644 index 0000000000..29df382334 --- /dev/null +++ b/test/Feature/ubsan/ubsan_pointer_overflow-applying_zero_offset_to_null_pointer.c @@ -0,0 +1,21 @@ +// REQUIRES: geq-llvm-10.0 + +// 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 + +#include "klee/klee.h" +#include + +int main() { + size_t address; + volatile char *result; + + klee_make_symbolic(&address, sizeof(address), "address"); + + char *ptr = (char *)address;; + + // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: nullptr-with-offset + result = ptr + 0; + return 0; +} diff --git a/test/Feature/ubsan/ubsan_pointer_overflow-pointer_arithmetic.c b/test/Feature/ubsan/ubsan_pointer_overflow-pointer_arithmetic.c new file mode 100644 index 0000000000..8c445b0e6e --- /dev/null +++ b/test/Feature/ubsan/ubsan_pointer_overflow-pointer_arithmetic.c @@ -0,0 +1,24 @@ +// REQUIRES: geq-llvm-5.0 + +// 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 + +#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: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: pointer-overflow + result = ptr + offset; + + return 0; +} diff --git a/test/Feature/ubsan/ubsan_return.c b/test/Feature/ubsan/ubsan_return.c new file mode 100644 index 0000000000..3e9c8ccb8a --- /dev/null +++ b/test/Feature/ubsan/ubsan_return.c @@ -0,0 +1,14 @@ +// 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 + +#include "klee/klee.h" + +int no_return() { + // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: missing-return +} + +int main() { + volatile int result = no_return(); + return 0; +} diff --git a/test/Feature/ubsan/ubsan_returns_nonnull_attribute.c b/test/Feature/ubsan/ubsan_returns_nonnull_attribute.c new file mode 100644 index 0000000000..d8fd661c00 --- /dev/null +++ b/test/Feature/ubsan/ubsan_returns_nonnull_attribute.c @@ -0,0 +1,22 @@ +// 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 + +#include "klee/klee.h" + +__attribute__((returns_nonnull)) char *foo(char *a) { + // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: 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/Feature/ubsan/ubsan_shift_base.c b/test/Feature/ubsan/ubsan_shift_base.c new file mode 100644 index 0000000000..31d87f43e1 --- /dev/null +++ b/test/Feature/ubsan/ubsan_shift_base.c @@ -0,0 +1,23 @@ +// RUN: %clang %s -fsanitize=shift -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 + +#include "klee/klee.h" + +int lsh_overflow(signed int a, signed int b) { + // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: 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/Feature/ubsan/ubsan_shift_exponent.c b/test/Feature/ubsan/ubsan_shift_exponent.c new file mode 100644 index 0000000000..1716ecb9bb --- /dev/null +++ b/test/Feature/ubsan/ubsan_shift_exponent.c @@ -0,0 +1,23 @@ +// 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 %t.bc 2>&1 | FileCheck %s + +#include "klee/klee.h" + +int rsh_inbounds(signed int a, signed int b) { + // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: 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/Feature/ubsan/ubsan_signed_integer_overflow.c b/test/Feature/ubsan/ubsan_signed_integer_overflow.c new file mode 100644 index 0000000000..306d0935cb --- /dev/null +++ b/test/Feature/ubsan/ubsan_signed_integer_overflow.c @@ -0,0 +1,28 @@ +// 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 + +#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: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: signed-integer-overflow + result = x + y; + + // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: signed-integer-overflow + result = x - y; + + // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: signed-integer-overflow + result = x * y; + + // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: signed-integer-overflow + result = -x; + + return 0; +} diff --git a/test/Feature/ubsan/ubsan_unreachable.c b/test/Feature/ubsan/ubsan_unreachable.c new file mode 100644 index 0000000000..56de8e617d --- /dev/null +++ b/test/Feature/ubsan/ubsan_unreachable.c @@ -0,0 +1,16 @@ +// 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 + +#include "klee/klee.h" + +void _Noreturn f() { + // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: unreachable-call + __builtin_unreachable(); +} + +int main() { + f(); + + return 0; +} diff --git a/test/Feature/ubsan/ubsan_unsigned_integer_overflow.c b/test/Feature/ubsan/ubsan_unsigned_integer_overflow.c new file mode 100644 index 0000000000..fb90d97fb3 --- /dev/null +++ b/test/Feature/ubsan/ubsan_unsigned_integer_overflow.c @@ -0,0 +1,28 @@ +// 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 + +#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: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: unsigned-integer-overflow + result = x + y; + + // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: unsigned-integer-overflow + result = x - y; + + // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: unsigned-integer-overflow + result = x * y; + + // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: unsigned-integer-overflow + result = -x; + + return 0; +} diff --git a/test/Feature/ubsan/ubsan_unsigned_shift_base.c b/test/Feature/ubsan/ubsan_unsigned_shift_base.c new file mode 100644 index 0000000000..d08bfe160a --- /dev/null +++ b/test/Feature/ubsan/ubsan_unsigned_shift_base.c @@ -0,0 +1,25 @@ +// 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 %t.bc 2>&1 | FileCheck %s + +#include "klee/klee.h" + +int lsh_overflow(unsigned int a, unsigned int b) { + // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: 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/Feature/ubsan/ubsan_vla_bound.c b/test/Feature/ubsan/ubsan_vla_bound.c new file mode 100644 index 0000000000..24a95d17c7 --- /dev/null +++ b/test/Feature/ubsan/ubsan_vla_bound.c @@ -0,0 +1,17 @@ +// 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 + +#include "klee/klee.h" + +int main() { + int x; + volatile int result; + + x = klee_range(-10, 10, "x"); + + // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: non-positive-vla-index + int arr[x]; + result = arr[0]; + return 0; +} 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/tools/klee/main.cpp b/tools/klee/main.cpp index d94cdc7695..7d938ab29e 100644 --- a/tools/klee/main.cpp +++ b/tools/klee/main.cpp @@ -187,6 +187,10 @@ namespace { cl::init(false), cl::cat(LinkCat)); + cl::opt WithUBSanRuntime("ubsan-runtime", + cl::desc("Link with UBSan runtime."), + cl::init(false), cl::cat(LinkCat)); + cl::opt RuntimeBuild( "runtime-build", cl::desc("Link with versions of the runtime library that were built with " @@ -794,10 +798,6 @@ static const char *modelledExternals[] = { "_Znwj", "_Znam", "_Znwm", - "__ubsan_handle_add_overflow", - "__ubsan_handle_sub_overflow", - "__ubsan_handle_mul_overflow", - "__ubsan_handle_divrem_overflow", }; // Symbols we aren't going to warn about @@ -1265,6 +1265,15 @@ int main(int argc, char **argv, char **envp) { preparePOSIX(loadedModules, libcPrefix); } + if (WithUBSanRuntime) { + SmallString<128> Path(Opts.LibraryDir); + llvm::sys::path::append(Path, "libkleeUBSan" + opt_suffix + ".bca"); + if (!klee::loadFile(Path.c_str(), mainModule->getContext(), loadedModules, + errorMsg)) + klee_error("error loading UBSan support '%s': %s", Path.c_str(), + errorMsg.c_str()); + } + if (Libcxx) { #ifndef SUPPORT_KLEE_LIBCXX klee_error("KLEE was not compiled with libc++ support"); From 712745687c080e2607a7c7657af33b3791d90f41 Mon Sep 17 00:00:00 2001 From: Pavel Date: Tue, 18 Jan 2022 17:47:50 +0530 Subject: [PATCH 042/320] Introduce separate categories for different kinds of undefined behavior --- include/klee/Core/TerminationTypes.h | 5 +- lib/Core/Executor.cpp | 6 ++ runtime/Sanitizer/ubsan/ubsan_handlers.cpp | 102 +++++++++++++++++++-- 3 files changed, 105 insertions(+), 8 deletions(-) diff --git a/include/klee/Core/TerminationTypes.h b/include/klee/Core/TerminationTypes.h index 592cd3cb0c..435b6c051a 100644 --- a/include/klee/Core/TerminationTypes.h +++ b/include/klee/Core/TerminationTypes.h @@ -32,7 +32,10 @@ TTYPE(Ptr, 16U, "ptr.err") \ TTYPE(ReadOnly, 17U, "read_only.err") \ TTYPE(ReportError, 18U, "report_error.err") \ - MARK(PROGERR, 18U) \ + TTYPE(ImplicitConversion, 19U, "implicit_conversion.err") \ + TTYPE(NullableAttribute, 20U, "nullable_attribute.err") \ + TTYPE(UndefinedBehavior, 21U, "undefined_behavior.err") \ + MARK(PROGERR, 21U) \ TTYPE(User, 23U, "user.err") \ MARK(USERERR, 23U) \ TTYPE(Execution, 25U, "exec.err") \ diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp index 6fad883020..157c1cc845 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -290,6 +290,12 @@ cl::list ExitOnErrorType( "Write to read-only memory"), clEnumValN(StateTerminationType::ReportError, "ReportError", "klee_report_error called"), + clEnumValN(StateTerminationType::ImplicitConversion, "ImplicitConversion", + "Undefined implicit conversion detected"), + clEnumValN(StateTerminationType::NullableAttribute, "NullableAttribute", + "Violation of nullable attribute detected"), + clEnumValN(StateTerminationType::UndefinedBehavior, "UndefinedBehavior", + "Undefined behavior detected"), clEnumValN(StateTerminationType::User, "User", "Wrong klee_* functions invocation")), cl::ZeroOrMore, diff --git a/runtime/Sanitizer/ubsan/ubsan_handlers.cpp b/runtime/Sanitizer/ubsan/ubsan_handlers.cpp index 3cc9af2a54..3cb5cfe6cd 100644 --- a/runtime/Sanitizer/ubsan/ubsan_handlers.cpp +++ b/runtime/Sanitizer/ubsan/ubsan_handlers.cpp @@ -30,13 +30,101 @@ static const char *ConvertTypeToString(ErrorType Type) { // UNREACHABLE("unknown ErrorType!"); } -__attribute__((noreturn)) static void -report_error(const char *msg, const char *suffix = "undefined_behavior.err") { - klee_report_error(__FILE__, __LINE__, msg, suffix); +__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 GenericUB: + return "undefined_behavior.err"; + case NullPointerUse: +#if LLVM_VERSION_MAJOR >= 11 + case NullPointerUseWithNullability: +#endif +#if LLVM_VERSION_MAJOR >= 10 + case NullptrWithOffset: + case NullptrWithNonZeroOffset: + case NullptrAfterNonZeroOffset: +#endif +#if LLVM_VERSION_MAJOR >= 5 + case PointerOverflow: +#endif + case MisalignedPointerUse: +#if LLVM_VERSION_MAJOR >= 8 + case AlignmentAssumption: +#endif + return "ptr.err"; + case InsufficientObjectSize: + return "undefined_behavior.err"; + case SignedIntegerOverflow: + case UnsignedIntegerOverflow: + return "overflow.err"; + case IntegerDivideByZero: + case FloatDivideByZero: + return "div.err"; +#if LLVM_VERSION_MAJOR >= 6 + case InvalidBuiltin: + return "undefined_behavior.err"; +#endif +#if LLVM_VERSION_MAJOR >= 11 + case InvalidObjCCast: + return "undefined_behavior.err"; +#endif +#if LLVM_VERSION_MAJOR >= 8 + case ImplicitUnsignedIntegerTruncation: + case ImplicitSignedIntegerTruncation: + return "implicit_conversion.err"; +#elif LLVM_VERSION_MAJOR >= 7 + case ImplicitIntegerTruncation: + return "implicit_conversion.err"; +#endif +#if LLVM_VERSION_MAJOR >= 8 + case ImplicitIntegerSignChange: + case ImplicitSignedIntegerTruncationOrSignChange: + return "implicit_conversion.err"; +#endif + case InvalidShiftBase: + case InvalidShiftExponent: + return "overflow.err"; + case OutOfBoundsIndex: + return "ptr.err"; + case UnreachableCall: + return "undefined_behavior.err"; + case MissingReturn: + return "undefined_behavior.err"; + case NonPositiveVLAIndex: + return "ptr.err"; + case FloatCastOverflow: + return "overflow.err"; + case InvalidBoolLoad: + return "undefined_behavior.err"; + case InvalidEnumLoad: + return "undefined_behavior.err"; + case FunctionTypeMismatch: + // This check is unsupported + return "exec.err"; + case InvalidNullReturn: +#if LLVM_VERSION_MAJOR >= 11 + case InvalidNullReturnWithNullability: +#endif + case InvalidNullArgument: +#if LLVM_VERSION_MAJOR >= 11 + case InvalidNullArgumentWithNullability: +#endif + return "nullable_attribute.err"; + case DynamicTypeMismatch: + case 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)); + report_error(ConvertTypeToString(ET), get_suffix(ET)); } /// Situations in which we might emit a check for the suitability of a @@ -195,7 +283,7 @@ static void handleDivremOverflowImpl(OverflowData *Data, ValueHandle /*LHS*/, ValueHandle /*RHS*/) { ErrorType ET; if (Data->Type.isIntegerTy()) - report_error("integer division overflow"); + report_error("integer division overflow", "overflow.err"); else ET = ErrorType::FloatDivideByZero; report_error_type(ET); @@ -216,7 +304,7 @@ extern "C" void __ubsan_handle_divrem_overflow_abort(OverflowData *Data, static void handleShiftOutOfBoundsImpl(ShiftOutOfBoundsData * /*Data*/, ValueHandle /*LHS*/, ValueHandle /*RHS*/) { - report_error("shift out of bounds"); + report_error("shift out of bounds", "overflow.err"); } extern "C" void __ubsan_handle_shift_out_of_bounds(ShiftOutOfBoundsData *Data, @@ -298,7 +386,7 @@ extern "C" void __ubsan_handle_float_cast_overflow_abort(void *Data, static void handleLoadInvalidValue(InvalidValueData * /*Data*/, ValueHandle /*Val*/) { - report_error("load invalid value"); + report_error("load invalid value", "undefined_behavior.err"); } extern "C" void __ubsan_handle_load_invalid_value(InvalidValueData *Data, From d2445083b152a5b9bff20125910f832af0d4a3de Mon Sep 17 00:00:00 2001 From: Pavel Date: Fri, 18 Mar 2022 18:02:34 +0400 Subject: [PATCH 043/320] Remove LLVM version < 6 --- runtime/Sanitizer/ubsan/ubsan_checks.inc | 4 - runtime/Sanitizer/ubsan/ubsan_diag.h | 2 +- runtime/Sanitizer/ubsan/ubsan_handlers.cpp | 119 ++++++------------ runtime/Sanitizer/ubsan/ubsan_handlers.h | 10 +- test/Feature/ubsan/ubsan_builtin.c | 2 - test/Feature/ubsan/ubsan_nullability_arg.c | 2 - test/Feature/ubsan/ubsan_nullability_assign.c | 2 - test/Feature/ubsan/ubsan_nullability_return.c | 2 - ...plying_nonzero_offset_to_nonnull_pointer.c | 1 - ...bsan_pointer_overflow-pointer_arithmetic.c | 2 - 10 files changed, 39 insertions(+), 107 deletions(-) diff --git a/runtime/Sanitizer/ubsan/ubsan_checks.inc b/runtime/Sanitizer/ubsan/ubsan_checks.inc index b426beea10..c32f784676 100644 --- a/runtime/Sanitizer/ubsan/ubsan_checks.inc +++ b/runtime/Sanitizer/ubsan/ubsan_checks.inc @@ -32,9 +32,7 @@ UBSAN_CHECK(NullptrWithNonZeroOffset, "nullptr-with-nonzero-offset", UBSAN_CHECK(NullptrAfterNonZeroOffset, "nullptr-after-nonzero-offset", "pointer-overflow") #endif -#if LLVM_VERSION_MAJOR >= 5 UBSAN_CHECK(PointerOverflow, "pointer-overflow", "pointer-overflow") -#endif UBSAN_CHECK(MisalignedPointerUse, "misaligned-pointer-use", "alignment") #if LLVM_VERSION_MAJOR >= 8 UBSAN_CHECK(AlignmentAssumption, "alignment-assumption", "alignment") @@ -47,9 +45,7 @@ UBSAN_CHECK(UnsignedIntegerOverflow, "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") -#if LLVM_VERSION_MAJOR >= 6 UBSAN_CHECK(InvalidBuiltin, "invalid-builtin-use", "invalid-builtin-use") -#endif #if LLVM_VERSION_MAJOR >= 11 UBSAN_CHECK(InvalidObjCCast, "invalid-objc-cast", "invalid-objc-cast") #endif diff --git a/runtime/Sanitizer/ubsan/ubsan_diag.h b/runtime/Sanitizer/ubsan/ubsan_diag.h index 71219ab7c5..4bb0404a96 100644 --- a/runtime/Sanitizer/ubsan/ubsan_diag.h +++ b/runtime/Sanitizer/ubsan/ubsan_diag.h @@ -25,7 +25,7 @@ class TypeName { const char *getName() const { return Name; } }; -enum /*class*/ ErrorType { +enum class ErrorType { #define UBSAN_CHECK(Name, SummaryKind, FSanitizeFlagName) Name, #include "ubsan_checks.inc" #undef UBSAN_CHECK diff --git a/runtime/Sanitizer/ubsan/ubsan_handlers.cpp b/runtime/Sanitizer/ubsan/ubsan_handlers.cpp index 3cb5cfe6cd..752d47a436 100644 --- a/runtime/Sanitizer/ubsan/ubsan_handlers.cpp +++ b/runtime/Sanitizer/ubsan/ubsan_handlers.cpp @@ -37,85 +37,81 @@ __attribute__((noreturn)) static void report_error(const char *msg, static const char *get_suffix(ErrorType ET) { switch (ET) { - case GenericUB: + case ErrorType::GenericUB: return "undefined_behavior.err"; - case NullPointerUse: + case ErrorType::NullPointerUse: #if LLVM_VERSION_MAJOR >= 11 - case NullPointerUseWithNullability: + case ErrorType::NullPointerUseWithNullability: #endif #if LLVM_VERSION_MAJOR >= 10 - case NullptrWithOffset: - case NullptrWithNonZeroOffset: - case NullptrAfterNonZeroOffset: + case ErrorType::NullptrWithOffset: + case ErrorType::NullptrWithNonZeroOffset: + case ErrorType::NullptrAfterNonZeroOffset: #endif -#if LLVM_VERSION_MAJOR >= 5 - case PointerOverflow: -#endif - case MisalignedPointerUse: + case ErrorType::PointerOverflow: + case ErrorType::MisalignedPointerUse: #if LLVM_VERSION_MAJOR >= 8 - case AlignmentAssumption: + case ErrorType::AlignmentAssumption: #endif return "ptr.err"; - case InsufficientObjectSize: + case ErrorType::InsufficientObjectSize: return "undefined_behavior.err"; - case SignedIntegerOverflow: - case UnsignedIntegerOverflow: + case ErrorType::SignedIntegerOverflow: + case ErrorType::UnsignedIntegerOverflow: return "overflow.err"; - case IntegerDivideByZero: - case FloatDivideByZero: + case ErrorType::IntegerDivideByZero: + case ErrorType::FloatDivideByZero: return "div.err"; -#if LLVM_VERSION_MAJOR >= 6 - case InvalidBuiltin: + case ErrorType::InvalidBuiltin: return "undefined_behavior.err"; -#endif #if LLVM_VERSION_MAJOR >= 11 - case InvalidObjCCast: + case ErrorType::InvalidObjCCast: return "undefined_behavior.err"; #endif #if LLVM_VERSION_MAJOR >= 8 - case ImplicitUnsignedIntegerTruncation: - case ImplicitSignedIntegerTruncation: + case ErrorType::ImplicitUnsignedIntegerTruncation: + case ErrorType::ImplicitSignedIntegerTruncation: return "implicit_conversion.err"; #elif LLVM_VERSION_MAJOR >= 7 - case ImplicitIntegerTruncation: + case ErrorType::ImplicitIntegerTruncation: return "implicit_conversion.err"; #endif #if LLVM_VERSION_MAJOR >= 8 - case ImplicitIntegerSignChange: - case ImplicitSignedIntegerTruncationOrSignChange: + case ErrorType::ImplicitIntegerSignChange: + case ErrorType::ImplicitSignedIntegerTruncationOrSignChange: return "implicit_conversion.err"; #endif - case InvalidShiftBase: - case InvalidShiftExponent: + case ErrorType::InvalidShiftBase: + case ErrorType::InvalidShiftExponent: return "overflow.err"; - case OutOfBoundsIndex: + case ErrorType::OutOfBoundsIndex: return "ptr.err"; - case UnreachableCall: + case ErrorType::UnreachableCall: return "undefined_behavior.err"; - case MissingReturn: + case ErrorType::MissingReturn: return "undefined_behavior.err"; - case NonPositiveVLAIndex: + case ErrorType::NonPositiveVLAIndex: return "ptr.err"; - case FloatCastOverflow: + case ErrorType::FloatCastOverflow: return "overflow.err"; - case InvalidBoolLoad: + case ErrorType::InvalidBoolLoad: return "undefined_behavior.err"; - case InvalidEnumLoad: + case ErrorType::InvalidEnumLoad: return "undefined_behavior.err"; - case FunctionTypeMismatch: + case ErrorType::FunctionTypeMismatch: // This check is unsupported return "exec.err"; - case InvalidNullReturn: + case ErrorType::InvalidNullReturn: #if LLVM_VERSION_MAJOR >= 11 - case InvalidNullReturnWithNullability: + case ErrorType::InvalidNullReturnWithNullability: #endif - case InvalidNullArgument: + case ErrorType::InvalidNullArgument: #if LLVM_VERSION_MAJOR >= 11 - case InvalidNullArgumentWithNullability: + case ErrorType::InvalidNullArgumentWithNullability: #endif return "nullable_attribute.err"; - case DynamicTypeMismatch: - case CFIBadType: + case ErrorType::DynamicTypeMismatch: + case ErrorType::CFIBadType: // These checks are unsupported return "exec.err"; default: @@ -168,9 +164,7 @@ enum TypeCheckKind { static void handleTypeMismatchImpl(TypeMismatchData *Data, ValueHandle Pointer) { -#if LLVM_VERSION_MAJOR >= 4 uptr Alignment = (uptr)1 << Data->LogAlignment; -#endif ErrorType ET; if (!Pointer) #if LLVM_VERSION_MAJOR >= 11 @@ -180,11 +174,7 @@ static void handleTypeMismatchImpl(TypeMismatchData *Data, #else ET = ErrorType::NullPointerUse; #endif -#if LLVM_VERSION_MAJOR >= 4 else if (Pointer & (Alignment - 1)) -#else - else if (Data->Alignment && (Pointer & (Data->Alignment - 1))) -#endif ET = ErrorType::MisalignedPointerUse; else ET = ErrorType::InsufficientObjectSize; @@ -192,7 +182,6 @@ static void handleTypeMismatchImpl(TypeMismatchData *Data, report_error_type(ET); } -#if LLVM_VERSION_MAJOR >= 4 extern "C" void __ubsan_handle_type_mismatch_v1(TypeMismatchData *Data, ValueHandle Pointer) { @@ -204,17 +193,6 @@ extern "C" void __ubsan_handle_type_mismatch_v1_abort(TypeMismatchData *Data, handleTypeMismatchImpl(Data, Pointer); } -#else -extern "C" void __ubsan_handle_type_mismatch(TypeMismatchData *Data, - ValueHandle Pointer) { - handleTypeMismatchImpl(Data, Pointer); -} - -extern "C" void __ubsan_handle_type_mismatch_abort(TypeMismatchData *Data, - ValueHandle Pointer) { - handleTypeMismatchImpl(Data, Pointer); -} -#endif #if LLVM_VERSION_MAJOR >= 8 static void handleAlignmentAssumptionImpl(AlignmentAssumptionData * /*Data*/, @@ -458,7 +436,6 @@ __ubsan_handle_implicit_conversion_abort(ImplicitConversionData *Data, } #endif -#if LLVM_VERSION_MAJOR >= 6 static void handleInvalidBuiltin(InvalidBuiltinData * /*Data*/) { ErrorType ET = ErrorType::InvalidBuiltin; report_error_type(ET); @@ -471,9 +448,7 @@ extern "C" void __ubsan_handle_invalid_builtin(InvalidBuiltinData *Data) { extern "C" void __ubsan_handle_invalid_builtin_abort(InvalidBuiltinData *Data) { handleInvalidBuiltin(Data); } -#endif -#if LLVM_VERSION_MAJOR >= 5 static void handleNonNullReturn(NonNullReturnData * /*Data*/, SourceLocation * /*LocPtr*/, bool IsAttr) { #if LLVM_VERSION_MAJOR >= 11 @@ -494,22 +469,7 @@ extern "C" void __ubsan_handle_nonnull_return_v1_abort(NonNullReturnData *Data, SourceLocation *LocPtr) { handleNonNullReturn(Data, LocPtr, true); } -#else -static void handleNonNullReturn(NonNullReturnData * /*Data*/) { - ErrorType ET = ErrorType::InvalidNullReturn; - report_error_type(ET); -} - -extern "C" void __ubsan_handle_nonnull_return(NonNullReturnData *Data) { - handleNonNullReturn(Data); -} -extern "C" void __ubsan_handle_nonnull_return_abort(NonNullReturnData *Data) { - handleNonNullReturn(Data); -} -#endif - -#if LLVM_VERSION_MAJOR >= 5 extern "C" void __ubsan_handle_nullability_return_v1(NonNullReturnData *Data, SourceLocation *LocPtr) { handleNonNullReturn(Data, LocPtr, false); @@ -520,7 +480,6 @@ __ubsan_handle_nullability_return_v1_abort(NonNullReturnData *Data, SourceLocation *LocPtr) { handleNonNullReturn(Data, LocPtr, false); } -#endif static void handleNonNullArg(NonNullArgData * /*Data*/, bool IsAttr) { #if LLVM_VERSION_MAJOR >= 11 @@ -540,7 +499,6 @@ extern "C" void __ubsan_handle_nonnull_arg_abort(NonNullArgData *Data) { handleNonNullArg(Data, true); } -#if LLVM_VERSION_MAJOR >= 5 extern "C" void __ubsan_handle_nullability_arg(NonNullArgData *Data) { handleNonNullArg(Data, false); } @@ -549,9 +507,7 @@ extern "C" void __ubsan_handle_nullability_arg_abort(NonNullArgData *Data) { handleNonNullArg(Data, false); } -#endif -#if LLVM_VERSION_MAJOR >= 5 static void handlePointerOverflowImpl(PointerOverflowData * /*Data*/, ValueHandle Base, ValueHandle Result) { #if LLVM_VERSION_MAJOR >= 10 @@ -583,6 +539,5 @@ extern "C" void __ubsan_handle_pointer_overflow_abort(PointerOverflowData *Data, handlePointerOverflowImpl(Data, Base, Result); } -#endif } // namespace __ubsan \ No newline at end of file diff --git a/runtime/Sanitizer/ubsan/ubsan_handlers.h b/runtime/Sanitizer/ubsan/ubsan_handlers.h index be2b8225e9..da111ff6f8 100644 --- a/runtime/Sanitizer/ubsan/ubsan_handlers.h +++ b/runtime/Sanitizer/ubsan/ubsan_handlers.h @@ -21,11 +21,7 @@ using namespace __ubsan; struct TypeMismatchData { SourceLocation Loc; const TypeDescriptor &Type; -#if LLVM_VERSION_MAJOR >= 4 unsigned char LogAlignment; -#else - uptr Alignment; -#endif unsigned char TypeCheckKind; }; @@ -89,12 +85,10 @@ struct ImplicitConversionData { }; #endif -#if LLVM_VERSION_MAJOR >= 6 struct InvalidBuiltinData { SourceLocation Loc; unsigned char Kind; }; -#endif struct NonNullReturnData { SourceLocation AttrLoc; @@ -106,10 +100,8 @@ struct NonNullArgData { int ArgIndex; }; -#if LLVM_VERSION_MAJOR >= 5 struct PointerOverflowData { SourceLocation Loc; }; -#endif -#endif // UBSAN_HANDLERS_H \ No newline at end of file +#endif // UBSAN_HANDLERS_H diff --git a/test/Feature/ubsan/ubsan_builtin.c b/test/Feature/ubsan/ubsan_builtin.c index 85cf02a8be..85603646d5 100644 --- a/test/Feature/ubsan/ubsan_builtin.c +++ b/test/Feature/ubsan/ubsan_builtin.c @@ -1,5 +1,3 @@ -// REQUIRES: geq-llvm-6.0 -// // 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 diff --git a/test/Feature/ubsan/ubsan_nullability_arg.c b/test/Feature/ubsan/ubsan_nullability_arg.c index 38227a8b78..72cb79aaff 100644 --- a/test/Feature/ubsan/ubsan_nullability_arg.c +++ b/test/Feature/ubsan/ubsan_nullability_arg.c @@ -1,5 +1,3 @@ -// REQUIRES: geq-llvm-5.0 - // 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 diff --git a/test/Feature/ubsan/ubsan_nullability_assign.c b/test/Feature/ubsan/ubsan_nullability_assign.c index a2a9c5e417..84421bb7ac 100644 --- a/test/Feature/ubsan/ubsan_nullability_assign.c +++ b/test/Feature/ubsan/ubsan_nullability_assign.c @@ -1,5 +1,3 @@ -// REQUIRES: geq-llvm-5.0 - // 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 diff --git a/test/Feature/ubsan/ubsan_nullability_return.c b/test/Feature/ubsan/ubsan_nullability_return.c index ffd7886c79..3e1a76d305 100644 --- a/test/Feature/ubsan/ubsan_nullability_return.c +++ b/test/Feature/ubsan/ubsan_nullability_return.c @@ -1,5 +1,3 @@ -// REQUIRES: geq-llvm-5.0 - // 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 diff --git a/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer.c b/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer.c index caee33af65..acf551bc6b 100644 --- a/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer.c +++ b/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer.c @@ -1,4 +1,3 @@ -// REQUIRES: geq-llvm-5.0 // REQUIRES: lt-llvm-10.0 // RUN: %clang %s -fsanitize=pointer-overflow -emit-llvm -g %O0opt -c -o %t.bc diff --git a/test/Feature/ubsan/ubsan_pointer_overflow-pointer_arithmetic.c b/test/Feature/ubsan/ubsan_pointer_overflow-pointer_arithmetic.c index 8c445b0e6e..be15628c2e 100644 --- a/test/Feature/ubsan/ubsan_pointer_overflow-pointer_arithmetic.c +++ b/test/Feature/ubsan/ubsan_pointer_overflow-pointer_arithmetic.c @@ -1,5 +1,3 @@ -// REQUIRES: geq-llvm-5.0 - // 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 From f3f4736956bb906e480d7ba50e1836c611f26be7 Mon Sep 17 00:00:00 2001 From: Pavel Date: Sat, 26 Mar 2022 14:05:08 +0400 Subject: [PATCH 044/320] Check extensions of generated files in tests --- test/Feature/ubsan/ubsan_alignment-assumption.c | 2 ++ .../ubsan/ubsan_alignment-assumption_with_offset.c | 2 ++ test/Feature/ubsan/ubsan_alignment-type-mismatch.c | 2 ++ test/Feature/ubsan/ubsan_array_bounds.c | 2 ++ test/Feature/ubsan/ubsan_bool.c | 2 ++ test/Feature/ubsan/ubsan_builtin.c | 2 ++ test/Feature/ubsan/ubsan_enum.c | 2 ++ test/Feature/ubsan/ubsan_float_cast_overflow.c | 4 ++++ test/Feature/ubsan/ubsan_float_divide_by_zero.c | 4 ++++ .../ubsan/ubsan_implicit_integer_sign_change.c | 2 ++ .../ubsan/ubsan_implicit_signed_integer_truncation.c | 2 ++ .../ubsan_implicit_unsigned_integer_truncation.c | 2 ++ test/Feature/ubsan/ubsan_integer_divide_by_zero.c | 6 +++++- test/Feature/ubsan/ubsan_nonnull_attribute.c | 2 ++ test/Feature/ubsan/ubsan_null.c | 2 ++ test/Feature/ubsan/ubsan_nullability_arg.c | 2 ++ test/Feature/ubsan/ubsan_nullability_assign.c | 2 ++ test/Feature/ubsan/ubsan_nullability_return.c | 2 ++ ...flow-applying_nonzero_offset_to_nonnull_pointer.c | 2 ++ ...w-applying_nonzero_offset_to_nonnull_pointer_10.c | 2 ++ ...verflow-applying_nonzero_offset_to_null_pointer.c | 3 +++ ...r_overflow-applying_zero_offset_to_null_pointer.c | 2 ++ .../ubsan_pointer_overflow-pointer_arithmetic.c | 2 ++ test/Feature/ubsan/ubsan_return.c | 2 ++ test/Feature/ubsan/ubsan_returns_nonnull_attribute.c | 2 ++ test/Feature/ubsan/ubsan_shift_base.c | 12 ++++++++++-- test/Feature/ubsan/ubsan_shift_exponent.c | 4 +++- test/Feature/ubsan/ubsan_signed_integer_overflow.c | 2 ++ test/Feature/ubsan/ubsan_unreachable.c | 2 ++ test/Feature/ubsan/ubsan_unsigned_integer_overflow.c | 2 ++ test/Feature/ubsan/ubsan_unsigned_shift_base.c | 4 +++- test/Feature/ubsan/ubsan_vla_bound.c | 3 +++ 32 files changed, 83 insertions(+), 5 deletions(-) diff --git a/test/Feature/ubsan/ubsan_alignment-assumption.c b/test/Feature/ubsan/ubsan_alignment-assumption.c index b48929ac01..d18f2a284c 100644 --- a/test/Feature/ubsan/ubsan_alignment-assumption.c +++ b/test/Feature/ubsan/ubsan_alignment-assumption.c @@ -3,6 +3,8 @@ // 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 diff --git a/test/Feature/ubsan/ubsan_alignment-assumption_with_offset.c b/test/Feature/ubsan/ubsan_alignment-assumption_with_offset.c index 587c510814..d0b5c03abe 100644 --- a/test/Feature/ubsan/ubsan_alignment-assumption_with_offset.c +++ b/test/Feature/ubsan/ubsan_alignment-assumption_with_offset.c @@ -3,6 +3,8 @@ // 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 diff --git a/test/Feature/ubsan/ubsan_alignment-type-mismatch.c b/test/Feature/ubsan/ubsan_alignment-type-mismatch.c index 37eb09278a..4fde8921b6 100644 --- a/test/Feature/ubsan/ubsan_alignment-type-mismatch.c +++ b/test/Feature/ubsan/ubsan_alignment-type-mismatch.c @@ -1,6 +1,8 @@ // 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 diff --git a/test/Feature/ubsan/ubsan_array_bounds.c b/test/Feature/ubsan/ubsan_array_bounds.c index 626d016baa..ba4e7b5c5e 100644 --- a/test/Feature/ubsan/ubsan_array_bounds.c +++ b/test/Feature/ubsan/ubsan_array_bounds.c @@ -1,6 +1,8 @@ // 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" diff --git a/test/Feature/ubsan/ubsan_bool.c b/test/Feature/ubsan/ubsan_bool.c index 4c2a9dbbee..360af183e8 100644 --- a/test/Feature/ubsan/ubsan_bool.c +++ b/test/Feature/ubsan/ubsan_bool.c @@ -1,6 +1,8 @@ // 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 undefined_behavior.err | wc -l | grep 1 #include "klee/klee.h" diff --git a/test/Feature/ubsan/ubsan_builtin.c b/test/Feature/ubsan/ubsan_builtin.c index 85603646d5..72ff73da24 100644 --- a/test/Feature/ubsan/ubsan_builtin.c +++ b/test/Feature/ubsan/ubsan_builtin.c @@ -1,6 +1,8 @@ // 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 .undefined_behavior.err | wc -l | grep 1 #include "klee/klee.h" diff --git a/test/Feature/ubsan/ubsan_enum.c b/test/Feature/ubsan/ubsan_enum.c index d6422fcbe5..1c79629ac6 100644 --- a/test/Feature/ubsan/ubsan_enum.c +++ b/test/Feature/ubsan/ubsan_enum.c @@ -1,6 +1,8 @@ // 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 .undefined_behavior.err | wc -l | grep 1 #include "klee/klee.h" diff --git a/test/Feature/ubsan/ubsan_float_cast_overflow.c b/test/Feature/ubsan/ubsan_float_cast_overflow.c index 749a340eee..6f17c6fa59 100644 --- a/test/Feature/ubsan/ubsan_float_cast_overflow.c +++ b/test/Feature/ubsan/ubsan_float_cast_overflow.c @@ -1,6 +1,8 @@ // 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" @@ -8,6 +10,8 @@ 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: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: float-cast-overflow diff --git a/test/Feature/ubsan/ubsan_float_divide_by_zero.c b/test/Feature/ubsan/ubsan_float_divide_by_zero.c index eec443938b..848571909a 100644 --- a/test/Feature/ubsan/ubsan_float_divide_by_zero.c +++ b/test/Feature/ubsan/ubsan_float_divide_by_zero.c @@ -1,12 +1,16 @@ // 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); diff --git a/test/Feature/ubsan/ubsan_implicit_integer_sign_change.c b/test/Feature/ubsan/ubsan_implicit_integer_sign_change.c index d8e99e54f2..9b33466457 100644 --- a/test/Feature/ubsan/ubsan_implicit_integer_sign_change.c +++ b/test/Feature/ubsan/ubsan_implicit_integer_sign_change.c @@ -3,6 +3,8 @@ // 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" diff --git a/test/Feature/ubsan/ubsan_implicit_signed_integer_truncation.c b/test/Feature/ubsan/ubsan_implicit_signed_integer_truncation.c index 3d6ffcd1ec..cc511f7f12 100644 --- a/test/Feature/ubsan/ubsan_implicit_signed_integer_truncation.c +++ b/test/Feature/ubsan/ubsan_implicit_signed_integer_truncation.c @@ -3,6 +3,8 @@ // 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_conversion.err | wc -l | grep 1 #include "klee/klee.h" diff --git a/test/Feature/ubsan/ubsan_implicit_unsigned_integer_truncation.c b/test/Feature/ubsan/ubsan_implicit_unsigned_integer_truncation.c index 5421d10f0a..b90fac70e5 100644 --- a/test/Feature/ubsan/ubsan_implicit_unsigned_integer_truncation.c +++ b/test/Feature/ubsan/ubsan_implicit_unsigned_integer_truncation.c @@ -3,6 +3,8 @@ // 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_conversion.err | wc -l | grep 1 #include "klee/klee.h" diff --git a/test/Feature/ubsan/ubsan_integer_divide_by_zero.c b/test/Feature/ubsan/ubsan_integer_divide_by_zero.c index ff5458abae..c33bab38e7 100644 --- a/test/Feature/ubsan/ubsan_integer_divide_by_zero.c +++ b/test/Feature/ubsan/ubsan_integer_divide_by_zero.c @@ -1,6 +1,10 @@ // 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 %t.bc 2>&1 | FileCheck %s +// 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" #if defined(__SIZEOF_INT128__) && !defined(_WIN32) typedef __int128 intmax; diff --git a/test/Feature/ubsan/ubsan_nonnull_attribute.c b/test/Feature/ubsan/ubsan_nonnull_attribute.c index 0e1c841146..a98aeaddfe 100644 --- a/test/Feature/ubsan/ubsan_nonnull_attribute.c +++ b/test/Feature/ubsan/ubsan_nonnull_attribute.c @@ -1,6 +1,8 @@ // 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" diff --git a/test/Feature/ubsan/ubsan_null.c b/test/Feature/ubsan/ubsan_null.c index 5f3a516fc7..f5ad6fdf63 100644 --- a/test/Feature/ubsan/ubsan_null.c +++ b/test/Feature/ubsan/ubsan_null.c @@ -1,6 +1,8 @@ // 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" diff --git a/test/Feature/ubsan/ubsan_nullability_arg.c b/test/Feature/ubsan/ubsan_nullability_arg.c index 72cb79aaff..c739364910 100644 --- a/test/Feature/ubsan/ubsan_nullability_arg.c +++ b/test/Feature/ubsan/ubsan_nullability_arg.c @@ -1,6 +1,8 @@ // 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" diff --git a/test/Feature/ubsan/ubsan_nullability_assign.c b/test/Feature/ubsan/ubsan_nullability_assign.c index 84421bb7ac..eaf58a65d3 100644 --- a/test/Feature/ubsan/ubsan_nullability_assign.c +++ b/test/Feature/ubsan/ubsan_nullability_assign.c @@ -1,6 +1,8 @@ // 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" diff --git a/test/Feature/ubsan/ubsan_nullability_return.c b/test/Feature/ubsan/ubsan_nullability_return.c index 3e1a76d305..25b2b5e0cd 100644 --- a/test/Feature/ubsan/ubsan_nullability_return.c +++ b/test/Feature/ubsan/ubsan_nullability_return.c @@ -1,6 +1,8 @@ // 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" diff --git a/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer.c b/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer.c index acf551bc6b..dcbba073a3 100644 --- a/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer.c +++ b/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer.c @@ -3,6 +3,8 @@ // 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 diff --git a/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer_10.c b/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer_10.c index 529c0d11b2..cb1267423f 100644 --- a/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer_10.c +++ b/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer_10.c @@ -3,6 +3,8 @@ // 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 diff --git a/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_null_pointer.c b/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_null_pointer.c index dc9ff50fab..20286bcc0a 100644 --- a/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_null_pointer.c +++ b/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_null_pointer.c @@ -3,6 +3,8 @@ // 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 @@ -12,6 +14,7 @@ int main() { volatile char *result; klee_make_symbolic(&address, sizeof(address), "address"); + klee_assume(address != 0); char *ptr = (char *)address; diff --git a/test/Feature/ubsan/ubsan_pointer_overflow-applying_zero_offset_to_null_pointer.c b/test/Feature/ubsan/ubsan_pointer_overflow-applying_zero_offset_to_null_pointer.c index 29df382334..301952b980 100644 --- a/test/Feature/ubsan/ubsan_pointer_overflow-applying_zero_offset_to_null_pointer.c +++ b/test/Feature/ubsan/ubsan_pointer_overflow-applying_zero_offset_to_null_pointer.c @@ -3,6 +3,8 @@ // 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 diff --git a/test/Feature/ubsan/ubsan_pointer_overflow-pointer_arithmetic.c b/test/Feature/ubsan/ubsan_pointer_overflow-pointer_arithmetic.c index be15628c2e..123034b585 100644 --- a/test/Feature/ubsan/ubsan_pointer_overflow-pointer_arithmetic.c +++ b/test/Feature/ubsan/ubsan_pointer_overflow-pointer_arithmetic.c @@ -1,6 +1,8 @@ // 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 diff --git a/test/Feature/ubsan/ubsan_return.c b/test/Feature/ubsan/ubsan_return.c index 3e9c8ccb8a..c2327db4c3 100644 --- a/test/Feature/ubsan/ubsan_return.c +++ b/test/Feature/ubsan/ubsan_return.c @@ -1,6 +1,8 @@ // 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 .undefined_behavior.err | wc -l | grep 1 #include "klee/klee.h" diff --git a/test/Feature/ubsan/ubsan_returns_nonnull_attribute.c b/test/Feature/ubsan/ubsan_returns_nonnull_attribute.c index d8fd661c00..f2a1c6e4cd 100644 --- a/test/Feature/ubsan/ubsan_returns_nonnull_attribute.c +++ b/test/Feature/ubsan/ubsan_returns_nonnull_attribute.c @@ -1,6 +1,8 @@ // 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" diff --git a/test/Feature/ubsan/ubsan_shift_base.c b/test/Feature/ubsan/ubsan_shift_base.c index 31d87f43e1..2da7158220 100644 --- a/test/Feature/ubsan/ubsan_shift_base.c +++ b/test/Feature/ubsan/ubsan_shift_base.c @@ -1,6 +1,14 @@ -// RUN: %clang %s -fsanitize=shift -emit-llvm -g %O0opt -c -o %t.bc +// 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 %t.bc 2>&1 | FileCheck %s +// 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" diff --git a/test/Feature/ubsan/ubsan_shift_exponent.c b/test/Feature/ubsan/ubsan_shift_exponent.c index 1716ecb9bb..548ebb66c0 100644 --- a/test/Feature/ubsan/ubsan_shift_exponent.c +++ b/test/Feature/ubsan/ubsan_shift_exponent.c @@ -1,6 +1,8 @@ // 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 %t.bc 2>&1 | FileCheck %s +// 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" diff --git a/test/Feature/ubsan/ubsan_signed_integer_overflow.c b/test/Feature/ubsan/ubsan_signed_integer_overflow.c index 306d0935cb..df798e7957 100644 --- a/test/Feature/ubsan/ubsan_signed_integer_overflow.c +++ b/test/Feature/ubsan/ubsan_signed_integer_overflow.c @@ -1,6 +1,8 @@ // 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" diff --git a/test/Feature/ubsan/ubsan_unreachable.c b/test/Feature/ubsan/ubsan_unreachable.c index 56de8e617d..76e2e9091e 100644 --- a/test/Feature/ubsan/ubsan_unreachable.c +++ b/test/Feature/ubsan/ubsan_unreachable.c @@ -1,6 +1,8 @@ // 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 .undefined_behavior.err | wc -l | grep 1 #include "klee/klee.h" diff --git a/test/Feature/ubsan/ubsan_unsigned_integer_overflow.c b/test/Feature/ubsan/ubsan_unsigned_integer_overflow.c index fb90d97fb3..a11c8d07a7 100644 --- a/test/Feature/ubsan/ubsan_unsigned_integer_overflow.c +++ b/test/Feature/ubsan/ubsan_unsigned_integer_overflow.c @@ -1,6 +1,8 @@ // 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" diff --git a/test/Feature/ubsan/ubsan_unsigned_shift_base.c b/test/Feature/ubsan/ubsan_unsigned_shift_base.c index d08bfe160a..92c6135345 100644 --- a/test/Feature/ubsan/ubsan_unsigned_shift_base.c +++ b/test/Feature/ubsan/ubsan_unsigned_shift_base.c @@ -2,7 +2,9 @@ // 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 %t.bc 2>&1 | FileCheck %s +// 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" diff --git a/test/Feature/ubsan/ubsan_vla_bound.c b/test/Feature/ubsan/ubsan_vla_bound.c index 24a95d17c7..a057c62c10 100644 --- a/test/Feature/ubsan/ubsan_vla_bound.c +++ b/test/Feature/ubsan/ubsan_vla_bound.c @@ -1,6 +1,9 @@ // 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" From d14b7dc335f1dc31a53602cee48f05e415edbfe5 Mon Sep 17 00:00:00 2001 From: Pavel Date: Mon, 4 Jul 2022 01:27:43 +0400 Subject: [PATCH 045/320] Remove LLVM version < 9 --- runtime/Sanitizer/ubsan/ubsan_checks.inc | 9 -------- runtime/Sanitizer/ubsan/ubsan_handlers.cpp | 21 ------------------- runtime/Sanitizer/ubsan/ubsan_handlers.h | 6 ------ .../ubsan/ubsan_alignment-assumption.c | 2 -- .../ubsan_alignment-assumption_with_offset.c | 2 -- .../ubsan_implicit_integer_sign_change.c | 2 -- ...ubsan_implicit_signed_integer_truncation.c | 2 -- ...san_implicit_unsigned_integer_truncation.c | 2 -- 8 files changed, 46 deletions(-) diff --git a/runtime/Sanitizer/ubsan/ubsan_checks.inc b/runtime/Sanitizer/ubsan/ubsan_checks.inc index c32f784676..a4235e964c 100644 --- a/runtime/Sanitizer/ubsan/ubsan_checks.inc +++ b/runtime/Sanitizer/ubsan/ubsan_checks.inc @@ -34,9 +34,7 @@ UBSAN_CHECK(NullptrAfterNonZeroOffset, "nullptr-after-nonzero-offset", #endif UBSAN_CHECK(PointerOverflow, "pointer-overflow", "pointer-overflow") UBSAN_CHECK(MisalignedPointerUse, "misaligned-pointer-use", "alignment") -#if LLVM_VERSION_MAJOR >= 8 UBSAN_CHECK(AlignmentAssumption, "alignment-assumption", "alignment") -#endif UBSAN_CHECK(InsufficientObjectSize, "insufficient-object-size", "object-size") UBSAN_CHECK(SignedIntegerOverflow, "signed-integer-overflow", "signed-integer-overflow") @@ -49,25 +47,18 @@ UBSAN_CHECK(InvalidBuiltin, "invalid-builtin-use", "invalid-builtin-use") #if LLVM_VERSION_MAJOR >= 11 UBSAN_CHECK(InvalidObjCCast, "invalid-objc-cast", "invalid-objc-cast") #endif -#if LLVM_VERSION_MAJOR >= 8 UBSAN_CHECK(ImplicitUnsignedIntegerTruncation, "implicit-unsigned-integer-truncation", "implicit-unsigned-integer-truncation") UBSAN_CHECK(ImplicitSignedIntegerTruncation, "implicit-signed-integer-truncation", "implicit-signed-integer-truncation") -#elif LLVM_VERSION_MAJOR >= 7 -UBSAN_CHECK(ImplicitIntegerTruncation, "implicit-integer-truncation", - "implicit-integer-truncation") -#endif -#if LLVM_VERSION_MAJOR >= 8 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") -#endif UBSAN_CHECK(InvalidShiftBase, "invalid-shift-base", "shift-base") UBSAN_CHECK(InvalidShiftExponent, "invalid-shift-exponent", "shift-exponent") UBSAN_CHECK(OutOfBoundsIndex, "out-of-bounds-index", "bounds") diff --git a/runtime/Sanitizer/ubsan/ubsan_handlers.cpp b/runtime/Sanitizer/ubsan/ubsan_handlers.cpp index 752d47a436..cfb0287c6e 100644 --- a/runtime/Sanitizer/ubsan/ubsan_handlers.cpp +++ b/runtime/Sanitizer/ubsan/ubsan_handlers.cpp @@ -50,9 +50,7 @@ static const char *get_suffix(ErrorType ET) { #endif case ErrorType::PointerOverflow: case ErrorType::MisalignedPointerUse: -#if LLVM_VERSION_MAJOR >= 8 case ErrorType::AlignmentAssumption: -#endif return "ptr.err"; case ErrorType::InsufficientObjectSize: return "undefined_behavior.err"; @@ -68,19 +66,12 @@ static const char *get_suffix(ErrorType ET) { case ErrorType::InvalidObjCCast: return "undefined_behavior.err"; #endif -#if LLVM_VERSION_MAJOR >= 8 case ErrorType::ImplicitUnsignedIntegerTruncation: case ErrorType::ImplicitSignedIntegerTruncation: return "implicit_conversion.err"; -#elif LLVM_VERSION_MAJOR >= 7 - case ErrorType::ImplicitIntegerTruncation: - return "implicit_conversion.err"; -#endif -#if LLVM_VERSION_MAJOR >= 8 case ErrorType::ImplicitIntegerSignChange: case ErrorType::ImplicitSignedIntegerTruncationOrSignChange: return "implicit_conversion.err"; -#endif case ErrorType::InvalidShiftBase: case ErrorType::InvalidShiftExponent: return "overflow.err"; @@ -194,7 +185,6 @@ extern "C" void __ubsan_handle_type_mismatch_v1_abort(TypeMismatchData *Data, handleTypeMismatchImpl(Data, Pointer); } -#if LLVM_VERSION_MAJOR >= 8 static void handleAlignmentAssumptionImpl(AlignmentAssumptionData * /*Data*/, ValueHandle /*Pointer*/, ValueHandle /*Alignment*/, @@ -215,7 +205,6 @@ extern "C" void __ubsan_handle_alignment_assumption_abort( ValueHandle Offset) { handleAlignmentAssumptionImpl(Data, Pointer, Alignment, Offset); } -#endif /// \brief Common diagnostic emission for various forms of integer overflow. static void handleIntegerOverflowImpl(OverflowData *Data, ValueHandle /*LHS*/, @@ -376,12 +365,10 @@ extern "C" void __ubsan_handle_load_invalid_value_abort(InvalidValueData *Data, handleLoadInvalidValue(Data, Val); } -#if LLVM_VERSION_MAJOR >= 7 static void handleImplicitConversion(ImplicitConversionData *Data, ValueHandle /*Src*/, ValueHandle /*Dst*/) { ErrorType ET = ErrorType::GenericUB; -#if LLVM_VERSION_MAJOR >= 8 const TypeDescriptor &SrcTy = Data->FromType; const TypeDescriptor &DstTy = Data->ToType; @@ -413,13 +400,6 @@ static void handleImplicitConversion(ImplicitConversionData *Data, ET = ErrorType::ImplicitSignedIntegerTruncationOrSignChange; break; } -#else - switch (Data->Kind) { - case ICCK_IntegerTruncation: - ET = ErrorType::ImplicitIntegerTruncation; - break; - } -#endif report_error_type(ET); } @@ -434,7 +414,6 @@ __ubsan_handle_implicit_conversion_abort(ImplicitConversionData *Data, ValueHandle Src, ValueHandle Dst) { handleImplicitConversion(Data, Src, Dst); } -#endif static void handleInvalidBuiltin(InvalidBuiltinData * /*Data*/) { ErrorType ET = ErrorType::InvalidBuiltin; diff --git a/runtime/Sanitizer/ubsan/ubsan_handlers.h b/runtime/Sanitizer/ubsan/ubsan_handlers.h index da111ff6f8..f6c36fe586 100644 --- a/runtime/Sanitizer/ubsan/ubsan_handlers.h +++ b/runtime/Sanitizer/ubsan/ubsan_handlers.h @@ -25,13 +25,11 @@ struct TypeMismatchData { unsigned char TypeCheckKind; }; -#if LLVM_VERSION_MAJOR >= 8 struct AlignmentAssumptionData { SourceLocation Loc; SourceLocation AssumptionLoc; const TypeDescriptor &Type; }; -#endif struct OverflowData { SourceLocation Loc; @@ -64,7 +62,6 @@ struct InvalidValueData { const TypeDescriptor &Type; }; -#if LLVM_VERSION_MAJOR >= 7 /// Known implicit conversion check kinds. /// Keep in sync with the enum of the same name in CGExprScalar.cpp enum ImplicitConversionCheckKind : unsigned char { @@ -74,16 +71,13 @@ enum ImplicitConversionCheckKind : unsigned char { ICCK_IntegerSignChange = 3, ICCK_SignedIntegerTruncationOrSignChange = 4, }; -#endif -#if LLVM_VERSION_MAJOR >= 7 struct ImplicitConversionData { SourceLocation Loc; const TypeDescriptor &FromType; const TypeDescriptor &ToType; /* ImplicitConversionCheckKind */ unsigned char Kind; }; -#endif struct InvalidBuiltinData { SourceLocation Loc; diff --git a/test/Feature/ubsan/ubsan_alignment-assumption.c b/test/Feature/ubsan/ubsan_alignment-assumption.c index d18f2a284c..01c45360a0 100644 --- a/test/Feature/ubsan/ubsan_alignment-assumption.c +++ b/test/Feature/ubsan/ubsan_alignment-assumption.c @@ -1,5 +1,3 @@ -// REQUIRES: geq-llvm-8.0 - // 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 diff --git a/test/Feature/ubsan/ubsan_alignment-assumption_with_offset.c b/test/Feature/ubsan/ubsan_alignment-assumption_with_offset.c index d0b5c03abe..1eeb0de7aa 100644 --- a/test/Feature/ubsan/ubsan_alignment-assumption_with_offset.c +++ b/test/Feature/ubsan/ubsan_alignment-assumption_with_offset.c @@ -1,5 +1,3 @@ -// REQUIRES: geq-llvm-8.0 - // 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 diff --git a/test/Feature/ubsan/ubsan_implicit_integer_sign_change.c b/test/Feature/ubsan/ubsan_implicit_integer_sign_change.c index 9b33466457..36a48432c3 100644 --- a/test/Feature/ubsan/ubsan_implicit_integer_sign_change.c +++ b/test/Feature/ubsan/ubsan_implicit_integer_sign_change.c @@ -1,5 +1,3 @@ -// REQUIRES: geq-llvm-8.0 - // 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 diff --git a/test/Feature/ubsan/ubsan_implicit_signed_integer_truncation.c b/test/Feature/ubsan/ubsan_implicit_signed_integer_truncation.c index cc511f7f12..232138087d 100644 --- a/test/Feature/ubsan/ubsan_implicit_signed_integer_truncation.c +++ b/test/Feature/ubsan/ubsan_implicit_signed_integer_truncation.c @@ -1,5 +1,3 @@ -// REQUIRES: geq-llvm-8.0 - // 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 diff --git a/test/Feature/ubsan/ubsan_implicit_unsigned_integer_truncation.c b/test/Feature/ubsan/ubsan_implicit_unsigned_integer_truncation.c index b90fac70e5..f14b65ca2c 100644 --- a/test/Feature/ubsan/ubsan_implicit_unsigned_integer_truncation.c +++ b/test/Feature/ubsan/ubsan_implicit_unsigned_integer_truncation.c @@ -1,5 +1,3 @@ -// REQUIRES: geq-llvm-8.0 - // 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 From 1ac45951a90c2eed70d5232d7cd794060c47162a Mon Sep 17 00:00:00 2001 From: Pavel Date: Mon, 4 Jul 2022 15:43:52 +0400 Subject: [PATCH 046/320] Eliminate .undefined_behavior.err category and simplify tests --- include/klee/Core/TerminationTypes.h | 30 +++++++------- lib/Core/Executor.cpp | 18 +++++++-- runtime/Sanitizer/ubsan/ubsan_handlers.cpp | 39 +++++++++++-------- test/Feature/ubsan/ubsan_bool.c | 2 +- test/Feature/ubsan/ubsan_builtin.c | 2 +- .../ubsan/{ubsan_enum.c => ubsan_enum.cpp} | 2 +- ...ubsan_implicit_signed_integer_truncation.c | 2 +- ...san_implicit_unsigned_integer_truncation.c | 2 +- .../ubsan/ubsan_integer_divide_by_zero.c | 10 +---- ...plying_nonzero_offset_to_nonnull_pointer.c | 1 + ...ing_nonzero_offset_to_nonnull_pointer_10.c | 1 + ...-applying_nonzero_offset_to_null_pointer.c | 6 +-- ...low-applying_zero_offset_to_null_pointer.c | 5 ++- .../{ubsan_return.c => ubsan_return.cpp} | 2 +- test/Feature/ubsan/ubsan_unreachable.c | 2 +- 15 files changed, 72 insertions(+), 52 deletions(-) rename test/Feature/ubsan/{ubsan_enum.c => ubsan_enum.cpp} (89%) rename test/Feature/ubsan/{ubsan_return.c => ubsan_return.cpp} (85%) diff --git a/include/klee/Core/TerminationTypes.h b/include/klee/Core/TerminationTypes.h index 435b6c051a..4fe5583a99 100644 --- a/include/klee/Core/TerminationTypes.h +++ b/include/klee/Core/TerminationTypes.h @@ -32,19 +32,23 @@ TTYPE(Ptr, 16U, "ptr.err") \ TTYPE(ReadOnly, 17U, "read_only.err") \ TTYPE(ReportError, 18U, "report_error.err") \ - TTYPE(ImplicitConversion, 19U, "implicit_conversion.err") \ - TTYPE(NullableAttribute, 20U, "nullable_attribute.err") \ - TTYPE(UndefinedBehavior, 21U, "undefined_behavior.err") \ - MARK(PROGERR, 21U) \ - 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) + TTYPE(InvalidBuiltin, 19U, "invalid_builtin_use.err") \ + TTYPE(ImplicitTruncation, 20U, "implicit_truncation.err") \ + TTYPE(ImplicitConversion, 21U, "implicit_conversion.err") \ + TTYPE(UnreachableCall, 22U, "unreachable_call.err") \ + TTYPE(MissingReturn, 23U, "missing_return.err") \ + TTYPE(InvalidLoad, 24U, "invalid_load.err") \ + TTYPE(NullableAttribute, 25U, "nullable_attribute.err") \ + MARK(PROGERR, 25U) \ + TTYPE(User, 33U, "user.err") \ + MARK(USERERR, 33U) \ + TTYPE(Execution, 35U, "exec.err") \ + TTYPE(External, 36U, "external.err") \ + MARK(EXECERR, 36U) \ + TTYPE(Replay, 37U, "") \ + TTYPE(Merge, 38U, "") \ + TTYPE(SilentExit, 39U, "") \ + MARK(END, 39U) ///@brief Reason an ExecutionState got terminated. enum class StateTerminationType : std::uint8_t { diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp index 157c1cc845..1187654dc6 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -290,12 +290,24 @@ 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", - "Undefined implicit conversion detected"), + "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::UndefinedBehavior, "UndefinedBehavior", - "Undefined behavior detected"), clEnumValN(StateTerminationType::User, "User", "Wrong klee_* functions invocation")), cl::ZeroOrMore, diff --git a/runtime/Sanitizer/ubsan/ubsan_handlers.cpp b/runtime/Sanitizer/ubsan/ubsan_handlers.cpp index cfb0287c6e..38f3425f54 100644 --- a/runtime/Sanitizer/ubsan/ubsan_handlers.cpp +++ b/runtime/Sanitizer/ubsan/ubsan_handlers.cpp @@ -27,18 +27,20 @@ static const char *ConvertTypeToString(ErrorType Type) { #include "ubsan_checks.inc" #undef UBSAN_CHECK } - // UNREACHABLE("unknown ErrorType!"); } __attribute__((noreturn)) static void report_error(const char *msg, const char *suffix) { - klee_report_error(__FILE__, __LINE__, msg, suffix); + klee_report_error(__FILE__, __LINE__, msg, suffix); } static const char *get_suffix(ErrorType ET) { switch (ET) { case ErrorType::GenericUB: - return "undefined_behavior.err"; + // 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: #if LLVM_VERSION_MAJOR >= 11 case ErrorType::NullPointerUseWithNullability: @@ -53,7 +55,9 @@ static const char *get_suffix(ErrorType ET) { case ErrorType::AlignmentAssumption: return "ptr.err"; case ErrorType::InsufficientObjectSize: - return "undefined_behavior.err"; + // 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"; @@ -61,14 +65,16 @@ static const char *get_suffix(ErrorType ET) { case ErrorType::FloatDivideByZero: return "div.err"; case ErrorType::InvalidBuiltin: - return "undefined_behavior.err"; + return "invalid_builtin_use.err"; #if LLVM_VERSION_MAJOR >= 11 case ErrorType::InvalidObjCCast: - return "undefined_behavior.err"; + // Option `fsanitize=objc-cast` is not supported due to the requirement for + // Darwin system. + return "exec.err"; #endif case ErrorType::ImplicitUnsignedIntegerTruncation: case ErrorType::ImplicitSignedIntegerTruncation: - return "implicit_conversion.err"; + return "implicit_truncation.err"; case ErrorType::ImplicitIntegerSignChange: case ErrorType::ImplicitSignedIntegerTruncationOrSignChange: return "implicit_conversion.err"; @@ -78,17 +84,16 @@ static const char *get_suffix(ErrorType ET) { case ErrorType::OutOfBoundsIndex: return "ptr.err"; case ErrorType::UnreachableCall: - return "undefined_behavior.err"; + return "unreachable_call.err"; case ErrorType::MissingReturn: - return "undefined_behavior.err"; + return "missing_return.err"; case ErrorType::NonPositiveVLAIndex: return "ptr.err"; case ErrorType::FloatCastOverflow: return "overflow.err"; case ErrorType::InvalidBoolLoad: - return "undefined_behavior.err"; case ErrorType::InvalidEnumLoad: - return "undefined_behavior.err"; + return "invalid_load.err"; case ErrorType::FunctionTypeMismatch: // This check is unsupported return "exec.err"; @@ -114,6 +119,7 @@ __attribute__((noreturn)) static void report_error_type(ErrorType ET) { report_error(ConvertTypeToString(ET), get_suffix(ET)); } +#if LLVM_VERSION_MAJOR >= 11 /// 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. @@ -152,6 +158,7 @@ enum TypeCheckKind { /// null or an object within its lifetime. TCK_DynamicOperation }; +#endif static void handleTypeMismatchImpl(TypeMismatchData *Data, ValueHandle Pointer) { @@ -248,12 +255,12 @@ extern "C" void __ubsan_handle_negate_overflow_abort(OverflowData *Data, static void handleDivremOverflowImpl(OverflowData *Data, ValueHandle /*LHS*/, ValueHandle /*RHS*/) { - ErrorType ET; if (Data->Type.isIntegerTy()) report_error("integer division overflow", "overflow.err"); - else - ET = ErrorType::FloatDivideByZero; - report_error_type(ET); + else { + ErrorType ET = ErrorType::FloatDivideByZero; + report_error_type(ET); + } } extern "C" void __ubsan_handle_divrem_overflow(OverflowData *Data, @@ -353,7 +360,7 @@ extern "C" void __ubsan_handle_float_cast_overflow_abort(void *Data, static void handleLoadInvalidValue(InvalidValueData * /*Data*/, ValueHandle /*Val*/) { - report_error("load invalid value", "undefined_behavior.err"); + report_error("load invalid value", "invalid_load.err"); } extern "C" void __ubsan_handle_load_invalid_value(InvalidValueData *Data, diff --git a/test/Feature/ubsan/ubsan_bool.c b/test/Feature/ubsan/ubsan_bool.c index 360af183e8..6873299dc5 100644 --- a/test/Feature/ubsan/ubsan_bool.c +++ b/test/Feature/ubsan/ubsan_bool.c @@ -2,7 +2,7 @@ // 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 undefined_behavior.err | wc -l | grep 1 +// RUN: ls %t.klee-out/ | grep .invalid_load.err | wc -l | grep 1 #include "klee/klee.h" diff --git a/test/Feature/ubsan/ubsan_builtin.c b/test/Feature/ubsan/ubsan_builtin.c index 72ff73da24..cb04987eb2 100644 --- a/test/Feature/ubsan/ubsan_builtin.c +++ b/test/Feature/ubsan/ubsan_builtin.c @@ -2,7 +2,7 @@ // 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 .undefined_behavior.err | wc -l | grep 1 +// RUN: ls %t.klee-out/ | grep .invalid_builtin_use.err | wc -l | grep 1 #include "klee/klee.h" diff --git a/test/Feature/ubsan/ubsan_enum.c b/test/Feature/ubsan/ubsan_enum.cpp similarity index 89% rename from test/Feature/ubsan/ubsan_enum.c rename to test/Feature/ubsan/ubsan_enum.cpp index 1c79629ac6..fe01f97815 100644 --- a/test/Feature/ubsan/ubsan_enum.c +++ b/test/Feature/ubsan/ubsan_enum.cpp @@ -2,7 +2,7 @@ // 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 .undefined_behavior.err | wc -l | grep 1 +// RUN: ls %t.klee-out/ | grep .invalid_load.err | wc -l | grep 1 #include "klee/klee.h" diff --git a/test/Feature/ubsan/ubsan_implicit_signed_integer_truncation.c b/test/Feature/ubsan/ubsan_implicit_signed_integer_truncation.c index 232138087d..9500290756 100644 --- a/test/Feature/ubsan/ubsan_implicit_signed_integer_truncation.c +++ b/test/Feature/ubsan/ubsan_implicit_signed_integer_truncation.c @@ -2,7 +2,7 @@ // 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 +// RUN: ls %t.klee-out/ | grep .implicit_truncation.err | wc -l | grep 1 #include "klee/klee.h" diff --git a/test/Feature/ubsan/ubsan_implicit_unsigned_integer_truncation.c b/test/Feature/ubsan/ubsan_implicit_unsigned_integer_truncation.c index f14b65ca2c..0db03cb0e5 100644 --- a/test/Feature/ubsan/ubsan_implicit_unsigned_integer_truncation.c +++ b/test/Feature/ubsan/ubsan_implicit_unsigned_integer_truncation.c @@ -2,7 +2,7 @@ // 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 +// RUN: ls %t.klee-out/ | grep .implicit_truncation.err | wc -l | grep 1 #include "klee/klee.h" diff --git a/test/Feature/ubsan/ubsan_integer_divide_by_zero.c b/test/Feature/ubsan/ubsan_integer_divide_by_zero.c index c33bab38e7..09591e299c 100644 --- a/test/Feature/ubsan/ubsan_integer_divide_by_zero.c +++ b/test/Feature/ubsan/ubsan_integer_divide_by_zero.c @@ -6,15 +6,9 @@ #include "klee/klee.h" -#if defined(__SIZEOF_INT128__) && !defined(_WIN32) -typedef __int128 intmax; -#else -typedef long long intmax; -#endif - int main() { - intmax x; - volatile intmax result; + int x; + volatile int result; klee_make_symbolic(&x, sizeof(x), "x"); diff --git a/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer.c b/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer.c index dcbba073a3..007a8ee293 100644 --- a/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer.c +++ b/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer.c @@ -17,6 +17,7 @@ int main() { klee_assume(address != 0); char *ptr = (char *)address; + // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: pointer-overflow result = ptr + 1; return 0; diff --git a/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer_10.c b/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer_10.c index cb1267423f..20286bcc0a 100644 --- a/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer_10.c +++ b/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer_10.c @@ -17,6 +17,7 @@ int main() { klee_assume(address != 0); char *ptr = (char *)address; + // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: nullptr-after-nonzero-offset result = ptr + 1; return 0; diff --git a/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_null_pointer.c b/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_null_pointer.c index 20286bcc0a..f36dca61d7 100644 --- a/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_null_pointer.c +++ b/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_null_pointer.c @@ -3,7 +3,7 @@ // 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 .ktest | wc -l | grep 1 // RUN: ls %t.klee-out/ | grep .ptr.err | wc -l | grep 1 #include "klee/klee.h" @@ -14,11 +14,11 @@ int main() { volatile char *result; klee_make_symbolic(&address, sizeof(address), "address"); - klee_assume(address != 0); + klee_assume(address == 0); char *ptr = (char *)address; - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: nullptr-after-nonzero-offset + // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: nullptr-with-nonzero-offset result = ptr + 1; return 0; } diff --git a/test/Feature/ubsan/ubsan_pointer_overflow-applying_zero_offset_to_null_pointer.c b/test/Feature/ubsan/ubsan_pointer_overflow-applying_zero_offset_to_null_pointer.c index 301952b980..b39b65e2bc 100644 --- a/test/Feature/ubsan/ubsan_pointer_overflow-applying_zero_offset_to_null_pointer.c +++ b/test/Feature/ubsan/ubsan_pointer_overflow-applying_zero_offset_to_null_pointer.c @@ -3,7 +3,7 @@ // 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 .ktest | wc -l | grep 1 // RUN: ls %t.klee-out/ | grep .ptr.err | wc -l | grep 1 #include "klee/klee.h" @@ -14,8 +14,9 @@ int main() { volatile char *result; klee_make_symbolic(&address, sizeof(address), "address"); + klee_assume(address == 0); - char *ptr = (char *)address;; + char *ptr = (char *)address; // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: nullptr-with-offset result = ptr + 0; diff --git a/test/Feature/ubsan/ubsan_return.c b/test/Feature/ubsan/ubsan_return.cpp similarity index 85% rename from test/Feature/ubsan/ubsan_return.c rename to test/Feature/ubsan/ubsan_return.cpp index c2327db4c3..05f8209840 100644 --- a/test/Feature/ubsan/ubsan_return.c +++ b/test/Feature/ubsan/ubsan_return.cpp @@ -2,7 +2,7 @@ // 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 .undefined_behavior.err | wc -l | grep 1 +// RUN: ls %t.klee-out/ | grep .missing_return.err | wc -l | grep 1 #include "klee/klee.h" diff --git a/test/Feature/ubsan/ubsan_unreachable.c b/test/Feature/ubsan/ubsan_unreachable.c index 76e2e9091e..bfc7f6ad54 100644 --- a/test/Feature/ubsan/ubsan_unreachable.c +++ b/test/Feature/ubsan/ubsan_unreachable.c @@ -2,7 +2,7 @@ // 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 .undefined_behavior.err | wc -l | grep 1 +// RUN: ls %t.klee-out/ | grep .unreachable_call.err | wc -l | grep 1 #include "klee/klee.h" From 9b08202f12b039d8f39dfead004eabbf7361a028 Mon Sep 17 00:00:00 2001 From: Pavel Date: Mon, 4 Jul 2022 16:54:03 +0400 Subject: [PATCH 047/320] Add README to UBSan runtime --- runtime/Sanitizer/README.md | 74 +++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 runtime/Sanitizer/README.md 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 From 8ecf071992adab8b8c5593faab7338d16b15f364 Mon Sep 17 00:00:00 2001 From: Pavel Date: Sun, 10 Jul 2022 18:05:23 +0400 Subject: [PATCH 048/320] Improve pattern for FileCheck in UBSan's tests --- test/Feature/ubsan/ubsan_alignment-assumption.c | 2 +- .../ubsan/ubsan_alignment-assumption_with_offset.c | 2 +- test/Feature/ubsan/ubsan_alignment-type-mismatch.c | 2 +- test/Feature/ubsan/ubsan_array_bounds.c | 2 +- test/Feature/ubsan/ubsan_bool.c | 2 +- test/Feature/ubsan/ubsan_builtin.c | 2 +- test/Feature/ubsan/ubsan_enum.cpp | 2 +- test/Feature/ubsan/ubsan_float_cast_overflow.c | 2 +- test/Feature/ubsan/ubsan_float_divide_by_zero.c | 2 +- test/Feature/ubsan/ubsan_implicit_integer_sign_change.c | 2 +- .../ubsan/ubsan_implicit_signed_integer_truncation.c | 2 +- .../ubsan/ubsan_implicit_unsigned_integer_truncation.c | 2 +- test/Feature/ubsan/ubsan_integer_divide_by_zero.c | 2 +- test/Feature/ubsan/ubsan_nonnull_attribute.c | 2 +- test/Feature/ubsan/ubsan_null.c | 2 +- test/Feature/ubsan/ubsan_nullability_arg.c | 2 +- test/Feature/ubsan/ubsan_nullability_assign.c | 2 +- test/Feature/ubsan/ubsan_nullability_return.c | 2 +- ..._overflow-applying_nonzero_offset_to_nonnull_pointer.c | 2 +- ...erflow-applying_nonzero_offset_to_nonnull_pointer_10.c | 2 +- ...ter_overflow-applying_nonzero_offset_to_null_pointer.c | 2 +- ...ointer_overflow-applying_zero_offset_to_null_pointer.c | 2 +- .../ubsan/ubsan_pointer_overflow-pointer_arithmetic.c | 2 +- test/Feature/ubsan/ubsan_return.cpp | 2 +- test/Feature/ubsan/ubsan_returns_nonnull_attribute.c | 2 +- test/Feature/ubsan/ubsan_shift_base.c | 2 +- test/Feature/ubsan/ubsan_shift_exponent.c | 2 +- test/Feature/ubsan/ubsan_signed_integer_overflow.c | 8 ++++---- test/Feature/ubsan/ubsan_unreachable.c | 2 +- test/Feature/ubsan/ubsan_unsigned_integer_overflow.c | 8 ++++---- test/Feature/ubsan/ubsan_unsigned_shift_base.c | 2 +- test/Feature/ubsan/ubsan_vla_bound.c | 2 +- 32 files changed, 38 insertions(+), 38 deletions(-) diff --git a/test/Feature/ubsan/ubsan_alignment-assumption.c b/test/Feature/ubsan/ubsan_alignment-assumption.c index 01c45360a0..1774b5e3ad 100644 --- a/test/Feature/ubsan/ubsan_alignment-assumption.c +++ b/test/Feature/ubsan/ubsan_alignment-assumption.c @@ -14,7 +14,7 @@ int main() { char *ptr = (char *)address; - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: alignment-assumption + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: alignment-assumption __builtin_assume_aligned(ptr, 0x8000); return 0; diff --git a/test/Feature/ubsan/ubsan_alignment-assumption_with_offset.c b/test/Feature/ubsan/ubsan_alignment-assumption_with_offset.c index 1eeb0de7aa..d6ea636dde 100644 --- a/test/Feature/ubsan/ubsan_alignment-assumption_with_offset.c +++ b/test/Feature/ubsan/ubsan_alignment-assumption_with_offset.c @@ -14,7 +14,7 @@ int main() { char *ptr = (char *)address; - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: alignment-assumption + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: alignment-assumption __builtin_assume_aligned(ptr, 0x8000, 1); return 0; diff --git a/test/Feature/ubsan/ubsan_alignment-type-mismatch.c b/test/Feature/ubsan/ubsan_alignment-type-mismatch.c index 4fde8921b6..93ffd394aa 100644 --- a/test/Feature/ubsan/ubsan_alignment-type-mismatch.c +++ b/test/Feature/ubsan/ubsan_alignment-type-mismatch.c @@ -14,7 +14,7 @@ int main() { char c[] __attribute__((aligned(8))) = {0, 0, 0, 0, 1, 2, 3, 4, 5}; int *p = (int *)&c[x]; - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: misaligned-pointer-use + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: misaligned-pointer-use result = *p; return 0; } diff --git a/test/Feature/ubsan/ubsan_array_bounds.c b/test/Feature/ubsan/ubsan_array_bounds.c index ba4e7b5c5e..b8ed91f055 100644 --- a/test/Feature/ubsan/ubsan_array_bounds.c +++ b/test/Feature/ubsan/ubsan_array_bounds.c @@ -9,7 +9,7 @@ unsigned int array_index(unsigned int n) { unsigned int a[4] = {0}; - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: out-of-bounds-index + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: out-of-bounds-index return a[n]; } diff --git a/test/Feature/ubsan/ubsan_bool.c b/test/Feature/ubsan/ubsan_bool.c index 6873299dc5..e7913a637f 100644 --- a/test/Feature/ubsan/ubsan_bool.c +++ b/test/Feature/ubsan/ubsan_bool.c @@ -12,7 +12,7 @@ int main() { klee_make_symbolic(&x, sizeof(x), "x"); - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: load invalid value + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: load invalid value result = *(_Bool *)&x; return 0; diff --git a/test/Feature/ubsan/ubsan_builtin.c b/test/Feature/ubsan/ubsan_builtin.c index cb04987eb2..9147ff7640 100644 --- a/test/Feature/ubsan/ubsan_builtin.c +++ b/test/Feature/ubsan/ubsan_builtin.c @@ -11,7 +11,7 @@ int main() { klee_make_symbolic(&x, sizeof(x), "x"); - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: invalid-builtin-use + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: invalid-builtin-use __builtin_ctz(x); return 0; } diff --git a/test/Feature/ubsan/ubsan_enum.cpp b/test/Feature/ubsan/ubsan_enum.cpp index fe01f97815..462aa21c44 100644 --- a/test/Feature/ubsan/ubsan_enum.cpp +++ b/test/Feature/ubsan/ubsan_enum.cpp @@ -17,7 +17,7 @@ int main() { for (unsigned char *p = (unsigned char *)&e; p != (unsigned char *)(&e + 1); ++p) *p = x; - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: load invalid value + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: load invalid value result = (int)e != -1; return 0; diff --git a/test/Feature/ubsan/ubsan_float_cast_overflow.c b/test/Feature/ubsan/ubsan_float_cast_overflow.c index 6f17c6fa59..ad17c95c81 100644 --- a/test/Feature/ubsan/ubsan_float_cast_overflow.c +++ b/test/Feature/ubsan/ubsan_float_cast_overflow.c @@ -14,7 +14,7 @@ int main() { // klee_make_symbolic(&f, sizeof(f), "f"); - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: float-cast-overflow + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: float-cast-overflow result = f + 0x80; return 0; } diff --git a/test/Feature/ubsan/ubsan_float_divide_by_zero.c b/test/Feature/ubsan/ubsan_float_divide_by_zero.c index 848571909a..0156dbbd06 100644 --- a/test/Feature/ubsan/ubsan_float_divide_by_zero.c +++ b/test/Feature/ubsan/ubsan_float_divide_by_zero.c @@ -14,6 +14,6 @@ int main() { // klee_make_symbolic(&x, sizeof(x), "x"); // klee_assume(x != 0.0); - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: float-divide-by-zero + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: float-divide-by-zero volatile float result = x / 0; } diff --git a/test/Feature/ubsan/ubsan_implicit_integer_sign_change.c b/test/Feature/ubsan/ubsan_implicit_integer_sign_change.c index 36a48432c3..e523208142 100644 --- a/test/Feature/ubsan/ubsan_implicit_integer_sign_change.c +++ b/test/Feature/ubsan/ubsan_implicit_integer_sign_change.c @@ -7,7 +7,7 @@ #include "klee/klee.h" signed int convert_unsigned_int_to_signed_int(unsigned int x) { - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: implicit-integer-sign-change + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: implicit-integer-sign-change return x; } diff --git a/test/Feature/ubsan/ubsan_implicit_signed_integer_truncation.c b/test/Feature/ubsan/ubsan_implicit_signed_integer_truncation.c index 9500290756..727e635237 100644 --- a/test/Feature/ubsan/ubsan_implicit_signed_integer_truncation.c +++ b/test/Feature/ubsan/ubsan_implicit_signed_integer_truncation.c @@ -7,7 +7,7 @@ #include "klee/klee.h" unsigned char convert_signed_int_to_unsigned_char(signed int x) { - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: implicit-signed-integer-truncation + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: implicit-signed-integer-truncation return x; } diff --git a/test/Feature/ubsan/ubsan_implicit_unsigned_integer_truncation.c b/test/Feature/ubsan/ubsan_implicit_unsigned_integer_truncation.c index 0db03cb0e5..d16dc7e84f 100644 --- a/test/Feature/ubsan/ubsan_implicit_unsigned_integer_truncation.c +++ b/test/Feature/ubsan/ubsan_implicit_unsigned_integer_truncation.c @@ -7,7 +7,7 @@ #include "klee/klee.h" unsigned char convert_unsigned_int_to_unsigned_char(unsigned int x) { - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: implicit-unsigned-integer-truncation + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: implicit-unsigned-integer-truncation return x; } diff --git a/test/Feature/ubsan/ubsan_integer_divide_by_zero.c b/test/Feature/ubsan/ubsan_integer_divide_by_zero.c index 09591e299c..d2faca2762 100644 --- a/test/Feature/ubsan/ubsan_integer_divide_by_zero.c +++ b/test/Feature/ubsan/ubsan_integer_divide_by_zero.c @@ -12,7 +12,7 @@ int main() { klee_make_symbolic(&x, sizeof(x), "x"); - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: integer division overflow + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: integer division overflow result = x / 0; return 0; } diff --git a/test/Feature/ubsan/ubsan_nonnull_attribute.c b/test/Feature/ubsan/ubsan_nonnull_attribute.c index a98aeaddfe..fec8960439 100644 --- a/test/Feature/ubsan/ubsan_nonnull_attribute.c +++ b/test/Feature/ubsan/ubsan_nonnull_attribute.c @@ -17,7 +17,7 @@ int main() { int local = 0; int *arg = null ? 0x0 : &local; - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: invalid-null-argument + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: invalid-null-argument result = func(arg); return 0; } diff --git a/test/Feature/ubsan/ubsan_null.c b/test/Feature/ubsan/ubsan_null.c index f5ad6fdf63..754b31d3b0 100644 --- a/test/Feature/ubsan/ubsan_null.c +++ b/test/Feature/ubsan/ubsan_null.c @@ -15,7 +15,7 @@ int main() { int local = 0; int *arg = null ? 0x0 : &local; - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: null-pointer-use + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: null-pointer-use result = *arg; return 0; } diff --git a/test/Feature/ubsan/ubsan_nullability_arg.c b/test/Feature/ubsan/ubsan_nullability_arg.c index c739364910..74e881b692 100644 --- a/test/Feature/ubsan/ubsan_nullability_arg.c +++ b/test/Feature/ubsan/ubsan_nullability_arg.c @@ -15,7 +15,7 @@ int main() { int local = 0; int *arg = null ? 0x0 : &local; - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: invalid-null-argument + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: invalid-null-argument nonnull_arg(arg); return 0; } diff --git a/test/Feature/ubsan/ubsan_nullability_assign.c b/test/Feature/ubsan/ubsan_nullability_assign.c index eaf58a65d3..d1066e5443 100644 --- a/test/Feature/ubsan/ubsan_nullability_assign.c +++ b/test/Feature/ubsan/ubsan_nullability_assign.c @@ -8,7 +8,7 @@ void nonnull_assign(int *p) { volatile int *_Nonnull local; - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: null-pointer-use + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: null-pointer-use local = p; } diff --git a/test/Feature/ubsan/ubsan_nullability_return.c b/test/Feature/ubsan/ubsan_nullability_return.c index 25b2b5e0cd..3d432ab8dc 100644 --- a/test/Feature/ubsan/ubsan_nullability_return.c +++ b/test/Feature/ubsan/ubsan_nullability_return.c @@ -7,7 +7,7 @@ #include "klee/klee.h" int *_Nonnull nonnull_retval(int *p) { - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: invalid-null-return + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: invalid-null-return return p; } diff --git a/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer.c b/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer.c index 007a8ee293..9a22f7b8b2 100644 --- a/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer.c +++ b/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer.c @@ -18,7 +18,7 @@ int main() { char *ptr = (char *)address; - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: pointer-overflow + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: pointer-overflow result = ptr + 1; return 0; } diff --git a/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer_10.c b/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer_10.c index 20286bcc0a..3a0643757a 100644 --- a/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer_10.c +++ b/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer_10.c @@ -18,7 +18,7 @@ int main() { char *ptr = (char *)address; - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: nullptr-after-nonzero-offset + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: nullptr-after-nonzero-offset result = ptr + 1; return 0; } diff --git a/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_null_pointer.c b/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_null_pointer.c index f36dca61d7..26c97f3b7a 100644 --- a/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_null_pointer.c +++ b/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_null_pointer.c @@ -18,7 +18,7 @@ int main() { char *ptr = (char *)address; - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: nullptr-with-nonzero-offset + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: nullptr-with-nonzero-offset result = ptr + 1; return 0; } diff --git a/test/Feature/ubsan/ubsan_pointer_overflow-applying_zero_offset_to_null_pointer.c b/test/Feature/ubsan/ubsan_pointer_overflow-applying_zero_offset_to_null_pointer.c index b39b65e2bc..cd5215726a 100644 --- a/test/Feature/ubsan/ubsan_pointer_overflow-applying_zero_offset_to_null_pointer.c +++ b/test/Feature/ubsan/ubsan_pointer_overflow-applying_zero_offset_to_null_pointer.c @@ -18,7 +18,7 @@ int main() { char *ptr = (char *)address; - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: nullptr-with-offset + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: nullptr-with-offset result = ptr + 0; return 0; } diff --git a/test/Feature/ubsan/ubsan_pointer_overflow-pointer_arithmetic.c b/test/Feature/ubsan/ubsan_pointer_overflow-pointer_arithmetic.c index 123034b585..6d86a77e9b 100644 --- a/test/Feature/ubsan/ubsan_pointer_overflow-pointer_arithmetic.c +++ b/test/Feature/ubsan/ubsan_pointer_overflow-pointer_arithmetic.c @@ -17,7 +17,7 @@ int main() { klee_make_symbolic(&offset, sizeof(offset), "offset"); klee_assume((size_t)(ptr) + offset != 0); - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: pointer-overflow + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: pointer-overflow result = ptr + offset; return 0; diff --git a/test/Feature/ubsan/ubsan_return.cpp b/test/Feature/ubsan/ubsan_return.cpp index 05f8209840..ed5188bd15 100644 --- a/test/Feature/ubsan/ubsan_return.cpp +++ b/test/Feature/ubsan/ubsan_return.cpp @@ -7,7 +7,7 @@ #include "klee/klee.h" int no_return() { - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: missing-return + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: missing-return } int main() { diff --git a/test/Feature/ubsan/ubsan_returns_nonnull_attribute.c b/test/Feature/ubsan/ubsan_returns_nonnull_attribute.c index f2a1c6e4cd..a94ea79064 100644 --- a/test/Feature/ubsan/ubsan_returns_nonnull_attribute.c +++ b/test/Feature/ubsan/ubsan_returns_nonnull_attribute.c @@ -7,7 +7,7 @@ #include "klee/klee.h" __attribute__((returns_nonnull)) char *foo(char *a) { - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: invalid-null-return + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: invalid-null-return return a; } diff --git a/test/Feature/ubsan/ubsan_shift_base.c b/test/Feature/ubsan/ubsan_shift_base.c index 2da7158220..755c26c35a 100644 --- a/test/Feature/ubsan/ubsan_shift_base.c +++ b/test/Feature/ubsan/ubsan_shift_base.c @@ -13,7 +13,7 @@ #include "klee/klee.h" int lsh_overflow(signed int a, signed int b) { - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: shift out of bounds + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: shift out of bounds return a << b; } diff --git a/test/Feature/ubsan/ubsan_shift_exponent.c b/test/Feature/ubsan/ubsan_shift_exponent.c index 548ebb66c0..1c133b01dd 100644 --- a/test/Feature/ubsan/ubsan_shift_exponent.c +++ b/test/Feature/ubsan/ubsan_shift_exponent.c @@ -7,7 +7,7 @@ #include "klee/klee.h" int rsh_inbounds(signed int a, signed int b) { - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: shift out of bounds + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: shift out of bounds return a >> b; } diff --git a/test/Feature/ubsan/ubsan_signed_integer_overflow.c b/test/Feature/ubsan/ubsan_signed_integer_overflow.c index df798e7957..60b24dfa34 100644 --- a/test/Feature/ubsan/ubsan_signed_integer_overflow.c +++ b/test/Feature/ubsan/ubsan_signed_integer_overflow.c @@ -14,16 +14,16 @@ int main() { klee_make_symbolic(&x, sizeof(x), "x"); klee_make_symbolic(&y, sizeof(y), "y"); - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: signed-integer-overflow + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: signed-integer-overflow result = x + y; - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: signed-integer-overflow + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: signed-integer-overflow result = x - y; - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: signed-integer-overflow + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: signed-integer-overflow result = x * y; - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: signed-integer-overflow + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: signed-integer-overflow result = -x; return 0; diff --git a/test/Feature/ubsan/ubsan_unreachable.c b/test/Feature/ubsan/ubsan_unreachable.c index bfc7f6ad54..a7feaab73b 100644 --- a/test/Feature/ubsan/ubsan_unreachable.c +++ b/test/Feature/ubsan/ubsan_unreachable.c @@ -7,7 +7,7 @@ #include "klee/klee.h" void _Noreturn f() { - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: unreachable-call + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: unreachable-call __builtin_unreachable(); } diff --git a/test/Feature/ubsan/ubsan_unsigned_integer_overflow.c b/test/Feature/ubsan/ubsan_unsigned_integer_overflow.c index a11c8d07a7..8ec661303c 100644 --- a/test/Feature/ubsan/ubsan_unsigned_integer_overflow.c +++ b/test/Feature/ubsan/ubsan_unsigned_integer_overflow.c @@ -14,16 +14,16 @@ int main() { klee_make_symbolic(&x, sizeof(x), "x"); klee_make_symbolic(&y, sizeof(y), "y"); - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: unsigned-integer-overflow + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: unsigned-integer-overflow result = x + y; - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: unsigned-integer-overflow + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: unsigned-integer-overflow result = x - y; - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: unsigned-integer-overflow + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: unsigned-integer-overflow result = x * y; - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: unsigned-integer-overflow + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: unsigned-integer-overflow result = -x; return 0; diff --git a/test/Feature/ubsan/ubsan_unsigned_shift_base.c b/test/Feature/ubsan/ubsan_unsigned_shift_base.c index 92c6135345..932c82081a 100644 --- a/test/Feature/ubsan/ubsan_unsigned_shift_base.c +++ b/test/Feature/ubsan/ubsan_unsigned_shift_base.c @@ -9,7 +9,7 @@ #include "klee/klee.h" int lsh_overflow(unsigned int a, unsigned int b) { - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: shift out of bounds + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: shift out of bounds return a << b; } diff --git a/test/Feature/ubsan/ubsan_vla_bound.c b/test/Feature/ubsan/ubsan_vla_bound.c index a057c62c10..00ba1a1cb6 100644 --- a/test/Feature/ubsan/ubsan_vla_bound.c +++ b/test/Feature/ubsan/ubsan_vla_bound.c @@ -13,7 +13,7 @@ int main() { x = klee_range(-10, 10, "x"); - // CHECK: runtime/Sanitizer/ubsan/ubsan_handlers.cpp:35: non-positive-vla-index + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: non-positive-vla-index int arr[x]; result = arr[0]; return 0; From 13564199937f2382ae3b0f585e4b876449e6d5c9 Mon Sep 17 00:00:00 2001 From: Pavel Date: Sat, 6 Aug 2022 16:14:47 +0400 Subject: [PATCH 049/320] Improve pattern for FileCheck in UBSan's tests --- test/Feature/ubsan/ubsan_alignment-assumption.c | 2 +- .../ubsan/ubsan_alignment-assumption_with_offset.c | 2 +- test/Feature/ubsan/ubsan_alignment-type-mismatch.c | 2 +- test/Feature/ubsan/ubsan_array_bounds.c | 2 +- test/Feature/ubsan/ubsan_bool.c | 2 +- test/Feature/ubsan/ubsan_builtin.c | 2 +- test/Feature/ubsan/ubsan_enum.cpp | 2 +- test/Feature/ubsan/ubsan_float_cast_overflow.c | 2 +- test/Feature/ubsan/ubsan_float_divide_by_zero.c | 2 +- test/Feature/ubsan/ubsan_implicit_integer_sign_change.c | 2 +- .../ubsan/ubsan_implicit_signed_integer_truncation.c | 2 +- .../ubsan/ubsan_implicit_unsigned_integer_truncation.c | 2 +- test/Feature/ubsan/ubsan_integer_divide_by_zero.c | 2 +- test/Feature/ubsan/ubsan_nonnull_attribute.c | 2 +- test/Feature/ubsan/ubsan_null.c | 2 +- test/Feature/ubsan/ubsan_nullability_arg.c | 2 +- test/Feature/ubsan/ubsan_nullability_assign.c | 2 +- test/Feature/ubsan/ubsan_nullability_return.c | 2 +- ..._overflow-applying_nonzero_offset_to_nonnull_pointer.c | 2 +- ...erflow-applying_nonzero_offset_to_nonnull_pointer_10.c | 2 +- ...ter_overflow-applying_nonzero_offset_to_null_pointer.c | 2 +- ...ointer_overflow-applying_zero_offset_to_null_pointer.c | 2 +- .../ubsan/ubsan_pointer_overflow-pointer_arithmetic.c | 2 +- test/Feature/ubsan/ubsan_return.cpp | 2 +- test/Feature/ubsan/ubsan_returns_nonnull_attribute.c | 2 +- test/Feature/ubsan/ubsan_shift_base.c | 2 +- test/Feature/ubsan/ubsan_shift_exponent.c | 2 +- test/Feature/ubsan/ubsan_signed_integer_overflow.c | 8 ++++---- test/Feature/ubsan/ubsan_unreachable.c | 2 +- test/Feature/ubsan/ubsan_unsigned_integer_overflow.c | 8 ++++---- test/Feature/ubsan/ubsan_unsigned_shift_base.c | 2 +- test/Feature/ubsan/ubsan_vla_bound.c | 2 +- 32 files changed, 38 insertions(+), 38 deletions(-) diff --git a/test/Feature/ubsan/ubsan_alignment-assumption.c b/test/Feature/ubsan/ubsan_alignment-assumption.c index 1774b5e3ad..439101f9ae 100644 --- a/test/Feature/ubsan/ubsan_alignment-assumption.c +++ b/test/Feature/ubsan/ubsan_alignment-assumption.c @@ -14,7 +14,7 @@ int main() { char *ptr = (char *)address; - // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: alignment-assumption + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: alignment-assumption __builtin_assume_aligned(ptr, 0x8000); return 0; diff --git a/test/Feature/ubsan/ubsan_alignment-assumption_with_offset.c b/test/Feature/ubsan/ubsan_alignment-assumption_with_offset.c index d6ea636dde..4cf2142eba 100644 --- a/test/Feature/ubsan/ubsan_alignment-assumption_with_offset.c +++ b/test/Feature/ubsan/ubsan_alignment-assumption_with_offset.c @@ -14,7 +14,7 @@ int main() { char *ptr = (char *)address; - // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: alignment-assumption + // 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/Feature/ubsan/ubsan_alignment-type-mismatch.c b/test/Feature/ubsan/ubsan_alignment-type-mismatch.c index 93ffd394aa..4b5a46cde7 100644 --- a/test/Feature/ubsan/ubsan_alignment-type-mismatch.c +++ b/test/Feature/ubsan/ubsan_alignment-type-mismatch.c @@ -14,7 +14,7 @@ int main() { 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:34: misaligned-pointer-use + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: misaligned-pointer-use result = *p; return 0; } diff --git a/test/Feature/ubsan/ubsan_array_bounds.c b/test/Feature/ubsan/ubsan_array_bounds.c index b8ed91f055..8b067afa5e 100644 --- a/test/Feature/ubsan/ubsan_array_bounds.c +++ b/test/Feature/ubsan/ubsan_array_bounds.c @@ -9,7 +9,7 @@ unsigned int array_index(unsigned int n) { unsigned int a[4] = {0}; - // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: out-of-bounds-index + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: out-of-bounds-index return a[n]; } diff --git a/test/Feature/ubsan/ubsan_bool.c b/test/Feature/ubsan/ubsan_bool.c index e7913a637f..2e2ab86c87 100644 --- a/test/Feature/ubsan/ubsan_bool.c +++ b/test/Feature/ubsan/ubsan_bool.c @@ -12,7 +12,7 @@ int main() { klee_make_symbolic(&x, sizeof(x), "x"); - // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: load invalid value + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: load invalid value result = *(_Bool *)&x; return 0; diff --git a/test/Feature/ubsan/ubsan_builtin.c b/test/Feature/ubsan/ubsan_builtin.c index 9147ff7640..54f0b853ea 100644 --- a/test/Feature/ubsan/ubsan_builtin.c +++ b/test/Feature/ubsan/ubsan_builtin.c @@ -11,7 +11,7 @@ int main() { klee_make_symbolic(&x, sizeof(x), "x"); - // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: invalid-builtin-use + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: invalid-builtin-use __builtin_ctz(x); return 0; } diff --git a/test/Feature/ubsan/ubsan_enum.cpp b/test/Feature/ubsan/ubsan_enum.cpp index 462aa21c44..18efce2d18 100644 --- a/test/Feature/ubsan/ubsan_enum.cpp +++ b/test/Feature/ubsan/ubsan_enum.cpp @@ -17,7 +17,7 @@ int main() { for (unsigned char *p = (unsigned char *)&e; p != (unsigned char *)(&e + 1); ++p) *p = x; - // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: load invalid value + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: load invalid value result = (int)e != -1; return 0; diff --git a/test/Feature/ubsan/ubsan_float_cast_overflow.c b/test/Feature/ubsan/ubsan_float_cast_overflow.c index ad17c95c81..707a9782a4 100644 --- a/test/Feature/ubsan/ubsan_float_cast_overflow.c +++ b/test/Feature/ubsan/ubsan_float_cast_overflow.c @@ -14,7 +14,7 @@ int main() { // klee_make_symbolic(&f, sizeof(f), "f"); - // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: float-cast-overflow + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: float-cast-overflow result = f + 0x80; return 0; } diff --git a/test/Feature/ubsan/ubsan_float_divide_by_zero.c b/test/Feature/ubsan/ubsan_float_divide_by_zero.c index 0156dbbd06..4c68eb75df 100644 --- a/test/Feature/ubsan/ubsan_float_divide_by_zero.c +++ b/test/Feature/ubsan/ubsan_float_divide_by_zero.c @@ -14,6 +14,6 @@ int main() { // klee_make_symbolic(&x, sizeof(x), "x"); // klee_assume(x != 0.0); - // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: float-divide-by-zero + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: float-divide-by-zero volatile float result = x / 0; } diff --git a/test/Feature/ubsan/ubsan_implicit_integer_sign_change.c b/test/Feature/ubsan/ubsan_implicit_integer_sign_change.c index e523208142..9423970ff8 100644 --- a/test/Feature/ubsan/ubsan_implicit_integer_sign_change.c +++ b/test/Feature/ubsan/ubsan_implicit_integer_sign_change.c @@ -7,7 +7,7 @@ #include "klee/klee.h" signed int convert_unsigned_int_to_signed_int(unsigned int x) { - // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: implicit-integer-sign-change + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: implicit-integer-sign-change return x; } diff --git a/test/Feature/ubsan/ubsan_implicit_signed_integer_truncation.c b/test/Feature/ubsan/ubsan_implicit_signed_integer_truncation.c index 727e635237..d2ff1e765a 100644 --- a/test/Feature/ubsan/ubsan_implicit_signed_integer_truncation.c +++ b/test/Feature/ubsan/ubsan_implicit_signed_integer_truncation.c @@ -7,7 +7,7 @@ #include "klee/klee.h" unsigned char convert_signed_int_to_unsigned_char(signed int x) { - // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: implicit-signed-integer-truncation + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: implicit-signed-integer-truncation return x; } diff --git a/test/Feature/ubsan/ubsan_implicit_unsigned_integer_truncation.c b/test/Feature/ubsan/ubsan_implicit_unsigned_integer_truncation.c index d16dc7e84f..edbb9a81a0 100644 --- a/test/Feature/ubsan/ubsan_implicit_unsigned_integer_truncation.c +++ b/test/Feature/ubsan/ubsan_implicit_unsigned_integer_truncation.c @@ -7,7 +7,7 @@ #include "klee/klee.h" unsigned char convert_unsigned_int_to_unsigned_char(unsigned int x) { - // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: implicit-unsigned-integer-truncation + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: implicit-unsigned-integer-truncation return x; } diff --git a/test/Feature/ubsan/ubsan_integer_divide_by_zero.c b/test/Feature/ubsan/ubsan_integer_divide_by_zero.c index d2faca2762..aa0bf43fe7 100644 --- a/test/Feature/ubsan/ubsan_integer_divide_by_zero.c +++ b/test/Feature/ubsan/ubsan_integer_divide_by_zero.c @@ -12,7 +12,7 @@ int main() { klee_make_symbolic(&x, sizeof(x), "x"); - // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: integer division overflow + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: integer division overflow result = x / 0; return 0; } diff --git a/test/Feature/ubsan/ubsan_nonnull_attribute.c b/test/Feature/ubsan/ubsan_nonnull_attribute.c index fec8960439..d619456766 100644 --- a/test/Feature/ubsan/ubsan_nonnull_attribute.c +++ b/test/Feature/ubsan/ubsan_nonnull_attribute.c @@ -17,7 +17,7 @@ int main() { int local = 0; int *arg = null ? 0x0 : &local; - // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: invalid-null-argument + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: invalid-null-argument result = func(arg); return 0; } diff --git a/test/Feature/ubsan/ubsan_null.c b/test/Feature/ubsan/ubsan_null.c index 754b31d3b0..459e3e0dcb 100644 --- a/test/Feature/ubsan/ubsan_null.c +++ b/test/Feature/ubsan/ubsan_null.c @@ -15,7 +15,7 @@ int main() { int local = 0; int *arg = null ? 0x0 : &local; - // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: null-pointer-use + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: null-pointer-use result = *arg; return 0; } diff --git a/test/Feature/ubsan/ubsan_nullability_arg.c b/test/Feature/ubsan/ubsan_nullability_arg.c index 74e881b692..f311967ecf 100644 --- a/test/Feature/ubsan/ubsan_nullability_arg.c +++ b/test/Feature/ubsan/ubsan_nullability_arg.c @@ -15,7 +15,7 @@ int main() { int local = 0; int *arg = null ? 0x0 : &local; - // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: invalid-null-argument + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: invalid-null-argument nonnull_arg(arg); return 0; } diff --git a/test/Feature/ubsan/ubsan_nullability_assign.c b/test/Feature/ubsan/ubsan_nullability_assign.c index d1066e5443..03908cd34d 100644 --- a/test/Feature/ubsan/ubsan_nullability_assign.c +++ b/test/Feature/ubsan/ubsan_nullability_assign.c @@ -8,7 +8,7 @@ void nonnull_assign(int *p) { volatile int *_Nonnull local; - // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: null-pointer-use + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: null-pointer-use local = p; } diff --git a/test/Feature/ubsan/ubsan_nullability_return.c b/test/Feature/ubsan/ubsan_nullability_return.c index 3d432ab8dc..bf38b45f04 100644 --- a/test/Feature/ubsan/ubsan_nullability_return.c +++ b/test/Feature/ubsan/ubsan_nullability_return.c @@ -7,7 +7,7 @@ #include "klee/klee.h" int *_Nonnull nonnull_retval(int *p) { - // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: invalid-null-return + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: invalid-null-return return p; } diff --git a/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer.c b/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer.c index 9a22f7b8b2..ce1a8fea36 100644 --- a/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer.c +++ b/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer.c @@ -18,7 +18,7 @@ int main() { char *ptr = (char *)address; - // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: pointer-overflow + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: pointer-overflow result = ptr + 1; return 0; } diff --git a/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer_10.c b/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer_10.c index 3a0643757a..7a6b5153c6 100644 --- a/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer_10.c +++ b/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_nonnull_pointer_10.c @@ -18,7 +18,7 @@ int main() { char *ptr = (char *)address; - // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: nullptr-after-nonzero-offset + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: nullptr-after-nonzero-offset result = ptr + 1; return 0; } diff --git a/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_null_pointer.c b/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_null_pointer.c index 26c97f3b7a..5fb711b6ea 100644 --- a/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_null_pointer.c +++ b/test/Feature/ubsan/ubsan_pointer_overflow-applying_nonzero_offset_to_null_pointer.c @@ -18,7 +18,7 @@ int main() { char *ptr = (char *)address; - // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: nullptr-with-nonzero-offset + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: nullptr-with-nonzero-offset result = ptr + 1; return 0; } diff --git a/test/Feature/ubsan/ubsan_pointer_overflow-applying_zero_offset_to_null_pointer.c b/test/Feature/ubsan/ubsan_pointer_overflow-applying_zero_offset_to_null_pointer.c index cd5215726a..c65954e336 100644 --- a/test/Feature/ubsan/ubsan_pointer_overflow-applying_zero_offset_to_null_pointer.c +++ b/test/Feature/ubsan/ubsan_pointer_overflow-applying_zero_offset_to_null_pointer.c @@ -18,7 +18,7 @@ int main() { char *ptr = (char *)address; - // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: nullptr-with-offset + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: nullptr-with-offset result = ptr + 0; return 0; } diff --git a/test/Feature/ubsan/ubsan_pointer_overflow-pointer_arithmetic.c b/test/Feature/ubsan/ubsan_pointer_overflow-pointer_arithmetic.c index 6d86a77e9b..c50c788882 100644 --- a/test/Feature/ubsan/ubsan_pointer_overflow-pointer_arithmetic.c +++ b/test/Feature/ubsan/ubsan_pointer_overflow-pointer_arithmetic.c @@ -17,7 +17,7 @@ int main() { klee_make_symbolic(&offset, sizeof(offset), "offset"); klee_assume((size_t)(ptr) + offset != 0); - // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: pointer-overflow + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: pointer-overflow result = ptr + offset; return 0; diff --git a/test/Feature/ubsan/ubsan_return.cpp b/test/Feature/ubsan/ubsan_return.cpp index ed5188bd15..8342f8b475 100644 --- a/test/Feature/ubsan/ubsan_return.cpp +++ b/test/Feature/ubsan/ubsan_return.cpp @@ -7,7 +7,7 @@ #include "klee/klee.h" int no_return() { - // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: missing-return + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: missing-return } int main() { diff --git a/test/Feature/ubsan/ubsan_returns_nonnull_attribute.c b/test/Feature/ubsan/ubsan_returns_nonnull_attribute.c index a94ea79064..3ee4dadabc 100644 --- a/test/Feature/ubsan/ubsan_returns_nonnull_attribute.c +++ b/test/Feature/ubsan/ubsan_returns_nonnull_attribute.c @@ -7,7 +7,7 @@ #include "klee/klee.h" __attribute__((returns_nonnull)) char *foo(char *a) { - // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: invalid-null-return + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: invalid-null-return return a; } diff --git a/test/Feature/ubsan/ubsan_shift_base.c b/test/Feature/ubsan/ubsan_shift_base.c index 755c26c35a..00c55ac3d6 100644 --- a/test/Feature/ubsan/ubsan_shift_base.c +++ b/test/Feature/ubsan/ubsan_shift_base.c @@ -13,7 +13,7 @@ #include "klee/klee.h" int lsh_overflow(signed int a, signed int b) { - // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: shift out of bounds + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: shift out of bounds return a << b; } diff --git a/test/Feature/ubsan/ubsan_shift_exponent.c b/test/Feature/ubsan/ubsan_shift_exponent.c index 1c133b01dd..3b5011b94e 100644 --- a/test/Feature/ubsan/ubsan_shift_exponent.c +++ b/test/Feature/ubsan/ubsan_shift_exponent.c @@ -7,7 +7,7 @@ #include "klee/klee.h" int rsh_inbounds(signed int a, signed int b) { - // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: shift out of bounds + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: shift out of bounds return a >> b; } diff --git a/test/Feature/ubsan/ubsan_signed_integer_overflow.c b/test/Feature/ubsan/ubsan_signed_integer_overflow.c index 60b24dfa34..3b0b94f93e 100644 --- a/test/Feature/ubsan/ubsan_signed_integer_overflow.c +++ b/test/Feature/ubsan/ubsan_signed_integer_overflow.c @@ -14,16 +14,16 @@ int main() { klee_make_symbolic(&x, sizeof(x), "x"); klee_make_symbolic(&y, sizeof(y), "y"); - // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: signed-integer-overflow + // 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:34: signed-integer-overflow + // 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:34: signed-integer-overflow + // 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:34: signed-integer-overflow + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: signed-integer-overflow result = -x; return 0; diff --git a/test/Feature/ubsan/ubsan_unreachable.c b/test/Feature/ubsan/ubsan_unreachable.c index a7feaab73b..8f975261aa 100644 --- a/test/Feature/ubsan/ubsan_unreachable.c +++ b/test/Feature/ubsan/ubsan_unreachable.c @@ -7,7 +7,7 @@ #include "klee/klee.h" void _Noreturn f() { - // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: unreachable-call + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: unreachable-call __builtin_unreachable(); } diff --git a/test/Feature/ubsan/ubsan_unsigned_integer_overflow.c b/test/Feature/ubsan/ubsan_unsigned_integer_overflow.c index 8ec661303c..83afac79d7 100644 --- a/test/Feature/ubsan/ubsan_unsigned_integer_overflow.c +++ b/test/Feature/ubsan/ubsan_unsigned_integer_overflow.c @@ -14,16 +14,16 @@ int main() { klee_make_symbolic(&x, sizeof(x), "x"); klee_make_symbolic(&y, sizeof(y), "y"); - // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: unsigned-integer-overflow + // 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:34: unsigned-integer-overflow + // 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:34: unsigned-integer-overflow + // 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:34: unsigned-integer-overflow + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: unsigned-integer-overflow result = -x; return 0; diff --git a/test/Feature/ubsan/ubsan_unsigned_shift_base.c b/test/Feature/ubsan/ubsan_unsigned_shift_base.c index 932c82081a..a591bff0b8 100644 --- a/test/Feature/ubsan/ubsan_unsigned_shift_base.c +++ b/test/Feature/ubsan/ubsan_unsigned_shift_base.c @@ -9,7 +9,7 @@ #include "klee/klee.h" int lsh_overflow(unsigned int a, unsigned int b) { - // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: shift out of bounds + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: shift out of bounds return a << b; } diff --git a/test/Feature/ubsan/ubsan_vla_bound.c b/test/Feature/ubsan/ubsan_vla_bound.c index 00ba1a1cb6..72336a3b7a 100644 --- a/test/Feature/ubsan/ubsan_vla_bound.c +++ b/test/Feature/ubsan/ubsan_vla_bound.c @@ -13,7 +13,7 @@ int main() { x = klee_range(-10, 10, "x"); - // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:34: non-positive-vla-index + // CHECK: KLEE: ERROR: {{.*}}runtime/Sanitizer/ubsan/ubsan_handlers.cpp:{{[0-9]+}}: non-positive-vla-index int arr[x]; result = arr[0]; return 0; From e244b610b04afd81ef3ae47b3644fecc41ea4db1 Mon Sep 17 00:00:00 2001 From: Pavel Date: Sat, 6 Aug 2022 16:48:04 +0400 Subject: [PATCH 050/320] Add notes about how to keep in sync runtime with LLVM project --- runtime/Sanitizer/sanitizer_common/sanitizer_common.h | 6 ++++++ .../Sanitizer/sanitizer_common/sanitizer_internal_defs.h | 5 +++++ runtime/Sanitizer/sanitizer_common/sanitizer_platform.h | 4 ++++ runtime/Sanitizer/ubsan/ubsan_checks.inc | 5 +++++ runtime/Sanitizer/ubsan/ubsan_diag.h | 6 ++++++ runtime/Sanitizer/ubsan/ubsan_handlers.cpp | 3 +++ runtime/Sanitizer/ubsan/ubsan_handlers.h | 4 ++++ runtime/Sanitizer/ubsan/ubsan_value.h | 6 ++++++ 8 files changed, 39 insertions(+) diff --git a/runtime/Sanitizer/sanitizer_common/sanitizer_common.h b/runtime/Sanitizer/sanitizer_common/sanitizer_common.h index ebb88600ca..7c1161f75e 100644 --- a/runtime/Sanitizer/sanitizer_common/sanitizer_common.h +++ b/runtime/Sanitizer/sanitizer_common/sanitizer_common.h @@ -12,6 +12,12 @@ // 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 diff --git a/runtime/Sanitizer/sanitizer_common/sanitizer_internal_defs.h b/runtime/Sanitizer/sanitizer_common/sanitizer_internal_defs.h index d0817abec8..a8ba685a1c 100644 --- a/runtime/Sanitizer/sanitizer_common/sanitizer_internal_defs.h +++ b/runtime/Sanitizer/sanitizer_common/sanitizer_internal_defs.h @@ -9,6 +9,11 @@ // 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 diff --git a/runtime/Sanitizer/sanitizer_common/sanitizer_platform.h b/runtime/Sanitizer/sanitizer_common/sanitizer_platform.h index 074d2b7467..d912a0f051 100644 --- a/runtime/Sanitizer/sanitizer_common/sanitizer_platform.h +++ b/runtime/Sanitizer/sanitizer_common/sanitizer_platform.h @@ -9,6 +9,10 @@ // 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 diff --git a/runtime/Sanitizer/ubsan/ubsan_checks.inc b/runtime/Sanitizer/ubsan/ubsan_checks.inc index a4235e964c..35c64f41ff 100644 --- a/runtime/Sanitizer/ubsan/ubsan_checks.inc +++ b/runtime/Sanitizer/ubsan/ubsan_checks.inc @@ -10,6 +10,11 @@ // //===----------------------------------------------------------------------===// +// 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 diff --git a/runtime/Sanitizer/ubsan/ubsan_diag.h b/runtime/Sanitizer/ubsan/ubsan_diag.h index 4bb0404a96..29e92ea19e 100644 --- a/runtime/Sanitizer/ubsan/ubsan_diag.h +++ b/runtime/Sanitizer/ubsan/ubsan_diag.h @@ -9,6 +9,12 @@ // 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 diff --git a/runtime/Sanitizer/ubsan/ubsan_handlers.cpp b/runtime/Sanitizer/ubsan/ubsan_handlers.cpp index 38f3425f54..0213836bf5 100644 --- a/runtime/Sanitizer/ubsan/ubsan_handlers.cpp +++ b/runtime/Sanitizer/ubsan/ubsan_handlers.cpp @@ -10,6 +10,9 @@ // //===----------------------------------------------------------------------===// +// 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" diff --git a/runtime/Sanitizer/ubsan/ubsan_handlers.h b/runtime/Sanitizer/ubsan/ubsan_handlers.h index f6c36fe586..93d6326559 100644 --- a/runtime/Sanitizer/ubsan/ubsan_handlers.h +++ b/runtime/Sanitizer/ubsan/ubsan_handlers.h @@ -9,6 +9,10 @@ // 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 diff --git a/runtime/Sanitizer/ubsan/ubsan_value.h b/runtime/Sanitizer/ubsan/ubsan_value.h index 5474961ed3..02f1adf64f 100644 --- a/runtime/Sanitizer/ubsan/ubsan_value.h +++ b/runtime/Sanitizer/ubsan/ubsan_value.h @@ -10,6 +10,12 @@ // 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 From 21146a3653cdb29790a9d0f557f0f1651befbe9e Mon Sep 17 00:00:00 2001 From: Pavel Date: Fri, 8 Jul 2022 17:48:50 +0400 Subject: [PATCH 051/320] Pass llvm.experimental.noalias.scope.decl to IntrinsicLowering so that it strips out these intrinsics --- lib/Module/IntrinsicCleaner.cpp | 3 ++ test/Intrinsics/noalias-scope-decl.ll | 57 +++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 test/Intrinsics/noalias-scope-decl.ll diff --git a/lib/Module/IntrinsicCleaner.cpp b/lib/Module/IntrinsicCleaner.cpp index bdaca4259e..8658f611f1 100644 --- a/lib/Module/IntrinsicCleaner.cpp +++ b/lib/Module/IntrinsicCleaner.cpp @@ -349,6 +349,9 @@ bool IntrinsicCleanerPass::runOnBasicBlock(BasicBlock &b, Module &M) { 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: case Intrinsic::flt_rounds: case Intrinsic::frameaddress: 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" } From 667ce0f1ef33c32fbe2d1836fc1b334066e244ca Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Sat, 25 Jun 2022 21:02:58 +0100 Subject: [PATCH 052/320] Improve the message for when large arrays become symbolic. Only print this warning once per array. Add test case. --- lib/Core/Memory.cpp | 32 +++++++++++++++++----------- test/Feature/LargeArrayBecomesSym.c | 33 +++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 12 deletions(-) create mode 100644 test/Feature/LargeArrayBecomesSym.c diff --git a/lib/Core/Memory.cpp b/lib/Core/Memory.cpp index f2f679adab..efc23612dd 100644 --- a/lib/Core/Memory.cpp +++ b/lib/Core/Memory.cpp @@ -375,19 +375,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 +417,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/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); +} From 7a60192729704f2a84645bb70b0c4188f93f7f92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthis=20G=C3=B6rdel?= Date: Thu, 8 Dec 2022 22:59:30 +0100 Subject: [PATCH 053/320] fix FileCheck cmd of VarArgByVal test --- test/Feature/VarArgByVal.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/Feature/VarArgByVal.c b/test/Feature/VarArgByVal.c index 43c815b577..42718bb95d 100644 --- a/test/Feature/VarArgByVal.c +++ b/test/Feature/VarArgByVal.c @@ -4,8 +4,9 @@ // 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 +// CHECK: @test1({{.*}}, i32 -1, %struct.foo* byval{{.*}} %struct.bar* byval +// CHECK: @test2({{.*}}, %struct.foo* byval{{.*}} %struct.bar* byval #include #include From f11aae61dc582c32a40816edb02df196e71b9874 Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Sat, 24 Sep 2022 20:24:43 +0100 Subject: [PATCH 054/320] Fixed some leaks in klee-replay --- tools/klee-replay/klee-replay.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/tools/klee-replay/klee-replay.c b/tools/klee-replay/klee-replay.c index 8af90e98cb..72eeb17ee6 100644 --- a/tools/klee-replay/klee-replay.c +++ b/tools/klee-replay/klee-replay.c @@ -311,10 +311,12 @@ int main(int argc, char** argv) { prg_argc = input->numArgs; prg_argv = input->args; - prg_argv[0] = argv[1]; + free(prg_argv[0]); + prg_argv[0] = strdup(argv[1]); klee_init_env(&prg_argc, &prg_argv); replay_create_files(&__exe_fs); + kTest_free(input); return 0; } @@ -366,8 +368,11 @@ int main(int argc, char** argv) { obj_index = 0; prg_argc = input->numArgs; prg_argv = input->args; - prg_argv[0] = argv[optind]; + free(prg_argv[0]); + prg_argv[0] = strdup(argv[optind]); + klee_init_env(&prg_argc, &prg_argv); + if (idx > 2) fputc('\n', stderr); fprintf(stderr, "KLEE-REPLAY: NOTE: Test file: %s\n" @@ -385,6 +390,7 @@ int main(int argc, char** argv) { /* Run the test case machinery in a subprocess, eventually this parent process should be a script or something which shells out to the actual execution tool. */ + int pid = fork(); if (pid < 0) { perror("fork"); @@ -408,6 +414,9 @@ int main(int argc, char** argv) { perror("waitpid"); _exit(66); } + + free(prg_argv); + kTest_free(input); } } From 67805a68b233342f76011a74951bb59911721d74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthis=20G=C3=B6rdel?= Date: Thu, 8 Dec 2022 22:57:55 +0100 Subject: [PATCH 055/320] add missing FileCheck command to test --- test/Merging/unexpected_close.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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{{$}} From fc778afc9029c48b78aa59c20cdf3e8223a88081 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthis=20G=C3=B6rdel?= Date: Tue, 20 Dec 2022 16:07:51 +0100 Subject: [PATCH 056/320] fix output check in test const_arr_opt1 --- test/Feature/const_array_opt1.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/Feature/const_array_opt1.c b/test/Feature/const_array_opt1.c index f633e659f0..1776e9d812 100644 --- a/test/Feature/const_array_opt1.c +++ b/test/Feature/const_array_opt1.c @@ -1,7 +1,8 @@ +// REQUIRES: not-msan +// Disabling msan 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 @@ -32,6 +33,7 @@ int main() { else klee_silent_exit(0); } + // CHECK: Finished successfully! printf("Finished successfully!\n"); return 0; From e92f0d9bba0d109232db323d41d0443dbdd5c121 Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Fri, 3 Feb 2023 11:07:07 +0000 Subject: [PATCH 057/320] Use LLVM 11 for FreeBSD testing (package llvm90 is not available anymore) --- .cirrus.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index 8ac70fe5d9..cda56fe18d 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -6,13 +6,13 @@ task: 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 py39-sqlite3 py39-tabulate + - env ASSUME_ALWAYS_YES=yes pkg install -y llvm11 gmake z3 cmake pkgconf google-perftools python3 py39-sqlite3 py39-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_CONFIG_BINARY=/usr/local/bin/llvm-config11 -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\./lit11\./' test/lit.cfg - cd build - gmake check From 786cdf8cdb2fbd9956b5c764a7e68c7f6f8e4474 Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Fri, 3 Feb 2023 13:59:59 +0000 Subject: [PATCH 058/320] Add an extra check to test/Runtime/FreeStanding/memcpy_chk_err.c ensuring that a call to __memcpy_chk is emitted --- test/Runtime/FreeStanding/memcpy_chk_err.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/Runtime/FreeStanding/memcpy_chk_err.c b/test/Runtime/FreeStanding/memcpy_chk_err.c index b6071469bb..d8e8bc518d 100644 --- a/test/Runtime/FreeStanding/memcpy_chk_err.c +++ b/test/Runtime/FreeStanding/memcpy_chk_err.c @@ -9,6 +9,9 @@ // 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 From 5389bec800997d58b0660c87615fd4d68c7cefd2 Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Fri, 3 Feb 2023 14:11:18 +0000 Subject: [PATCH 059/320] Disable memcpy_chk_err.c on FreeBSD, where a call to __memcpy_chk is not generated --- test/Runtime/FreeStanding/memcpy_chk_err.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/test/Runtime/FreeStanding/memcpy_chk_err.c b/test/Runtime/FreeStanding/memcpy_chk_err.c index d8e8bc518d..490d3f1d24 100644 --- a/test/Runtime/FreeStanding/memcpy_chk_err.c +++ b/test/Runtime/FreeStanding/memcpy_chk_err.c @@ -1,9 +1,10 @@ // 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 +// It requires clang >= 10 and not FreeBSD, otherwise a direct call to +// memcpy is emitted instead of to __memcpy_chk // REQUIRES: geq-llvm-10.0 +// REQUIRES: not-freebsd // RUN: %clang %s -emit-llvm -O2 -g -c -D_FORTIFY_SOURCE=1 -o %t2.bc // RUN: rm -rf %t.klee-out @@ -24,7 +25,7 @@ int main() { char d[5]; - char* s = "1234567890"; + char *s = "1234567890"; memcpy(d, s, 10); } From 7e0e773b5c2fa00ab09f0756d4dadadc5b6f37eb Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Thu, 16 Feb 2023 16:33:02 +0000 Subject: [PATCH 060/320] Fix integer overflow --- tools/klee/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/klee/main.cpp b/tools/klee/main.cpp index 7d938ab29e..5e8ce86479 100644 --- a/tools/klee/main.cpp +++ b/tools/klee/main.cpp @@ -367,7 +367,7 @@ KleeHandler::KleeHandler(int argc, char **argv) } else { // "klee-out-" int i = 0; - for (; i <= INT_MAX; ++i) { + for (; i < INT_MAX; ++i) { SmallString<128> d(directory); llvm::sys::path::append(d, "klee-out-"); raw_svector_ostream ds(d); From 03a38141f95f132ebb8bd840e3063b504fe3ed1d Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Thu, 16 Feb 2023 16:43:47 +0000 Subject: [PATCH 061/320] create klee-last as a relative link --- tools/klee/main.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tools/klee/main.cpp b/tools/klee/main.cpp index 5e8ce86479..59261e4968 100644 --- a/tools/klee/main.cpp +++ b/tools/klee/main.cpp @@ -381,9 +381,15 @@ KleeHandler::KleeHandler(int argc, char **argv) SmallString<128> klee_last(directory); llvm::sys::path::append(klee_last, "klee-last"); - if (((unlink(klee_last.c_str()) < 0) && (errno != ENOENT)) || - symlink(m_outputDirectory.c_str(), klee_last.c_str()) < 0) { + if ((unlink(klee_last.c_str()) < 0) && (errno != ENOENT)) { + klee_warning("cannot remove existing klee-last symlink: %s", + strerror(errno)); + } + size_t offset = m_outputDirectory.size() - + llvm::sys::path::filename(m_outputDirectory).size(); + if (symlink(m_outputDirectory.c_str() + offset, klee_last.c_str()) < + 0) { klee_warning("cannot create klee-last symlink: %s", strerror(errno)); } From 04a42c95943ae0a6c514b133a720bd94fc54b054 Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Wed, 29 Jun 2022 23:47:22 +0100 Subject: [PATCH 062/320] Add a few simple solver tests --- test/Solver/CrosscheckCoreStpZ3.c | 10 +++++++++ test/Solver/DummySolver.c | 8 +++++++ test/Solver/ExerciseSolver.c.inc | 35 +++++++++++++++++++++++++++++++ test/Solver/NoSTP.c | 10 +++++++++ test/Solver/NoZ3.c | 10 +++++++++ test/Solver/ValidatingSolver.c | 8 +++++++ 6 files changed, 81 insertions(+) create mode 100644 test/Solver/CrosscheckCoreStpZ3.c create mode 100644 test/Solver/DummySolver.c create mode 100644 test/Solver/ExerciseSolver.c.inc create mode 100644 test/Solver/NoSTP.c create mode 100644 test/Solver/NoZ3.c create mode 100644 test/Solver/ValidatingSolver.c 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/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/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 From d3e8cd3c842b3ff8de31a52733378300fb3cef5a Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Thu, 30 Jun 2022 00:51:20 +0100 Subject: [PATCH 063/320] Have the STP coverage build also provide Z3, so that the crosscheck solver can also be tested --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 307dd8f2dc..9588b204e6 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -162,7 +162,7 @@ jobs: include: - name: "STP" env: - SOLVERS: STP + SOLVERS: STP:Z3 - name: "Z3" env: SOLVERS: Z3 From 6bc91e58dc9d286cbb50c9e48057c8037229023b Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Tue, 14 Mar 2023 20:13:30 +0000 Subject: [PATCH 064/320] Do not escape "@". This triggers an error now in the CI. --- scripts/build/p-clang-osx.inc | 2 +- scripts/build/p-llvm-osx.inc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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-llvm-osx.inc b/scripts/build/p-llvm-osx.inc index 05e423f3d1..731b14f5fa 100644 --- a/scripts/build/p-llvm-osx.inc +++ b/scripts/build/p-llvm-osx.inc @@ -2,7 +2,7 @@ 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 From 5b49bd5999aabf51016a34acaefe905c313185c1 Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Thu, 13 Oct 2022 14:22:52 +0100 Subject: [PATCH 065/320] The KDAlloc slot allocator is useful for small sized allocations --- include/klee/ADT/Bits.h | 95 +++- include/klee/KDAlloc/define.h | 17 + include/klee/KDAlloc/location_info.h | 71 +++ .../KDAlloc/suballocators/slot_allocator.h | 538 ++++++++++++++++++ include/klee/KDAlloc/tagged_logger.h | 43 ++ lib/Solver/ConstantDivision.cpp | 2 +- 6 files changed, 756 insertions(+), 10 deletions(-) create mode 100644 include/klee/KDAlloc/define.h create mode 100644 include/klee/KDAlloc/location_info.h create mode 100644 include/klee/KDAlloc/suballocators/slot_allocator.h create mode 100644 include/klee/KDAlloc/tagged_logger.h 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/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/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/suballocators/slot_allocator.h b/include/klee/KDAlloc/suballocators/slot_allocator.h new file mode 100644 index 0000000000..be8393d7d8 --- /dev/null +++ b/include/klee/KDAlloc/suballocators/slot_allocator.h @@ -0,0 +1,538 @@ +//===-- 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 { +class SlotAllocator final : public TaggedLogger { + static_assert(static_cast(-1) == ~static_cast(0), + "-1 must be ~0 for size_t"); + 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[]; + }; + + static_assert(std::is_pod::value, "Data must be POD"); + +public: + class Control final : public TaggedLogger { + 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 (=> _qurantine_size == 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] "; + } + + 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) { + 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"); + assert( + !control.unlimitedQuarantine && + "Please check for unlimited quarantine before calling this function"); + + 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"); + + if (control.unlimitedQuarantine) { + traceLine("Quarantining ", ptr, " for ever"); + } else { + 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 + } +}; +} // 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/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); From 140e08ac039959ffc34adcbd8022b3d565f50ee8 Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Thu, 13 Oct 2022 14:23:39 +0100 Subject: [PATCH 066/320] The KDAlloc loh allocator is useful for variable sized (large) allocations --- include/klee/KDAlloc/suballocators/cow_ptr.h | 180 ++++++ include/klee/KDAlloc/suballocators/loh.h | 346 ++++++++++ .../KDAlloc/suballocators/sized_regions.h | 589 ++++++++++++++++++ 3 files changed, 1115 insertions(+) create mode 100644 include/klee/KDAlloc/suballocators/cow_ptr.h create mode 100644 include/klee/KDAlloc/suballocators/loh.h create mode 100644 include/klee/KDAlloc/suballocators/sized_regions.h diff --git a/include/klee/KDAlloc/suballocators/cow_ptr.h b/include/klee/KDAlloc/suballocators/cow_ptr.h new file mode 100644 index 0000000000..20e127016e --- /dev/null +++ b/include/klee/KDAlloc/suballocators/cow_ptr.h @@ -0,0 +1,180 @@ +//===-- 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(ptr && "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(ptr && "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 &get() const noexcept { + assert(ptr && "the `CoWPtr` must not be empty"); + return ptr->data; + } + + /// Accesses 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; + } + + /// Accesses an existing, owned object. + /// Must not be called when `*this` does not hold CoW ownership. + /// + /// Note: This function is included for completeness' sake. Instead of calling + /// `getOwned` on a constant, one should probably just call `get` as it + /// produces the same result without requiring the target object to hold + /// ownership of the data. + T const &getOwned() const 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..6238618280 --- /dev/null +++ b/include/klee/KDAlloc/suballocators/loh.h @@ -0,0 +1,346 @@ +//===-- 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 elements are alternating `void*` and `std::size_t`"); + static_assert( + alignof(void *) >= alignof(std::size_t), + "The quarantine elements are alternating `void*` and `std::size_t`"); + using QuarantineElement = + std::aligned_storage_t; + + /// The quarantine position followed by the quarantine ring buffer + /// Structure: [pos, ptr1, size1, ptr2, size2, ...] + 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 * 2 + 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); + } + + std::pair + quarantine(Control const &control, void *const ptr, std::size_t const size) { + assert(!!data && + "Deallocations can only happen if allocations happened beforehand"); + assert(!control.unlimitedQuarantine); + + if (control.quarantineSize == 0) { + return {ptr, size}; + } + + 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 + 2 == control.quarantineSize) { + reinterpret_cast(data->quarantine[0]) = 1; + } else { + reinterpret_cast(data->quarantine[0]) = pos + 2; + } + + auto quarantinedPtr = std::exchange( + reinterpret_cast(data->quarantine[pos]), std::move(ptr)); + auto quarantinedSize = std::exchange( + reinterpret_cast(data->quarantine[pos + 1]), + std::move(size)); + return {quarantinedPtr, quarantinedSize}; + } + +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)) { + 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] "; + } + + 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, std::size_t size) { + assert(!!data && + "Deallocations can only happen if allocations happened beforehand"); + + if (control.unlimitedQuarantine) { + traceLine("Quarantining ", ptr, " for ever"); + } else { + auto quantizedSize = roundUpToMultipleOf4096(size); + traceLine("Quarantining ", ptr, " with size ", size, " (", quantizedSize, + ") for ", (control.quarantineSize - 1) / 2, " deallocations"); + assert(size > 0); + assert(quantizedSize % 4096 == 0); + + acquireData(control); // we will need quarantine and/or region ownership + std::tie(ptr, size) = quarantine(control, ptr, size); + if (!ptr) { + return; + } + + quantizedSize = roundUpToMultipleOf4096(size); + traceLine("Deallocating ", ptr, " with size ", size, " (", quantizedSize, + ")"); + + assert(data->referenceCount == 1); + assert(size > 0); + assert(quantizedSize % 4096 == 0); + size = quantizedSize; + traceContents(control); + traceLine("Merging region at ", + static_cast(static_cast(ptr) + size), + " with the preceding region"); + + data->regions.mergeRegionWithPrevious(static_cast(ptr) + size); + } + } + + 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..7adeea45ed --- /dev/null +++ b/include/klee/KDAlloc/suballocators/sized_regions.h @@ -0,0 +1,589 @@ +//===-- 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; } + + /// 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; + Node const *closestPredecessor = nullptr; + for (;;) { + if (currentNode->getBaseAddress() <= address) { + if (address < currentNode->getBaseAddress() + currentNode->getSize()) { + if (address + size <= + currentNode->getBaseAddress() + currentNode->getSize()) { + return LocationInfo::LI_Unallocated; + } else { + return LocationInfo::LI_Unaligned; + } + } else { + closestPredecessor = currentNode; + if (!currentNode->rhs) { + return {LocationInfo::LI_AllocatedOrQuarantined, + closestPredecessor->getBaseAddress() + + closestPredecessor->getSize()}; + } + currentNode = &*currentNode->rhs; + } + } else { + assert(closestPredecessor && + "If there is no closest predecessor, there must not be a " + "predecessor at all. Since regions are only ever split, " + "this would mean that the lookup is outside the valid " + "range, which has to be handled by the caller."); + if (currentNode->getBaseAddress() < address + size) { + return LocationInfo::LI_Unaligned; + } + if (!currentNode->lhs) { + return {LocationInfo::LI_AllocatedOrQuarantined, + closestPredecessor->getBaseAddress() + + closestPredecessor->getSize()}; + } + currentNode = &*currentNode->lhs; + } + } + } + + 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; + } + } + } + +private: + static CoWPtr mergeRegionWithPreviousRec(CoWPtr &treap, + char *const baseAddress) { + assert(treap && "cannot extract region that is not part of the treap"); + if (baseAddress < treap->getBaseAddress()) { + auto &node = treap.acquire(); + if (auto greater = mergeRegionWithPreviousRec(node.lhs, baseAddress)) { + if (node.getBaseAddress() < greater->getBaseAddress()) { + auto newSize = static_cast(greater->getBaseAddress() - + node.getBaseAddress() + + greater->getSize()); + assert( + newSize > node.getSize() && + "Sizes only get greater by adding `greater - smaller` to them"); + node.setSize(newSize); + return {}; + } else { + return greater; + } + } else { + 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.getOwned(); + node.lhs = std::move(nodeTemp.rhs); + nodeTemp.rhs = std::move(treap); + treap = std::move(temp); + } + return {}; + } + } else if (treap->getBaseAddress() < baseAddress) { + auto &node = treap.acquire(); + if (auto greater = mergeRegionWithPreviousRec(node.rhs, baseAddress)) { + if (node.getBaseAddress() < greater->getBaseAddress()) { + auto newSize = static_cast(greater->getBaseAddress() - + node.getBaseAddress() + + greater->getSize()); + assert( + newSize > node.getSize() && + "Sizes only get greater by adding `greater - smaller` to them"); + node.setSize(newSize); + return {}; + } else { + return greater; + } + } else { + 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.getOwned(); + node.rhs = std::move(nodeTemp.lhs); + nodeTemp.lhs = std::move(treap); + treap = std::move(temp); + } + return greater; + } + } else { + assert(treap->getBaseAddress() == baseAddress); + // target is now the greater (w.r.t. the tree key) of the two regions we + // are looking for + if (treap->lhs) { + CoWPtr lhs, rhs; + if (treap.isOwned()) { + auto &node = treap.acquire(); + lhs = std::move(node.lhs); + rhs = std::move(node.rhs); + } else { + lhs = treap->lhs; + rhs = treap->rhs; + } + auto const greaterBaseAddress = treap->getBaseAddress(); + auto const greaterSize = treap->getSize(); + + auto *target = &lhs; + while ((*target)->rhs) { + target = &target->acquire().rhs; + } + treap = std::move(*target); + auto &node = treap.acquire(); + *target = std::move(node.lhs); + + assert(greaterBaseAddress > node.getBaseAddress()); + auto newSize = static_cast( + greaterBaseAddress - node.getBaseAddress() + greaterSize); + assert(newSize > node.getSize() && + "Sizes only get greater by adding `greater - smaller` to them"); + node.setSize(newSize); + + assert(!node.rhs && "We looked for a node that has no rhs"); + assert((!rhs || node.getBaseAddress() < rhs->getBaseAddress()) && + "`lesser` comes from the left subtree of `greater`, while " + "rhs is the right subtree of `greater`"); + assert((!rhs || node.getSize() > rhs->getSize()) && + "The old size of `greater` was >= that of its right subtree, " + "so the new size (of `lesser`) is strictly greater"); + node.rhs = std::move(rhs); + + assert(!node.lhs && "The lhs of this node has already been removed"); + assert((!lhs || lhs->getBaseAddress() < node.getBaseAddress()) && + "`lesser` is the greatest child of the `lhs` subtree"); + assert((!lhs || node.getSize() > lhs->getSize()) && + "The old size of `greater` was >= that of its left subtree, " + "so the new size (of `lesser`) is strictly greater"); + node.lhs = std::move(lhs); + return {}; + } else { + auto greater = std::move(treap); + if (greater->rhs) { + if (greater.isOwned()) { + treap = std::move(greater.acquire().rhs); + } else { + treap = greater->rhs; + } + } + return greater; // no move to enable copy elision + } + } + } + +public: + /// This function merges the region starting at the given address, with the + /// region immediately preceding it. Both regions must exist. The resulting + /// region has the same base address as the lesser region with its size large + /// enough to cover the space to the end of the greater region (filling any + /// holes in the process). + inline void mergeRegionWithPrevious(char *const baseAddress) { + assert(root && "An empty treap holds no regions to merge"); + mergeRegionWithPreviousRec(root, baseAddress); + } + +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 From 44f9772f87b45ca7bef7767e3962e6b61a2e5c4d Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Thu, 13 Oct 2022 14:24:07 +0100 Subject: [PATCH 067/320] Add the KDAlloc allocator using both of its suballocators --- include/klee/KDAlloc/allocator.h | 264 +++++++++++++++++++++++++++++++ include/klee/KDAlloc/kdalloc.h | 21 +++ include/klee/KDAlloc/mapping.h | 158 ++++++++++++++++++ 3 files changed, 443 insertions(+) create mode 100644 include/klee/KDAlloc/allocator.h create mode 100644 include/klee/KDAlloc/kdalloc.h create mode 100644 include/klee/KDAlloc/mapping.h diff --git a/include/klee/KDAlloc/allocator.h b/include/klee/KDAlloc/allocator.h new file mode 100644 index 0000000000..f59223ed53 --- /dev/null +++ b/include/klee/KDAlloc/allocator.h @@ -0,0 +1,264 @@ +//===-- 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 that is shared with other allocators. +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); + + /// @todo This should really be a data member `static constexpr const + /// std::array meta = { ... }`. + static inline const std::array &getMeta() noexcept { + static 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 + }; + return meta; + } + + [[nodiscard]] static inline int + convertSizeToBinIndex(std::size_t const size) noexcept { + for (std::size_t i = 0; i < getMeta().size(); ++i) { + if (getMeta()[i] >= size) { + return i; + } + } + return getMeta().size(); + } + + public: + mutable class klee::ReferenceCounter _refCount; + + private: + Mapping mapping; + std::array>::value> + 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>::value> + sizedBins; + suballocators::LargeObjectAllocator largeObjectBin; + +public: + std::ostream &logTag(std::ostream &out) const noexcept { + return out << "[alloc] "; + } + + Allocator() = default; + Allocator(Allocator const &rhs) = default; + Allocator &operator=(Allocator const &rhs) = default; + Allocator(Allocator &&) = default; + Allocator &operator=(Allocator &&) = default; + + Allocator(klee::ref control) : control(std::move(control)) {} + + explicit operator bool() const noexcept { return !control.isNull(); } + + auto const &getSizedBinInfo() const noexcept { return Control::getMeta(); } + + [[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())) { + result = sizedBins[bin].allocate(control->sizedBins[bin]); + } else { + result = largeObjectBin.allocate(control->largeObjectBin, size); + } + traceLine("Allocated ", result); + return result; + } + + 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())) { + return sizedBins[bin].deallocate(control->sizedBins[bin], ptr); + } else { + return largeObjectBin.deallocate(control->largeObjectBin, ptr, size); + } + } + + LocationInfo location_info(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::getMeta().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()) { + return 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) { + assert(mapping && "Invalid mapping"); + assert(mapping.getSize() > + Allocator::Control::getMeta().size() * 4096 + 3 * 4096 && + "Mapping is *far* to 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::getMeta().size() + 1))); + char *const base = static_cast(control->mapping.getBaseAddress()); + std::size_t totalSize = 0; + for (std::size_t i = 0; i < Allocator::Control::getMeta().size(); ++i) { + control->sizedBins[i].initialize( + base + totalSize, binSize, Allocator::Control::getMeta()[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/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/mapping.h b/include/klee/KDAlloc/mapping.h new file mode 100644 index 0000000000..4afc9d8662 --- /dev/null +++ b/include/klee/KDAlloc/mapping.h @@ -0,0 +1,158 @@ +//===-- 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 (baseAddress != 0 && + baseAddress != reinterpret_cast(mappedAddress)) { + [[maybe_unused]] int rc = ::munmap(mappedAddress, size); + assert(rc == 0 && "munmap failed"); + this->baseAddress = MAP_FAILED; + return false; + } + if (mappedAddress == MAP_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); + assert(*this && "failed to allocate mapping"); + if (!*this) { + std::abort(); + } + } + + 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; + 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 From 51655c601b3246457e27cf296284c049641c470c Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Thu, 13 Oct 2022 14:25:08 +0100 Subject: [PATCH 068/320] Add some unit tests for KDAlloc --- unittests/CMakeLists.txt | 1 + unittests/KDAlloc/CMakeLists.txt | 10 ++ unittests/KDAlloc/allocate.cpp | 66 ++++++++++++ unittests/KDAlloc/randomtest.cpp | 177 +++++++++++++++++++++++++++++++ unittests/KDAlloc/reuse.cpp | 134 +++++++++++++++++++++++ unittests/KDAlloc/rusage.cpp | 66 ++++++++++++ unittests/KDAlloc/sample.cpp | 68 ++++++++++++ unittests/KDAlloc/stacktest.cpp | 172 ++++++++++++++++++++++++++++++ unittests/KDAlloc/xoshiro.h | 56 ++++++++++ 9 files changed, 750 insertions(+) create mode 100644 unittests/KDAlloc/CMakeLists.txt create mode 100644 unittests/KDAlloc/allocate.cpp create mode 100644 unittests/KDAlloc/randomtest.cpp create mode 100644 unittests/KDAlloc/reuse.cpp create mode 100644 unittests/KDAlloc/rusage.cpp create mode 100644 unittests/KDAlloc/sample.cpp create mode 100644 unittests/KDAlloc/stacktest.cpp create mode 100644 unittests/KDAlloc/xoshiro.h diff --git a/unittests/CMakeLists.txt b/unittests/CMakeLists.txt index 4ee90146d5..88d5de91e6 100644 --- a/unittests/CMakeLists.txt +++ b/unittests/CMakeLists.txt @@ -235,6 +235,7 @@ endfunction() # Unit Tests add_subdirectory(Assignment) add_subdirectory(Expr) +add_subdirectory(KDAlloc) add_subdirectory(Ref) add_subdirectory(Solver) add_subdirectory(Searcher) diff --git a/unittests/KDAlloc/CMakeLists.txt b/unittests/KDAlloc/CMakeLists.txt new file mode 100644 index 0000000000..2bb2ebe89c --- /dev/null +++ b/unittests/KDAlloc/CMakeLists.txt @@ -0,0 +1,10 @@ +add_klee_unit_test(KDAllocTest + allocate.cpp + randomtest.cpp + reuse.cpp + rusage.cpp + sample.cpp + stacktest.cpp) +target_compile_definitions(KDAllocTest PUBLIC "-DKDALLOC_CHECKED" "-DUSE_KDALLOC" "-DUSE_GTEST_INSTEAD_OF_MAIN") +target_compile_definitions(KDAllocTest PRIVATE ${KLEE_COMPONENT_CXX_DEFINES}) +target_compile_options(KDAllocTest PRIVATE ${KLEE_COMPONENT_CXX_FLAGS}) diff --git a/unittests/KDAlloc/allocate.cpp b/unittests/KDAlloc/allocate.cpp new file mode 100644 index 0000000000..895f82154d --- /dev/null +++ b/unittests/KDAlloc/allocate.cpp @@ -0,0 +1,66 @@ +//===-- allocate.cpp ------------------------------------------------------===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "klee/KDAlloc/kdalloc.h" + +#if defined(USE_GTEST_INSTEAD_OF_MAIN) +#include "gtest/gtest.h" +#endif + +#include +#include +#include +#include + +#if defined(USE_GTEST_INSTEAD_OF_MAIN) +int allocate_sample_test() { +#else +int main() { +#endif + // initialize a factory and an associated allocator (using the location "0" + // gives an OS-assigned location) + klee::kdalloc::AllocatorFactory factory(static_cast(1) << 20, 0); + klee::kdalloc::Allocator allocator = factory.makeAllocator(); + + std::deque allocations; + for (std::size_t i = 0; i < 10; ++i) { + auto p = allocator.allocate(4); + allocations.emplace_back(p); + std::cout << "Allocated " << std::right << std::setw(64 / 4) << std::hex + << (static_cast(p) - + static_cast(factory.getMapping().getBaseAddress())) + << "\n"; + } + + { + auto p = allocations[2]; + allocations.erase(allocations.begin() + 2); + std::cout << "Freeing " << std::right << std::setw(64 / 4) << std::hex + << (static_cast(p) - + static_cast(factory.getMapping().getBaseAddress())) + << "\n"; + allocator.free(p, 4); + } + + for (auto p : allocations) { + std::cout << "Freeing " << std::right << std::setw(64 / 4) << std::hex + << (static_cast(p) - + static_cast(factory.getMapping().getBaseAddress())) + << "\n"; + allocator.free(p, 4); + } + + exit(0); +} + +#if defined(USE_GTEST_INSTEAD_OF_MAIN) +TEST(KDAllocDeathTest, AllocateSample) { + ASSERT_EXIT(allocate_sample_test(), ::testing::ExitedWithCode(0), ""); +} +#endif diff --git a/unittests/KDAlloc/randomtest.cpp b/unittests/KDAlloc/randomtest.cpp new file mode 100644 index 0000000000..1120ee4e41 --- /dev/null +++ b/unittests/KDAlloc/randomtest.cpp @@ -0,0 +1,177 @@ +//===-- randomtest.cpp ----------------------------------------------------===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "klee/KDAlloc/kdalloc.h" +#include "xoshiro.h" + +#if defined(USE_GTEST_INSTEAD_OF_MAIN) +#include "gtest/gtest.h" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { +class RandomTest { + xoshiro512 rng; + +#if defined(USE_KDALLOC) + klee::kdalloc::Allocator allocator; +#endif + + std::vector> allocations; + + std::geometric_distribution allocation_bin_distribution; + std::geometric_distribution large_allocation_distribution; + +public: + std::size_t maximum_concurrent_allocations = 0; + std::uint64_t allocation_count = 0; + std::uint64_t deallocation_count = 0; + + RandomTest(std::uint64_t seed = 0x31337) + : rng(seed) +#if defined(USE_KDALLOC) + , + allocator(klee::kdalloc::AllocatorFactory( + static_cast(1) << 42, 0)) +#endif + , + allocation_bin_distribution(0.3), + large_allocation_distribution(0.00003) { + } + + void run(std::uint64_t const iterations) { + std::uniform_int_distribution choice(0, 999); + for (std::uint64_t i = 0; i < iterations; ++i) { + auto chosen = choice(rng); + if (chosen < 650) { + ++allocation_count; + allocate_sized(); + } else if (chosen < 700) { + ++allocation_count; + allocate_large(); + } else if (chosen < 1000) { + ++deallocation_count; + deallocate(); + } + } + cleanup(); + } + + void cleanup() { + while (!allocations.empty()) { + auto choice = std::uniform_int_distribution( + 0, allocations.size() - 1)(rng); +#if defined(USE_KDALLOC) + allocator.free(allocations[choice].first, allocations[choice].second); +#else + free(allocations[choice].first); +#endif + allocations[choice] = allocations.back(); + allocations.pop_back(); + } + } + + void allocate_sized() { + auto bin = allocation_bin_distribution(rng); + while (bin >= 11) { + bin = allocation_bin_distribution(rng); + } + auto min = (bin == 0 ? 1 : (static_cast(1) << (bin + 1)) + 1); + auto max = static_cast(1) << (bin + 2); + auto size = std::uniform_int_distribution(min, max)(rng); + +#if defined(USE_KDALLOC) + allocations.emplace_back(allocator.allocate(size), size); +#else + allocations.emplace_back(std::malloc(size), size); +#endif + if (allocations.size() > maximum_concurrent_allocations) { + maximum_concurrent_allocations = allocations.size(); + } + } + + void allocate_large() { + auto size = 0; + while (size <= 4096 || size > 1073741825) { + size = large_allocation_distribution(rng) + 4097; + } + +#if defined(USE_KDALLOC) + allocations.emplace_back(allocator.allocate(size), size); +#else + allocations.emplace_back(std::malloc(size), size); +#endif + if (allocations.size() > maximum_concurrent_allocations) { + maximum_concurrent_allocations = allocations.size(); + } + } + + void deallocate() { + if (allocations.empty()) { + return; + } + auto choice = std::uniform_int_distribution( + 0, allocations.size() - 1)(rng); +#if defined(USE_KDALLOC) + allocator.free(allocations[choice].first, allocations[choice].second); +#else + free(allocations[choice].first); +#endif + allocations[choice] = allocations.back(); + allocations.pop_back(); + } +}; +} // namespace + +#if defined(USE_GTEST_INSTEAD_OF_MAIN) +int random_test() { +#else +int main() { +#endif +#if defined(USE_KDALLOC) + std::cout << "Using kdalloc\n"; +#else + std::cout << "Using std::malloc\n"; +#endif + auto start = std::chrono::steady_clock::now(); + + RandomTest tester; + tester.run(10'000'000); + + auto stop = std::chrono::steady_clock::now(); + std::cout << std::dec + << std::chrono::duration_cast(stop - + start) + .count() + << " ms\n"; + std::cout << "\n"; + + std::cout << "Allocations: " << tester.allocation_count << "\n"; + std::cout << "Deallocations: " << tester.deallocation_count << "\n"; + std::cout << "Maximum concurrent allocations: " + << tester.maximum_concurrent_allocations << "\n"; + + exit(0); +} + +#if defined(USE_GTEST_INSTEAD_OF_MAIN) +TEST(KDAllocDeathTest, Random) { + ASSERT_EXIT(random_test(), ::testing::ExitedWithCode(0), ""); +} +#endif diff --git a/unittests/KDAlloc/reuse.cpp b/unittests/KDAlloc/reuse.cpp new file mode 100644 index 0000000000..d886a9d627 --- /dev/null +++ b/unittests/KDAlloc/reuse.cpp @@ -0,0 +1,134 @@ +//===-- reuse.cpp ---------------------------------------------------------===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "klee/KDAlloc/kdalloc.h" + +#if defined(USE_GTEST_INSTEAD_OF_MAIN) +#include "gtest/gtest.h" +#endif + +#include +#include +#include +#include +#include + +#if defined(USE_GTEST_INSTEAD_OF_MAIN) +int reuse_test() { +#else +int main() { +#endif + { + static const std::size_t size = 8; + static const std::uint32_t quarantine = 0; + std::cout << "size = " << size << " quarantine = " << quarantine << "\n"; + auto allocator = + static_cast(klee::kdalloc::AllocatorFactory( + static_cast(1) << 42, quarantine)); + auto a = allocator.allocate(size); + allocator.free(a, size); + auto b = allocator.allocate(size); + allocator.free(b, size); + auto c = allocator.allocate(size); + allocator.free(c, size); + auto d = allocator.allocate(size); + allocator.free(d, size); + + std::cout << "a: " << a << "\nb: " << b << "\nc: " << c << "\nd: " << d + << "\n"; + assert(a == b); + assert(a == c); + assert(a == d); + } + + std::cout << "\n\n"; + + { + static const std::size_t size = 8; + static const std::uint32_t quarantine = 1; + std::cout << "size = " << size << " quarantine = " << quarantine << "\n"; + auto allocator = + static_cast(klee::kdalloc::AllocatorFactory( + static_cast(1) << 42, quarantine)); + auto a = allocator.allocate(size); + allocator.free(a, size); + auto b = allocator.allocate(size); + allocator.free(b, size); + auto c = allocator.allocate(size); + allocator.free(c, size); + auto d = allocator.allocate(size); + allocator.free(d, size); + + std::cout << "a: " << a << "\nb: " << b << "\nc: " << c << "\nd: " << d + << "\n"; + assert(a != b); + assert(a == c); + assert(b == d); + } + + std::cout << "\n\n"; + + { + static const std::size_t size = 8; + static const std::uint32_t quarantine = 2; + std::cout << "size = " << size << " quarantine = " << quarantine << "\n"; + auto allocator = + static_cast(klee::kdalloc::AllocatorFactory( + static_cast(1) << 42, quarantine)); + auto a = allocator.allocate(size); + allocator.free(a, size); + auto b = allocator.allocate(size); + allocator.free(b, size); + auto c = allocator.allocate(size); + allocator.free(c, size); + auto d = allocator.allocate(size); + allocator.free(d, size); + + std::cout << "a: " << a << "\nb: " << b << "\nc: " << c << "\nd: " << d + << "\n"; + assert(a != b); + assert(a != c); + assert(b != c); + assert(a == d); + } + + std::cout << "\n\n"; + + { + static const std::size_t size = 8; + static const std::uint32_t quarantine = + klee::kdalloc::AllocatorFactory::unlimitedQuarantine; + std::cout << "size = " << size << " quarantine unlimited\n"; + auto allocator = + static_cast(klee::kdalloc::AllocatorFactory( + static_cast(1) << 42, quarantine)); + +#if KDALLOC_TRACE >= 2 + static const std::size_t iterations = 10; +#else + static const std::size_t iterations = 10'000; +#endif + std::unordered_set allocations; + allocations.reserve(iterations); + for (std::size_t i = 0; i < iterations; ++i) { + auto *ptr = allocator.allocate(size); + allocator.free(ptr, 8); + auto emplaced = allocations.emplace(ptr); + assert(emplaced.second); + } + } + + std::exit(0); +} + +#if defined(USE_GTEST_INSTEAD_OF_MAIN) +TEST(KDAllocDeathTest, Reuse) { + ASSERT_EXIT(reuse_test(), ::testing::ExitedWithCode(0), ""); +} +#endif diff --git a/unittests/KDAlloc/rusage.cpp b/unittests/KDAlloc/rusage.cpp new file mode 100644 index 0000000000..fa755b736e --- /dev/null +++ b/unittests/KDAlloc/rusage.cpp @@ -0,0 +1,66 @@ +//===-- rusage.cpp --------------------------------------------------------===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "klee/KDAlloc/kdalloc.h" + +#include "gtest/gtest.h" + +#include + +#include + +// This test is disabled for asan and msan because they create additional page +// faults +#if !defined(__has_feature) || \ + (!__has_feature(memory_sanitizer) && !__has_feature(address_sanitizer)) + +std::size_t write_to_allocations(std::deque &allocations) { + struct rusage ru; + getrusage(RUSAGE_SELF, &ru); + auto initial = ru.ru_minflt; + + for (auto p : allocations) { + auto pp = static_cast(p); + *pp = 1; + } + + getrusage(RUSAGE_SELF, &ru); + return ru.ru_minflt - initial; +} + +TEST(KDAllocTest, Rusage) { + // initialize a factory and an associated allocator (using the location "0" + // gives an OS-assigned location) + klee::kdalloc::AllocatorFactory factory(static_cast(1) << 30, + 0); // 1 GB + klee::kdalloc::Allocator allocator = factory.makeAllocator(); + + std::deque allocations; + for (std::size_t i = 0; i < 1000; ++i) { + auto p = allocator.allocate(16); + allocations.emplace_back(p); + } + + auto pageFaults = write_to_allocations(allocations); + + ASSERT_GT(pageFaults, static_cast(0)) + << "No page faults happened"; + ASSERT_EQ(pageFaults, allocations.size()) + << "Number of (minor) page faults and objects differs"; + + factory.getMapping().clear(); + + // try again: this should (again) trigger a minor page fault for every object + auto pageFaultsSecondTry = write_to_allocations(allocations); + + ASSERT_EQ(pageFaults, pageFaultsSecondTry) + << "Number of minor page faults in second try differs"; +} + +#endif diff --git a/unittests/KDAlloc/sample.cpp b/unittests/KDAlloc/sample.cpp new file mode 100644 index 0000000000..d4bed00b93 --- /dev/null +++ b/unittests/KDAlloc/sample.cpp @@ -0,0 +1,68 @@ +//===-- sample.cpp --------------------------------------------------------===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "klee/KDAlloc/kdalloc.h" + +#if defined(USE_GTEST_INSTEAD_OF_MAIN) +#include "gtest/gtest.h" +#endif + +#include + +#if defined(USE_GTEST_INSTEAD_OF_MAIN) +int sample_test() { +#else +int main() { +#endif + // initialize a factory and an associated allocator (using the location "0" + // gives an OS-assigned location) + klee::kdalloc::AllocatorFactory factory(static_cast(1) << 40, 0); + klee::kdalloc::Allocator allocator = factory.makeAllocator(); + + // let us create an integer + void *ptr = allocator.allocate(sizeof(int)); + int *my_int = static_cast(ptr); + *my_int = 42; + assert(*my_int == 42 && + "While we can use the addresses, this is not the point of kdalloc"); + + { + auto allocator2 = factory.makeAllocator(); + int *my_second_int = static_cast(allocator2.allocate(sizeof(int))); + assert(reinterpret_cast(my_int) == + reinterpret_cast(my_second_int) && + "kdalloc is intended to produce reproducible addresses"); + allocator2.free(my_second_int, sizeof(int)); + assert(*my_int == 42 && + "The original allocation (from allocator) is still valid"); + } + + // now let us clone the allocator state + { + auto allocator2 = allocator; + int *my_second_int = static_cast(allocator2.allocate(sizeof(int))); + assert(reinterpret_cast(my_int) != + reinterpret_cast(my_second_int) && + "the new address must be different, as allocator2 also contains the " + "previous allocation"); + allocator2.free(my_second_int, sizeof(int)); + assert(*my_int == 42 && + "The original allocation (from allocator) is still valid"); + } + + // there is no need to return allocated memory, so we omit + // `allocator.free(my_int, sizeof(int));` + exit(0); +} + +#if defined(USE_GTEST_INSTEAD_OF_MAIN) +TEST(KDAllocDeathTest, Sample) { + ASSERT_EXIT(sample_test(), ::testing::ExitedWithCode(0), ""); +} +#endif diff --git a/unittests/KDAlloc/stacktest.cpp b/unittests/KDAlloc/stacktest.cpp new file mode 100644 index 0000000000..2844bf1136 --- /dev/null +++ b/unittests/KDAlloc/stacktest.cpp @@ -0,0 +1,172 @@ +//===-- stacktest.cpp -----------------------------------------------------===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "klee/KDAlloc/kdalloc.h" +#include "xoshiro.h" + +#if defined(USE_GTEST_INSTEAD_OF_MAIN) +#include "gtest/gtest.h" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { +class RandomTest { + xoshiro512 rng; + +#if defined(USE_KDALLOC) + klee::kdalloc::StackAllocator allocator; +#endif + + std::vector> allocations; + + std::geometric_distribution allocation_bin_distribution; + std::geometric_distribution large_allocation_distribution; + +public: + std::size_t maximum_concurrent_allocations = 0; + std::uint64_t allocation_count = 0; + std::uint64_t deallocation_count = 0; + + RandomTest(std::mt19937_64::result_type seed = 0x31337) + : rng(seed) +#if defined(USE_KDALLOC) + , + allocator(klee::kdalloc::StackAllocatorFactory( + static_cast(1) << 42, 0)) +#endif + , + allocation_bin_distribution(0.3), + large_allocation_distribution(0.00003) { + } + + void run(std::uint64_t const iterations) { + allocations.reserve((iterations * 7) / 10); + std::uniform_int_distribution choice(0, 999); + for (std::uint64_t i = 0; i < iterations; ++i) { + auto chosen = choice(rng); + if (chosen < 650) { + ++allocation_count; + allocate_sized(); + } else if (chosen < 700) { + ++allocation_count; + allocate_large(); + } else if (chosen < 1000) { + ++deallocation_count; + deallocate(); + } + } + cleanup(); + } + + void cleanup() { + while (!allocations.empty()) { +#if defined(USE_KDALLOC) + allocator.free(allocations.back().first, allocations.back().second); +#else + free(allocations.back().first); +#endif + allocations.pop_back(); + } + } + + void allocate_sized() { + auto bin = allocation_bin_distribution(rng); + while (bin >= 11) { + bin = allocation_bin_distribution(rng); + } + auto min = (bin == 0 ? 1 : (static_cast(1) << (bin + 1)) + 1); + auto max = static_cast(1) << (bin + 2); + auto size = std::uniform_int_distribution(min, max)(rng); + +#if defined(USE_KDALLOC) + allocations.emplace_back(allocator.allocate(size), size); +#else + allocations.emplace_back(std::malloc(size), size); +#endif + if (allocations.size() > maximum_concurrent_allocations) { + maximum_concurrent_allocations = allocations.size(); + } + } + + void allocate_large() { + auto size = 0; + while (size <= 4096 || size > 1073741825) { + size = large_allocation_distribution(rng) + 4097; + } + +#if defined(USE_KDALLOC) + allocations.emplace_back(allocator.allocate(size), size); +#else + allocations.emplace_back(std::malloc(size), size); +#endif + if (allocations.size() > maximum_concurrent_allocations) { + maximum_concurrent_allocations = allocations.size(); + } + } + + void deallocate() { + if (allocations.empty()) { + return; + } +#if defined(USE_KDALLOC) + allocator.free(allocations.back().first, allocations.back().second); +#else + free(allocations.back().first); +#endif + allocations.pop_back(); + } +}; +} // namespace + +#if defined(USE_GTEST_INSTEAD_OF_MAIN) +int stack_test() { +#else +int main() { +#endif +#if defined(USE_KDALLOC) + std::cout << "Using kdalloc\n"; +#else + std::cout << "Using std::malloc\n"; +#endif + auto start = std::chrono::steady_clock::now(); + + RandomTest tester; + tester.run(10'000'000); + + auto stop = std::chrono::steady_clock::now(); + std::cout << std::dec + << std::chrono::duration_cast(stop - + start) + .count() + << " ms\n"; + std::cout << "\n"; + + std::cout << "Allocations: " << tester.allocation_count << "\n"; + std::cout << "Deallocations: " << tester.deallocation_count << "\n"; + std::cout << "Maximum concurrent allocations: " + << tester.maximum_concurrent_allocations << "\n"; + + exit(0); +} + +#if defined(USE_GTEST_INSTEAD_OF_MAIN) +TEST(KDAllocDeathTest, Stack) { + ASSERT_EXIT(stack_test(), ::testing::ExitedWithCode(0), ""); +} +#endif diff --git a/unittests/KDAlloc/xoshiro.h b/unittests/KDAlloc/xoshiro.h new file mode 100644 index 0000000000..465a83c9aa --- /dev/null +++ b/unittests/KDAlloc/xoshiro.h @@ -0,0 +1,56 @@ +//===-- xoshiro.h ---------------------------------------------------------===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include + +/// A xoshiro512** generator +class xoshiro512 { + static constexpr const ::std::uint64_t A = 11; + static constexpr const ::std::uint64_t B = 21; + + static constexpr const ::std::uint64_t S = 5; + static constexpr const ::std::uint64_t R = 7; + static constexpr const ::std::uint64_t T = 9; + + ::std::uint64_t s[8] = {0x243F6A8885A308D3u, 0x13198A2E03707344u, + 0xA4093822299F31D0u, 0x082EFA98EC4E6C89u, + 0x452821E638D01377u, 0xBE5466CF34E90C6Cu, + 0xC0AC29B7C97C50DDu, 0x3F84D5B5B5470917u}; + +public: + explicit xoshiro512(std::uint64_t const seed) noexcept { + for (auto &x : s) { + x ^= seed; + } + } + + using result_type = std::uint64_t; + + std::uint64_t operator()() noexcept { + auto const t = s[1] * S; + auto const result = ((t << R) | (t >> (64 - R))) * T; + auto const u = s[1] << A; + s[2] ^= s[0]; + s[5] ^= s[1]; + s[1] ^= s[2]; + s[7] ^= s[3]; + s[3] ^= s[4]; + s[4] ^= s[5]; + s[0] ^= s[6]; + s[6] ^= s[7]; + s[6] ^= u; + s[7] = ((s[7] << B) | (s[7] >> (64 - B))); + return result; + } + + static constexpr ::std::uint64_t(min)() noexcept { return 0; } + static constexpr ::std::uint64_t(max)() noexcept { + return static_cast(0) - static_cast(1); + } +}; From 9d0e072e3b40b720a26265f0d9b2b99f2d3a954e Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Wed, 15 Mar 2023 00:13:28 +0000 Subject: [PATCH 069/320] Integrate KDAlloc into KLEE --- lib/Core/AddressSpace.cpp | 28 ++-- lib/Core/AddressSpace.h | 6 +- lib/Core/ExecutionState.cpp | 24 ++- lib/Core/ExecutionState.h | 12 +- lib/Core/Executor.cpp | 141 ++++++++++++---- lib/Core/Executor.h | 9 +- lib/Core/Memory.h | 5 +- lib/Core/MemoryManager.cpp | 321 +++++++++++++++++++++++++++++------- lib/Core/MemoryManager.h | 27 ++- test/Feature/VarArg.c | 2 +- 10 files changed, 459 insertions(+), 116 deletions(-) diff --git a/lib/Core/AddressSpace.cpp b/lib/Core/AddressSpace.cpp index f3462ca177..ab3bbb8cf1 100644 --- a/lib/Core/AddressSpace.cpp +++ b/lib/Core/AddressSpace.cpp @@ -297,19 +297,25 @@ 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() { diff --git a/lib/Core/AddressSpace.h b/lib/Core/AddressSpace.h index 4df8d5f0b9..37ae76f94c 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 diff --git a/lib/Core/ExecutionState.cpp b/lib/Core/ExecutionState.cpp index 5231f7fb71..1c1f477c4a 100644 --- a/lib/Core/ExecutionState.cpp +++ b/lib/Core/ExecutionState.cpp @@ -70,10 +70,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 +95,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), @@ -127,11 +133,25 @@ 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 (!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); } diff --git a/lib/Core/ExecutionState.h b/lib/Core/ExecutionState.h index 49e232dcf7..6d6336dd40 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" @@ -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; @@ -246,7 +254,7 @@ class ExecutionState { 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 +269,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); diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp index 1187654dc6..013f01c256 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -9,6 +9,7 @@ #include "Executor.h" +#include "AddressSpace.h" #include "Context.h" #include "CoreStats.h" #include "ExecutionState.h" @@ -35,6 +36,7 @@ #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" @@ -81,6 +83,7 @@ typedef unsigned TypeSize; #include #include #include +#include #include #include #include @@ -90,6 +93,7 @@ typedef unsigned TypeSize; #include #include #include +#include #include using namespace llvm; @@ -208,6 +212,14 @@ cl::opt AllExternalWarnings( "as opposed to once per function (default=false)"), 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 ***/ @@ -684,7 +696,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); } @@ -763,7 +775,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"); @@ -813,9 +826,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); @@ -838,22 +848,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); - } } @@ -1537,7 +1540,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]); @@ -1987,7 +1990,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)"); @@ -2054,7 +2057,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); @@ -2418,7 +2421,7 @@ void Executor::executeInstruction(ExecutionState &state, KInstruction *ki) { const CallBase &cb = cast(*i); Value *fp = cb.getCalledOperand(); unsigned numArgs = cb.arg_size(); - Function *f = getTargetFunction(fp, state); + Function *f = getTargetFunction(fp); // evaluate arguments std::vector< ref > arguments; @@ -3873,7 +3876,35 @@ void Executor::callExternalFunction(ExecutionState &state, } // 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 = {}; + 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); @@ -3926,6 +3957,13 @@ void Executor::callExternalFunction(ExecutionState &state, 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(); @@ -4002,7 +4040,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())); @@ -4019,7 +4057,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 { @@ -4134,6 +4174,7 @@ void Executor::executeFree(ExecutionState &state, 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)); @@ -4168,6 +4209,19 @@ void Executor::resolveExact(ExecutionState &state, } if (unbound) { + auto CE = dyn_cast(p); + if (MemoryManager::isDeterministic && CE) { + using kdalloc::LocationInfo; + auto ptr = reinterpret_cast(CE->getZExtValue()); + auto locinfo = unbound->heapAllocator.location_info(ptr, 1); + if (locinfo == LocationInfo::LI_AllocatedOrQuarantined && + locinfo.getBaseAddress() == ptr && name == "free") { + terminateStateOnError(*unbound, "memory error: double free", + StateTerminationType::Ptr, + getAddressInfo(*unbound, p)); + return; + } + } terminateStateOnError(*unbound, "memory error: invalid pointer: " + name, StateTerminationType::Ptr, getAddressInfo(*unbound, p)); } @@ -4293,6 +4347,32 @@ void Executor::executeMemoryOperation(ExecutionState &state, if (incomplete) { terminateStateOnSolverError(*unbound, "Query timed out (resolve)."); } else { + if (auto CE = dyn_cast(address)) { + std::uintptr_t ptrval = CE->getZExtValue(); + auto ptr = reinterpret_cast(ptrval); + if (ptrval < MemoryManager::pageSize) { + terminateStateOnError(*unbound, "memory error: null page access", + StateTerminationType::Ptr, + getAddressInfo(*unbound, address)); + return; + } else if (MemoryManager::isDeterministic) { + using kdalloc::LocationInfo; + auto li = unbound->heapAllocator.location_info(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)) { + terminateStateOnError(*unbound, "memory error: use after free", + StateTerminationType::Ptr, + getAddressInfo(*unbound, address)); + return; + } + } + } + } terminateStateOnError(*unbound, "memory error: out of bound pointer", StateTerminationType::Ptr, getAddressInfo(*unbound, address)); @@ -4404,10 +4484,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"); @@ -4424,7 +4504,7 @@ void Executor::runFunctionAsMain(Function *f, } } - ExecutionState *state = new ExecutionState(kmodule->functionMap[f]); + ExecutionState *state = new ExecutionState(kmodule->functionMap[f], memory); if (pathWriter) state->pathOS = pathWriter->open(); @@ -4452,7 +4532,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); diff --git a/lib/Core/Executor.h b/lib/Core/Executor.h index 279d8bee00..21d0d081c1 100644 --- a/lib/Core/Executor.h +++ b/lib/Core/Executor.h @@ -138,13 +138,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. @@ -212,8 +212,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); diff --git a/lib/Core/Memory.h b/lib/Core/Memory.h index 7e1f097a78..9a9367467e 100644 --- a/lib/Core/Memory.h +++ b/lib/Core/Memory.h @@ -50,6 +50,7 @@ class MemoryObject { /// size in bytes unsigned size; + unsigned alignment; mutable std::string name; bool isLocal; @@ -76,18 +77,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), diff --git a/lib/Core/MemoryManager.cpp b/lib/Core/MemoryManager.cpp index f15c0db9d7..0e47500a62 100644 --- a/lib/Core/MemoryManager.cpp +++ b/lib/Core/MemoryManager.cpp @@ -10,76 +10,261 @@ #include "MemoryManager.h" #include "CoreStats.h" +#include "ExecutionState.h" #include "Memory.h" #include "klee/Expr/Expr.h" #include "klee/Support/ErrorHandling.h" +#include "llvm/IR/GlobalVariable.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/MathExtras.h" +#if LLVM_VERSION_CODE >= LLVM_VERSION(10, 0) +#include "llvm/Support/Alignment.h" +#else +#include "llvm/Support/MathExtras.h" +#endif -#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; +} // namespace klee + +namespace { llvm::cl::OptionCategory MemoryCat("Memory management options", "These options control memory management."); -llvm::cl::opt DeterministicAllocation( - "allocate-determ", +llvm::cl::opt DeterministicAllocation( + "kdalloc", llvm::cl::desc("Allocate memory deterministically (default=false)"), - llvm::cl::init(false), llvm::cl::cat(MemoryCat)); + llvm::cl::location(MemoryManager::isDeterministic), llvm::cl::init(false), + 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 DeterministicAllocationSize( - "allocate-determ-size", +llvm::cl::opt DeterministicAllocationGlobalsStartAddress( + "kdalloc-globals-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 globals segment (has to be page aligned)"), + llvm::cl::cat(MemoryCat)); + +llvm::cl::opt DeterministicAllocationConstantsStartAddress( + "kdalloc-constants-start-address", + llvm::cl::desc( + "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 +#if LLVM_VERSION_CODE >= LLVM_VERSION(10, 0) + llvm::Align pageAlignment(pageSize); +#endif + 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 LLVM_VERSION_CODE >= LLVM_VERSION(10, 0) + if (start1 != 0 && !llvm::isAligned(pageAlignment, start1)) { + klee_error("Deterministic allocator: Requested start address for %s " + "is not page aligned (page size: %zu B)", + segment1.c_str(), pageAlignment.value()); + } +#else + if (start1 != 0 && llvm::OffsetToAlignment(start1, pageSize) != 0) { + klee_error("Deterministic allocator: Requested start address for %s " + "is not page aligned (page size: %zu B)", + segment1.c_str(), pageSize); + } +#endif + + // 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: %s", + segment.c_str(), 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 +276,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 +298,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 +338,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 +357,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 +370,21 @@ void MemoryManager::markFreed(MemoryObject *mo) { } } -size_t MemoryManager::getUsedDeterministicSize() { - return nextFreeSlot - deterministicSpace; +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() { + // TODO: implement + return 0; +} \ No newline at end of file diff --git a/lib/Core/MemoryManager.h b/lib/Core/MemoryManager.h index f75c82fb1d..71a7018329 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); ~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/test/Feature/VarArg.c b/test/Feature/VarArg.c index 0b8b669802..67807a11f2 100644 --- a/test/Feature/VarArg.c +++ b/test/Feature/VarArg.c @@ -7,7 +7,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 From 7e49c161b76c687f5813e81305ca6697a397478a Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Thu, 13 Oct 2022 14:25:43 +0100 Subject: [PATCH 070/320] Add some system tests for KDAlloc --- test/DeterministicAllocation/OneOutOfBounds.c | 12 +++++ .../DeterministicAllocation/double-free-loh.c | 16 ++++++ test/DeterministicAllocation/double-free.c | 16 ++++++ test/DeterministicAllocation/madvise.c | 49 +++++++++++++++++++ test/DeterministicAllocation/nullpage-read.c | 20 ++++++++ test/DeterministicAllocation/nullpage-write.c | 19 +++++++ .../use-after-free-loh.c | 17 +++++++ test/DeterministicAllocation/use-after-free.c | 17 +++++++ 8 files changed, 166 insertions(+) create mode 100644 test/DeterministicAllocation/OneOutOfBounds.c create mode 100644 test/DeterministicAllocation/double-free-loh.c create mode 100644 test/DeterministicAllocation/double-free.c create mode 100644 test/DeterministicAllocation/madvise.c create mode 100644 test/DeterministicAllocation/nullpage-read.c create mode 100644 test/DeterministicAllocation/nullpage-write.c create mode 100644 test/DeterministicAllocation/use-after-free-loh.c create mode 100644 test/DeterministicAllocation/use-after-free.c diff --git a/test/DeterministicAllocation/OneOutOfBounds.c b/test/DeterministicAllocation/OneOutOfBounds.c new file mode 100644 index 0000000000..499ff06bae --- /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 + +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; +} From 7a4a9b9b47d2fe9b90cee95d68d89faa24a118d4 Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Tue, 14 Mar 2023 20:25:11 +0000 Subject: [PATCH 071/320] Fixed a bug in KLEE libc's implementation of strcmp: according to the C standard, characters should be compared as unsigned chars. --- runtime/klee-libc/strcmp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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; } From 3ef5c9d0cd51babb7c4ec2d7bb76d0cb7e47a65c Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Thu, 23 Feb 2023 21:47:53 +0000 Subject: [PATCH 072/320] [cmake] Use LLVM's CMake functionality only LLVM became more complex, use LLVM's CMake functionality directly instead of replicating this behaviour in KLEE's build system. Use the correct build flags provided by LLVM itself. This is influenced by the way LLVM is built in the first place. Remove older CMake support (< 3.0). --- CMakeLists.txt | 162 +++++----------- README-CMake.md | 11 +- cmake/add_global_flag.cmake | 55 ------ cmake/c_flags_override.cmake | 24 --- cmake/compiler_warnings.cmake | 57 +----- cmake/cxx_flags_override.cmake | 25 --- cmake/find_bitcode_compiler.cmake | 96 --------- cmake/find_llvm.cmake | 246 ------------------------ cmake/find_metasmt.cmake | 14 +- cmake/find_stp.cmake | 2 +- cmake/find_z3.cmake | 6 + cmake/klee_add_component.cmake | 20 -- cmake/klee_component_add_cxx_flag.cmake | 31 --- cmake/string_to_list.cmake | 13 -- lib/Basic/CMakeLists.txt | 13 +- lib/Core/CMakeLists.txt | 20 +- lib/Expr/CMakeLists.txt | 12 +- lib/Module/CMakeLists.txt | 21 +- lib/Solver/CMakeLists.txt | 15 +- lib/Support/CMakeLists.txt | 13 +- runtime/Runtest/CMakeLists.txt | 4 +- test/CMakeLists.txt | 12 +- tools/kleaver/CMakeLists.txt | 12 +- tools/klee-replay/CMakeLists.txt | 1 + tools/klee/CMakeLists.txt | 4 + tools/ktest-gen/CMakeLists.txt | 1 + tools/ktest-randgen/CMakeLists.txt | 1 + unittests/Assignment/CMakeLists.txt | 4 + unittests/CMakeLists.txt | 11 +- unittests/DiscretePDF/CMakeLists.txt | 6 +- unittests/Expr/CMakeLists.txt | 5 + unittests/RNG/CMakeLists.txt | 4 + unittests/Ref/CMakeLists.txt | 4 + unittests/Searcher/CMakeLists.txt | 6 +- unittests/Solver/CMakeLists.txt | 9 +- unittests/Time/CMakeLists.txt | 3 + unittests/TreeStream/CMakeLists.txt | 3 + 37 files changed, 189 insertions(+), 757 deletions(-) delete mode 100644 cmake/add_global_flag.cmake delete mode 100644 cmake/c_flags_override.cmake delete mode 100644 cmake/cxx_flags_override.cmake delete mode 100644 cmake/find_bitcode_compiler.cmake delete mode 100644 cmake/find_llvm.cmake delete mode 100644 cmake/klee_add_component.cmake delete mode 100644 cmake/klee_component_add_cxx_flag.cmake delete mode 100644 cmake/string_to_list.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 89054a8646..cf01df24e9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,30 +11,8 @@ # 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") project(KLEE CXX C) -include(CheckFunctionExists) -include(CheckLibraryExists) - ############################################################################### # Project version ############################################################################### @@ -88,9 +66,10 @@ 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 @@ -103,11 +82,6 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules") # 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 "") ################################################################################ @@ -116,7 +90,8 @@ set(KLEE_COMPONENT_EXTRA_LIBRARIES "") 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 add the undefine to the flags, otherwise "-D-UDNDEBUG" will be added + list(APPEND KLEE_COMPONENT_CXX_FLAGS "-UDNDEBUG") else() message(STATUS "KLEE assertions disabled") list(APPEND KLEE_COMPONENT_CXX_DEFINES "-DNDEBUG") @@ -136,47 +111,25 @@ include(CheckIncludeFile) include(CheckIncludeFileCXX) 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") - +include(CheckFunctionExists) +include(CheckLibraryExists) ################################################################################ # 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 +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 ${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 -) -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 set(ENABLE_KLEE_DEBUG 1) # for config.h @@ -199,45 +152,39 @@ 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}\"") -endif() - ################################################################################ # C++ version ################################################################################ @@ -275,7 +222,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 +236,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() @@ -325,14 +272,19 @@ 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) @@ -341,15 +293,10 @@ if (ENABLE_TCMALLOC) 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 +310,8 @@ 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() ################################################################################ @@ -511,8 +456,6 @@ endif() ################################################################################ set(KLEE_UCLIBC_PATH "" CACHE PATH "Path to klee-uclibc root directory") set(KLEE_UCLIBC_BCA_NAME "klee-uclibc.bca") -list(APPEND KLEE_COMPONENT_CXX_DEFINES - -DKLEE_UCLIBC_BCA_NAME=\"${KLEE_UCLIBC_BCA_NAME}\") if (NOT KLEE_UCLIBC_PATH STREQUAL "") # Find the C library bitcode archive set(KLEE_UCLIBC_C_BCA "${KLEE_UCLIBC_PATH}/lib/libc.a") @@ -621,7 +564,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) @@ -659,10 +602,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 @@ -685,7 +628,6 @@ 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/README-CMake.md b/README-CMake.md index 4ea57421ed..965e2b02f0 100644 --- a/README-CMake.md +++ b/README-CMake.md @@ -87,13 +87,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 @@ -105,7 +99,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/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..b8d00a6ba7 100644 --- a/cmake/compiler_warnings.cmake +++ b/cmake/compiler_warnings.cmake @@ -13,67 +13,18 @@ # 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 +add_compile_options( "-Wall" "-Wextra" - "-Wno-unused-parameter") -set(GCC_AND_CLANG_WARNINGS_C - "-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/string_to_list.cmake b/cmake/string_to_list.cmake deleted file mode 100644 index 65c04413fa..0000000000 --- a/cmake/string_to_list.cmake +++ /dev/null @@ -1,13 +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(string_to_list s output_var) - string(REPLACE " " ";" _output "${s}") - set(${output_var} ${_output} PARENT_SCOPE) -endfunction() diff --git a/lib/Basic/CMakeLists.txt b/lib/Basic/CMakeLists.txt index d156116f45..5671c14459 100644 --- a/lib/Basic/CMakeLists.txt +++ b/lib/Basic/CMakeLists.txt @@ -6,13 +6,14 @@ # 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_map_components_to_libnames(llvm_libs support) +target_link_libraries(kleeBasic PRIVATE ${llvm_libs}) +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/CMakeLists.txt b/lib/Core/CMakeLists.txt index de52cd1111..0905a7f03e 100644 --- a/lib/Core/CMakeLists.txt +++ b/lib/Core/CMakeLists.txt @@ -6,7 +6,7 @@ # License. See LICENSE.TXT for details. # #===------------------------------------------------------------------------===# -klee_add_component(kleeCore +add_library(kleeCore AddressSpace.cpp MergeHandler.cpp CallPathManager.cpp @@ -28,18 +28,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 +35,9 @@ target_link_libraries(kleeCore PRIVATE kleaverExpr kleeSupport ) + +llvm_map_components_to_libnames(llvm_libs core executionengine mcjit native support) +target_link_libraries(kleeCore PRIVATE ${llvm_libs} ${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/Expr/CMakeLists.txt b/lib/Expr/CMakeLists.txt index f469a1dede..6b8a873bb8 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,8 @@ 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_map_components_to_libnames(llvm_libs support) +target_link_libraries(kleaverExpr PRIVATE ${llvm_libs}) +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/Module/CMakeLists.txt b/lib/Module/CMakeLists.txt index 6c2a24b319..c81d395e2c 100644 --- a/lib/Module/CMakeLists.txt +++ b/lib/Module/CMakeLists.txt @@ -22,22 +22,31 @@ set(KLEE_MODULE_COMPONENT_SRCS RaiseAsm.cpp ) -klee_add_component(kleeModule +add_library(kleeModule ${KLEE_MODULE_COMPONENT_SRCS} ) -set(LLVM_COMPONENTS - bitreader +llvm_map_components_to_libnames(llvm_libs bitreader bitwriter codegen ipo irreader linker support -) + scalaropts + instcombine + transformutils + analysis + object + mc + binaryformat + ) + +target_link_libraries(kleeModule PRIVATE ${llvm_libs}) -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/Solver/CMakeLists.txt b/lib/Solver/CMakeLists.txt index 31c8302a0b..81a6488267 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_map_components_to_libnames(llvm_libs support) target_link_libraries(kleaverSolver PRIVATE kleeBasic kleaverExpr kleeSupport - ${KLEE_SOLVER_LIBRARIES}) + ${KLEE_SOLVER_LIBRARIES} ${llvm_libs}) +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/Support/CMakeLists.txt b/lib/Support/CMakeLists.txt index 7145930fc5..7ff4daa34e 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_map_components_to_libnames(llvm_libs 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 ${llvm_libs} ${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/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/test/CMakeLists.txt b/test/CMakeLists.txt index 6a625935e0..226eb08a3d 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -96,10 +96,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_map_components_to_libnames(FILECHECK_NEEDED_LIBS support) + target_include_directories(FileCheck PRIVATE ${LLVM_INCLUDE_DIRS}) target_link_libraries(FileCheck PRIVATE ${FILECHECK_NEEDED_LIBS}) endif() @@ -119,10 +117,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_map_components_to_libnames(NOT_NEEDED_LIBS support) + target_include_directories("not" PRIVATE ${LLVM_INCLUDE_DIRS}) target_link_libraries("not" PRIVATE ${NOT_NEEDED_LIBS}) endif() diff --git a/tools/kleaver/CMakeLists.txt b/tools/kleaver/CMakeLists.txt index c079c2a4e9..acc681e506 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_map_components_to_libnames(llvm_libs core support) + +target_link_libraries(kleaver kleaverSolver ${llvm_libs}) +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/klee-replay/CMakeLists.txt b/tools/klee-replay/CMakeLists.txt index aeb9084578..83fddaeb38 100644 --- a/tools/klee-replay/CMakeLists.txt +++ b/tools/klee-replay/CMakeLists.txt @@ -15,6 +15,7 @@ if (HAVE_PTY_H OR HAVE_UTIL_H OR HAVE_LIBUTIL_H) ) target_link_libraries(klee-replay PRIVATE kleeBasic) + target_include_directories(klee-replay PRIVATE ${KLEE_INCLUDE_DIRS}) if(LIBCAP_LIBRARIES) target_link_libraries(klee-replay PRIVATE ${LIBCAP_LIBRARIES}) diff --git a/tools/klee/CMakeLists.txt b/tools/klee/CMakeLists.txt index 8b05c357e7..cabdfdfcbd 100644 --- a/tools/klee/CMakeLists.txt +++ b/tools/klee/CMakeLists.txt @@ -15,6 +15,10 @@ set(KLEE_LIBS ) target_link_libraries(klee ${KLEE_LIBS}) +target_include_directories(klee PRIVATE ${KLEE_INCLUDE_DIRS} ${LLVM_INCLUDE_DIRS}) +target_compile_options(klee PRIVATE ${KLEE_COMPONENT_CXX_FLAGS}) +target_compile_definitions(klee PRIVATE ${KLEE_COMPONENT_CXX_DEFINES}) + install(TARGETS klee RUNTIME DESTINATION bin) diff --git a/tools/ktest-gen/CMakeLists.txt b/tools/ktest-gen/CMakeLists.txt index 084d551d69..2bd9af6be1 100644 --- a/tools/ktest-gen/CMakeLists.txt +++ b/tools/ktest-gen/CMakeLists.txt @@ -13,5 +13,6 @@ add_executable(ktest-gen set(KLEE_LIBS kleeBasic) target_link_libraries(ktest-gen ${KLEE_LIBS}) +target_include_directories(ktest-gen PRIVATE ${KLEE_INCLUDE_DIRS}) install(TARGETS ktest-gen RUNTIME DESTINATION bin) diff --git a/tools/ktest-randgen/CMakeLists.txt b/tools/ktest-randgen/CMakeLists.txt index 8b15c275c1..48b2348512 100644 --- a/tools/ktest-randgen/CMakeLists.txt +++ b/tools/ktest-randgen/CMakeLists.txt @@ -13,5 +13,6 @@ add_executable(ktest-randgen set(KLEE_LIBS kleeBasic) target_link_libraries(ktest-randgen ${KLEE_LIBS}) +target_include_directories(ktest-randgen PRIVATE ${KLEE_INCLUDE_DIRS}) install(TARGETS ktest-randgen RUNTIME DESTINATION bin) diff --git a/unittests/Assignment/CMakeLists.txt b/unittests/Assignment/CMakeLists.txt index e5dd1b4c72..647aae4c0e 100644 --- a/unittests/Assignment/CMakeLists.txt +++ b/unittests/Assignment/CMakeLists.txt @@ -1,3 +1,7 @@ add_klee_unit_test(AssignmentTest AssignmentTest.cpp) target_link_libraries(AssignmentTest PRIVATE kleaverExpr kleaverSolver) +target_compile_options(AssignmentTest PRIVATE ${KLEE_COMPONENT_CXX_FLAGS}) +target_compile_definitions(AssignmentTest PRIVATE ${KLEE_COMPONENT_CXX_DEFINES}) + +target_include_directories(AssignmentTest PRIVATE ${KLEE_INCLUDE_DIRS}) diff --git a/unittests/CMakeLists.txt b/unittests/CMakeLists.txt index 88d5de91e6..9e30a9b766 100644 --- a/unittests/CMakeLists.txt +++ b/unittests/CMakeLists.txt @@ -46,9 +46,9 @@ endfunction() if (TARGET gtest) # try to reuse LLVM's 'gtest' target - message(WARNING "LLVM exports its 'gtest' CMake target (for Google Test), so" - "KLEE cannot create its own. Thus, KLEE will reuse the existing one. This" - "is, however, only recommended if LLVM and KLEE were built using the same" + message(WARNING "LLVM exports its 'gtest' CMake target (for Google Test), so " + "KLEE cannot create its own. Thus, KLEE will reuse the existing one. This " + "is, however, only recommended if LLVM and KLEE were built using the same " "compiler and linker flags (to prevent compatibility issues).\n" "To prevent CMake from reusing the target or to use a different version " "of Google Test, try either of the following:\n" @@ -166,6 +166,8 @@ else() endif() endif() +enable_testing() + # This keeps track of all the unit test # targets so we can ensure they are built @@ -199,7 +201,8 @@ endif() add_library(unittest_main) target_sources(unittest_main PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/TestMain.cpp") -klee_get_llvm_libs(UNITTEST_MAIN_LIBS Support) +llvm_map_components_to_libnames(UNITTEST_MAIN_LIBS support) + target_link_libraries(unittest_main PUBLIC ${GTEST_TARGET_NAME} diff --git a/unittests/DiscretePDF/CMakeLists.txt b/unittests/DiscretePDF/CMakeLists.txt index 07ec1f89c3..f3b23fc976 100644 --- a/unittests/DiscretePDF/CMakeLists.txt +++ b/unittests/DiscretePDF/CMakeLists.txt @@ -1,4 +1,8 @@ add_klee_unit_test(DiscretePDFTest DiscretePDFTest.cpp) # FIXME add the following line to link against libgtest.a -target_link_libraries(DiscretePDFTest PRIVATE kleaverSolver) \ No newline at end of file +target_link_libraries(DiscretePDFTest PRIVATE kleaverSolver) +target_compile_options(DiscretePDFTest PRIVATE ${KLEE_COMPONENT_CXX_FLAGS}) +target_compile_definitions(DiscretePDFTest PRIVATE ${KLEE_COMPONENT_CXX_DEFINES}) + +target_include_directories(DiscretePDFTest PRIVATE ${KLEE_INCLUDE_DIRS}) diff --git a/unittests/Expr/CMakeLists.txt b/unittests/Expr/CMakeLists.txt index 34bc5a013f..566467157c 100644 --- a/unittests/Expr/CMakeLists.txt +++ b/unittests/Expr/CMakeLists.txt @@ -2,3 +2,8 @@ add_klee_unit_test(ExprTest ExprTest.cpp ArrayExprTest.cpp) target_link_libraries(ExprTest PRIVATE kleaverExpr kleeSupport kleaverSolver) +target_compile_options(ExprTest PRIVATE ${KLEE_COMPONENT_CXX_FLAGS}) +target_compile_definitions(ExprTest PRIVATE ${KLEE_COMPONENT_CXX_DEFINES}) + +target_include_directories(ExprTest PRIVATE ${KLEE_INCLUDE_DIRS}) + diff --git a/unittests/RNG/CMakeLists.txt b/unittests/RNG/CMakeLists.txt index 866f915847..67363323af 100644 --- a/unittests/RNG/CMakeLists.txt +++ b/unittests/RNG/CMakeLists.txt @@ -1,3 +1,7 @@ add_klee_unit_test(RNGTest RNGTest.cpp) target_link_libraries(RNGTest PRIVATE kleeSupport) +target_compile_options(RNGTest PRIVATE ${KLEE_COMPONENT_CXX_FLAGS}) +target_compile_definitions(RNGTest PRIVATE ${KLEE_COMPONENT_CXX_DEFINES}) + +target_include_directories(RNGTest PRIVATE ${KLEE_INCLUDE_DIRS}) diff --git a/unittests/Ref/CMakeLists.txt b/unittests/Ref/CMakeLists.txt index facd26a38b..f60927d85e 100644 --- a/unittests/Ref/CMakeLists.txt +++ b/unittests/Ref/CMakeLists.txt @@ -1,3 +1,7 @@ add_klee_unit_test(RefTest RefTest.cpp) target_link_libraries(RefTest PRIVATE kleaverExpr) +target_compile_options(RefTest PRIVATE ${KLEE_COMPONENT_CXX_FLAGS}) +target_compile_definitions(RefTest PRIVATE ${KLEE_COMPONENT_CXX_DEFINES}) + +target_include_directories(RefTest PRIVATE ${KLEE_INCLUDE_DIRS}) diff --git a/unittests/Searcher/CMakeLists.txt b/unittests/Searcher/CMakeLists.txt index 2935847088..c35b407f96 100644 --- a/unittests/Searcher/CMakeLists.txt +++ b/unittests/Searcher/CMakeLists.txt @@ -1,4 +1,8 @@ add_klee_unit_test(SearcherTest SearcherTest.cpp) target_link_libraries(SearcherTest PRIVATE kleeCore) -target_include_directories(SearcherTest BEFORE PUBLIC "../../lib") +target_include_directories(SearcherTest BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/lib") +target_compile_options(SearcherTest PRIVATE ${KLEE_COMPONENT_CXX_FLAGS}) +target_compile_definitions(SearcherTest PRIVATE ${KLEE_COMPONENT_CXX_DEFINES}) + +target_include_directories(SearcherTest PRIVATE ${KLEE_INCLUDE_DIRS}) \ No newline at end of file diff --git a/unittests/Solver/CMakeLists.txt b/unittests/Solver/CMakeLists.txt index c3dc63b64b..c3cd357cbc 100644 --- a/unittests/Solver/CMakeLists.txt +++ b/unittests/Solver/CMakeLists.txt @@ -1,9 +1,16 @@ add_klee_unit_test(SolverTest SolverTest.cpp) target_link_libraries(SolverTest PRIVATE kleaverSolver) +target_compile_options(SolverTest PRIVATE ${KLEE_COMPONENT_CXX_FLAGS}) +target_compile_definitions(SolverTest PRIVATE ${KLEE_COMPONENT_CXX_DEFINES}) +target_include_directories(SolverTest PRIVATE ${KLEE_INCLUDE_DIRS}) + if (${ENABLE_Z3}) add_klee_unit_test(Z3SolverTest Z3SolverTest.cpp) -target_link_libraries(Z3SolverTest PRIVATE kleaverSolver) + target_link_libraries(Z3SolverTest PRIVATE kleaverSolver) + target_compile_options(Z3SolverTest PRIVATE ${KLEE_COMPONENT_CXX_FLAGS}) + target_compile_definitions(Z3SolverTest PRIVATE ${KLEE_COMPONENT_CXX_DEFINES}) + target_include_directories(Z3SolverTest PRIVATE ${KLEE_INCLUDE_DIRS}) endif() diff --git a/unittests/Time/CMakeLists.txt b/unittests/Time/CMakeLists.txt index 6a860582f3..0280a4bb13 100644 --- a/unittests/Time/CMakeLists.txt +++ b/unittests/Time/CMakeLists.txt @@ -1,3 +1,6 @@ add_klee_unit_test(TimeTest TimeTest.cpp) target_link_libraries(TimeTest PRIVATE kleeSupport) +target_compile_options(TimeTest PRIVATE ${KLEE_COMPONENT_CXX_FLAGS}) +target_compile_definitions(TimeTest PRIVATE ${KLEE_COMPONENT_CXX_DEFINES}) +target_include_directories(TimeTest PRIVATE ${KLEE_INCLUDE_DIRS}) diff --git a/unittests/TreeStream/CMakeLists.txt b/unittests/TreeStream/CMakeLists.txt index ff9b4c3e7d..db9ef3dbf1 100644 --- a/unittests/TreeStream/CMakeLists.txt +++ b/unittests/TreeStream/CMakeLists.txt @@ -1,3 +1,6 @@ add_klee_unit_test(TreeStreamTest TreeStreamTest.cpp) target_link_libraries(TreeStreamTest PRIVATE kleeBasic kleeSupport) +target_compile_options(TreeStreamTest PRIVATE ${KLEE_COMPONENT_CXX_FLAGS}) +target_compile_definitions(TreeStreamTest PRIVATE ${KLEE_COMPONENT_CXX_DEFINES}) +target_include_directories(TreeStreamTest PRIVATE ${KLEE_INCLUDE_DIRS}) From 66e6504a99223fb305525f9ad7edb11a0026820d Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Thu, 23 Feb 2023 21:48:46 +0000 Subject: [PATCH 073/320] Use bitcode library paths via config generation instead of `-D` flags --- include/klee/Config/config.h.cmin | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/include/klee/Config/config.h.cmin b/include/klee/Config/config.h.cmin index 24dc87e8ad..50ccf3fd60 100644 --- a/include/klee/Config/config.h.cmin +++ b/include/klee/Config/config.h.cmin @@ -95,6 +95,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. */ From 71dc423262a91c012d708afc8b2e3cc3abdf49c3 Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Thu, 23 Feb 2023 21:49:11 +0000 Subject: [PATCH 074/320] Fix compiler warning with newer compilers --- lib/Module/InstructionOperandTypeCheckPass.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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: From dd492f8763f13312c17eb67af33e3e90217a30e1 Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Thu, 23 Feb 2023 21:51:45 +0000 Subject: [PATCH 075/320] [MemSan] Mark memory objects modified by syscalls as initialised --- tools/klee-replay/file-creator.c | 15 +++++++++++++++ tools/ktest-gen/ktest-gen.cpp | 16 +++++++++++++++- tools/ktest-randgen/ktest-randgen.cpp | 5 +++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/tools/klee-replay/file-creator.c b/tools/klee-replay/file-creator.c index 497cf1c3f6..e103a39f67 100644 --- a/tools/klee-replay/file-creator.c +++ b/tools/klee-replay/file-creator.c @@ -463,16 +463,31 @@ static void check_file(int index, exe_disk_file_t *dfile) { switch (index) { case __STDIN: strcpy(name, "stdin"); +#if defined(__has_feature) +#if __has_feature(memory_sanitizer) + memset(&s, 0, sizeof(struct stat)); +#endif +#endif res = fstat(0, &s); break; case __STDOUT: strcpy(name, "stdout"); +#if defined(__has_feature) +#if __has_feature(memory_sanitizer) + memset(&s, 0, sizeof(struct stat)); +#endif +#endif res = fstat(1, &s); break; default: name[0] = 'A' + index; name[1] = '\0'; snprintf(fullname, sizeof(fullname), "%s/%s", replay_dir, name); +#if defined(__has_feature) +#if __has_feature(memory_sanitizer) + memset(&s, 0, sizeof(struct stat)); +#endif +#endif res = stat(fullname, &s); break; diff --git a/tools/ktest-gen/ktest-gen.cpp b/tools/ktest-gen/ktest-gen.cpp index a9f4be7c23..331ff7b1cd 100644 --- a/tools/ktest-gen/ktest-gen.cpp +++ b/tools/ktest-gen/ktest-gen.cpp @@ -151,6 +151,11 @@ int main(int argc, char *argv[]) { current_file++) { char *content_filename = content_filenames_list[current_file]; +#if defined(__has_feature) +#if __has_feature(memory_sanitizer) + memset(&file_stat[current_file], 0, sizeof(struct stat64)); +#endif +#endif if ((fp[current_file] = fopen(content_filename, "r")) == NULL || stat64(content_filename, file_stat + current_file) < 0) { perror("Failed to open"); @@ -218,7 +223,11 @@ int main(int argc, char *argv[]) { struct stat64 file_stat; char filename[6] = "stdin"; char statname[11] = "stdin-stat"; - +#if defined(__has_feature) +#if __has_feature(memory_sanitizer) + memset(&file_stat, 0, sizeof(struct stat64)); +#endif +#endif if ((fp = fopen(stdin_content_filename, "r")) == NULL || stat64(stdin_content_filename, &file_stat) < 0) { fprintf(stderr, "Failure opening %s\n", stdin_content_filename); @@ -258,6 +267,11 @@ int main(int argc, char *argv[]) { char filename[7] = "stdout"; char statname[12] = "stdout-stat"; +#if defined(__has_feature) +#if __has_feature(memory_sanitizer) + memset(&file_stat, 0, sizeof(struct stat64)); +#endif +#endif if ((fp = fopen(stdout_content_filename, "r")) == NULL || stat64(stdout_content_filename, &file_stat) < 0) { fprintf(stderr, "Failure opening %s\n", stdout_content_filename); diff --git a/tools/ktest-randgen/ktest-randgen.cpp b/tools/ktest-randgen/ktest-randgen.cpp index 04cf53e66d..9b7260eb36 100644 --- a/tools/ktest-randgen/ktest-randgen.cpp +++ b/tools/ktest-randgen/ktest-randgen.cpp @@ -117,6 +117,11 @@ void create_stat(size_t size, struct stat *s) { free(filename); error_exit("%s:%d: Error writing %s\n", __FILE__, __LINE__, filename); } +#if defined(__has_feature) +#if __has_feature(memory_sanitizer) + memset(s, 0, sizeof(struct stat)); +#endif +#endif fstat(fd, s); From ca60811f5d55254bec378919430dd0e7e6e5cdd1 Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Thu, 23 Feb 2023 22:01:12 +0000 Subject: [PATCH 076/320] Update build scripts * Support for Ubuntu 22.04 * Remove support for Python2 * Better separation between sanitizer builds and non-sanitizer builds * Fix build of metaSMT on newer Ubuntu versions * Use ninja to build LLVM * Simplifying building arbitrary LLVM configurations, e.g. different LLVM sanitizer builds (MemSan, UBSan, ASan) * Use MemSan with origin tracking * Build sqlite3 container correctly * Add support to provide sqlite3 version number --- scripts/build/d-klee-linux-ubuntu.inc | 18 +- scripts/build/p-clang-linux-ubuntu-22.04.inc | 8 + scripts/build/p-clang-linux-ubuntu.inc | 69 ++++-- scripts/build/p-clang-linux.inc | 7 +- scripts/build/p-clang.inc | 62 +++++ scripts/build/p-klee-linux-ubuntu.inc | 8 +- scripts/build/p-klee.inc | 10 +- scripts/build/p-libcxx.inc | 1 + scripts/build/p-llvm-linux-ubuntu.inc | 82 +++---- scripts/build/p-llvm.inc | 232 ++++++++----------- scripts/build/p-metasmt-linux-ubuntu.inc | 10 +- scripts/build/p-metasmt.inc | 16 +- scripts/build/p-sanitizer-linux-ubuntu.inc | 52 +++-- scripts/build/p-sanitizer-linux.inc | 8 +- scripts/build/p-sqlite-linux-ubuntu.inc | 10 +- scripts/build/p-sqlite.inc | 15 +- scripts/build/p-uclibc-linux-ubuntu.inc | 2 +- scripts/build/p-z3-linux-ubuntu.inc | 2 +- scripts/build/p-z3.inc | 2 +- scripts/build/patches/libcxx110.patch | 13 ++ scripts/build/patches/llvm110.patch | 72 +++++- scripts/build/patches/llvm120.patch | 8 + scripts/build/patches/llvm90.patch | 118 +++++++--- scripts/build/patches/metasmt.patch | 72 ++++++ scripts/build/run-tests.sh | 2 +- scripts/build/v-klee.inc | 8 +- scripts/build/v-libcxx.inc | 2 +- scripts/build/v-sanitizer.inc | 28 ++- scripts/build/v-sqlite.inc | 4 +- scripts/build/v-stp.inc | 9 +- scripts/build/v-uclibc.inc | 2 +- 31 files changed, 641 insertions(+), 311 deletions(-) create mode 100644 scripts/build/p-clang-linux-ubuntu-22.04.inc create mode 100644 scripts/build/p-clang.inc create mode 100644 scripts/build/patches/libcxx110.patch create mode 100644 scripts/build/patches/llvm120.patch create mode 100644 scripts/build/patches/metasmt.patch 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-ubuntu-22.04.inc b/scripts/build/p-clang-linux-ubuntu-22.04.inc new file mode 100644 index 0000000000..dc125bd57f --- /dev/null +++ b/scripts/build/p-clang-linux-ubuntu-22.04.inc @@ -0,0 +1,8 @@ +get_docker_config_id_clang() { + if [[ "${LLVM_VERSION_SHORT}" -ge "11" ]]; then + echo "" + return 0; + else + return 1; + fi +} diff --git a/scripts/build/p-clang-linux-ubuntu.inc b/scripts/build/p-clang-linux-ubuntu.inc index 286246ca30..85f02c1432 100644 --- a/scripts/build/p-clang-linux-ubuntu.inc +++ b/scripts/build/p-clang-linux-ubuntu.inc @@ -3,40 +3,59 @@ install_binary_artifact_clang() { 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 6481fdd837..519333c65f 100644 --- a/scripts/build/p-clang-linux.inc +++ b/scripts/build/p-clang-linux.inc @@ -7,9 +7,12 @@ setup_artifact_variables_clang() { 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++" 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.inc b/scripts/build/p-klee.inc index a69f654a4f..82dedeaa1e 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" @@ -160,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.inc b/scripts/build/p-libcxx.inc index 3ee4166092..641fad613f 100644 --- a/scripts/build/p-libcxx.inc +++ b/scripts/build/p-libcxx.inc @@ -107,6 +107,7 @@ get_build_artifacts_libcxx() { ( setup_build_variables_libcxx echo "${LIBCXX_INSTALL}" + echo "${LIBCXX_SRC}" ) } diff --git a/scripts/build/p-llvm-linux-ubuntu.inc b/scripts/build/p-llvm-linux-ubuntu.inc index 48a0083f31..1af095f985 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,27 +54,30 @@ 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}" - - # 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 @@ -82,7 +89,7 @@ install_binary_artifact_llvm() { ) #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() { @@ -92,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 @@ -140,9 +147,6 @@ 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 } @@ -155,22 +159,22 @@ setup_artifact_variables_llvm() { 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.inc b/scripts/build/p-llvm.inc index d1b9374e04..abf895aee0 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,46 @@ 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 disables + 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" + ) + CONFIG+=("-DLLVM_ENABLE_PROJECTS=${ENABLED_LLVM_PROJECTS};libcxx;libcxxabi;libunwind") + 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 +214,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 +235,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 +261,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 +281,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 30e153bbb2..5aa6480a81 100644 --- a/scripts/build/p-sanitizer-linux-ubuntu.inc +++ b/scripts/build/p-sanitizer-linux-ubuntu.inc @@ -1,5 +1,5 @@ install_binary_artifact_sanitizer() { - if [[ -z "${SANITIZER_BUILD:=}" ]]; then + if [[ -z "${SANITIZER_BUILD:-}" ]]; then return 1 fi @@ -7,34 +7,46 @@ install_binary_artifact_sanitizer() { local SANITIZER_LLVM_VERSION_MAJOR="${SANITIZER_LLVM_VERSION/.*/}" local 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 - + 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 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 + # 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 fa9f35f367..6cfd5920ec 100644 --- a/scripts/build/p-sanitizer-linux.inc +++ b/scripts/build/p-sanitizer-linux.inc @@ -15,23 +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}" + 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/llvm90.patch b/scripts/build/patches/llvm90.patch index e99827b6b2..3ff0dc2904 100644 --- a/scripts/build/patches/llvm90.patch +++ b/scripts/build/patches/llvm90.patch @@ -1,18 +1,28 @@ ---- 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}) +diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc +index 490a04b21..42e43a044 100644 +--- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc ++++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc +@@ -366,15 +366,6 @@ static void ioctl_table_fill() { -+ 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; + #if SANITIZER_LINUX && !SANITIZER_ANDROID + // _(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); +diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cc b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cc +index b7fa6e8f7..fa981e129 100644 +--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cc ++++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cc +@@ -126,7 +126,6 @@ typedef struct user_fpregs elf_fpregset_t; # include #endif #include @@ -20,15 +30,15 @@ #include #include #include -@@ -459,7 +458,6 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr); +@@ -437,7 +436,6 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr); - #if SANITIZER_GLIBC + #if SANITIZER_LINUX && !SANITIZER_ANDROID 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); +@@ -803,15 +801,6 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr); #endif // SANITIZER_LINUX #if SANITIZER_LINUX && !SANITIZER_ANDROID @@ -44,21 +54,61 @@ 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() { +@@ -1126,8 +1115,9 @@ CHECK_SIZE_AND_OFFSET(ipc_perm, uid); + CHECK_SIZE_AND_OFFSET(ipc_perm, gid); + CHECK_SIZE_AND_OFFSET(ipc_perm, cuid); + CHECK_SIZE_AND_OFFSET(ipc_perm, cgid); +-#if !defined(__aarch64__) || !SANITIZER_LINUX || __GLIBC_PREREQ (2, 21) +-/* On aarch64 glibc 2.20 and earlier provided incorrect mode field. */ ++#if !SANITIZER_LINUX || __GLIBC_PREREQ (2, 31) ++/* glibc 2.30 and earlier provided 16-bit mode field instead of 32-bit ++ on many architectures. */ + CHECK_SIZE_AND_OFFSET(ipc_perm, mode); + #endif - #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/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h +index f1a4fd7d3..029a209fc 100644 +--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h ++++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h +@@ -203,26 +203,13 @@ namespace __sanitizer { + u64 __unused1; + u64 __unused2; + #elif defined(__sparc__) +-#if defined(__arch64__) + unsigned mode; +- unsigned short __pad1; +-#else +- unsigned short __pad1; +- unsigned short mode; + unsigned short __pad2; +-#endif + unsigned short __seq; + unsigned long long __unused1; + unsigned long long __unused2; +-#elif defined(__mips__) || defined(__aarch64__) || defined(__s390x__) +- unsigned int mode; +- unsigned short __seq; +- unsigned short __pad1; +- unsigned long __unused1; +- unsigned long __unused2; + #else +- unsigned short mode; +- unsigned short __pad1; ++ unsigned int mode; + unsigned short __seq; + unsigned short __pad2; + #if defined(__x86_64__) && !defined(_LP64) +diff --git a/llvm/tools/llvm-shlib/CMakeLists.txt b/llvm/tools/llvm-shlib/CMakeLists.txt +index 901f55c99..7cb78afe5 100644 +--- a/llvm/tools/llvm-shlib/CMakeLists.txt ++++ b/llvm/tools/llvm-shlib/CMakeLists.txt +@@ -44,7 +44,9 @@ if(LLVM_BUILD_LLVM_DYLIB) + endif() + add_llvm_library(LLVM SHARED DISABLE_LLVM_LINK_LLVM_DYLIB SONAME ${INSTALL_WITH_TOOLCHAIN} ${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") 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 7eb8b4fab4..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 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" } From 03fa34c4e51351b357b84a27c705aac5e0a5e68b Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Thu, 23 Feb 2023 22:02:53 +0000 Subject: [PATCH 077/320] Add support to disable memsan instrumentation; update UB/Asan suppression --- scripts/build/build.sh | 5 +++++ scripts/build/sanitizer/klee.txt | 2 ++ scripts/build/sanitizer/sqlite.txt | 2 ++ utils/sanitizers/ubsan.txt | 6 ++++++ 4 files changed, 15 insertions(+) create mode 100644 scripts/build/sanitizer/klee.txt create mode 100644 scripts/build/sanitizer/sqlite.txt 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/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/utils/sanitizers/ubsan.txt b/utils/sanitizers/ubsan.txt index 97a6600050..8a2d3d2300 100644 --- a/utils/sanitizers/ubsan.txt +++ b/utils/sanitizers/ubsan.txt @@ -1,3 +1,9 @@ # Runtime suppression of undefined behavior # vptr_check:Module.h +vptr:gtest.cc +vptr:gtest.h +vptr:gtest-death-test.cc +vptr:gtest-matchers.h +vptr:shared_ptr_base.h +shift-base:constantbv.cpp From 38b07e7a89f103dc3b690be5382b5a0d9f5aa7fe Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Thu, 23 Feb 2023 22:06:10 +0000 Subject: [PATCH 078/320] Fix building of runtime library and klee-replay Former build system provided additional flags for building bitcode while they were not required, e.g. under BSD or MacOS. --- runtime/POSIX/fd.h | 7 +++++++ tools/klee-replay/file-creator.c | 3 ++- tools/klee-replay/klee-replay.h | 2 -- tools/klee-replay/klee_init_env.c | 1 + 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/runtime/POSIX/fd.h b/runtime/POSIX/fd.h index 39307cebc6..5fa428744c 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 diff --git a/tools/klee-replay/file-creator.c b/tools/klee-replay/file-creator.c index e103a39f67..a1685a02a4 100644 --- a/tools/klee-replay/file-creator.c +++ b/tools/klee-replay/file-creator.c @@ -290,7 +290,7 @@ static int create_pipe(const char *fname, exe_disk_file_t *dfile, } } - +int futimes(int fd, const struct timeval tv[2]); static int create_reg_file(const char *fname, exe_disk_file_t *dfile, const char *tmpdir) { struct stat64 *s = dfile->stat; @@ -395,6 +395,7 @@ static void create_file(int target_fd, char replay_dir[] = "/tmp/klee-replay-XXXXXX"; +char *mkdtemp(char *template); void replay_create_files(exe_file_system_t *exe_fs) { unsigned k; diff --git a/tools/klee-replay/klee-replay.h b/tools/klee-replay/klee-replay.h index 5701caa5f7..47d63a47a9 100644 --- a/tools/klee-replay/klee-replay.h +++ b/tools/klee-replay/klee-replay.h @@ -9,11 +9,9 @@ #ifndef KLEE_REPLAY_H #define KLEE_REPLAY_H - #define _LARGEFILE64_SOURCE #define _FILE_OFFSET_BITS 64 -#include "klee/Config/config.h" // FIXME: This is a hack. #include "../../runtime/POSIX/fd.h" #include diff --git a/tools/klee-replay/klee_init_env.c b/tools/klee-replay/klee_init_env.c index b0b6e91239..c697975e1b 100644 --- a/tools/klee-replay/klee_init_env.c +++ b/tools/klee-replay/klee_init_env.c @@ -1,3 +1,4 @@ +#define _LARGEFILE64_SOURCE #include "../../runtime/POSIX/klee_init_env.c" int __klee_posix_wrapped_main(int argc, char **argv, char **envp) { return 0; } From 134571efec28aa754beaba829fe75f666c065845 Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Thu, 23 Feb 2023 22:09:04 +0000 Subject: [PATCH 079/320] Fix uninitialised memory access while reading last path entry `>>` can fail and sets internal error information in the istream. Check the state of istream before pushing the value onto the buffer. --- tools/klee/main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/klee/main.cpp b/tools/klee/main.cpp index 59261e4968..0b76e9041a 100644 --- a/tools/klee/main.cpp +++ b/tools/klee/main.cpp @@ -617,7 +617,8 @@ void KleeHandler::loadPathFile(std::string name, while (f.good()) { unsigned value; f >> value; - buffer.push_back(!!value); + if (f.good()) + buffer.push_back(!!value); f.get(); } } From d811fad5cfec036fc413d47db3bcc3eab0b1457e Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Thu, 23 Feb 2023 22:10:00 +0000 Subject: [PATCH 080/320] Disable `const_array_opt1` for ubsan as well --- test/Feature/const_array_opt1.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/Feature/const_array_opt1.c b/test/Feature/const_array_opt1.c index 1776e9d812..1ed3c3ee69 100644 --- a/test/Feature/const_array_opt1.c +++ b/test/Feature/const_array_opt1.c @@ -1,5 +1,6 @@ // REQUIRES: not-msan -// Disabling msan because it times out on CI +// 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 | FileCheck %s From 45a958f9ee3200dbfc2a2fb07f4f82968bf83b02 Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Thu, 23 Feb 2023 22:11:20 +0000 Subject: [PATCH 081/320] Don't fail `KleeStats.c` test if it takes 1s or longer --- test/Feature/KleeStats.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Feature/KleeStats.c b/test/Feature/KleeStats.c index e54542e3ba..2a498beb95 100644 --- a/test/Feature/KleeStats.c +++ b/test/Feature/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]+),100\.00}} // Check other formats // CHECK-STATS-ABS-TIMES: Path,Time(s),TUser(s),TResolve(s),TCex(s),TSolver(s),TFork(s) From 2add9acfc9f2b0b01ea7c45c81494b7c19f696c2 Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Thu, 23 Feb 2023 22:12:08 +0000 Subject: [PATCH 082/320] Use newer LLVM_DIR config option to build FreeBSD --- .cirrus.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.cirrus.yml b/.cirrus.yml index cda56fe18d..828f667364 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -10,7 +10,7 @@ task: build_script: - mkdir build - cd build - - cmake -DLLVM_CONFIG_BINARY=/usr/local/bin/llvm-config11 -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\./lit11\./' test/lit.cfg From c0cdde6d0fc3c8423dce71cdc7245cdb7fef8da8 Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Thu, 23 Feb 2023 22:22:52 +0000 Subject: [PATCH 083/320] Update Docker build components * Use Ubuntu 22.04 * Use newer TCMalloc 2.9.1 * use Z3 4.8.15 * Use SQLite 3400100 --- Dockerfile | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6926b133f8..a10ce3c8d0 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.3_110_ubuntu_bionic-20200807 as uclibc_base -FROM klee/tcmalloc:2.9.1_ubuntu_bionic-20200807 as tcmalloc_base -FROM klee/stp:2.3.3_ubuntu_bionic-20200807 as stp_base -FROM klee/z3:4.8.15_ubuntu_bionic-20200807 as z3_base -FROM klee/libcxx:110_ubuntu_bionic-20200807 as libcxx_base +FROM klee/llvm:110_O_D_A_ubuntu_jammy-20230126 as llvm_base +FROM klee/gtest:1.11.0_ubuntu_jammy-20230126 as gtest_base +FROM klee/uclibc:klee_uclibc_v1.3_110_ubuntu_jammy-20230126 as uclibc_base +FROM klee/tcmalloc:2.9.1_ubuntu_jammy-20230126 as tcmalloc_base +FROM klee/stp:2.3.3_ubuntu_jammy-20230126 as stp_base +FROM klee/z3:4.8.15_ubuntu_jammy-20230126 as z3_base +FROM klee/libcxx:110_ubuntu_jammy-20230126 as libcxx_base +FROM 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,6 +13,7 @@ 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 @@ -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) @@ -56,6 +58,8 @@ RUN /tmp/klee_src/scripts/build/build.sh --debug --install-system-deps klee && p ENV PATH="$PATH:/tmp/llvm-110-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 sudo /bin/bash -c 'ln -s /tmp/klee_src/include/klee /usr/include/' From 789bf292487566980e69b0745e5e2cd1f252cd80 Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Thu, 23 Feb 2023 22:23:30 +0000 Subject: [PATCH 084/320] Fix script to build all the containers we require for GitHub actions --- scripts/build/build-ci-container.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) 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 From 02b9b0483a5243595c712c27f445ae7eda0fea9a Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Thu, 23 Feb 2023 22:26:03 +0000 Subject: [PATCH 085/320] Update CI components * Use Ubuntu 22.04 instead of 18.04 * Use LLVM 11 instead of 9 * Use TCMalloc 2.9.1 * Use Z3 4.8.15 * Use Sqlite3 3400100 Clean-up comments and structure to satisfy yaml linter --- .github/workflows/build.yaml | 61 +++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 9588b204e6..420ea57a81 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -1,3 +1,4 @@ +--- name: CI on: @@ -8,7 +9,7 @@ on: # Defaults for building KLEE env: - BASE_IMAGE: ubuntu:bionic-20200807 + BASE_IMAGE: ubuntu:jammy-20230126 REPOSITORY: klee COVERAGE: 0 DISABLE_ASSERTIONS: 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: 11 MINISAT_VERSION: "master" REQUIRES_RTTI: 0 SOLVERS: STP:Z3 STP_VERSION: 2.3.3 - TCMALLOC_VERSION: 2.7 + TCMALLOC_VERSION: 2.9.1 UCLIBC_VERSION: klee_uclibc_v1.3 USE_TCMALLOC: 1 USE_LIBCXX: 1 - Z3_VERSION: 4.8.14 + Z3_VERSION: 4.8.15 + SQLITE_VERSION: 3400100 jobs: Linux: @@ -35,21 +36,21 @@ jobs: strategy: matrix: name: [ - "LLVM 13", - "LLVM 12", - "LLVM 11, Doxygen", - "LLVM 10", - "LLVM 9", - "ASan", - "UBSan", - "MSan", - "Z3 only", - "metaSMT", - "STP master", - "Latest klee-uclibc", - "Asserts enabled", - "No TCMalloc, optimised runtime", - ] + "LLVM 13", + "LLVM 12", + "LLVM 11, Doxygen", + "LLVM 10", + "LLVM 9", + "ASan", + "UBSan", + "MSan", + "Z3 only", + "metaSMT", + "STP master", + "Latest klee-uclibc", + "Asserts disabled", + "No TCMalloc, optimised runtime", + ] include: - name: "LLVM 13" env: @@ -67,33 +68,35 @@ jobs: - name: "LLVM 9" env: LLVM_VERSION: 9 - # 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: 12 - name: "UBSan" env: SANITIZER_BUILD: undefined ENABLE_OPTIMIZED: 0 USE_TCMALLOC: 0 - SANITIZER_LLVM_VERSION: 11 + SANITIZER_LLVM_VERSION: 12 - 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" env: + METASMT_VERSION: qf_abv SOLVERS: metaSMT METASMT_DEFAULT: STP REQUIRES_RTTI: 1 @@ -107,7 +110,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 @@ -156,9 +159,9 @@ jobs: strategy: matrix: name: [ - "STP", - "Z3", - ] + "STP", + "Z3", + ] include: - name: "STP" env: From 7c68c58bff2884c7d61f5756aad342caabc83233 Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Fri, 17 Mar 2023 15:56:30 +0000 Subject: [PATCH 086/320] Update KDAlloc unittests --- unittests/KDAlloc/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/unittests/KDAlloc/CMakeLists.txt b/unittests/KDAlloc/CMakeLists.txt index 2bb2ebe89c..87d016d75f 100644 --- a/unittests/KDAlloc/CMakeLists.txt +++ b/unittests/KDAlloc/CMakeLists.txt @@ -5,6 +5,7 @@ add_klee_unit_test(KDAllocTest rusage.cpp sample.cpp stacktest.cpp) -target_compile_definitions(KDAllocTest PUBLIC "-DKDALLOC_CHECKED" "-DUSE_KDALLOC" "-DUSE_GTEST_INSTEAD_OF_MAIN") +target_compile_definitions(KDAllocTest PRIVATE KDALLOC_CHECKED USE_KDALLOC USE_GTEST_INSTEAD_OF_MAIN) target_compile_definitions(KDAllocTest PRIVATE ${KLEE_COMPONENT_CXX_DEFINES}) target_compile_options(KDAllocTest PRIVATE ${KLEE_COMPONENT_CXX_FLAGS}) +target_include_directories(KDAllocTest PRIVATE ${KLEE_INCLUDE_DIRS}) \ No newline at end of file From 4d7eb8bab0945665a778fbf6064aaa4016a2756c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Zaoral?= Date: Sat, 5 Mar 2022 13:44:24 +0100 Subject: [PATCH 087/320] llvm14: Add LLVM 14 to lit.cfg --- test/lit.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/lit.cfg b/test/lit.cfg index 4d7382cf74..c935ab8e37 100644 --- a/test/lit.cfg +++ b/test/lit.cfg @@ -161,7 +161,7 @@ config.substitutions.append( # 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 = { "9.0", "10.0", "11.0", "11.1", "12.0", "13.0" } +known_llvm_versions = { "9.0", "10.0", "11.0", "11.1", "12.0", "13.0", "14.0" } current_llvm_version_tuple = (int(config.llvm_version_major), int(config.llvm_version_minor)) current_llvm_version = "%s.%s" % current_llvm_version_tuple From 9c73eb5081a12bf2de5e9a0cb0933cd30925ac6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Zaoral?= Date: Sat, 5 Mar 2022 13:45:58 +0100 Subject: [PATCH 088/320] llvm14: Add LLVM 14 job to GitHub Actions --- .github/workflows/build.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 420ea57a81..05fb58c048 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -36,6 +36,7 @@ jobs: strategy: matrix: name: [ + "LLVM 14", "LLVM 13", "LLVM 12", "LLVM 11, Doxygen", @@ -52,6 +53,9 @@ jobs: "No TCMalloc, optimised runtime", ] include: + - name: "LLVM 14" + env: + LLVM_VERSION: 14 - name: "LLVM 13" env: LLVM_VERSION: 13 From 425597940be8f35a05a34638764b3c8dc482dc25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Zaoral?= Date: Sat, 5 Mar 2022 14:08:11 +0100 Subject: [PATCH 089/320] llvm14: TargetRegistry.h was moved from Support to MC --- lib/Module/RaiseAsm.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/Module/RaiseAsm.cpp b/lib/Module/RaiseAsm.cpp index 98e580a871..457927f908 100644 --- a/lib/Module/RaiseAsm.cpp +++ b/lib/Module/RaiseAsm.cpp @@ -19,7 +19,11 @@ #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" From 70bf8d0495cee2772ae1b0c1b046721e0339f62f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Zaoral?= Date: Sat, 5 Mar 2022 16:50:36 +0100 Subject: [PATCH 090/320] llvm14: PointerType::getElementType() was deprecated ... for LLVM 14 in [1] and has already been removed from the LLVM 15 branch in [2]. Some changes are only temporary to silence the warning though, as Type::getPointerElementType() is planned to be removed as well. [3] [1] https://reviews.llvm.org/D117885/new/ [2] https://github.com/llvm/llvm-project/commit/d593cf7 [3] https://llvm.org/docs/OpaquePointers.html#migration-instructions --- include/klee/Module/KCallable.h | 6 ++++-- include/klee/Module/KModule.h | 4 +++- lib/Core/Executor.cpp | 29 ++++++++++++---------------- lib/Core/Executor.h | 2 +- lib/Core/ExternalDispatcher.cpp | 3 +-- lib/Core/GetElementPtrTypeIterator.h | 4 ++-- lib/Module/FunctionAlias.cpp | 6 ++---- 7 files changed, 25 insertions(+), 29 deletions(-) diff --git a/include/klee/Module/KCallable.h b/include/klee/Module/KCallable.h index bf8b17eae2..6fe8419dba 100644 --- a/include/klee/Module/KCallable.h +++ b/include/klee/Module/KCallable.h @@ -32,7 +32,7 @@ class KCallable { CallableKind getKind() const { return Kind; } virtual llvm::StringRef getName() const = 0; - virtual llvm::PointerType *getType() const = 0; + virtual llvm::FunctionType *getFunctionType() const = 0; virtual llvm::Value *getValue() = 0; virtual ~KCallable() = default; @@ -55,7 +55,9 @@ class KInlineAsm : public KCallable { llvm::StringRef getName() const override { return name; } - llvm::PointerType *getType() const override { return value->getType(); } + llvm::FunctionType *getFunctionType() const override { + return value->getFunctionType(); + } llvm::Value *getValue() override { return value; } diff --git a/include/klee/Module/KModule.h b/include/klee/Module/KModule.h index 71fe8a0ace..e2dc71d1a2 100644 --- a/include/klee/Module/KModule.h +++ b/include/klee/Module/KModule.h @@ -64,7 +64,9 @@ namespace klee { llvm::StringRef getName() const override { return function->getName(); } - llvm::PointerType *getType() const override { return function->getType(); } + llvm::FunctionType *getFunctionType() const override { + return function->getFunctionType(); + } llvm::Value *getValue() override { return function; } diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp index 013f01c256..d644d647dd 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -740,7 +740,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); @@ -2441,10 +2441,9 @@ void Executor::executeInstruction(ExecutionState &state, KInstruction *ki) { } if (f) { - const FunctionType *fType = - dyn_cast(cast(f->getType())->getElementType()); + const FunctionType *fType = f->getFunctionType(); const FunctionType *fpType = - dyn_cast(cast(fp->getType())->getElementType()); + dyn_cast(fp->getType()->getPointerElementType()); // special case the call with a bitcast case if (fType != fpType) { @@ -3345,13 +3344,14 @@ void Executor::updateStates(ExecutionState *current) { removedStates.clear(); } -template +template void Executor::computeOffsetsSeqTy(KGEPInstruction *kgepi, ref &constantOffset, uint64_t index, const TypeIt it) { - const auto *sq = cast(*it); + assert(it->getNumContainedTypes() == 1 && + "Sequential type must contain one subtype"); uint64_t elementSize = - kmodule->targetData->getTypeStoreSize(sq->getElementType()); + kmodule->targetData->getTypeStoreSize(it->getContainedType(0)); const Value *operand = it.getOperand(); if (const Constant *c = dyn_cast(operand)) { ref index = @@ -3376,12 +3376,8 @@ void Executor::computeOffsets(KGEPInstruction *kgepi, TypeIt ib, TypeIt ie) { 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); + } else if (ii->isArrayTy() || ii->isVectorTy() || ii->isPointerTy()) { + computeOffsetsSeqTy(kgepi, constantOffset, index, ii); } else assert("invalid type" && 0); index++; @@ -4712,10 +4708,9 @@ 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(); } diff --git a/lib/Core/Executor.h b/lib/Core/Executor.h index 21d0d081c1..c821b987bb 100644 --- a/lib/Core/Executor.h +++ b/lib/Core/Executor.h @@ -449,7 +449,7 @@ class Executor : public Interpreter { /// bindModuleConstants - Initialize the module constant table. void bindModuleConstants(); - template + template void computeOffsetsSeqTy(KGEPInstruction *kgepi, ref &constantOffset, uint64_t index, const TypeIt it); diff --git a/lib/Core/ExternalDispatcher.cpp b/lib/Core/ExternalDispatcher.cpp index 7a0d8e148b..d286bea95a 100644 --- a/lib/Core/ExternalDispatcher.cpp +++ b/lib/Core/ExternalDispatcher.cpp @@ -284,8 +284,7 @@ Function *ExternalDispatcherImpl::createDispatcher(KCallable *target, argI64sp->getType()->getPointerElementType(), argI64sp, "args"); // 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; diff --git a/lib/Core/GetElementPtrTypeIterator.h b/lib/Core/GetElementPtrTypeIterator.h index 89606a0a39..23bda1f0f5 100644 --- a/lib/Core/GetElementPtrTypeIterator.h +++ b/lib/Core/GetElementPtrTypeIterator.h @@ -88,8 +88,8 @@ class generic_gep_type_iterator 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; } diff --git a/lib/Module/FunctionAlias.cpp b/lib/Module/FunctionAlias.cpp index a98b74fb60..aa80b35d6e 100644 --- a/lib/Module/FunctionAlias.cpp +++ b/lib/Module/FunctionAlias.cpp @@ -135,10 +135,8 @@ bool FunctionAliasPass::runOnModule(Module &M) { const FunctionType *FunctionAliasPass::getFunctionType(const GlobalValue *gv) { const Type *type = gv->getType(); - while (type->isPointerTy()) { - const PointerType *ptr = cast(type); - type = ptr->getElementType(); - } + while (type->isPointerTy()) + type = type->getPointerElementType(); return cast(type); } From d79d048bfa21b432e1e9e97db9fca9924118b678 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Zaoral?= Date: Sat, 18 Mar 2023 16:43:02 +0100 Subject: [PATCH 091/320] llvm14: port test/Feature/VarArgByVal.c to LLVM 14 LLVM 14 has introduced the noundef function argument attribute. --- test/Feature/VarArgByVal.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/Feature/VarArgByVal.c b/test/Feature/VarArgByVal.c index 42718bb95d..551e6c6316 100644 --- a/test/Feature/VarArgByVal.c +++ b/test/Feature/VarArgByVal.c @@ -5,8 +5,10 @@ // 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 -// CHECK: @test1({{.*}}, i32 -1, %struct.foo* byval{{.*}} %struct.bar* byval -// CHECK: @test2({{.*}}, %struct.foo* byval{{.*}} %struct.bar* byval +// +// 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 From d9da9eadbc0aacf61b336231560abb67bcba91ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Zaoral?= Date: Sun, 17 Apr 2022 12:35:47 +0200 Subject: [PATCH 092/320] ConstantArrayExprVisitor: Deduplicate `visitConcat` and `visitRead` --- lib/Expr/ArrayExprVisitor.cpp | 36 ++--------------------------------- 1 file changed, 2 insertions(+), 34 deletions(-) diff --git a/lib/Expr/ArrayExprVisitor.cpp b/lib/Expr/ArrayExprVisitor.cpp index c12689b30c..0965308ae6 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 From 1398e960ec9aca3f0ceac5e37062631986b9c2a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Zaoral?= Date: Sun, 17 Apr 2022 13:32:15 +0200 Subject: [PATCH 093/320] ConstantArrayExprVisitor: Fix detection of multiple array indices Previously, the code did two consecutive checks. First one succeeded only if the given index was not already seen and the second one did an analogous check but for arrays. However, if the given index usage was already detected for some array, its usage for another array that already had some other index detected would be silently skipped and the `incompatible` flag would not be set. Therefore, if the code contained e.g. the following conditional jump on two arrays with two symbolic indices, the multi-index access would remain undetected: if ((array1[k] + array2[x] + array2[k]) == 0) Resulting in the following output: KLEE: WARNING: OPT_I: infeasible branch! KLEE: WARNING: OPT_I: successful --- include/klee/Expr/ArrayExprVisitor.h | 2 -- lib/Expr/ArrayExprVisitor.cpp | 20 +++++------ test/ArrayOpt/test_multindex_multarray.c | 46 ++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 13 deletions(-) create mode 100644 test/ArrayOpt/test_multindex_multarray.c 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/lib/Expr/ArrayExprVisitor.cpp b/lib/Expr/ArrayExprVisitor.cpp index 0965308ae6..cf0da7f62f 100644 --- a/lib/Expr/ArrayExprVisitor.cpp +++ b/lib/Expr/ArrayExprVisitor.cpp @@ -73,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/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; +} From 5c8610ec5e6fd54746b2934bcb0a4d63ef20b0bf Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Mon, 20 Mar 2023 17:50:30 +0000 Subject: [PATCH 094/320] Explicitly check if 32bit support is enabled for testing Ignore test in the first place, if no 32bit is enabled. --- CMakeLists.txt | 8 +++++++- test/Programs/pcregrep.c | 1 + test/lit.cfg | 4 ++++ test/lit.site.cfg.in | 1 + 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cf01df24e9..59c6094ae6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -430,8 +430,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") diff --git a/test/Programs/pcregrep.c b/test/Programs/pcregrep.c index ba5c79db29..7bcef6710e 100644 --- a/test/Programs/pcregrep.c +++ b/test/Programs/pcregrep.c @@ -1,3 +1,4 @@ +// REQUIRES: 32bit-support // 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 diff --git a/test/lit.cfg b/test/lit.cfg index c935ab8e37..ca7fe20f0f 100644 --- a/test/lit.cfg +++ b/test/lit.cfg @@ -224,6 +224,10 @@ 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('{}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-')) diff --git a/test/lit.site.cfg.in b/test/lit.site.cfg.in index 849062b1ca..c7063057da 100644 --- a/test/lit.site.cfg.in +++ b/test/lit.site.cfg.in @@ -38,6 +38,7 @@ 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 # Add sanitizer list config.environment['LSAN_OPTIONS'] = "suppressions=@KLEE_UTILS_DIR@/sanitizers/lsan.txt" From 6b21755f0744cdf7b71bf14432324e1a15c119ea Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Tue, 21 Mar 2023 11:13:22 +0000 Subject: [PATCH 095/320] Handle fail of KLEE gracefully Under 64bit architecture, a ptr-error might be found. Ignore this for now. --- test/Programs/pcregrep.c | 2 +- test/lit.cfg | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/test/Programs/pcregrep.c b/test/Programs/pcregrep.c index 7bcef6710e..8bd7a00f82 100644 --- a/test/Programs/pcregrep.c +++ b/test/Programs/pcregrep.c @@ -2,7 +2,7 @@ // 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 +// XFAIL: not-target-x86 /* Provide Declarations */ #include diff --git a/test/lit.cfg b/test/lit.cfg index ca7fe20f0f..8d2654d583 100644 --- a/test/lit.cfg +++ b/test/lit.cfg @@ -225,6 +225,7 @@ 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-')) From 61d12516648cdb76e3a0b45e4fda74e9bf19b0a2 Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Tue, 21 Mar 2023 11:13:42 +0000 Subject: [PATCH 096/320] Fixed typo --- test/lit.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/lit.cfg b/test/lit.cfg index 8d2654d583..cb47d3d4c5 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] From 9020563fc8bfb2b5abf929f45be1c046ddd8d785 Mon Sep 17 00:00:00 2001 From: Frank Busse Date: Wed, 15 Mar 2023 10:28:44 +0000 Subject: [PATCH 097/320] klee-stats: improve error message for missing tabulate package --- tools/klee-stats/klee-stats | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/tools/klee-stats/klee-stats b/tools/klee-stats/klee-stats index b3673c7e64..22cdaf4310 100755 --- a/tools/klee-stats/klee-stats +++ b/tools/klee-stats/klee-stats @@ -464,10 +464,16 @@ def main(): parser.add_argument('dir', nargs='+', help='KLEE output directory') if tabulate_available: - parser.add_argument('--table-format', - choices=['klee', 'csv', 'readable-csv'] + list(_table_formats.keys()), - dest='tableFormat', default='klee', - help='Table format for the summary.') + tf_choices = ['klee', 'csv', 'readable-csv'] + list(_table_formats.keys()) + tf_help = 'Table format for the summary.' + tf_default = 'klee' + else: + tf_choices = [] + tf_help = '(not available due to missing "tabulate" package)' + tf_default = None + parser.add_argument('--table-format', + choices=tf_choices, dest='tableFormat', default=tf_default, + help=tf_help) parser.add_argument('--to-csv', action='store_true', dest='toCsv', @@ -506,6 +512,13 @@ def main(): args = parser.parse_args() + if not tabulate_available and not (args.grafana or args.toCsv): + print('Error: Package "tabulate" required for table formatting. ' + 'Please install it using "pip" or your package manager. ' + 'You can still use --grafana and --to-csv without tabulate.', + file=sys.stderr) + sys.exit(1) + # get print controls pr = 'NONE' if args.pAll or args.columns: @@ -539,16 +552,7 @@ def main(): write_csv(data) return - if tabulate_available: - write_table(args, data, dirs, pr) - return - - print('Error: Package "tabulate" required for table formatting. ' - 'Please install it using "pip" or your package manager.' - 'You can still use --grafana and --to-csv without tabulate.', - file=sys.stderr) - sys.exit(1) - + write_table(args, data, dirs, pr) if __name__ == '__main__': From 8dcd69dda61c58e9fb5bc392c9e5f787fee0a5b6 Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Wed, 22 Mar 2023 17:28:21 +0000 Subject: [PATCH 098/320] Remove hard to understand and debug pcregrep test --- test/Programs/pcregrep.c | 14582 ------------------------------------- 1 file changed, 14582 deletions(-) delete mode 100644 test/Programs/pcregrep.c diff --git a/test/Programs/pcregrep.c b/test/Programs/pcregrep.c deleted file mode 100644 index 8bd7a00f82..0000000000 --- a/test/Programs/pcregrep.c +++ /dev/null @@ -1,14582 +0,0 @@ -// REQUIRES: 32bit-support -// 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: not-target-x86 - -/* 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; -} - From 3a0e434dc9d4053d75e9c0bbe6faa6dfb46717ae Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Wed, 22 Mar 2023 10:37:11 +0000 Subject: [PATCH 099/320] Require minimal version of CMake 3.16 for KLEE This is the default version for Ubuntu 20.04 and should be available for most distributions. Moreover this should allow to move STP forward with their changes. (https://github.com/stp/stp/issues/375#issuecomment-889178863) --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 59c6094ae6..54be2d3df0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,7 @@ ############################################################################### # Minimum CMake version and policies ############################################################################### -cmake_minimum_required(VERSION 3.9.0) +cmake_minimum_required(VERSION 3.16.0) project(KLEE CXX C) ############################################################################### From 318c63700372099a60566a3af4e0ec02dfd22073 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20B=C3=BCning?= Date: Fri, 28 Aug 2020 10:28:06 +0200 Subject: [PATCH 100/320] use C++17 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 54be2d3df0..bd8e9d759c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -188,7 +188,7 @@ endif() ################################################################################ # C++ version ################################################################################ -set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) ################################################################################ From 5607a7f1910e579acc0b93b1ae2caba88e7d5fd7 Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Wed, 22 Mar 2023 11:13:20 +0000 Subject: [PATCH 101/320] Change `llvm_map_components_to_libnames` to `llvm_config` CMake function With recent LLVM versions, this should allow to link against dynamic LLVM libraries. --- CMakeLists.txt | 5 +++++ lib/Basic/CMakeLists.txt | 3 +-- lib/Core/CMakeLists.txt | 4 ++-- lib/Expr/CMakeLists.txt | 3 +-- lib/Module/CMakeLists.txt | 5 ++--- lib/Solver/CMakeLists.txt | 4 ++-- lib/Support/CMakeLists.txt | 4 ++-- test/CMakeLists.txt | 4 ++-- tools/kleaver/CMakeLists.txt | 4 ++-- unittests/CMakeLists.txt | 2 +- 10 files changed, 20 insertions(+), 18 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bd8e9d759c..024d8a5003 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -185,6 +185,11 @@ if (NOT EXISTS "${LLVM_AS}") message(FATAL_ERROR "Failed to find llvm-as at \"${LLVM_AS}\"") endif() +# Check for dynamic linking +if (LLVM_LINK_LLVM_DYLIB) + set(USE_LLVM_SHARED USE_SHARED) +endif() + ################################################################################ # C++ version ################################################################################ diff --git a/lib/Basic/CMakeLists.txt b/lib/Basic/CMakeLists.txt index 5671c14459..db630893df 100644 --- a/lib/Basic/CMakeLists.txt +++ b/lib/Basic/CMakeLists.txt @@ -11,8 +11,7 @@ add_library(kleeBasic Statistics.cpp ) -llvm_map_components_to_libnames(llvm_libs support) -target_link_libraries(kleeBasic PRIVATE ${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}) diff --git a/lib/Core/CMakeLists.txt b/lib/Core/CMakeLists.txt index 0905a7f03e..fa5c2b5ae9 100644 --- a/lib/Core/CMakeLists.txt +++ b/lib/Core/CMakeLists.txt @@ -36,8 +36,8 @@ target_link_libraries(kleeCore PRIVATE kleeSupport ) -llvm_map_components_to_libnames(llvm_libs core executionengine mcjit native support) -target_link_libraries(kleeCore PRIVATE ${llvm_libs} ${SQLITE3_LIBRARIES}) +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/Expr/CMakeLists.txt b/lib/Expr/CMakeLists.txt index 6b8a873bb8..f9a5a83bc5 100644 --- a/lib/Expr/CMakeLists.txt +++ b/lib/Expr/CMakeLists.txt @@ -26,8 +26,7 @@ add_library(kleaverExpr Updates.cpp ) -llvm_map_components_to_libnames(llvm_libs support) -target_link_libraries(kleaverExpr PRIVATE ${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/Module/CMakeLists.txt b/lib/Module/CMakeLists.txt index c81d395e2c..e1f548e88b 100644 --- a/lib/Module/CMakeLists.txt +++ b/lib/Module/CMakeLists.txt @@ -26,7 +26,8 @@ add_library(kleeModule ${KLEE_MODULE_COMPONENT_SRCS} ) -llvm_map_components_to_libnames(llvm_libs bitreader +llvm_config(kleeModule "${USE_LLVM_SHARED}" + bitreader bitwriter codegen ipo @@ -42,8 +43,6 @@ llvm_map_components_to_libnames(llvm_libs bitreader binaryformat ) -target_link_libraries(kleeModule PRIVATE ${llvm_libs}) - target_link_libraries(kleeModule PRIVATE kleeSupport ) diff --git a/lib/Solver/CMakeLists.txt b/lib/Solver/CMakeLists.txt index 81a6488267..dbebe14588 100644 --- a/lib/Solver/CMakeLists.txt +++ b/lib/Solver/CMakeLists.txt @@ -32,12 +32,12 @@ add_library(kleaverSolver Z3Solver.cpp ) -llvm_map_components_to_libnames(llvm_libs support) +llvm_config(kleaverSolver "${USE_LLVM_SHARED}" support) target_link_libraries(kleaverSolver PRIVATE kleeBasic kleaverExpr kleeSupport - ${KLEE_SOLVER_LIBRARIES} ${llvm_libs}) + ${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/Support/CMakeLists.txt b/lib/Support/CMakeLists.txt index 7ff4daa34e..a6f13954bb 100644 --- a/lib/Support/CMakeLists.txt +++ b/lib/Support/CMakeLists.txt @@ -18,9 +18,9 @@ add_library(kleeSupport TreeStream.cpp ) -llvm_map_components_to_libnames(llvm_libs support) +llvm_config(kleeSupport "${USE_LLVM_SHARED}" support) -target_link_libraries(kleeSupport PRIVATE ${llvm_libs} ${ZLIB_LIBRARIES} ${TCMALLOC_LIBRARIES}) +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/test/CMakeLists.txt b/test/CMakeLists.txt index 226eb08a3d..b4716dae70 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -96,7 +96,7 @@ if (DOWNLOAD_FILECHECK_SOURCE) add_executable(FileCheck ${FILECHECK_SRC_FILE} ) - llvm_map_components_to_libnames(FILECHECK_NEEDED_LIBS support) + llvm_config(FileCheck "${USE_LLVM_SHARED}" support) target_include_directories(FileCheck PRIVATE ${LLVM_INCLUDE_DIRS}) target_link_libraries(FileCheck PRIVATE ${FILECHECK_NEEDED_LIBS}) endif() @@ -117,7 +117,7 @@ if (DOWNLOAD_NOT_SOURCE) add_executable("not" ${NOT_SRC_FILE} ) - llvm_map_components_to_libnames(NOT_NEEDED_LIBS support) + llvm_config("not" "${USE_LLVM_SHARED}" support) target_include_directories("not" PRIVATE ${LLVM_INCLUDE_DIRS}) target_link_libraries("not" PRIVATE ${NOT_NEEDED_LIBS}) endif() diff --git a/tools/kleaver/CMakeLists.txt b/tools/kleaver/CMakeLists.txt index acc681e506..c2960a7e88 100644 --- a/tools/kleaver/CMakeLists.txt +++ b/tools/kleaver/CMakeLists.txt @@ -10,9 +10,9 @@ add_executable(kleaver main.cpp ) -llvm_map_components_to_libnames(llvm_libs core support) +llvm_config(kleaver "${USE_LLVM_SHARED}" core support) -target_link_libraries(kleaver kleaverSolver ${llvm_libs}) +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}) diff --git a/unittests/CMakeLists.txt b/unittests/CMakeLists.txt index 9e30a9b766..17644eddf7 100644 --- a/unittests/CMakeLists.txt +++ b/unittests/CMakeLists.txt @@ -201,7 +201,7 @@ endif() add_library(unittest_main) target_sources(unittest_main PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/TestMain.cpp") -llvm_map_components_to_libnames(UNITTEST_MAIN_LIBS support) +llvm_config(unittest_main "${USE_LLVM_SHARED}" support) target_link_libraries(unittest_main PUBLIC From a52050202a53161615e1d088e61ff19d82aeef50 Mon Sep 17 00:00:00 2001 From: Frank Busse Date: Fri, 17 Mar 2023 13:11:58 +0000 Subject: [PATCH 102/320] STP: add option to switch SAT solver: --stp-sat-solver and set default to CryptoMinisat --- lib/Solver/STPSolver.cpp | 65 ++++++++++++++++++++++++++++++++++++-- test/Solver/STPswitchSAT.c | 31 ++++++++++++++++++ 2 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 test/Solver/STPswitchSAT.c diff --git a/lib/Solver/STPSolver.cpp b/lib/Solver/STPSolver.cpp index 95728cdec1..1353691011 100644 --- a/lib/Solver/STPSolver.cpp +++ b/lib/Solver/STPSolver.cpp @@ -16,13 +16,14 @@ #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 @@ -40,7 +41,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 @@ -103,6 +121,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); 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}} From 94376216f09802dd1d402b317dd703071e9a7099 Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Tue, 21 Mar 2023 17:19:14 +0000 Subject: [PATCH 103/320] Added more test cases for --entry-point. EntryPointMissing is currently expected to fail. --- test/Feature/EntryPoint.c | 10 +++++ test/Feature/EntryPointMissing.c | 64 ++++++++++++++++++++++++++++ test/Feature/EntryPointUclibcPosix.c | 45 +++++++++++++++++++ 3 files changed, 119 insertions(+) create mode 100644 test/Feature/EntryPointMissing.c create mode 100644 test/Feature/EntryPointUclibcPosix.c diff --git a/test/Feature/EntryPoint.c b/test/Feature/EntryPoint.c index 8a10d36fff..48442659fc 100644 --- a/test/Feature/EntryPoint.c +++ b/test/Feature/EntryPoint.c @@ -2,6 +2,10 @@ // RUN: rm -rf %t.klee-out // 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 @@ -14,4 +18,10 @@ int other_main() { 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..3a0d0530a3 --- /dev/null +++ b/test/Feature/EntryPointMissing.c @@ -0,0 +1,64 @@ +// REQUIRES: posix-runtime +// REQUIRES: uclibc +// XFAIL: * + +// 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 From 91468cf16fb158cd6be5eb9d9c5259f7f88bdf9a Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Wed, 22 Mar 2023 22:21:41 +0000 Subject: [PATCH 104/320] Run KDAlloc/rusage unittest a few times to allow for swapfile interference --- unittests/KDAlloc/rusage.cpp | 43 +++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/unittests/KDAlloc/rusage.cpp b/unittests/KDAlloc/rusage.cpp index fa755b736e..453c5e5d74 100644 --- a/unittests/KDAlloc/rusage.cpp +++ b/unittests/KDAlloc/rusage.cpp @@ -11,7 +11,7 @@ #include "gtest/gtest.h" -#include +#include #include @@ -20,7 +20,7 @@ #if !defined(__has_feature) || \ (!__has_feature(memory_sanitizer) && !__has_feature(address_sanitizer)) -std::size_t write_to_allocations(std::deque &allocations) { +std::size_t write_to_allocations(std::vector &allocations) { struct rusage ru; getrusage(RUSAGE_SELF, &ru); auto initial = ru.ru_minflt; @@ -41,26 +41,33 @@ TEST(KDAllocTest, Rusage) { 0); // 1 GB klee::kdalloc::Allocator allocator = factory.makeAllocator(); - std::deque allocations; + std::vector allocations; for (std::size_t i = 0; i < 1000; ++i) { - auto p = allocator.allocate(16); - allocations.emplace_back(p); + allocations.emplace_back(allocator.allocate(16)); } - auto pageFaults = write_to_allocations(allocations); - - ASSERT_GT(pageFaults, static_cast(0)) - << "No page faults happened"; - ASSERT_EQ(pageFaults, allocations.size()) - << "Number of (minor) page faults and objects differs"; - - factory.getMapping().clear(); - - // try again: this should (again) trigger a minor page fault for every object - auto pageFaultsSecondTry = write_to_allocations(allocations); + // When writing to allocations we should have at least one page fault per + // object, but may have more due to unrelated behavior (e.g., swapping). In + // the hopes that such interference is relatively rare, we try a few times to + // encounter a perfect run, where the number of page faults matches the number + // of allocated objects exactly. + constexpr std::size_t tries = 100; + for (std::size_t i = 0; i < tries; ++i) { + auto pageFaults = write_to_allocations(allocations); + if (pageFaults == allocations.size()) { + // we have a perfect match + return; + } + + ASSERT_GE(pageFaults, allocations.size()) + << "There should be at least as many page faults as allocated objects"; + + factory.getMapping().clear(); + } - ASSERT_EQ(pageFaults, pageFaultsSecondTry) - << "Number of minor page faults in second try differs"; + FAIL() + << "No single try out of " << tries + << " yielded a perfect match between page faults and allocated objects"; } #endif From a91be77e800510db50444b3e1f5ef20dbca0260c Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Wed, 22 Mar 2023 23:41:24 +0000 Subject: [PATCH 105/320] remove obsolete header --- include/klee/Support/FloatEvaluation.h | 264 ------------------------- lib/Core/Executor.cpp | 1 - 2 files changed, 265 deletions(-) delete mode 100644 include/klee/Support/FloatEvaluation.h 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/lib/Core/Executor.cpp b/lib/Core/Executor.cpp index d644d647dd..9322f50ab2 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -49,7 +49,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" From fc3c937892998b984a59cfa740244952ff6071b9 Mon Sep 17 00:00:00 2001 From: Frank Busse Date: Fri, 7 Jan 2022 14:14:38 +0000 Subject: [PATCH 106/320] stats: add InhibitedForks --- lib/Core/CoreStats.cpp | 1 + lib/Core/CoreStats.h | 3 +++ lib/Core/Executor.cpp | 2 ++ lib/Core/StatsTracker.cpp | 8 ++++++-- tools/klee-stats/klee-stats | 1 + 5 files changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/Core/CoreStats.cpp b/lib/Core/CoreStats.cpp index 2589d7dac4..720fa1b2e6 100644 --- a/lib/Core/CoreStats.cpp +++ b/lib/Core/CoreStats.cpp @@ -16,6 +16,7 @@ Statistic stats::coveredInstructions("CoveredInstructions", "Icov"); 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"); diff --git a/lib/Core/CoreStats.h b/lib/Core/CoreStats.h index 354706f589..b624d1aac7 100644 --- a/lib/Core/CoreStats.h +++ b/lib/Core/CoreStats.h @@ -30,6 +30,9 @@ namespace stats { /// 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; diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp index 9322f50ab2..c3a101448f 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -897,6 +897,7 @@ void Executor::branch(ExecutionState &state, result.push_back(nullptr); } } + stats::inhibitedForks += N - 1; } else { stats::forks += N-1; @@ -1074,6 +1075,7 @@ Executor::StatePair Executor::fork(ExecutionState ¤t, ref condition, addConstraint(current, Expr::createIsZero(condition)); res = Solver::False; } + ++stats::inhibitedForks; } } } diff --git a/lib/Core/StatsTracker.cpp b/lib/Core/StatsTracker.cpp index 539b913c42..18c0a6919f 100644 --- a/lib/Core/StatsTracker.cpp +++ b/lib/Core/StatsTracker.cpp @@ -451,6 +451,7 @@ void StatsTracker::writeStatsHeader() { << "ResolveTime INTEGER," << "QueryCexCacheMisses INTEGER," << "QueryCexCacheHits INTEGER," + << "InhibitedForks INTEGER," << "ArrayHashTime INTEGER" << ')'; char *zErrMsg = nullptr; @@ -484,6 +485,7 @@ void StatsTracker::writeStatsHeader() { << "ResolveTime," << "QueryCexCacheMisses," << "QueryCexCacheHits," + << "InhibitedForks," << "ArrayHashTime" << ") VALUES (" << "?," @@ -505,6 +507,7 @@ void StatsTracker::writeStatsHeader() { << "?," << "?," << "?," + << "?," << "? " << ')'; @@ -537,10 +540,11 @@ void StatsTracker::writeStatsLine() { sqlite3_bind_int64(insertStmt, 17, stats::resolveTime); sqlite3_bind_int64(insertStmt, 18, stats::queryCexCacheMisses); sqlite3_bind_int64(insertStmt, 19, stats::queryCexCacheHits); + sqlite3_bind_int64(insertStmt, 20, stats::inhibitedForks); #ifdef KLEE_ARRAY_DEBUG - sqlite3_bind_int64(insertStmt, 20, stats::arrayHashTime); + sqlite3_bind_int64(insertStmt, 21, stats::arrayHashTime); #else - sqlite3_bind_int64(insertStmt, 20, -1LL); + sqlite3_bind_int64(insertStmt, 21, -1LL); #endif int errCode = sqlite3_step(insertStmt); if(errCode != SQLITE_DONE) klee_error("Error writing stats data: %s", sqlite3_errmsg(statsFile)); diff --git a/tools/klee-stats/klee-stats b/tools/klee-stats/klee-stats index 22cdaf4310..18fbe5950e 100755 --- a/tools/klee-stats/klee-stats +++ b/tools/klee-stats/klee-stats @@ -47,6 +47,7 @@ Legend = [ ('ActiveStates', 'number of currently active states (0 after successful termination)', "NumStates"), ('MaxActiveStates', 'maximum number of active states', "MaxStates"), ('AvgActiveStates', 'average number of active states', "AvgStates"), + ('InhibitedForks', 'number of inhibited state forks due to e.g. memory pressure', "InhibitedForks"), # - constraint caching/solving ('Queries', 'number of queries issued to the constraint solver', "NumQueries"), ('QueryConstructs', 'number of query constructs for all queries send to the constraint solver', "NumQueryConstructs"), From 7b881cd894ce908a4b4e2d2ad89f90e39905905a Mon Sep 17 00:00:00 2001 From: Frank Busse Date: Fri, 7 Jan 2022 14:21:00 +0000 Subject: [PATCH 107/320] stats: add QCacheHits/Misses --- lib/Core/StatsTracker.cpp | 18 +++++++++++++----- tools/klee-stats/klee-stats | 6 ++++-- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/lib/Core/StatsTracker.cpp b/lib/Core/StatsTracker.cpp index 18c0a6919f..0cec42223b 100644 --- a/lib/Core/StatsTracker.cpp +++ b/lib/Core/StatsTracker.cpp @@ -449,6 +449,8 @@ void StatsTracker::writeStatsHeader() { << "CexCacheTime INTEGER," << "ForkTime INTEGER," << "ResolveTime INTEGER," + << "QueryCacheMisses INTEGER," + << "QueryCacheHits INTEGER," << "QueryCexCacheMisses INTEGER," << "QueryCexCacheHits INTEGER," << "InhibitedForks INTEGER," @@ -483,6 +485,8 @@ void StatsTracker::writeStatsHeader() { << "CexCacheTime," << "ForkTime," << "ResolveTime," + << "QueryCacheMisses," + << "QueryCacheHits," << "QueryCexCacheMisses," << "QueryCexCacheHits," << "InhibitedForks," @@ -508,6 +512,8 @@ void StatsTracker::writeStatsHeader() { << "?," << "?," << "?," + << "?," + << "?," << "? " << ')'; @@ -538,13 +544,15 @@ void StatsTracker::writeStatsLine() { 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); - sqlite3_bind_int64(insertStmt, 20, stats::inhibitedForks); + sqlite3_bind_int64(insertStmt, 18, stats::queryCacheMisses); + sqlite3_bind_int64(insertStmt, 19, stats::queryCacheHits); + sqlite3_bind_int64(insertStmt, 20, stats::queryCexCacheMisses); + sqlite3_bind_int64(insertStmt, 21, stats::queryCexCacheHits); + sqlite3_bind_int64(insertStmt, 22, stats::inhibitedForks); #ifdef KLEE_ARRAY_DEBUG - sqlite3_bind_int64(insertStmt, 21, stats::arrayHashTime); + sqlite3_bind_int64(insertStmt, 23, stats::arrayHashTime); #else - sqlite3_bind_int64(insertStmt, 21, -1LL); + sqlite3_bind_int64(insertStmt, 23, -1LL); #endif int errCode = sqlite3_step(insertStmt); if(errCode != SQLITE_DONE) klee_error("Error writing stats data: %s", sqlite3_errmsg(statsFile)); diff --git a/tools/klee-stats/klee-stats b/tools/klee-stats/klee-stats index 18fbe5950e..b819f69b32 100755 --- a/tools/klee-stats/klee-stats +++ b/tools/klee-stats/klee-stats @@ -52,8 +52,10 @@ Legend = [ ('Queries', 'number of queries issued to the constraint solver', "NumQueries"), ('QueryConstructs', 'number of query constructs for all queries send to the constraint solver', "NumQueryConstructs"), ('AvgSolverQuerySize', 'average number of query constructs per query issued to the constraint solver', "AvgQC"), - ('QCexCMisses', 'Counterexample cache misses', "QueryCexCacheMisses"), - ('QCexCHits', 'Counterexample cache hits', "QueryCexCacheHits"), + ('QCacheMisses', 'Query cache misses', "QueryCacheMisses"), + ('QCacheHits', 'Query cache hits', "QueryCacheHits"), + ('QCexCacheMisses', 'Counterexample cache misses', "QueryCexCacheMisses"), + ('QCexCacheHits', 'Counterexample cache hits', "QueryCexCacheHits"), # - memory ('Mem(MiB)', 'mebibytes of memory currently used', "MallocUsage"), ('MaxMem(MiB)', 'maximum memory usage', "MaxMem"), From 895f095d3d16472b9443bda60854a3230fc7e974 Mon Sep 17 00:00:00 2001 From: Frank Busse Date: Fri, 7 Jan 2022 14:32:22 +0000 Subject: [PATCH 108/320] stats: add ExternalCalls --- lib/Core/CoreStats.cpp | 1 + lib/Core/CoreStats.h | 3 +++ lib/Core/ExternalDispatcher.cpp | 3 +++ lib/Core/StatsTracker.cpp | 8 ++++++-- tools/klee-stats/klee-stats | 1 + 5 files changed, 14 insertions(+), 2 deletions(-) diff --git a/lib/Core/CoreStats.cpp b/lib/Core/CoreStats.cpp index 720fa1b2e6..06b8b93076 100644 --- a/lib/Core/CoreStats.cpp +++ b/lib/Core/CoreStats.cpp @@ -13,6 +13,7 @@ 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"); diff --git a/lib/Core/CoreStats.h b/lib/Core/CoreStats.h index b624d1aac7..c0dcac7d7e 100644 --- a/lib/Core/CoreStats.h +++ b/lib/Core/CoreStats.h @@ -27,6 +27,9 @@ namespace stats { extern Statistic forkTime; extern Statistic solverTime; + /// The number of external calls. + extern Statistic externalCalls; + /// The number of process forks. extern Statistic forks; diff --git a/lib/Core/ExternalDispatcher.cpp b/lib/Core/ExternalDispatcher.cpp index d286bea95a..d155798e0d 100644 --- a/lib/Core/ExternalDispatcher.cpp +++ b/lib/Core/ExternalDispatcher.cpp @@ -8,6 +8,8 @@ //===----------------------------------------------------------------------===// #include "ExternalDispatcher.h" + +#include "CoreStats.h" #include "klee/Config/Version.h" #include "klee/Module/KCallable.h" #include "klee/Module/KModule.h" @@ -158,6 +160,7 @@ ExternalDispatcherImpl::~ExternalDispatcherImpl() { 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 diff --git a/lib/Core/StatsTracker.cpp b/lib/Core/StatsTracker.cpp index 0cec42223b..907aaa7329 100644 --- a/lib/Core/StatsTracker.cpp +++ b/lib/Core/StatsTracker.cpp @@ -454,6 +454,7 @@ void StatsTracker::writeStatsHeader() { << "QueryCexCacheMisses INTEGER," << "QueryCexCacheHits INTEGER," << "InhibitedForks INTEGER," + << "ExternalCalls INTEGER," << "ArrayHashTime INTEGER" << ')'; char *zErrMsg = nullptr; @@ -490,6 +491,7 @@ void StatsTracker::writeStatsHeader() { << "QueryCexCacheMisses," << "QueryCexCacheHits," << "InhibitedForks," + << "ExternalCalls," << "ArrayHashTime" << ") VALUES (" << "?," @@ -514,6 +516,7 @@ void StatsTracker::writeStatsHeader() { << "?," << "?," << "?," + << "?," << "? " << ')'; @@ -549,10 +552,11 @@ void StatsTracker::writeStatsLine() { sqlite3_bind_int64(insertStmt, 20, stats::queryCexCacheMisses); sqlite3_bind_int64(insertStmt, 21, stats::queryCexCacheHits); sqlite3_bind_int64(insertStmt, 22, stats::inhibitedForks); + sqlite3_bind_int64(insertStmt, 23, stats::externalCalls); #ifdef KLEE_ARRAY_DEBUG - sqlite3_bind_int64(insertStmt, 23, stats::arrayHashTime); + sqlite3_bind_int64(insertStmt, 24, stats::arrayHashTime); #else - sqlite3_bind_int64(insertStmt, 23, -1LL); + sqlite3_bind_int64(insertStmt, 24, -1LL); #endif int errCode = sqlite3_step(insertStmt); if(errCode != SQLITE_DONE) klee_error("Error writing stats data: %s", sqlite3_errmsg(statsFile)); diff --git a/tools/klee-stats/klee-stats b/tools/klee-stats/klee-stats index b819f69b32..be30a0ca90 100755 --- a/tools/klee-stats/klee-stats +++ b/tools/klee-stats/klee-stats @@ -35,6 +35,7 @@ Legend = [ ('Branches', 'number of conditional branch (br) instructions in the LLVM bitcode', 'NumBranches'), ('FullBranches', 'number of fully-explored conditional branch (br) instructions in the LLVM bitcode', 'FullBranches'), ('PartialBranches', 'number of partially-explored conditional branch (br) instructions in the LLVM bitcode', 'PartialBranches'), + ('ExternalCalls', 'number of external calls', 'ExternalCalls'), # - time ('TUser(s)', 'total user time', "UserTime"), ('TResolve(s)', 'time spent in object resolution', "ResolveTime"), From 855d33173cae9fd43899a6a96a58f79563560cce Mon Sep 17 00:00:00 2001 From: Frank Busse Date: Fri, 7 Jan 2022 16:09:10 +0000 Subject: [PATCH 109/320] stats: rename numQueries/Queries -> SolverQueries, add Queries --- include/klee/Solver/SolverStats.h | 1 + lib/Core/StatsTracker.cpp | 42 +++++++++++++++++-------------- lib/Core/TimingSolver.cpp | 6 +++++ lib/Solver/DummySolver.cpp | 8 +++--- lib/Solver/MetaSMTSolver.cpp | 2 +- lib/Solver/STPSolver.cpp | 2 +- lib/Solver/SolverStats.cpp | 1 + lib/Solver/Z3Solver.cpp | 2 +- tools/kleaver/main.cpp | 2 +- tools/klee-stats/klee-stats | 5 ++-- tools/klee/main.cpp | 2 +- 11 files changed, 43 insertions(+), 30 deletions(-) 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/lib/Core/StatsTracker.cpp b/lib/Core/StatsTracker.cpp index 907aaa7329..37a52fffb7 100644 --- a/lib/Core/StatsTracker.cpp +++ b/lib/Core/StatsTracker.cpp @@ -439,7 +439,8 @@ void StatsTracker::writeStatsHeader() { << "UserTime REAL," << "NumStates INTEGER," << "MallocUsage INTEGER," - << "NumQueries INTEGER," + << "Queries INTEGER," + << "SolverQueries INTEGER," << "NumQueryConstructs INTEGER," << "WallTime REAL," << "CoveredInstructions INTEGER," @@ -476,7 +477,8 @@ void StatsTracker::writeStatsHeader() { << "UserTime," << "NumStates," << "MallocUsage," - << "NumQueries," + << "Queries," + << "SolverQueries," << "NumQueryConstructs," << "WallTime," << "CoveredInstructions," @@ -517,6 +519,7 @@ void StatsTracker::writeStatsHeader() { << "?," << "?," << "?," + << "?," << "? " << ')'; @@ -538,25 +541,26 @@ void StatsTracker::writeStatsLine() { 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::queryCacheMisses); - sqlite3_bind_int64(insertStmt, 19, stats::queryCacheHits); - sqlite3_bind_int64(insertStmt, 20, stats::queryCexCacheMisses); - sqlite3_bind_int64(insertStmt, 21, stats::queryCexCacheHits); - sqlite3_bind_int64(insertStmt, 22, stats::inhibitedForks); - sqlite3_bind_int64(insertStmt, 23, stats::externalCalls); + sqlite3_bind_int64(insertStmt, 9, stats::solverQueries); + sqlite3_bind_int64(insertStmt, 10, stats::queryConstructs); + sqlite3_bind_int64(insertStmt, 11, elapsed().toMicroseconds()); + sqlite3_bind_int64(insertStmt, 12, stats::coveredInstructions); + sqlite3_bind_int64(insertStmt, 13, stats::uncoveredInstructions); + sqlite3_bind_int64(insertStmt, 14, stats::queryTime); + sqlite3_bind_int64(insertStmt, 15, stats::solverTime); + sqlite3_bind_int64(insertStmt, 16, stats::cexCacheTime); + sqlite3_bind_int64(insertStmt, 17, stats::forkTime); + sqlite3_bind_int64(insertStmt, 18, stats::resolveTime); + sqlite3_bind_int64(insertStmt, 19, stats::queryCacheMisses); + sqlite3_bind_int64(insertStmt, 10, stats::queryCacheHits); + sqlite3_bind_int64(insertStmt, 21, stats::queryCexCacheMisses); + sqlite3_bind_int64(insertStmt, 22, stats::queryCexCacheHits); + sqlite3_bind_int64(insertStmt, 23, stats::inhibitedForks); + sqlite3_bind_int64(insertStmt, 24, stats::externalCalls); #ifdef KLEE_ARRAY_DEBUG - sqlite3_bind_int64(insertStmt, 24, stats::arrayHashTime); + sqlite3_bind_int64(insertStmt, 25, stats::arrayHashTime); #else - sqlite3_bind_int64(insertStmt, 24, -1LL); + sqlite3_bind_int64(insertStmt, 25, -1LL); #endif int errCode = sqlite3_step(insertStmt); if(errCode != SQLITE_DONE) klee_error("Error writing stats data: %s", sqlite3_errmsg(statsFile)); 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/Solver/DummySolver.cpp b/lib/Solver/DummySolver.cpp index 60a4fb5141..a845f9017c 100644 --- a/lib/Solver/DummySolver.cpp +++ b/lib/Solver/DummySolver.cpp @@ -30,19 +30,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 +50,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; } diff --git a/lib/Solver/MetaSMTSolver.cpp b/lib/Solver/MetaSMTSolver.cpp index 0f78bb5b63..37c22f0e1e 100644 --- a/lib/Solver/MetaSMTSolver.cpp +++ b/lib/Solver/MetaSMTSolver.cpp @@ -194,7 +194,7 @@ bool MetaSMTSolverImpl::computeInitialValues( TimerStatIncrementer t(stats::queryTime); assert(_builder); - ++stats::queries; + ++stats::solverQueries; ++stats::queryCounterexamples; bool success = true; diff --git a/lib/Solver/STPSolver.cpp b/lib/Solver/STPSolver.cpp index 1353691011..6e62b82bed 100644 --- a/lib/Solver/STPSolver.cpp +++ b/lib/Solver/STPSolver.cpp @@ -387,7 +387,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); 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/Z3Solver.cpp b/lib/Solver/Z3Solver.cpp index b628b86ba2..8319e5f35e 100644 --- a/lib/Solver/Z3Solver.cpp +++ b/lib/Solver/Z3Solver.cpp @@ -268,7 +268,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; diff --git a/tools/kleaver/main.cpp b/tools/kleaver/main.cpp index 22c23422e8..eed4e4c9dd 100644 --- a/tools/kleaver/main.cpp +++ b/tools/kleaver/main.cpp @@ -296,7 +296,7 @@ static bool EvaluateInputAST(const char *Filename, delete S; - if (uint64_t queries = *theStatisticManager->getStatisticByName("Queries")) { + if (uint64_t queries = *theStatisticManager->getStatisticByName("SolverQueries")) { llvm::outs() << "--\n" << "total queries = " << queries << '\n' diff --git a/tools/klee-stats/klee-stats b/tools/klee-stats/klee-stats index be30a0ca90..5e49587bb9 100755 --- a/tools/klee-stats/klee-stats +++ b/tools/klee-stats/klee-stats @@ -50,8 +50,9 @@ Legend = [ ('AvgActiveStates', 'average number of active states', "AvgStates"), ('InhibitedForks', 'number of inhibited state forks due to e.g. memory pressure', "InhibitedForks"), # - constraint caching/solving - ('Queries', 'number of queries issued to the constraint solver', "NumQueries"), - ('QueryConstructs', 'number of query constructs for all queries send to the constraint solver', "NumQueryConstructs"), + ('Queries', 'number of queries issued to the solver chain', "Queries"), + ('SolverQueries', 'number of queries issued to the constraint solver', "SolverQueries"), + ('SolverQueryConstructs', 'number of query constructs for all queries send to the constraint solver', "NumQueryConstructs"), ('AvgSolverQuerySize', 'average number of query constructs per query issued to the constraint solver', "AvgQC"), ('QCacheMisses', 'Query cache misses', "QueryCacheMisses"), ('QCacheHits', 'Query cache hits', "QueryCacheHits"), diff --git a/tools/klee/main.cpp b/tools/klee/main.cpp index 0b76e9041a..ddb1faec34 100644 --- a/tools/klee/main.cpp +++ b/tools/klee/main.cpp @@ -1547,7 +1547,7 @@ int main(int argc, char **argv, char **envp) { delete interpreter; uint64_t queries = - *theStatisticManager->getStatisticByName("Queries"); + *theStatisticManager->getStatisticByName("SolverQueries"); uint64_t queriesValid = *theStatisticManager->getStatisticByName("QueriesValid"); uint64_t queriesInvalid = From a88a768c3ea9343db746344f2cc6e41d4c598a8c Mon Sep 17 00:00:00 2001 From: Frank Busse Date: Fri, 7 Jan 2022 16:12:12 +0000 Subject: [PATCH 110/320] stats: add Allocations --- lib/Core/StatsTracker.cpp | 8 ++++++-- tools/klee-stats/klee-stats | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/Core/StatsTracker.cpp b/lib/Core/StatsTracker.cpp index 37a52fffb7..bc40afd9d4 100644 --- a/lib/Core/StatsTracker.cpp +++ b/lib/Core/StatsTracker.cpp @@ -456,6 +456,7 @@ void StatsTracker::writeStatsHeader() { << "QueryCexCacheHits INTEGER," << "InhibitedForks INTEGER," << "ExternalCalls INTEGER," + << "Allocations INTEGER," << "ArrayHashTime INTEGER" << ')'; char *zErrMsg = nullptr; @@ -494,6 +495,7 @@ void StatsTracker::writeStatsHeader() { << "QueryCexCacheHits," << "InhibitedForks," << "ExternalCalls," + << "Allocations," << "ArrayHashTime" << ") VALUES (" << "?," @@ -520,6 +522,7 @@ void StatsTracker::writeStatsHeader() { << "?," << "?," << "?," + << "?," << "? " << ')'; @@ -557,10 +560,11 @@ void StatsTracker::writeStatsLine() { sqlite3_bind_int64(insertStmt, 22, stats::queryCexCacheHits); sqlite3_bind_int64(insertStmt, 23, stats::inhibitedForks); sqlite3_bind_int64(insertStmt, 24, stats::externalCalls); + sqlite3_bind_int64(insertStmt, 25, stats::allocations); #ifdef KLEE_ARRAY_DEBUG - sqlite3_bind_int64(insertStmt, 25, stats::arrayHashTime); + sqlite3_bind_int64(insertStmt, 26, stats::arrayHashTime); #else - sqlite3_bind_int64(insertStmt, 25, -1LL); + sqlite3_bind_int64(insertStmt, 26, -1LL); #endif int errCode = sqlite3_step(insertStmt); if(errCode != SQLITE_DONE) klee_error("Error writing stats data: %s", sqlite3_errmsg(statsFile)); diff --git a/tools/klee-stats/klee-stats b/tools/klee-stats/klee-stats index 5e49587bb9..b08022f4db 100755 --- a/tools/klee-stats/klee-stats +++ b/tools/klee-stats/klee-stats @@ -59,6 +59,7 @@ Legend = [ ('QCexCacheMisses', 'Counterexample cache misses', "QueryCexCacheMisses"), ('QCexCacheHits', 'Counterexample cache hits', "QueryCexCacheHits"), # - memory + ('Allocations', 'number of allocated heap objects of the program under test', "Allocations"), ('Mem(MiB)', 'mebibytes of memory currently used', "MallocUsage"), ('MaxMem(MiB)', 'maximum memory usage', "MaxMem"), ('AvgMem(MiB)', 'average memory usage', "AvgMem"), From ba58e4add3bb2e924b0078146fdcd9b4f6158178 Mon Sep 17 00:00:00 2001 From: Frank Busse Date: Fri, 7 Jan 2022 16:28:17 +0000 Subject: [PATCH 111/320] stats: rename States -> ActiveStates, add States --- lib/Core/ExecutionState.h | 1 + lib/Core/StatsTracker.cpp | 8 ++++++-- tools/klee-stats/klee-stats | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/Core/ExecutionState.h b/lib/Core/ExecutionState.h index 6d6336dd40..dbe02fd9a8 100644 --- a/lib/Core/ExecutionState.h +++ b/lib/Core/ExecutionState.h @@ -281,6 +281,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/StatsTracker.cpp b/lib/Core/StatsTracker.cpp index bc40afd9d4..51a0b73cc4 100644 --- a/lib/Core/StatsTracker.cpp +++ b/lib/Core/StatsTracker.cpp @@ -457,6 +457,7 @@ void StatsTracker::writeStatsHeader() { << "InhibitedForks INTEGER," << "ExternalCalls INTEGER," << "Allocations INTEGER," + << "States INTEGER," << "ArrayHashTime INTEGER" << ')'; char *zErrMsg = nullptr; @@ -496,6 +497,7 @@ void StatsTracker::writeStatsHeader() { << "InhibitedForks," << "ExternalCalls," << "Allocations," + << "States," << "ArrayHashTime" << ") VALUES (" << "?," @@ -523,6 +525,7 @@ void StatsTracker::writeStatsHeader() { << "?," << "?," << "?," + << "?," << "? " << ')'; @@ -561,10 +564,11 @@ void StatsTracker::writeStatsLine() { sqlite3_bind_int64(insertStmt, 23, stats::inhibitedForks); sqlite3_bind_int64(insertStmt, 24, stats::externalCalls); sqlite3_bind_int64(insertStmt, 25, stats::allocations); + sqlite3_bind_int64(insertStmt, 26, ExecutionState::getLastID()); #ifdef KLEE_ARRAY_DEBUG - sqlite3_bind_int64(insertStmt, 26, stats::arrayHashTime); + sqlite3_bind_int64(insertStmt, 27, stats::arrayHashTime); #else - sqlite3_bind_int64(insertStmt, 26, -1LL); + sqlite3_bind_int64(insertStmt, 27, -1LL); #endif int errCode = sqlite3_step(insertStmt); if(errCode != SQLITE_DONE) klee_error("Error writing stats data: %s", sqlite3_errmsg(statsFile)); diff --git a/tools/klee-stats/klee-stats b/tools/klee-stats/klee-stats index b08022f4db..629095bc0a 100755 --- a/tools/klee-stats/klee-stats +++ b/tools/klee-stats/klee-stats @@ -45,6 +45,7 @@ Legend = [ ('TQuery(s)', 'time spent in the constraint solver', "QueryTime"), ('TSolver(s)', 'time spent in the solver chain (incl. caches and constraint solver)', "SolverTime"), # - states + ('States', 'number of created states', "States"), ('ActiveStates', 'number of currently active states (0 after successful termination)', "NumStates"), ('MaxActiveStates', 'maximum number of active states', "MaxStates"), ('AvgActiveStates', 'average number of active states', "AvgStates"), From 4749068700db333a47b034f047eed154de4ad2c8 Mon Sep 17 00:00:00 2001 From: Frank Busse Date: Fri, 7 Jan 2022 18:58:13 +0000 Subject: [PATCH 112/320] stats: add branch type stats --- include/klee/Core/BranchTypes.h | 33 +++-- lib/Core/CoreStats.cpp | 21 +++ lib/Core/CoreStats.h | 8 ++ lib/Core/Executor.cpp | 6 +- lib/Core/StatsTracker.cpp | 234 +++++++++++++++++--------------- tools/klee-stats/klee-stats | 11 ++ 6 files changed, 188 insertions(+), 125 deletions(-) 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/lib/Core/CoreStats.cpp b/lib/Core/CoreStats.cpp index 06b8b93076..54a9a69720 100644 --- a/lib/Core/CoreStats.cpp +++ b/lib/Core/CoreStats.cpp @@ -9,6 +9,9 @@ #include "CoreStats.h" +#include "klee/Support/ErrorHandling.h" + + using namespace klee; Statistic stats::allocations("Allocations", "Alloc"); @@ -28,3 +31,21 @@ 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)); + } +} diff --git a/lib/Core/CoreStats.h b/lib/Core/CoreStats.h index c0dcac7d7e..1585035491 100644 --- a/lib/Core/CoreStats.h +++ b/lib/Core/CoreStats.h @@ -10,6 +10,7 @@ #ifndef KLEE_CORESTATS_H #define KLEE_CORESTATS_H +#include "klee/Core/BranchTypes.h" #include "klee/Statistics/Statistic.h" namespace klee { @@ -49,6 +50,13 @@ 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 + + /// Increase a branch statistic for the given reason by value. + void incBranchStat(BranchType reason, std::uint32_t value); } } diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp index c3a101448f..e3af734804 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -900,6 +900,7 @@ void Executor::branch(ExecutionState &state, 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); @@ -1180,6 +1181,7 @@ Executor::StatePair Executor::fork(ExecutionState ¤t, ref condition, } processTree->attach(current.ptreeNode, falseState, trueState, reason); + stats::incBranchStat(reason, 1); if (pathWriter) { // Need to update the pathOS.id field of falseState, otherwise the same id @@ -2196,7 +2198,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 @@ -2269,7 +2271,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) { diff --git a/lib/Core/StatsTracker.cpp b/lib/Core/StatsTracker.cpp index 51a0b73cc4..80723f8a7b 100644 --- a/lib/Core/StatsTracker.cpp +++ b/lib/Core/StatsTracker.cpp @@ -430,35 +430,38 @@ void StatsTracker::markBranchVisited(ExecutionState *visitedTrue, } void StatsTracker::writeStatsHeader() { + #undef BTYPE + #define BTYPE(Name,I) << "Branches" #Name " INTEGER," std::ostringstream create, insert; create << "CREATE TABLE stats (" - << "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," - << "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 + << "ArrayHashTime INTEGER" << ')'; char *zErrMsg = nullptr; if(sqlite3_exec(statsFile, create.str().c_str(), nullptr, nullptr, &zErrMsg)) { @@ -471,62 +474,69 @@ 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 "," insert << "INSERT OR FAIL INTO stats (" - << "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," - << "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 + << "ArrayHashTime" + << ')'; + #undef BTYPE + #define BTYPE(Name, I) << "?," + insert << " VALUES (" + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + << "?," + BRANCH_TYPES + << "? " << ')'; if(sqlite3_prepare_v2(statsFile, insert.str().c_str(), -1, &insertStmt, nullptr) != SQLITE_OK) { @@ -539,36 +549,40 @@ 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::solverQueries); - sqlite3_bind_int64(insertStmt, 10, stats::queryConstructs); - sqlite3_bind_int64(insertStmt, 11, elapsed().toMicroseconds()); - sqlite3_bind_int64(insertStmt, 12, stats::coveredInstructions); - sqlite3_bind_int64(insertStmt, 13, stats::uncoveredInstructions); - sqlite3_bind_int64(insertStmt, 14, stats::queryTime); - sqlite3_bind_int64(insertStmt, 15, stats::solverTime); - sqlite3_bind_int64(insertStmt, 16, stats::cexCacheTime); - sqlite3_bind_int64(insertStmt, 17, stats::forkTime); - sqlite3_bind_int64(insertStmt, 18, stats::resolveTime); - sqlite3_bind_int64(insertStmt, 19, stats::queryCacheMisses); - sqlite3_bind_int64(insertStmt, 10, stats::queryCacheHits); - sqlite3_bind_int64(insertStmt, 21, stats::queryCexCacheMisses); - sqlite3_bind_int64(insertStmt, 22, stats::queryCexCacheHits); - sqlite3_bind_int64(insertStmt, 23, stats::inhibitedForks); - sqlite3_bind_int64(insertStmt, 24, stats::externalCalls); - sqlite3_bind_int64(insertStmt, 25, stats::allocations); - sqlite3_bind_int64(insertStmt, 26, ExecutionState::getLastID()); + #undef BTYPE + #define BTYPE(Name,I) sqlite3_bind_int64(insertStmt, arg++, stats::branches ## 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 #ifdef KLEE_ARRAY_DEBUG - sqlite3_bind_int64(insertStmt, 27, stats::arrayHashTime); + sqlite3_bind_int64(insertStmt, arg++, stats::arrayHashTime); #else - sqlite3_bind_int64(insertStmt, 27, -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)); diff --git a/tools/klee-stats/klee-stats b/tools/klee-stats/klee-stats index 629095bc0a..20d75adb10 100755 --- a/tools/klee-stats/klee-stats +++ b/tools/klee-stats/klee-stats @@ -64,6 +64,17 @@ Legend = [ ('Mem(MiB)', 'mebibytes of memory currently used', "MallocUsage"), ('MaxMem(MiB)', 'maximum memory usage', "MaxMem"), ('AvgMem(MiB)', 'average memory usage', "AvgMem"), + # - branch types + ('BrConditional', 'number of forks caused by symbolic branch conditions (br)', "BranchesConditional"), + ('BrIndirect', 'number of forks caused by indirect branches (indirectbr) with symbolic address', "BranchesIndirect"), + ('BrSwitch', 'number of forks caused by switch with symbolic value', "BranchesSwitch"), + ('BrCall', 'number of forks caused by symbolic function pointers', "BranchesCall"), + ('BrMemOp', 'number of forks caused by memory operation with symbolic address', "BranchesMemOp"), + ('BrResolvePointer', 'number of forks caused by symbolic pointers', "BranchesResolvePointer"), + ('BrAlloc', 'number of forks caused by symbolic allocation size', "BranchesAlloc"), + ('BrRealloc', 'number of forks caused by symbolic reallocation size', "BranchesRealloc"), + ('BrFree', 'number of forks caused by freeing a symbolic pointer', "BranchesFree"), + ('BrGetVal', 'number of forks caused by user-invoked concretization while seeding', "BranchesGetVal"), # - debugging ('TArrayHash(s)', 'time spent hashing arrays (if KLEE_ARRAY_DEBUG enabled, otherwise -1)', "ArrayHashTime"), ('TFork(s)', 'time spent forking states', "ForkTime"), From a6f0612026cac27a1c997517420bfe5c9d254944 Mon Sep 17 00:00:00 2001 From: Frank Busse Date: Mon, 10 Jan 2022 15:19:46 +0000 Subject: [PATCH 113/320] tests: add Feature/KleeStatsBranches.c --- test/Feature/KleeStatsBranches.c | 84 ++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 test/Feature/KleeStatsBranches.c diff --git a/test/Feature/KleeStatsBranches.c b/test/Feature/KleeStatsBranches.c new file mode 100644 index 0000000000..a1bf2721f5 --- /dev/null +++ b/test/Feature/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 From 3a1965c62540ef3fa3ec857f2b7d055cbbb68939 Mon Sep 17 00:00:00 2001 From: Frank Busse Date: Tue, 11 Jan 2022 09:09:44 +0000 Subject: [PATCH 114/320] stats: add termination class stats --- include/klee/Core/TerminationTypes.h | 110 +++++++++++++-------- lib/Core/CoreStats.cpp | 8 +- lib/Core/CoreStats.h | 6 ++ lib/Core/Executor.cpp | 139 ++++++++++++++++++--------- lib/Core/Executor.h | 41 ++++++-- lib/Core/MergeHandler.cpp | 2 +- lib/Core/SpecialFunctionHandler.cpp | 26 +++-- lib/Core/StatsTracker.cpp | 13 +++ tools/klee-stats/klee-stats | 9 ++ 9 files changed, 243 insertions(+), 111 deletions(-) diff --git a/include/klee/Core/TerminationTypes.h b/include/klee/Core/TerminationTypes.h index 4fe5583a99..25e5ef4a5d 100644 --- a/include/klee/Core/TerminationTypes.h +++ b/include/klee/Core/TerminationTypes.h @@ -12,51 +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") \ - TTYPE(InvalidBuiltin, 19U, "invalid_builtin_use.err") \ - TTYPE(ImplicitTruncation, 20U, "implicit_truncation.err") \ - TTYPE(ImplicitConversion, 21U, "implicit_conversion.err") \ - TTYPE(UnreachableCall, 22U, "unreachable_call.err") \ - TTYPE(MissingReturn, 23U, "missing_return.err") \ - TTYPE(InvalidLoad, 24U, "invalid_load.err") \ - TTYPE(NullableAttribute, 25U, "nullable_attribute.err") \ - MARK(PROGERR, 25U) \ - TTYPE(User, 33U, "user.err") \ - MARK(USERERR, 33U) \ - TTYPE(Execution, 35U, "exec.err") \ - TTYPE(External, 36U, "external.err") \ - MARK(EXECERR, 36U) \ - TTYPE(Replay, 37U, "") \ - TTYPE(Merge, 38U, "") \ - TTYPE(SilentExit, 39U, "") \ - MARK(END, 39U) + 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/lib/Core/CoreStats.cpp b/lib/Core/CoreStats.cpp index 54a9a69720..48eb1e85b6 100644 --- a/lib/Core/CoreStats.cpp +++ b/lib/Core/CoreStats.cpp @@ -8,7 +8,6 @@ //===----------------------------------------------------------------------===// #include "CoreStats.h" - #include "klee/Support/ErrorHandling.h" @@ -49,3 +48,10 @@ void stats::incBranchStat(BranchType reason, std::uint32_t value) { 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 1585035491..609e976a6a 100644 --- a/lib/Core/CoreStats.h +++ b/lib/Core/CoreStats.h @@ -11,6 +11,7 @@ #define KLEE_CORESTATS_H #include "klee/Core/BranchTypes.h" +#include "klee/Core/TerminationTypes.h" #include "klee/Statistics/Statistic.h" namespace klee { @@ -55,6 +56,11 @@ namespace stats { #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/Executor.cpp b/lib/Core/Executor.cpp index e3af734804..a3f91f20c2 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -436,6 +436,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]")), @@ -953,7 +954,7 @@ void Executor::branch(ExecutionState &state, if (OnlyReplaySeeds) { for (unsigned i=0; i= 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; } @@ -3208,8 +3210,9 @@ void Executor::executeInstruction(ExecutionState &state, KInstruction *ki) { 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; } @@ -3658,17 +3661,18 @@ 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, @@ -3679,20 +3683,35 @@ void Executor::terminateStateOnExit(ExecutionState &state) { } 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); } -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, @@ -3793,15 +3812,36 @@ 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) { + ++stats::terminationUserError; + terminateStateOnError(state, message, StateTerminationType::User, ""); +} + // XXX shoot me static const char *okExternalsList[] = { "printf", "fprintf", @@ -3945,14 +3985,15 @@ void Executor::callExternalFunction(ExecutionState &state, bool success = externalDispatcher->executeCall(callable, target->inst, args); if (!success) { - terminateStateOnError(state, "failed external call: " + callable->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); + terminateStateOnExecError(state, "external modified read-only object", + StateTerminationType::External); return; } @@ -4135,8 +4176,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()); } } } @@ -4165,13 +4207,13 @@ 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); @@ -4215,14 +4257,15 @@ void Executor::resolveExact(ExecutionState &state, auto locinfo = unbound->heapAllocator.location_info(ptr, 1); if (locinfo == LocationInfo::LI_AllocatedOrQuarantined && locinfo.getBaseAddress() == ptr && name == "free") { - terminateStateOnError(*unbound, "memory error: double free", - StateTerminationType::Ptr, - getAddressInfo(*unbound, p)); + terminateStateOnProgramError(*unbound, "memory error: double free", + StateTerminationType::Ptr, + getAddressInfo(*unbound, p)); return; } } - terminateStateOnError(*unbound, "memory error: invalid pointer: " + name, - StateTerminationType::Ptr, getAddressInfo(*unbound, p)); + terminateStateOnProgramError( + *unbound, "memory error: invalid pointer: " + name, + StateTerminationType::Ptr, getAddressInfo(*unbound, p)); } } @@ -4280,8 +4323,8 @@ void Executor::executeMemoryOperation(ExecutionState &state, const ObjectState *os = op.second; if (isWrite) { if (os->readOnly) { - terminateStateOnError(state, "memory error: object read only", - StateTerminationType::ReadOnly); + terminateStateOnProgramError(state, "memory error: object read only", + StateTerminationType::ReadOnly); } else { ObjectState *wos = state.addressSpace.getWriteable(mo, os); wos->write(offset, value); @@ -4324,8 +4367,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); @@ -4350,9 +4393,9 @@ void Executor::executeMemoryOperation(ExecutionState &state, std::uintptr_t ptrval = CE->getZExtValue(); auto ptr = reinterpret_cast(ptrval); if (ptrval < MemoryManager::pageSize) { - terminateStateOnError(*unbound, "memory error: null page access", - StateTerminationType::Ptr, - getAddressInfo(*unbound, address)); + terminateStateOnProgramError( + *unbound, "memory error: null page access", + StateTerminationType::Ptr, getAddressInfo(*unbound, address)); return; } else if (MemoryManager::isDeterministic) { using kdalloc::LocationInfo; @@ -4364,17 +4407,17 @@ void Executor::executeMemoryOperation(ExecutionState &state, auto baseExpr = Expr::createPointer(base); ObjectPair op; if (!unbound->addressSpace.resolveOne(baseExpr, op)) { - terminateStateOnError(*unbound, "memory error: use after free", - StateTerminationType::Ptr, - getAddressInfo(*unbound, address)); + terminateStateOnProgramError( + *unbound, "memory error: use after free", + StateTerminationType::Ptr, getAddressInfo(*unbound, address)); return; } } } } - terminateStateOnError(*unbound, "memory error: out of bound pointer", - StateTerminationType::Ptr, - getAddressInfo(*unbound, address)); + terminateStateOnProgramError( + *unbound, "memory error: out of bound pointer", + StateTerminationType::Ptr, getAddressInfo(*unbound, address)); } } } diff --git a/lib/Core/Executor.h b/lib/Core/Executor.h index c821b987bb..28a7d56df9 100644 --- a/lib/Core/Executor.h +++ b/lib/Core/Executor.h @@ -410,7 +410,8 @@ class Executor : public Interpreter { const InstructionInfo & getLastNonKleeInternalInstruction(const ExecutionState &state, llvm::Instruction** lastInstruction); - /// Remove state from queue and delete state + /// Remove state from queue and delete state. This function should only be + /// used in the termination functions below. void terminateState(ExecutionState &state); /// Call exit handler and terminate state normally @@ -420,21 +421,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) diff --git a/lib/Core/MergeHandler.cpp b/lib/Core/MergeHandler.cpp index 0067754137..3034dd7457 100644 --- a/lib/Core/MergeHandler.cpp +++ b/lib/Core/MergeHandler.cpp @@ -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/SpecialFunctionHandler.cpp b/lib/Core/SpecialFunctionHandler.cpp index f4b09f367e..7996499cc8 100644 --- a/lib/Core/SpecialFunctionHandler.cpp +++ b/lib/Core/SpecialFunctionHandler.cpp @@ -286,8 +286,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, @@ -301,14 +301,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); } @@ -318,7 +318,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); } @@ -330,7 +330,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()); @@ -759,19 +759,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)); } } } diff --git a/lib/Core/StatsTracker.cpp b/lib/Core/StatsTracker.cpp index 80723f8a7b..9f92a12775 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" @@ -432,6 +433,8 @@ 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," @@ -461,6 +464,7 @@ void StatsTracker::writeStatsHeader() { << "Allocations INTEGER," << "States INTEGER," BRANCH_TYPES + TERMINATION_CLASSES << "ArrayHashTime INTEGER" << ')'; char *zErrMsg = nullptr; @@ -476,6 +480,8 @@ void StatsTracker::writeStatsHeader() { */ #undef BTYPE #define BTYPE(Name, I) << "Branches" #Name "," + #undef TCLASS + #define TCLASS(Name, I) << "Termination" #Name "," insert << "INSERT OR FAIL INTO stats (" << "Instructions," << "FullBranches," @@ -504,10 +510,13 @@ void StatsTracker::writeStatsHeader() { << "Allocations," << "States," BRANCH_TYPES + TERMINATION_CLASSES << "ArrayHashTime" << ')'; #undef BTYPE #define BTYPE(Name, I) << "?," + #undef TCLASS + #define TCLASS(Name, I) << "?," insert << " VALUES (" << "?," << "?," @@ -536,6 +545,7 @@ void StatsTracker::writeStatsHeader() { << "?," << "?," BRANCH_TYPES + TERMINATION_CLASSES << "? " << ')'; @@ -551,6 +561,8 @@ time::Span StatsTracker::elapsed() { void StatsTracker::writeStatsLine() { #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); @@ -579,6 +591,7 @@ void StatsTracker::writeStatsLine() { 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, arg++, stats::arrayHashTime); #else diff --git a/tools/klee-stats/klee-stats b/tools/klee-stats/klee-stats index 20d75adb10..f681a06f44 100755 --- a/tools/klee-stats/klee-stats +++ b/tools/klee-stats/klee-stats @@ -75,6 +75,15 @@ Legend = [ ('BrRealloc', 'number of forks caused by symbolic reallocation size', "BranchesRealloc"), ('BrFree', 'number of forks caused by freeing a symbolic pointer', "BranchesFree"), ('BrGetVal', 'number of forks caused by user-invoked concretization while seeding', "BranchesGetVal"), + # - termination classes + ('TermExit', 'number of states that reached end of execution path', "TerminationExit"), + ('TermEarly', 'number of early terminated states (e.g. due to memory pressure, state limt)', "TerminationEarly"), + ('TermSolverErr', 'number of states terminated due to solver errors', "TerminationSolverError"), + ('TermProgrErr', 'number of states terminated due to program errors (e.g. division by zero)', "TerminationProgramError"), + ('TermUserErr', 'number of states terminated due to user errors (e.g. misuse of KLEE API)', "TerminationUserError"), + ('TermExecErr', 'number of states terminated due to execution errors (e.g. unsupported intrinsics)', "TerminationExecutionError"), + ('TermEarlyAlgo', 'number of state terminations required by algorithm (e.g. state merging or replaying)', "TerminationEarlyAlgorithm"), + ('TermEarlyUser', 'number of states terminated via klee_silent_exit()', "TerminationEarlyUser"), # - debugging ('TArrayHash(s)', 'time spent hashing arrays (if KLEE_ARRAY_DEBUG enabled, otherwise -1)', "ArrayHashTime"), ('TFork(s)', 'time spent forking states', "ForkTime"), From 58d454647ff1465128423fa02896f84e5d3b989a Mon Sep 17 00:00:00 2001 From: Frank Busse Date: Tue, 11 Jan 2022 19:28:24 +0000 Subject: [PATCH 115/320] tests: add Feature/KleeStatsTermClasses.c --- test/Feature/KleeStatsTermClasses.c | 89 +++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 test/Feature/KleeStatsTermClasses.c diff --git a/test/Feature/KleeStatsTermClasses.c b/test/Feature/KleeStatsTermClasses.c new file mode 100644 index 0000000000..1606128c05 --- /dev/null +++ b/test/Feature/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 From 0ca2dc8176a08a0d4fcaa90807e770a5809d95cf Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Tue, 21 Mar 2023 20:32:09 +0000 Subject: [PATCH 116/320] Remove model_version from the POSIX runtime, as we have never used it. --- runtime/POSIX/fd.h | 1 - runtime/POSIX/fd_init.c | 9 ------- runtime/Runtest/intrinsics.c | 7 ------ .../libkleeruntest/replay_posix_runtime.c | 5 ++-- tools/klee-replay/file-creator.c | 2 +- tools/klee-replay/klee-replay.c | 25 +++++-------------- tools/ktest-gen/ktest-gen.cpp | 2 -- tools/ktest-randgen/ktest-randgen.cpp | 1 - 8 files changed, 9 insertions(+), 43 deletions(-) diff --git a/runtime/POSIX/fd.h b/runtime/POSIX/fd.h index 5fa428744c..87d967ee3a 100644 --- a/runtime/POSIX/fd.h +++ b/runtime/POSIX/fd.h @@ -93,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..a064e42b90 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 }; @@ -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 @@ -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/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/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/tools/klee-replay/file-creator.c b/tools/klee-replay/file-creator.c index a1685a02a4..5e848964c6 100644 --- a/tools/klee-replay/file-creator.c +++ b/tools/klee-replay/file-creator.c @@ -301,7 +301,7 @@ static int create_reg_file(const char *fname, exe_disk_file_t *dfile, fprintf(stderr, "KLEE-REPLAY: NOTE: Creating file %s of length %d\n", fname, flen); // Open in RDWR just in case we have to end up using this fd. - if (__exe_env.version == 0 && mode == 0) + if (mode == 0) mode = 0644; int fd = open(fname, O_CREAT | O_RDWR, mode); diff --git a/tools/klee-replay/klee-replay.c b/tools/klee-replay/klee-replay.c index 72eeb17ee6..82c638c25e 100644 --- a/tools/klee-replay/klee-replay.c +++ b/tools/klee-replay/klee-replay.c @@ -466,30 +466,17 @@ void klee_posix_prefer_cex(void *buffer, uintptr_t condition) { } void klee_make_symbolic(void *addr, size_t nbytes, const char *name) { - /* XXX remove model version code once new tests gen'd */ if (obj_index >= input->numObjects) { - if (strcmp("model_version", name) == 0) { - assert(nbytes == 4); - *((int*) addr) = 0; - } else { __emit_error("ran out of appropriate inputs"); - } } else { KTestObject *boo = &input->objects[obj_index]; - - if (strcmp("model_version", name) == 0 && - strcmp("model_version", boo->name) != 0) { - assert(nbytes == 4); - *((int*) addr) = 0; + if (boo->numBytes != nbytes) { + fprintf(stderr, "KLEE-REPLAY: ERROR: make_symbolic mismatch, different sizes: " + "%d in input file, %lu in code\n", boo->numBytes, (unsigned long)nbytes); + exit(1); } else { - if (boo->numBytes != nbytes) { - fprintf(stderr, "KLEE-REPLAY: ERROR: make_symbolic mismatch, different sizes: " - "%d in input file, %lu in code\n", boo->numBytes, (unsigned long)nbytes); - exit(1); - } else { - memcpy(addr, boo->bytes, nbytes); - obj_index++; - } + memcpy(addr, boo->bytes, nbytes); + obj_index++; } } } diff --git a/tools/ktest-gen/ktest-gen.cpp b/tools/ktest-gen/ktest-gen.cpp index 331ff7b1cd..d127c0e5e0 100644 --- a/tools/ktest-gen/ktest-gen.cpp +++ b/tools/ktest-gen/ktest-gen.cpp @@ -303,8 +303,6 @@ int main(int argc, char *argv[]) { b.numArgs = argv_copy_idx; b.args = argv_copy; - push_range(&b, "model_version", 1); - if (!kTest_toFile(&b, bout_file ? bout_file : "file.bout")) assert(0); diff --git a/tools/ktest-randgen/ktest-randgen.cpp b/tools/ktest-randgen/ktest-randgen.cpp index 9b7260eb36..6146d35d6d 100644 --- a/tools/ktest-randgen/ktest-randgen.cpp +++ b/tools/ktest-randgen/ktest-randgen.cpp @@ -281,7 +281,6 @@ int main(int argc, char *argv[]) { push_random_obj(&b, "stdout", 1024, 1024); push_obj(&b, "stdout-stat", sizeof(struct stat), (unsigned char *)&s); } - push_range(&b, "model_version", 1); if (!kTest_toFile(&b, bout_file ? bout_file : "random.bout")) { error_exit("Error in storing data into random.bout\n"); From 76f05738dd0aaedd174af4d12dd37dd42836f47f Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Wed, 22 Mar 2023 23:00:09 +0000 Subject: [PATCH 117/320] fix unused variable warning --- runtime/POSIX/fd.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/runtime/POSIX/fd.c b/runtime/POSIX/fd.c index 0aba0ade9c..be13a40bca 100644 --- a/runtime/POSIX/fd.c +++ b/runtime/POSIX/fd.c @@ -830,8 +830,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 @@ -841,9 +839,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); From c9ce3b462de2372828e65b27acddfe3971813b3c Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Thu, 23 Mar 2023 17:20:09 +0000 Subject: [PATCH 118/320] Transition to GitHub Container Registry hosting --- .github/workflows/build.yaml | 2 +- Dockerfile | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 05fb58c048..96122bcb48 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -10,7 +10,7 @@ on: # Defaults for building KLEE env: BASE_IMAGE: ubuntu:jammy-20230126 - REPOSITORY: klee + REPOSITORY: ghcr.io/klee COVERAGE: 0 DISABLE_ASSERTIONS: 0 ENABLE_DOXYGEN: 0 diff --git a/Dockerfile b/Dockerfile index a10ce3c8d0..d58fd2458a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,11 @@ -FROM klee/llvm:110_O_D_A_ubuntu_jammy-20230126 as llvm_base -FROM klee/gtest:1.11.0_ubuntu_jammy-20230126 as gtest_base -FROM klee/uclibc:klee_uclibc_v1.3_110_ubuntu_jammy-20230126 as uclibc_base -FROM klee/tcmalloc:2.9.1_ubuntu_jammy-20230126 as tcmalloc_base -FROM klee/stp:2.3.3_ubuntu_jammy-20230126 as stp_base -FROM klee/z3:4.8.15_ubuntu_jammy-20230126 as z3_base -FROM klee/libcxx:110_ubuntu_jammy-20230126 as libcxx_base -FROM klee/sqlite:3400100_ubuntu_jammy-20230126 as sqlite3_base +FROM ghcr.io/klee/llvm:110_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_110_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:110_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/ From 721b2fc39451ecfc4cb84ec32138011f160913f8 Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Thu, 23 Mar 2023 18:57:57 +0000 Subject: [PATCH 119/320] Fix detection and installation of Ubuntu-provided llvm/clang packages --- scripts/build/p-llvm-linux-ubuntu.inc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/build/p-llvm-linux-ubuntu.inc b/scripts/build/p-llvm-linux-ubuntu.inc index 1af095f985..440afbd4c3 100644 --- a/scripts/build/p-llvm-linux-ubuntu.inc +++ b/scripts/build/p-llvm-linux-ubuntu.inc @@ -56,7 +56,7 @@ install_binary_artifact_llvm() { # Check if package in standard repository otherwise use upstream with_sudo apt-get update -y - if ! apt-cache show "llvm${version}"; then + if ! apt-cache show "llvm-${version}"; then if [[ -z "$(which wget)" ]]; then # Add certificate with_sudo apt-get update -y @@ -82,10 +82,10 @@ install_binary_artifact_llvm() { 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 From 7c9ce86abd16624a6d6ee509b3dce86d191568ca Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Fri, 24 Mar 2023 04:45:44 +0000 Subject: [PATCH 120/320] fix unused variables warning --- tools/klee-replay/file-creator.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/klee-replay/file-creator.c b/tools/klee-replay/file-creator.c index 5e848964c6..02531ab696 100644 --- a/tools/klee-replay/file-creator.c +++ b/tools/klee-replay/file-creator.c @@ -172,6 +172,7 @@ static int create_char_dev(const char *fname, exe_disk_file_t *dfile, struct termios mode; int res = tcgetattr(aslave, &mode); + (void)res; assert(!res); mode.c_iflag = IGNBRK; #if defined(__APPLE__) || defined(__FreeBSD__) @@ -183,6 +184,7 @@ static int create_char_dev(const char *fname, exe_disk_file_t *dfile, mode.c_cc[VMIN] = 1; mode.c_cc[VTIME] = 0; res = tcsetattr(aslave, TCSANOW, &mode); + (void)res; assert(res == 0); } From 67ec44723e9ce232f067964e7e9fb26090be305d Mon Sep 17 00:00:00 2001 From: Frank Busse Date: Fri, 24 Mar 2023 14:27:17 +0000 Subject: [PATCH 121/320] tests: add some missing headers --- test/Coverage/ReplayOutDir.c | 2 ++ test/Feature/AddressOfLabelsSymbolic.c | 2 ++ test/Feature/ExprLogging.c | 2 ++ test/Feature/WithLibc.c | 5 +++++ test/Feature/arithmetic-right-overshift-sym-conc.c | 3 +++ test/Runtime/klee-libc/bcmp.c | 2 ++ test/regression/2016-06-28-div-zero-bug.c | 2 ++ 7 files changed, 18 insertions(+) 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/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/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/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/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/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/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; From 89ebbb9de69b4de83e97f068cd2cbcdb7b3d1fb9 Mon Sep 17 00:00:00 2001 From: Jiri Slaby Date: Wed, 22 Mar 2023 09:48:50 +0100 Subject: [PATCH 122/320] (gcc-13) include cstdint for *int*_t Otherwise we see errors like this with gcc13: include/klee/Statistics/Statistic.h:31:10: error: no type named 'uint32_t' in namespace 'std' --- include/klee/Core/Interpreter.h | 1 + include/klee/Statistics/Statistic.h | 1 + 2 files changed, 2 insertions(+) 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/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 { From dfd2aea9e73c00634f81c6388587713ad737d4b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Zaoral?= Date: Sat, 25 Mar 2023 18:33:46 +0100 Subject: [PATCH 123/320] Core/Executor: long double on i686 must be aligned to 4 bytes According to i686 System V ABI 2.1.1, long double must be aligned to 4 bytes. Thus, its size with padding is 12 bytes. Prior to this change only 10 bytes were used. This commit fixes the following out of bound pointer access. ``` $ clang -m32 -O0 -Xclang -disable-O0-optnone -g -emit-llvm -c test/Feature/VarArgAlignment.c -o varalign.bc $ klee varalign.bc KLEE: output directory is "/home/lukas/klee/klee-out-19" KLEE: Using Z3 solver backend KLEE: WARNING: undefined reference to function: printf KLEE: WARNING ONCE: calling external: printf(44120064, 1, 2, 3) at test/Feature/VarArgAlignment.c:23 17 i1, i2, i3: 1, 2, 3 l1: 4 i4: 5 ld1: 6.000000 KLEE: ERROR: test/Feature/VarArgAlignment.c:35: memory error: out of bound pointer KLEE: NOTE: now ignoring this error at this location KLEE: done: total instructions = 499 KLEE: done: completed paths = 1 KLEE: done: generated tests = 1 ``` --- lib/Core/Executor.cpp | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp index a3f91f20c2..cdf012a5c5 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -1960,17 +1960,16 @@ void Executor::executeCall(ExecutionState &state, KInstruction *ki, Function *f, 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 = cb.getParamAlign(k); - unsigned alignment = ma ? ma->value() : 0; + MaybeAlign ma = cb.getParamAlign(k); + unsigned alignment = ma ? ma->value() : 0; #else - unsigned alignment = cb.getParamAlignment(k); + unsigned alignment = cb.getParamAlignment(k); #endif + 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. @@ -1981,10 +1980,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. From 13cfabb17dfb5305cbc8ddc2a2ab94b527f3f30e Mon Sep 17 00:00:00 2001 From: Jan Macku Date: Sun, 11 Sep 2022 17:19:38 +0200 Subject: [PATCH 124/320] ci(lint): add shell linter - Differential ShellCheck It performs differential ShellCheck scans and report results directly in pull request. documentation: https://github.com/redhat-plumbers-in-action/differential-shellcheck Signed-off-by: Jan Macku --- .github/workflows/differential-shellcheck.yml | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .github/workflows/differential-shellcheck.yml diff --git a/.github/workflows/differential-shellcheck.yml b/.github/workflows/differential-shellcheck.yml new file mode 100644 index 0000000000..2dd92e9b5b --- /dev/null +++ b/.github/workflows/differential-shellcheck.yml @@ -0,0 +1,31 @@ +# 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@v3 + with: + fetch-depth: 0 + + - name: Differential ShellCheck + uses: redhat-plumbers-in-action/differential-shellcheck@v4 + with: + severity: warning + token: ${{ secrets.GITHUB_TOKEN }} From 66e1044824d07697e6745a516451d75a21808938 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20B=C3=BCning?= Date: Wed, 29 Mar 2023 18:50:43 +0200 Subject: [PATCH 125/320] fix CMake: -UNDEBUG --- CMakeLists.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 024d8a5003..e6daa815e6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -90,8 +90,9 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules") option(ENABLE_KLEE_ASSERTS "Enable KLEE assertions" ON) if (ENABLE_KLEE_ASSERTS) message(STATUS "KLEE assertions enabled") - # We have to add the undefine to the flags, otherwise "-D-UDNDEBUG" will be added - list(APPEND KLEE_COMPONENT_CXX_FLAGS "-UDNDEBUG") + # 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") From 2aa5b7b83da9d3036c5b90df7be0a1e6a49d058f Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Fri, 24 Mar 2023 04:43:46 +0000 Subject: [PATCH 126/320] Prevent fallthrough warning --- lib/Expr/Parser.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) 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(); } } From a46b8059ba5f8b5759813d142018478d4b72db71 Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Thu, 23 Mar 2023 16:49:08 +0000 Subject: [PATCH 127/320] remove include/klee/Support/IntEvaluation.h --- include/klee/Support/IntEvaluation.h | 164 --------------------------- lib/Core/ImpliedValue.cpp | 1 - lib/Expr/Expr.cpp | 3 - lib/Solver/FastCexSolver.cpp | 8 +- 4 files changed, 5 insertions(+), 171 deletions(-) delete mode 100644 include/klee/Support/IntEvaluation.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/lib/Core/ImpliedValue.cpp b/lib/Core/ImpliedValue.cpp index 6e5a52dc72..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 diff --git a/lib/Expr/Expr.cpp b/lib/Expr/Expr.cpp index d82cbee34a..2d3670d814 100644 --- a/lib/Expr/Expr.cpp +++ b/lib/Expr/Expr.cpp @@ -12,9 +12,6 @@ #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" diff --git a/lib/Solver/FastCexSolver.cpp b/lib/Solver/FastCexSolver.cpp index 382774ce60..34a44c3e39 100644 --- a/lib/Solver/FastCexSolver.cpp +++ b/lib/Solver/FastCexSolver.cpp @@ -17,8 +17,8 @@ #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 @@ -260,6 +260,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 +270,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 +290,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(); } } }; From 2769f1f4dc3515a8b5fc22ccf3e30b906faef75d Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Mon, 27 Mar 2023 15:01:29 +0100 Subject: [PATCH 128/320] Mark variable as potentially unused --- include/klee/KDAlloc/mapping.h | 2 +- lib/Core/Executor.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/klee/KDAlloc/mapping.h b/include/klee/KDAlloc/mapping.h index 4afc9d8662..f566a211bf 100644 --- a/include/klee/KDAlloc/mapping.h +++ b/include/klee/KDAlloc/mapping.h @@ -139,7 +139,7 @@ class Mapping { [[maybe_unused]] int rc = ::munmap(baseAddress, size); assert(rc == 0 && "munmap failed"); baseAddress = MAP_FAILED; - auto success = try_map(address); + [[maybe_unused]] auto success = try_map(address); assert(success && "could not recreate the mapping"); #endif } diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp index cdf012a5c5..b13afb6ae9 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -3923,7 +3923,7 @@ void Executor::callExternalFunction(ExecutionState &state, if (MemoryManager::isDeterministic) { auto const minflt = [] { struct rusage ru = {}; - int ret = getrusage(RUSAGE_SELF, &ru); + [[maybe_unused]] int ret = getrusage(RUSAGE_SELF, &ru); assert(!ret && "getrusage failed"); assert(ru.ru_minflt >= 0); return ru.ru_minflt; From 81ff90b3fc4f38abea2ab9472924dcdf0d1f10fe Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Mon, 27 Mar 2023 15:21:51 +0100 Subject: [PATCH 129/320] Support disabling compiler warnings; Use with external headers --- include/klee/Expr/Expr.h | 5 ++++ include/klee/Module/KCallable.h | 4 +++ include/klee/Solver/SolverCmdLine.h | 4 +++ include/klee/Support/CompilerWarning.h | 33 +++++++++++++++++++++++++ include/klee/Support/FileHandling.h | 5 ++++ include/klee/Support/ModuleUtil.h | 4 +++ include/klee/Support/OptionCategories.h | 4 +++ include/klee/Support/PrintVersion.h | 4 +++ include/klee/System/Time.h | 4 +++ lib/Core/CallPathManager.cpp | 4 +++ lib/Core/ExecutorUtil.cpp | 4 +++ lib/Core/ExternalDispatcher.cpp | 4 +++ lib/Core/GetElementPtrTypeIterator.h | 4 +++ lib/Core/Memory.cpp | 4 +++ lib/Core/MemoryManager.cpp | 4 +++ lib/Core/MergeHandler.h | 4 +++ lib/Core/Searcher.cpp | 4 +++ lib/Core/SpecialFunctionHandler.cpp | 4 +++ lib/Core/StatsTracker.cpp | 4 +++ lib/Module/Checks.cpp | 4 +++ lib/Module/InstructionInfoTable.cpp | 4 +++ lib/Module/IntrinsicCleaner.cpp | 6 ++++- lib/Module/KModule.cpp | 4 +++ lib/Module/LowerSwitch.cpp | 5 ++++ lib/Module/ModuleUtil.cpp | 5 +++- lib/Module/Optimize.cpp | 5 +++- lib/Module/Passes.h | 4 +++ lib/Module/RaiseAsm.cpp | 5 +++- lib/Support/ErrorHandling.cpp | 4 +++ tools/klee/main.cpp | 5 +++- 30 files changed, 153 insertions(+), 5 deletions(-) create mode 100644 include/klee/Support/CompilerWarning.h diff --git a/include/klee/Expr/Expr.h b/include/klee/Expr/Expr.h index ae2760a23d..15075eb89c 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 diff --git a/include/klee/Module/KCallable.h b/include/klee/Module/KCallable.h index 6fe8419dba..ade28cfc82 100644 --- a/include/klee/Module/KCallable.h +++ b/include/klee/Module/KCallable.h @@ -12,10 +12,14 @@ #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 diff --git a/include/klee/Solver/SolverCmdLine.h b/include/klee/Solver/SolverCmdLine.h index b453d058dc..90c162ee6b 100644 --- a/include/klee/Solver/SolverCmdLine.h +++ b/include/klee/Solver/SolverCmdLine.h @@ -16,9 +16,13 @@ #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 namespace klee { diff --git a/include/klee/Support/CompilerWarning.h b/include/klee/Support/CompilerWarning.h new file mode 100644 index 0000000000..ce192292bb --- /dev/null +++ b/include/klee/Support/CompilerWarning.h @@ -0,0 +1,33 @@ +//===-- 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 + +// 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) + +#define DISABLE_WARNING_DEPRECATED_DECLARATIONS \ + DISABLE_WARNING(-Wdeprecated-declarations) + +#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/ModuleUtil.h b/include/klee/Support/ModuleUtil.h index 328b9aeb6e..f1c4c4072e 100644 --- a/include/klee/Support/ModuleUtil.h +++ b/include/klee/Support/ModuleUtil.h @@ -12,8 +12,12 @@ #include "klee/Config/Version.h" +#include "klee/Support/CompilerWarning.h" +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS #include "llvm/IR/InstrTypes.h" #include "llvm/IR/Module.h" +DISABLE_WARNING_POP #include #include diff --git a/include/klee/Support/OptionCategories.h b/include/klee/Support/OptionCategories.h index 40f3deb8be..bde9a4eb50 100644 --- a/include/klee/Support/OptionCategories.h +++ b/include/klee/Support/OptionCategories.h @@ -14,7 +14,11 @@ #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; 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/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/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 d155798e0d..718b1c3175 100644 --- a/lib/Core/ExternalDispatcher.cpp +++ b/lib/Core/ExternalDispatcher.cpp @@ -14,6 +14,9 @@ #include "klee/Module/KCallable.h" #include "klee/Module/KModule.h" +#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" @@ -26,6 +29,7 @@ #include "llvm/Support/DynamicLibrary.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Support/TargetSelect.h" +DISABLE_WARNING_POP #include #include diff --git a/lib/Core/GetElementPtrTypeIterator.h b/lib/Core/GetElementPtrTypeIterator.h index 23bda1f0f5..c24ff74bc7 100644 --- a/lib/Core/GetElementPtrTypeIterator.h +++ b/lib/Core/GetElementPtrTypeIterator.h @@ -18,10 +18,14 @@ #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" diff --git a/lib/Core/Memory.cpp b/lib/Core/Memory.cpp index efc23612dd..1e3c892263 100644 --- a/lib/Core/Memory.cpp +++ b/lib/Core/Memory.cpp @@ -20,11 +20,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 diff --git a/lib/Core/MemoryManager.cpp b/lib/Core/MemoryManager.cpp index 0e47500a62..ffd08886a3 100644 --- a/lib/Core/MemoryManager.cpp +++ b/lib/Core/MemoryManager.cpp @@ -16,6 +16,9 @@ #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" @@ -24,6 +27,7 @@ #else #include "llvm/Support/MathExtras.h" #endif +DISABLE_WARNING_POP #include #include 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/Searcher.cpp b/lib/Core/Searcher.cpp index 047a1e4fd8..080c31aa56 100644 --- a/lib/Core/Searcher.cpp +++ b/lib/Core/Searcher.cpp @@ -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 diff --git a/lib/Core/SpecialFunctionHandler.cpp b/lib/Core/SpecialFunctionHandler.cpp index 7996499cc8..332e4b56ea 100644 --- a/lib/Core/SpecialFunctionHandler.cpp +++ b/lib/Core/SpecialFunctionHandler.cpp @@ -27,10 +27,14 @@ #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 diff --git a/lib/Core/StatsTracker.cpp b/lib/Core/StatsTracker.cpp index 9f92a12775..305c6da220 100644 --- a/lib/Core/StatsTracker.cpp +++ b/lib/Core/StatsTracker.cpp @@ -28,6 +28,9 @@ #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" #include "llvm/IR/CFG.h" @@ -41,6 +44,7 @@ #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" #include "llvm/Support/Process.h" +DISABLE_WARNING_POP #include #include 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/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/IntrinsicCleaner.cpp b/lib/Module/IntrinsicCleaner.cpp index 8658f611f1..ad7c0631a4 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" @@ -29,7 +33,7 @@ #include "llvm/Pass.h" #include "llvm/Transforms/Scalar.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h" - +DISABLE_WARNING_POP using namespace llvm; namespace klee { diff --git a/lib/Module/KModule.cpp b/lib/Module/KModule.cpp index 2e96c68a35..eed922f84e 100644 --- a/lib/Module/KModule.cpp +++ b/lib/Module/KModule.cpp @@ -22,6 +22,9 @@ #include "klee/Support/ErrorHandling.h" #include "klee/Support/ModuleUtil.h" +#include "klee/Support/CompilerWarning.h" +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS #include "llvm/Bitcode/BitcodeWriter.h" #include "llvm/IR/DataLayout.h" #include "llvm/IR/IRBuilder.h" @@ -40,6 +43,7 @@ #include "llvm/Transforms/Scalar/Scalarizer.h" #include "llvm/Transforms/Utils/Cloning.h" #include "llvm/Transforms/Utils.h" +DISABLE_WARNING_POP #include diff --git a/lib/Module/LowerSwitch.cpp b/lib/Module/LowerSwitch.cpp index b23278f702..84b04b246e 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; diff --git a/lib/Module/ModuleUtil.cpp b/lib/Module/ModuleUtil.cpp index 155b117fd7..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 diff --git a/lib/Module/Optimize.cpp b/lib/Module/Optimize.cpp index c982b73de4..35b9805a90 100644 --- a/lib/Module/Optimize.cpp +++ b/lib/Module/Optimize.cpp @@ -18,6 +18,9 @@ #include "klee/Config/Version.h" #include "klee/Support/OptionCategories.h" +#include "klee/Support/CompilerWarning.h" +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS #include "llvm/Analysis/GlobalsModRef.h" #include "llvm/Analysis/Passes.h" #include "llvm/Analysis/LoopPass.h" @@ -35,7 +38,7 @@ #include "llvm/Transforms/Scalar.h" #include "llvm/Transforms/Scalar/GVN.h" #include "llvm/Transforms/Utils.h" - +DISABLE_WARNING_POP using namespace llvm; diff --git a/lib/Module/Passes.h b/lib/Module/Passes.h index 3eb43ec3fd..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; diff --git a/lib/Module/RaiseAsm.cpp b/lib/Module/RaiseAsm.cpp index 457927f908..ec447bc4da 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" @@ -25,7 +28,7 @@ #include "llvm/Support/TargetRegistry.h" #endif #include "llvm/Target/TargetMachine.h" - +DISABLE_WARNING_POP using namespace llvm; using namespace klee; 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/tools/klee/main.cpp b/tools/klee/main.cpp index ddb1faec34..c35d956100 100644 --- a/tools/klee/main.cpp +++ b/tools/klee/main.cpp @@ -24,6 +24,9 @@ #include "klee/Support/PrintVersion.h" #include "klee/System/Time.h" +#include "klee/Support/CompilerWarning.h" +DISABLE_WARNING_PUSH +DISABLE_WARNING_DEPRECATED_DECLARATIONS #include "llvm/Bitcode/BitcodeReader.h" #include "llvm/IR/Constants.h" #include "llvm/IR/IRBuilder.h" @@ -43,7 +46,7 @@ #include "llvm/Support/TargetSelect.h" #include "llvm/Support/Signals.h" - +DISABLE_WARNING_POP #include #include From 0bef0499cd9bfe75fd248abecc0146128e8a67a6 Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Mon, 27 Mar 2023 15:22:41 +0100 Subject: [PATCH 130/320] Use newer C++ standard for KLEE's iterators; fixes deprecation warning --- lib/Core/GetElementPtrTypeIterator.h | 74 ++++++++++++++-------------- lib/Core/SpecialFunctionHandler.h | 18 ++++--- 2 files changed, 50 insertions(+), 42 deletions(-) diff --git a/lib/Core/GetElementPtrTypeIterator.h b/lib/Core/GetElementPtrTypeIterator.h index c24ff74bc7..d8b0e09791 100644 --- a/lib/Core/GetElementPtrTypeIterator.h +++ b/lib/Core/GetElementPtrTypeIterator.h @@ -31,51 +31,53 @@ DISABLE_WARNING_POP 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 { + llvm::Type *getIndexedType() const { #if LLVM_VERSION_CODE >= LLVM_VERSION(11, 0) 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. @@ -104,7 +106,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; diff --git a/lib/Core/SpecialFunctionHandler.h b/lib/Core/SpecialFunctionHandler.h index 9487fdf54c..230d392933 100644 --- a/lib/Core/SpecialFunctionHandler.h +++ b/lib/Core/SpecialFunctionHandler.h @@ -50,12 +50,18 @@ namespace klee { // const_iterator to iterate over stored HandlerInfo // FIXME: Implement >, >=, <=, < operators - class const_iterator : public std::iterator - { - private: - value_type* base; - int index; - public: + class const_iterator { + using iterator_category = std::random_access_iterator_tag; + using value_type = HandlerInfo; + using difference_type = ptrdiff_t; + using pointer = void; + using reference = void; + + 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 From 16010c104775d282525062843e9312b11a13a9aa Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Fri, 31 Mar 2023 07:46:59 +0100 Subject: [PATCH 131/320] Disable "disabling of warnings" for LLVM >= 14 --- include/klee/Support/CompilerWarning.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/include/klee/Support/CompilerWarning.h b/include/klee/Support/CompilerWarning.h index ce192292bb..167a775b1e 100644 --- a/include/klee/Support/CompilerWarning.h +++ b/include/klee/Support/CompilerWarning.h @@ -10,6 +10,8 @@ #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) @@ -18,8 +20,12 @@ #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) + DISABLE_WARNING("-Wdeprecated-declarations") +#endif #else From 896c652ed7d91d6ff954463c7c1e4bf95096481b Mon Sep 17 00:00:00 2001 From: ITWOI Date: Sat, 7 Sep 2019 16:52:52 +0800 Subject: [PATCH 132/320] Modify name of variables in generated cvc files. --- runtime/POSIX/fd_init.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runtime/POSIX/fd_init.c b/runtime/POSIX/fd_init.c index a064e42b90..adb1d9f653 100644 --- a/runtime/POSIX/fd_init.c +++ b/runtime/POSIX/fd_init.c @@ -49,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); @@ -106,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); From 02b52541c5e8262e7f7a909d90fb898399d822bd Mon Sep 17 00:00:00 2001 From: Jan Macku Date: Thu, 6 Apr 2023 14:04:14 +0200 Subject: [PATCH 133/320] ci: run ShellCheck on `*.inc` shell scripts --- .github/workflows/differential-shellcheck.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/differential-shellcheck.yml b/.github/workflows/differential-shellcheck.yml index 2dd92e9b5b..55bba98245 100644 --- a/.github/workflows/differential-shellcheck.yml +++ b/.github/workflows/differential-shellcheck.yml @@ -28,4 +28,5 @@ jobs: uses: redhat-plumbers-in-action/differential-shellcheck@v4 with: severity: warning + include-path: scripts/**.inc token: ${{ secrets.GITHUB_TOKEN }} From adfca64fdbcfd75d42b7a069d27ddbb0228e9eff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20B=C3=BCning?= Date: Sat, 1 Apr 2023 13:22:38 +0200 Subject: [PATCH 134/320] change some obsolete KDAlloc comments - mappings were only shared in a former version of KDAlloc - `AllocationFactory(std::size_t, std::uint32_t)`'s second parameter is used for quarantine size, not the location of the mapping --- include/klee/KDAlloc/allocator.h | 3 ++- unittests/KDAlloc/allocate.cpp | 3 +-- unittests/KDAlloc/rusage.cpp | 6 ++---- unittests/KDAlloc/sample.cpp | 3 +-- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/include/klee/KDAlloc/allocator.h b/include/klee/KDAlloc/allocator.h index f59223ed53..c4461b7936 100644 --- a/include/klee/KDAlloc/allocator.h +++ b/include/klee/KDAlloc/allocator.h @@ -29,7 +29,8 @@ #include namespace klee::kdalloc { -/// Wraps a mapping that is shared with other allocators. +/// 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 { diff --git a/unittests/KDAlloc/allocate.cpp b/unittests/KDAlloc/allocate.cpp index 895f82154d..c691e114ff 100644 --- a/unittests/KDAlloc/allocate.cpp +++ b/unittests/KDAlloc/allocate.cpp @@ -23,8 +23,7 @@ int allocate_sample_test() { #else int main() { #endif - // initialize a factory and an associated allocator (using the location "0" - // gives an OS-assigned location) + // initialize a factory and an associated allocator (1 MiB and no quarantine) klee::kdalloc::AllocatorFactory factory(static_cast(1) << 20, 0); klee::kdalloc::Allocator allocator = factory.makeAllocator(); diff --git a/unittests/KDAlloc/rusage.cpp b/unittests/KDAlloc/rusage.cpp index 453c5e5d74..2a893d7d1a 100644 --- a/unittests/KDAlloc/rusage.cpp +++ b/unittests/KDAlloc/rusage.cpp @@ -35,10 +35,8 @@ std::size_t write_to_allocations(std::vector &allocations) { } TEST(KDAllocTest, Rusage) { - // initialize a factory and an associated allocator (using the location "0" - // gives an OS-assigned location) - klee::kdalloc::AllocatorFactory factory(static_cast(1) << 30, - 0); // 1 GB + // initialize a factory and an associated allocator (1 GiB and no quarantine) + klee::kdalloc::AllocatorFactory factory(static_cast(1) << 30, 0); klee::kdalloc::Allocator allocator = factory.makeAllocator(); std::vector allocations; diff --git a/unittests/KDAlloc/sample.cpp b/unittests/KDAlloc/sample.cpp index d4bed00b93..365e7e2146 100644 --- a/unittests/KDAlloc/sample.cpp +++ b/unittests/KDAlloc/sample.cpp @@ -20,8 +20,7 @@ int sample_test() { #else int main() { #endif - // initialize a factory and an associated allocator (using the location "0" - // gives an OS-assigned location) + // initialize a factory and an associated allocator (1 TiB and no quarantine) klee::kdalloc::AllocatorFactory factory(static_cast(1) << 40, 0); klee::kdalloc::Allocator allocator = factory.makeAllocator(); From 46ea4a471f105ac24537706f021459de5b740319 Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Thu, 23 Mar 2023 21:42:46 +0000 Subject: [PATCH 135/320] use `std::mt19937` instead of the custom implementation --- include/klee/ADT/RNG.h | 22 ++------- lib/Support/RNG.cpp | 110 ++++++----------------------------------- 2 files changed, 18 insertions(+), 114 deletions(-) diff --git a/include/klee/ADT/RNG.h b/include/klee/ADT/RNG.h index 1c8eed1501..fc08e3b800 100644 --- a/include/klee/ADT/RNG.h +++ b/include/klee/ADT/RNG.h @@ -10,26 +10,12 @@ #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(); diff --git a/lib/Support/RNG.cpp b/lib/Support/RNG.cpp index a6841c5c1b..2cdcedf5fa 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,68 +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) { } -/* 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; + static_assert((min)() == 0); + static_assert((max)() == -1u); + return (*this)(); } /* generates a random number on [0,0x7fffffff]-interval */ From 270ced85122f8f70e1847488bd333bd808721473 Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Thu, 23 Mar 2023 21:45:00 +0000 Subject: [PATCH 136/320] remove unused rng adaptor functions --- include/klee/ADT/RNG.h | 7 ------- lib/Support/RNG.cpp | 24 ------------------------ unittests/RNG/RNGTest.cpp | 5 ----- 3 files changed, 36 deletions(-) diff --git a/include/klee/ADT/RNG.h b/include/klee/ADT/RNG.h index fc08e3b800..1e7a1682bf 100644 --- a/include/klee/ADT/RNG.h +++ b/include/klee/ADT/RNG.h @@ -19,17 +19,10 @@ namespace klee { /* 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/lib/Support/RNG.cpp b/lib/Support/RNG.cpp index 2cdcedf5fa..1523e123fa 100644 --- a/lib/Support/RNG.cpp +++ b/lib/Support/RNG.cpp @@ -30,17 +30,6 @@ unsigned int RNG::getInt32() { return (*this)(); } -/* 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 */ -} - /* generates a random number on [0,1)-real-interval */ double RNG::getDoubleL() { return getInt32()*(1.0/4294967296.0); @@ -53,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/unittests/RNG/RNGTest.cpp b/unittests/RNG/RNGTest.cpp index 218a15a751..4dee36d120 100644 --- a/unittests/RNG/RNGTest.cpp +++ b/unittests/RNG/RNGTest.cpp @@ -10,14 +10,9 @@ TEST(RNG, InitialSeedEquality) { RNG seed(5489U); ASSERT_EQ(noseed.getBool(), seed.getBool()); - ASSERT_EQ(noseed.getInt31(), seed.getInt31()); ASSERT_EQ(noseed.getInt32(), seed.getInt32()); ASSERT_EQ(noseed.getDouble(), seed.getDouble()); ASSERT_EQ(noseed.getDoubleL(), seed.getDoubleL()); - ASSERT_EQ(noseed.getDoubleLR(), seed.getDoubleLR()); - ASSERT_EQ(noseed.getFloat(), seed.getFloat()); - ASSERT_EQ(noseed.getFloatL(), seed.getFloatL()); - ASSERT_EQ(noseed.getFloatLR(), seed.getFloatLR()); } From ccf40f5aea243b15b6c0d48777760d1686e200e2 Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Thu, 20 Apr 2023 20:23:08 +0100 Subject: [PATCH 137/320] ensure that the right mt19937 constructor is chosen during overload resolution --- lib/Support/RNG.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Support/RNG.cpp b/lib/Support/RNG.cpp index 1523e123fa..c4268890e1 100644 --- a/lib/Support/RNG.cpp +++ b/lib/Support/RNG.cpp @@ -19,7 +19,7 @@ llvm::cl::opt RNGInitialSeed( llvm::cl::cat(klee::MiscCat)); } -RNG::RNG() : std::mt19937(RNGInitialSeed) { } +RNG::RNG() : std::mt19937(RNGInitialSeed.getValue()) { } RNG::RNG(RNG::result_type seed) : std::mt19937(seed) {} From f463da0084bc7516c74effe79c161318179dcc13 Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Thu, 20 Apr 2023 20:49:10 +0100 Subject: [PATCH 138/320] Remove additional quotation marks --- include/klee/Support/CompilerWarning.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/klee/Support/CompilerWarning.h b/include/klee/Support/CompilerWarning.h index 167a775b1e..41029decd7 100644 --- a/include/klee/Support/CompilerWarning.h +++ b/include/klee/Support/CompilerWarning.h @@ -24,7 +24,7 @@ #define DISABLE_WARNING_DEPRECATED_DECLARATIONS #else #define DISABLE_WARNING_DEPRECATED_DECLARATIONS \ - DISABLE_WARNING("-Wdeprecated-declarations") + DISABLE_WARNING(-Wdeprecated-declarations) #endif #else From 4ccb3fe8df5babec7480b433b38da265de73a8eb Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Fri, 24 Mar 2023 00:49:50 +0000 Subject: [PATCH 139/320] use unique_ptr in STPSolverImpl --- lib/Solver/STPSolver.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/Solver/STPSolver.cpp b/lib/Solver/STPSolver.cpp index 6e62b82bed..140ca6f4d7 100644 --- a/lib/Solver/STPSolver.cpp +++ b/lib/Solver/STPSolver.cpp @@ -25,6 +25,7 @@ #include #include +#include #include #include #include @@ -85,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; @@ -187,7 +188,7 @@ STPSolverImpl::~STPSolverImpl() { shared_memory_ptr = nullptr; shared_memory_id = 0; - delete builder; + builder.reset(); vc_Destroy(vc); } @@ -402,13 +403,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; } From ad61b674eef24d63f4514b3798f0d215c3080579 Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Fri, 24 Mar 2023 00:54:38 +0000 Subject: [PATCH 140/320] use unique_ptr in ValidatingSolver --- lib/Solver/ValidatingSolver.cpp | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/lib/Solver/ValidatingSolver.cpp b/lib/Solver/ValidatingSolver.cpp index d95b89428f..72bdc830cb 100644 --- a/lib/Solver/ValidatingSolver.cpp +++ b/lib/Solver/ValidatingSolver.cpp @@ -11,24 +11,22 @@ #include "klee/Solver/Solver.h" #include "klee/Solver/SolverImpl.h" +#include #include namespace klee { class ValidatingSolver : public SolverImpl { private: - Solver *solver, *oracle; - bool ownsOracle; + std::unique_ptr solver; + std::unique_ptr oracle; public: ValidatingSolver(Solver *solver, Solver *oracle, bool ownsOracle = false) - : solver(solver), oracle(oracle), ownsOracle(ownsOracle) {} - ~ValidatingSolver() { - delete solver; - if (ownsOracle) { - delete oracle; - } - } + : solver(solver), + oracle( + oracle, ownsOracle ? [](Solver *solver) { delete solver; } + : [](Solver *) {}) {} bool computeValidity(const Query &, Solver::Validity &result); bool computeTruth(const Query &, bool &isValid); From 9953e9901ff9cf68e26745c2aa6ef10de610c66d Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Fri, 24 Mar 2023 00:56:01 +0000 Subject: [PATCH 141/320] use unique_ptr in Z3SolverImpl --- lib/Solver/Z3Solver.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/Solver/Z3Solver.cpp b/lib/Solver/Z3Solver.cpp index 8319e5f35e..f3e8f92be3 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; @@ -135,7 +137,6 @@ Z3SolverImpl::Z3SolverImpl() Z3SolverImpl::~Z3SolverImpl() { Z3_params_dec_ref(builder->ctx, solverParameters); - delete builder; } Z3Solver::Z3Solver() : Solver(new Z3SolverImpl()) {} From 3a8fe1c957b74d087471db3e2fab6cf27acf26d4 Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Fri, 24 Mar 2023 00:59:02 +0000 Subject: [PATCH 142/320] use unique_ptr in StagedSolverImpl --- include/klee/Solver/IncompleteSolver.h | 7 ++++--- lib/Solver/IncompleteSolver.cpp | 5 ----- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/include/klee/Solver/IncompleteSolver.h b/include/klee/Solver/IncompleteSolver.h index 3841c38bcc..b8ef19298c 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 @@ -87,12 +89,11 @@ 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); diff --git a/lib/Solver/IncompleteSolver.cpp b/lib/Solver/IncompleteSolver.cpp index 9b57bc6caf..a9035eda88 100644 --- a/lib/Solver/IncompleteSolver.cpp +++ b/lib/Solver/IncompleteSolver.cpp @@ -64,11 +64,6 @@ StagedSolverImpl::StagedSolverImpl(IncompleteSolver *_primary, secondary(_secondary) { } -StagedSolverImpl::~StagedSolverImpl() { - delete primary; - delete secondary; -} - bool StagedSolverImpl::computeTruth(const Query& query, bool &isValid) { IncompleteSolver::PartialValidity trueResult = primary->computeTruth(query); From b0f645687c36237a58a571b5b416717a871f2bf2 Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Fri, 24 Mar 2023 01:11:58 +0000 Subject: [PATCH 143/320] use unique_ptr in CachingSolver --- lib/Solver/CachingSolver.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Solver/CachingSolver.cpp b/lib/Solver/CachingSolver.cpp index 4a4c8e280f..5d85062dfd 100644 --- a/lib/Solver/CachingSolver.cpp +++ b/lib/Solver/CachingSolver.cpp @@ -16,6 +16,7 @@ #include "klee/Solver/SolverImpl.h" #include "klee/Solver/SolverStats.h" +#include #include using namespace klee; @@ -62,12 +63,11 @@ 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; } bool computeValidity(const Query&, Solver::Validity &result); bool computeTruth(const Query&, bool &isValid); From ae0fd16356a7e421e10ffc4e8701583f012b4516 Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Fri, 24 Mar 2023 01:13:27 +0000 Subject: [PATCH 144/320] use unique_ptr in AssignmentValidatingSolver --- lib/Solver/AssignmentValidatingSolver.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Solver/AssignmentValidatingSolver.cpp b/lib/Solver/AssignmentValidatingSolver.cpp index 54d6ec8ccb..f18f43a895 100644 --- a/lib/Solver/AssignmentValidatingSolver.cpp +++ b/lib/Solver/AssignmentValidatingSolver.cpp @@ -12,18 +12,18 @@ #include "klee/Solver/Solver.h" #include "klee/Solver/SolverImpl.h" +#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; } bool computeValidity(const Query &, Solver::Validity &result); bool computeTruth(const Query &, bool &isValid); From 421319a2cca7e57e5479113dadf13ea6115d37fd Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Fri, 24 Mar 2023 12:59:31 +0000 Subject: [PATCH 145/320] use unique_ptr in CexCachingSolver --- lib/Solver/CexCachingSolver.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/Solver/CexCachingSolver.cpp b/lib/Solver/CexCachingSolver.cpp index 45ec554016..28996a6a2b 100644 --- a/lib/Solver/CexCachingSolver.cpp +++ b/lib/Solver/CexCachingSolver.cpp @@ -23,6 +23,8 @@ #include "llvm/Support/CommandLine.h" +#include + using namespace klee; using namespace llvm; @@ -66,7 +68,7 @@ struct AssignmentLessThan { class CexCachingSolver : public SolverImpl { typedef std::set assignmentsTable_ty; - Solver *solver; + std::unique_ptr solver; MapOfSets, Assignment*> cache; // memo table @@ -265,7 +267,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; From dab8f985dbf0310a7338e15e85f9268649540293 Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Fri, 24 Mar 2023 15:01:00 +0000 Subject: [PATCH 146/320] use unique_ptr in IndependentSolver --- lib/Solver/IndependentSolver.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/Solver/IndependentSolver.cpp b/lib/Solver/IndependentSolver.cpp index 812aefb6c7..007bfdcb07 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,12 +390,10 @@ 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; } + IndependentSolver(Solver *_solver) : solver(_solver) {} bool computeTruth(const Query&, bool &isValid); bool computeValidity(const Query&, Solver::Validity &result); From 4d59fe9aef258c35212e5b7b9f6eb2e17b88d293 Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Fri, 24 Mar 2023 02:40:47 +0000 Subject: [PATCH 147/320] use unique_ptr in QueryLoggingSolver --- lib/Solver/QueryLoggingSolver.cpp | 4 ---- lib/Solver/QueryLoggingSolver.h | 6 +++--- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/lib/Solver/QueryLoggingSolver.cpp b/lib/Solver/QueryLoggingSolver.cpp index 4c3d9b3045..c057751c6e 100644 --- a/lib/Solver/QueryLoggingSolver.cpp +++ b/lib/Solver/QueryLoggingSolver.cpp @@ -53,10 +53,6 @@ QueryLoggingSolver::QueryLoggingSolver(Solver *_solver, std::string path, assert(0 != solver); } -QueryLoggingSolver::~QueryLoggingSolver() { - delete solver; -} - void QueryLoggingSolver::flushBufferConditionally(bool writeToFile) { logBuffer.flush(); if (writeToFile) { diff --git a/lib/Solver/QueryLoggingSolver.h b/lib/Solver/QueryLoggingSolver.h index 65494498e7..76bba42943 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; @@ -59,8 +61,6 @@ class QueryLoggingSolver : public SolverImpl { QueryLoggingSolver(Solver *_solver, std::string path, const std::string &commentSign, time::Span queryTimeToLog, bool logTimedOut); - virtual ~QueryLoggingSolver(); - /// implementation of the SolverImpl interface bool computeTruth(const Query &query, bool &isValid); bool computeValidity(const Query &query, Solver::Validity &result); From e9d77be6c688836d68a2be5f3f0a02e63f392bb8 Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Fri, 24 Mar 2023 02:50:22 +0000 Subject: [PATCH 148/320] use unique_ptr in Solver --- include/klee/Solver/Solver.h | 12 +++--------- lib/Solver/Solver.cpp | 5 ++--- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/include/klee/Solver/Solver.h b/include/klee/Solver/Solver.h index a2256028e2..2689d19c91 100644 --- a/include/klee/Solver/Solver.h +++ b/include/klee/Solver/Solver.h @@ -14,6 +14,7 @@ #include "klee/System/Time.h" #include "klee/Solver/SolverCmdLine.h" +#include #include namespace klee { @@ -58,10 +59,6 @@ namespace klee { }; class Solver { - // DO NOT IMPLEMENT. - Solver(const Solver&); - void operator=(const Solver&); - public: enum Validity { True = 1, @@ -69,15 +66,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(SolverImpl *impl); virtual ~Solver(); /// evaluate - Determine for a particular state if the query diff --git a/lib/Solver/Solver.cpp b/lib/Solver/Solver.cpp index 5fe973fe38..e123a667d9 100644 --- a/lib/Solver/Solver.cpp +++ b/lib/Solver/Solver.cpp @@ -22,9 +22,8 @@ const char *Solver::validity_to_str(Validity v) { } } -Solver::~Solver() { - delete impl; -} +Solver::Solver(SolverImpl *impl) : impl(impl) {} +Solver::~Solver() = default; char *Solver::getConstraintLog(const Query& query) { return impl->getConstraintLog(query); From ac0fa15ab0679fe1b5067b07647b0701ae3bc347 Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Fri, 24 Mar 2023 15:05:43 +0000 Subject: [PATCH 149/320] use unique_ptr all throughout the solver chain --- include/klee/Solver/Common.h | 13 +++--- include/klee/Solver/IncompleteSolver.h | 7 ++-- include/klee/Solver/Solver.h | 38 +++++++++--------- include/klee/Solver/SolverImpl.h | 10 ++--- lib/Core/Executor.cpp | 19 +++++---- lib/Core/Executor.h | 2 +- lib/Core/TimingSolver.h | 5 ++- lib/Solver/AssignmentValidatingSolver.cpp | 10 +++-- lib/Solver/CachingSolver.cpp | 9 +++-- lib/Solver/CexCachingSolver.cpp | 10 +++-- lib/Solver/ConstructSolverChain.cpp | 48 ++++++++++++++--------- lib/Solver/CoreSolver.cpp | 7 ++-- lib/Solver/DummySolver.cpp | 6 ++- lib/Solver/FastCexSolver.cpp | 7 ++-- lib/Solver/IncompleteSolver.cpp | 10 ++--- lib/Solver/IndependentSolver.cpp | 9 +++-- lib/Solver/KQueryLoggingSolver.cpp | 21 ++++++---- lib/Solver/MetaSMTSolver.cpp | 34 ++++++++-------- lib/Solver/MetaSMTSolver.h | 4 +- lib/Solver/QueryLoggingSolver.cpp | 13 +++--- lib/Solver/QueryLoggingSolver.h | 5 ++- lib/Solver/SMTLIBLoggingSolver.cpp | 35 +++++++++-------- lib/Solver/STPSolver.cpp | 2 +- lib/Solver/Solver.cpp | 4 +- lib/Solver/ValidatingSolver.cpp | 13 ++++-- lib/Solver/Z3Solver.cpp | 2 +- tools/kleaver/main.cpp | 19 ++++----- unittests/Solver/SolverTest.cpp | 10 ++--- unittests/Solver/Z3SolverTest.cpp | 8 ++-- 29 files changed, 213 insertions(+), 167 deletions(-) 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 b8ef19298c..8bcf7f8848 100644 --- a/include/klee/Solver/IncompleteSolver.h +++ b/include/klee/Solver/IncompleteSolver.h @@ -91,10 +91,11 @@ class StagedSolverImpl : public SolverImpl { private: std::unique_ptr primary; std::unique_ptr secondary; - + public: - StagedSolverImpl(IncompleteSolver *_primary, Solver *_secondary); - + StagedSolverImpl(std::unique_ptr primary, + std::unique_ptr secondary); + bool computeTruth(const Query&, bool &isValid); bool computeValidity(const Query&, Solver::Validity &result); bool computeValue(const Query&, ref &result); diff --git a/include/klee/Solver/Solver.h b/include/klee/Solver/Solver.h index 2689d19c91..c50b17d8de 100644 --- a/include/klee/Solver/Solver.h +++ b/include/klee/Solver/Solver.h @@ -71,7 +71,7 @@ namespace klee { std::unique_ptr impl; - Solver(SolverImpl *impl); + Solver(std::unique_ptr impl); virtual ~Solver(); /// evaluate - Determine for a particular state if the query @@ -215,19 +215,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, bool ownsOracle = false); + 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 @@ -235,41 +238,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/SolverImpl.h b/include/klee/Solver/SolverImpl.h index f03db9648c..b73370b9fd 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, diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp index b13afb6ae9..0b28d60870 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -481,19 +481,19 @@ 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); + this->solver = std::make_unique(std::move(solver), EqualitySubstitution); memory = new MemoryManager(&arrayCache); initializeSearchOptions(); @@ -593,7 +593,6 @@ Executor::~Executor() { delete externalDispatcher; delete specialFunctionHandler; delete statsTracker; - delete solver; } /***/ @@ -1236,7 +1235,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; } } @@ -3895,7 +3894,7 @@ void Executor::callExternalFunction(ExecutionState &state, // 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); + op.second->flushToConcreteStore(solver.get(), state); } wordIndex += (ce->getWidth()+63)/64; } else { @@ -4234,7 +4233,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(); @@ -4294,7 +4293,7 @@ void Executor::executeMemoryOperation(ExecutionState &state, ObjectPair op; bool success; solver->setTimeout(coreSolverTimeout); - if (!state.addressSpace.resolveOne(state, solver, address, op, success)) { + if (!state.addressSpace.resolveOne(state, solver.get(), address, op, success)) { address = toConstant(state, address, "resolveOne failure"); success = state.addressSpace.resolveOne(cast(address), op); } @@ -4351,7 +4350,7 @@ void Executor::executeMemoryOperation(ExecutionState &state, address = optimizer.optimizeExpr(address, true); ResolutionList rl; solver->setTimeout(coreSolverTimeout); - bool incomplete = state.addressSpace.resolve(state, solver, address, rl, + bool incomplete = state.addressSpace.resolve(state, solver.get(), address, rl, 0, coreSolverTimeout); solver->setTimeout(time::Span()); diff --git a/lib/Core/Executor.h b/lib/Core/Executor.h index 28a7d56df9..40111af992 100644 --- a/lib/Core/Executor.h +++ b/lib/Core/Executor.h @@ -110,7 +110,7 @@ class Executor : public Interpreter { Searcher *searcher; ExternalDispatcher *externalDispatcher; - TimingSolver *solver; + std::unique_ptr solver; MemoryManager *memory; std::set states; StatsTracker *statsTracker; diff --git a/lib/Core/TimingSolver.h b/lib/Core/TimingSolver.h index 1f179e542e..0b88be3c9d 100644 --- a/lib/Core/TimingSolver.h +++ b/lib/Core/TimingSolver.h @@ -16,6 +16,7 @@ #include "klee/System/Time.h" #include +#include #include namespace klee { @@ -35,8 +36,8 @@ 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); } diff --git a/lib/Solver/AssignmentValidatingSolver.cpp b/lib/Solver/AssignmentValidatingSolver.cpp index f18f43a895..d90cf6b206 100644 --- a/lib/Solver/AssignmentValidatingSolver.cpp +++ b/lib/Solver/AssignmentValidatingSolver.cpp @@ -13,6 +13,7 @@ #include "klee/Solver/SolverImpl.h" #include +#include #include namespace klee { @@ -23,7 +24,8 @@ class AssignmentValidatingSolver : public SolverImpl { void dumpAssignmentQuery(const Query &query, const Assignment &assignment); public: - AssignmentValidatingSolver(Solver *_solver) : solver(_solver) {} + AssignmentValidatingSolver(std::unique_ptr solver) + : solver(std::move(solver)) {} bool computeValidity(const Query &, Solver::Validity &result); bool computeTruth(const Query &, bool &isValid); @@ -148,7 +150,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/CachingSolver.cpp b/lib/Solver/CachingSolver.cpp index 5d85062dfd..751e81c10c 100644 --- a/lib/Solver/CachingSolver.cpp +++ b/lib/Solver/CachingSolver.cpp @@ -18,6 +18,7 @@ #include #include +#include using namespace klee; @@ -67,7 +68,7 @@ class CachingSolver : public SolverImpl { cache_map cache; public: - CachingSolver(Solver *s) : solver(s) {} + CachingSolver(std::unique_ptr solver) : solver(std::move(solver)) {} bool computeValidity(const Query&, Solver::Validity &result); bool computeTruth(const Query&, bool &isValid); @@ -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 28996a6a2b..dbbd351660 100644 --- a/lib/Solver/CexCachingSolver.cpp +++ b/lib/Solver/CexCachingSolver.cpp @@ -24,6 +24,7 @@ #include "llvm/Support/CommandLine.h" #include +#include using namespace klee; using namespace llvm; @@ -87,7 +88,8 @@ 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); @@ -384,6 +386,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/ConstructSolverChain.cpp b/lib/Solver/ConstructSolverChain.cpp index 999edda44a..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(solver, oracleSolver, true); + 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 a845f9017c..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 { @@ -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 34a44c3e39..81fd6707ac 100644 --- a/lib/Solver/FastCexSolver.cpp +++ b/lib/Solver/FastCexSolver.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include using namespace klee; @@ -1141,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 a9035eda88..7aef05c9c4 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,11 +60,9 @@ IncompleteSolver::computeValidity(const Query& query) { /***/ -StagedSolverImpl::StagedSolverImpl(IncompleteSolver *_primary, - Solver *_secondary) - : primary(_primary), - secondary(_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); diff --git a/lib/Solver/IndependentSolver.cpp b/lib/Solver/IndependentSolver.cpp index 007bfdcb07..c05fa6bbd3 100644 --- a/lib/Solver/IndependentSolver.cpp +++ b/lib/Solver/IndependentSolver.cpp @@ -393,7 +393,8 @@ class IndependentSolver : public SolverImpl { std::unique_ptr solver; public: - IndependentSolver(Solver *_solver) : solver(_solver) {} + IndependentSolver(std::unique_ptr solver) + : solver(std::move(solver)) {} bool computeTruth(const Query&, bool &isValid); bool computeValidity(const Query&, Solver::Validity &result); @@ -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/MetaSMTSolver.cpp b/lib/Solver/MetaSMTSolver.cpp index 37c22f0e1e..c3c6dfaa9f 100644 --- a/lib/Solver/MetaSMTSolver.cpp +++ b/lib/Solver/MetaSMTSolver.cpp @@ -51,6 +51,8 @@ #undef type_t #endif +#include + #include #include #include @@ -85,7 +87,6 @@ template class MetaSMTSolverImpl : public SolverImpl { public: MetaSMTSolverImpl(MetaSMTSolver *solver, bool useForked, bool optimizeDivides); - virtual ~MetaSMTSolverImpl(); char *getConstraintLog(const Query &); void setCoreSolverTimeout(time::Span timeout) { _timeout = timeout; } @@ -133,9 +134,6 @@ MetaSMTSolverImpl::MetaSMTSolverImpl( } } -template -MetaSMTSolverImpl::~MetaSMTSolverImpl() {} - template char *MetaSMTSolverImpl::getConstraintLog(const Query &) { const char *msg = "Not supported"; @@ -404,8 +402,8 @@ 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() {} @@ -420,45 +418,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 +471,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..64c56c5720 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 { @@ -26,7 +28,7 @@ template class MetaSMTSolver : public Solver { /// 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 c057751c6e..911fa0674f 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,7 +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); + assert(this->solver); } void QueryLoggingSolver::flushBufferConditionally(bool writeToFile) { diff --git a/lib/Solver/QueryLoggingSolver.h b/lib/Solver/QueryLoggingSolver.h index 76bba42943..8149342ff4 100644 --- a/lib/Solver/QueryLoggingSolver.h +++ b/lib/Solver/QueryLoggingSolver.h @@ -58,8 +58,9 @@ class QueryLoggingSolver : public SolverImpl { void flushBufferConditionally(bool writeToFile); public: - QueryLoggingSolver(Solver *_solver, std::string path, const std::string &commentSign, - time::Span queryTimeToLog, bool logTimedOut); + 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); 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/STPSolver.cpp b/lib/Solver/STPSolver.cpp index 140ca6f4d7..8858e83eb2 100644 --- a/lib/Solver/STPSolver.cpp +++ b/lib/Solver/STPSolver.cpp @@ -430,7 +430,7 @@ 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) { return impl->getConstraintLog(query); diff --git a/lib/Solver/Solver.cpp b/lib/Solver/Solver.cpp index e123a667d9..bb6ed10527 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,7 +24,7 @@ const char *Solver::validity_to_str(Validity v) { } } -Solver::Solver(SolverImpl *impl) : impl(impl) {} +Solver::Solver(std::unique_ptr impl) : impl(std::move(impl)) {} Solver::~Solver() = default; char *Solver::getConstraintLog(const Query& query) { diff --git a/lib/Solver/ValidatingSolver.cpp b/lib/Solver/ValidatingSolver.cpp index 72bdc830cb..8e9886d14e 100644 --- a/lib/Solver/ValidatingSolver.cpp +++ b/lib/Solver/ValidatingSolver.cpp @@ -12,6 +12,7 @@ #include "klee/Solver/SolverImpl.h" #include +#include #include namespace klee { @@ -22,8 +23,9 @@ class ValidatingSolver : public SolverImpl { std::unique_ptr oracle; public: - ValidatingSolver(Solver *solver, Solver *oracle, bool ownsOracle = false) - : solver(solver), + ValidatingSolver(std::unique_ptr solver, Solver *oracle, + bool ownsOracle) + : solver(std::move(solver)), oracle( oracle, ownsOracle ? [](Solver *solver) { delete solver; } : [](Solver *) {}) {} @@ -140,7 +142,10 @@ void ValidatingSolver::setCoreSolverTimeout(time::Span timeout) { solver->impl->setCoreSolverTimeout(timeout); } -Solver *createValidatingSolver(Solver *s, Solver *oracle, bool ownsOracle) { - return new Solver(new ValidatingSolver(s, oracle, ownsOracle)); +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/Z3Solver.cpp b/lib/Solver/Z3Solver.cpp index f3e8f92be3..180b32f6d3 100644 --- a/lib/Solver/Z3Solver.cpp +++ b/lib/Solver/Z3Solver.cpp @@ -139,7 +139,7 @@ Z3SolverImpl::~Z3SolverImpl() { Z3_params_dec_ref(builder->ctx, solverParameters); } -Z3Solver::Z3Solver() : Solver(new Z3SolverImpl()) {} +Z3Solver::Z3Solver() : Solver(std::make_unique()) {} char *Z3Solver::getConstraintLog(const Query &query) { return impl->getConstraintLog(query); diff --git a/tools/kleaver/main.cpp b/tools/kleaver/main.cpp index eed4e4c9dd..51298dfb22 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,8 +293,6 @@ static bool EvaluateInputAST(const char *Filename, delete *it; delete P; - delete S; - if (uint64_t queries = *theStatisticManager->getStatisticByName("SolverQueries")) { llvm::outs() << "--\n" diff --git a/unittests/Solver/SolverTest.cpp b/unittests/Solver/SolverTest.cpp index d5d207a054..2137602f9e 100644 --- a/unittests/Solver/SolverTest.cpp +++ b/unittests/Solver/SolverTest.cpp @@ -131,11 +131,11 @@ void testOpcode(Solver &solver, bool tryBool = true, bool tryZero = true, } TEST(SolverTest, Evaluation) { - Solver *solver = klee::createCoreSolver(CoreSolverToUse); + auto solver = klee::createCoreSolver(CoreSolverToUse); - solver = createCexCachingSolver(solver); - solver = createCachingSolver(solver); - solver = createIndependentSolver(solver); + solver = createCexCachingSolver(std::move(solver)); + solver = createCachingSolver(std::move(solver)); + solver = createIndependentSolver(std::move(solver)); testOpcode(*solver); testOpcode(*solver); @@ -165,8 +165,6 @@ TEST(SolverTest, Evaluation) { testOpcode(*solver); testOpcode(*solver); testOpcode(*solver); - - delete solver; } } diff --git a/unittests/Solver/Z3SolverTest.cpp b/unittests/Solver/Z3SolverTest.cpp index eab43d79af..e81ff19e94 100644 --- a/unittests/Solver/Z3SolverTest.cpp +++ b/unittests/Solver/Z3SolverTest.cpp @@ -19,6 +19,8 @@ #include "klee/Expr/Expr.h" #include "klee/Solver/Solver.h" +#include + using namespace klee; namespace { @@ -26,13 +28,11 @@ ArrayCache AC; } class Z3SolverTest : public ::testing::Test { protected: + std::unique_ptr Z3Solver_; + Z3SolverTest() : Z3Solver_(createCoreSolver(CoreSolverType::Z3_SOLVER)) { Z3Solver_->setCoreSolverTimeout(time::Span("10s")); } - - virtual ~Z3SolverTest() { delete Z3Solver_; } - - Solver *Z3Solver_; }; TEST_F(Z3SolverTest, GetConstraintLog) { From 8795286d8277ffaecec405d8fa6e714cddafbeed Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Wed, 19 Apr 2023 19:16:06 +0100 Subject: [PATCH 150/320] Replaced "-data" and "-stat" by "_data" and "_stat" in the ktest-(rand)gen tools for consistency with recent changes. --- tools/ktest-gen/ktest-gen.cpp | 8 ++++---- tools/ktest-randgen/ktest-randgen.cpp | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/ktest-gen/ktest-gen.cpp b/tools/ktest-gen/ktest-gen.cpp index d127c0e5e0..93e428a965 100644 --- a/tools/ktest-gen/ktest-gen.cpp +++ b/tools/ktest-gen/ktest-gen.cpp @@ -139,8 +139,8 @@ int main(int argc, char *argv[]) { } if (file_counter > 0) { - char filename[7] = "A-data"; - char statname[12] = "A-data-stat"; + char filename[7] = "A_data"; + char statname[12] = "A_data_stat"; char sym_file_name = 'A'; FILE *fp[file_counter]; unsigned char *file_content[file_counter]; @@ -222,7 +222,7 @@ int main(int argc, char *argv[]) { FILE *fp; struct stat64 file_stat; char filename[6] = "stdin"; - char statname[11] = "stdin-stat"; + char statname[11] = "stdin_stat"; #if defined(__has_feature) #if __has_feature(memory_sanitizer) memset(&file_stat, 0, sizeof(struct stat64)); @@ -265,7 +265,7 @@ int main(int argc, char *argv[]) { struct stat64 file_stat; unsigned char file_content[1024]; char filename[7] = "stdout"; - char statname[12] = "stdout-stat"; + char statname[12] = "stdout_stat"; #if defined(__has_feature) #if __has_feature(memory_sanitizer) diff --git a/tools/ktest-randgen/ktest-randgen.cpp b/tools/ktest-randgen/ktest-randgen.cpp index 6146d35d6d..4bf3e23ca6 100644 --- a/tools/ktest-randgen/ktest-randgen.cpp +++ b/tools/ktest-randgen/ktest-randgen.cpp @@ -242,8 +242,8 @@ int main(int argc, char *argv[]) { } for (i = 0; i < total_files; ++i) { - char filename[] = "A-data"; - char file_stat[] = "A-data-stat"; + char filename[] = "A_data"; + char file_stat[] = "A_data_stat"; unsigned nbytes; struct stat s; From edfa29e836087cb61f33afcac40640be5f36341a Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Wed, 19 Apr 2023 19:20:55 +0100 Subject: [PATCH 151/320] Tests: replaced "-data" and "-stat" by "_data" and "_stat" for consistency with recent changes. --- .../2016-04-12-array-parsing-bug.kquery | 56 +++++++++---------- test/Solver/FastCexSolver.kquery | 4 +- ...lver-missing-objects-for-assignment.kquery | 12 ++-- 3 files changed, 36 insertions(+), 36 deletions(-) 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/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/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 From 8500a8190fe61dd9240d91baf849cba0cc859b82 Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Fri, 21 Apr 2023 22:31:10 +0100 Subject: [PATCH 152/320] Cleaned up and updated codecov file. --- .codecov.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) 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 From 7667c5c71748f319f2b8b2e7fb0cbc884bde04d4 Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Tue, 16 May 2023 15:23:11 +0100 Subject: [PATCH 153/320] Use unique_ptr for MemoryManager and avoid re-creating it in the first place No need to re-create and re-alloc all the memory again after execution. --- lib/Core/Executor.cpp | 9 ++++----- lib/Core/Executor.h | 2 +- lib/Core/MemoryManager.h | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp index 0b28d60870..5194aff26e 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -494,7 +494,7 @@ Executor::Executor(LLVMContext &ctx, const InterpreterOptions &opts, interpreterHandler->getOutputFilename(SOLVER_QUERIES_KQUERY_FILE_NAME)); this->solver = std::make_unique(std::move(solver), EqualitySubstitution); - memory = new MemoryManager(&arrayCache); + memory = std::make_unique(&arrayCache); initializeSearchOptions(); @@ -589,7 +589,6 @@ Executor::setModule(std::vector> &modules, } Executor::~Executor() { - delete memory; delete externalDispatcher; delete specialFunctionHandler; delete statsTracker; @@ -4548,7 +4547,8 @@ void Executor::runFunctionAsMain(Function *f, } } - ExecutionState *state = new ExecutionState(kmodule->functionMap[f], memory); + ExecutionState *state = + new ExecutionState(kmodule->functionMap[f], memory.get()); if (pathWriter) state->pathOS = pathWriter->open(); @@ -4597,8 +4597,7 @@ void Executor::runFunctionAsMain(Function *f, processTree = nullptr; // hack to clear memory objects - delete memory; - memory = new MemoryManager(NULL); + memory = nullptr; globalObjects.clear(); globalAddresses.clear(); diff --git a/lib/Core/Executor.h b/lib/Core/Executor.h index 40111af992..204638e857 100644 --- a/lib/Core/Executor.h +++ b/lib/Core/Executor.h @@ -111,7 +111,7 @@ class Executor : public Interpreter { ExternalDispatcher *externalDispatcher; std::unique_ptr solver; - MemoryManager *memory; + std::unique_ptr memory; std::set states; StatsTracker *statsTracker; TreeStreamWriter *pathWriter, *symPathWriter; diff --git a/lib/Core/MemoryManager.h b/lib/Core/MemoryManager.h index 71a7018329..c8ef8016c0 100644 --- a/lib/Core/MemoryManager.h +++ b/lib/Core/MemoryManager.h @@ -38,7 +38,7 @@ class MemoryManager { kdalloc::Allocator constantsAllocator; public: - MemoryManager(ArrayCache *arrayCache); + explicit MemoryManager(ArrayCache *arrayCache); ~MemoryManager(); kdalloc::AllocatorFactory heapFactory; From 43be111d7e0b8cd356633248e0f7d2ec3425cf9d Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Fri, 19 May 2023 21:33:07 +0000 Subject: [PATCH 154/320] Write `Control::meta` in C++17 style --- include/klee/KDAlloc/allocator.h | 51 +++++++++++++------------------- 1 file changed, 20 insertions(+), 31 deletions(-) diff --git a/include/klee/KDAlloc/allocator.h b/include/klee/KDAlloc/allocator.h index c4461b7936..d848e94cb6 100644 --- a/include/klee/KDAlloc/allocator.h +++ b/include/klee/KDAlloc/allocator.h @@ -40,30 +40,25 @@ class Allocator final : public TaggedLogger { static constexpr const std::uint32_t unlimitedQuarantine = static_cast(-1); - /// @todo This should really be a data member `static constexpr const - /// std::array meta = { ... }`. - static inline const std::array &getMeta() noexcept { - static 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 - }; - return meta; - } + 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 < getMeta().size(); ++i) { - if (getMeta()[i] >= size) { + for (std::size_t i = 0; i < meta.size(); ++i) { + if (meta[i] >= size) { return i; } } - return getMeta().size(); + return meta.size(); } public: @@ -71,9 +66,7 @@ class Allocator final : public TaggedLogger { private: Mapping mapping; - std::array>::value> - sizedBins; + std::array sizedBins; suballocators::LargeObjectAllocator::Control largeObjectBin; public: @@ -93,9 +86,7 @@ class Allocator final : public TaggedLogger { private: klee::ref control; - std::array>::value> - sizedBins; + std::array sizedBins; suballocators::LargeObjectAllocator largeObjectBin; public: @@ -113,8 +104,6 @@ class Allocator final : public TaggedLogger { explicit operator bool() const noexcept { return !control.isNull(); } - auto const &getSizedBinInfo() const noexcept { return Control::getMeta(); } - [[nodiscard]] void *allocate(std::size_t size) { assert(*this && "Invalid allocator"); @@ -155,7 +144,7 @@ class Allocator final : public TaggedLogger { // 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::getMeta().size(); ++i) { + 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 <= @@ -205,7 +194,7 @@ class AllocatorFactory { AllocatorFactory(Mapping &&mapping, std::uint32_t const quarantineSize) { assert(mapping && "Invalid mapping"); assert(mapping.getSize() > - Allocator::Control::getMeta().size() * 4096 + 3 * 4096 && + Allocator::Control::meta.size() * 4096 + 3 * 4096 && "Mapping is *far* to small"); control = new Allocator::Control(std::move(mapping)); @@ -213,12 +202,12 @@ class AllocatorFactory { static_cast(1) << (std::numeric_limits::digits - 1 - countLeadingZeroes(control->mapping.getSize() / - (Allocator::Control::getMeta().size() + 1))); + (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::getMeta().size(); ++i) { + for (std::size_t i = 0; i < Allocator::Control::meta.size(); ++i) { control->sizedBins[i].initialize( - base + totalSize, binSize, Allocator::Control::getMeta()[i], + base + totalSize, binSize, Allocator::Control::meta[i], quarantineSize == unlimitedQuarantine, quarantineSize == unlimitedQuarantine ? 0 : quarantineSize); From 5e63e1cd6863c1707cd0534d0d6c500ef32e601d Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Fri, 19 May 2023 22:22:48 +0000 Subject: [PATCH 155/320] prevent assertions from failing unnecessarily --- include/klee/KDAlloc/allocator.h | 53 ++++++++++++------------ include/klee/KDAlloc/mapping.h | 12 ++---- include/klee/KDAlloc/suballocators/loh.h | 4 +- 3 files changed, 34 insertions(+), 35 deletions(-) diff --git a/include/klee/KDAlloc/allocator.h b/include/klee/KDAlloc/allocator.h index d848e94cb6..d7b1e0e2cf 100644 --- a/include/klee/KDAlloc/allocator.h +++ b/include/klee/KDAlloc/allocator.h @@ -192,35 +192,36 @@ class AllocatorFactory { : AllocatorFactory(Mapping{address, size}, quarantineSize) {} AllocatorFactory(Mapping &&mapping, std::uint32_t const quarantineSize) { - assert(mapping && "Invalid mapping"); - assert(mapping.getSize() > - Allocator::Control::meta.size() * 4096 + 3 * 4096 && - "Mapping is *far* to 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], + 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); - - 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(); } diff --git a/include/klee/KDAlloc/mapping.h b/include/klee/KDAlloc/mapping.h index f566a211bf..c66e2f4b37 100644 --- a/include/klee/KDAlloc/mapping.h +++ b/include/klee/KDAlloc/mapping.h @@ -54,6 +54,10 @@ class Mapping { 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); @@ -61,10 +65,6 @@ class Mapping { this->baseAddress = MAP_FAILED; return false; } - if (mappedAddress == MAP_FAILED) { - this->baseAddress = MAP_FAILED; - return false; - } this->baseAddress = mappedAddress; #if defined(__linux__) @@ -98,10 +98,6 @@ class Mapping { Mapping(std::uintptr_t baseAddress, std::size_t size) noexcept : size(size) { try_map(baseAddress); - assert(*this && "failed to allocate mapping"); - if (!*this) { - std::abort(); - } } Mapping(Mapping const &) = delete; diff --git a/include/klee/KDAlloc/suballocators/loh.h b/include/klee/KDAlloc/suballocators/loh.h index 6238618280..4b99942b4e 100644 --- a/include/klee/KDAlloc/suballocators/loh.h +++ b/include/klee/KDAlloc/suballocators/loh.h @@ -193,7 +193,9 @@ class LargeObjectAllocator final : public TaggedLogger { LargeObjectAllocator(LargeObjectAllocator &&rhs) noexcept : data(std::exchange(rhs.data, nullptr)) { - assert(data->referenceCount > 0); + if (data) { + assert(data->referenceCount > 0); + } } LargeObjectAllocator &operator=(LargeObjectAllocator &&rhs) noexcept { From edda465c2e752eed164c2e2119a1b4ac00efbfd9 Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Fri, 19 May 2023 22:25:03 +0000 Subject: [PATCH 156/320] Add `getSize` primitive to kdalloc --- include/klee/KDAlloc/allocator.h | 26 +++++++++++++++++ include/klee/KDAlloc/suballocators/loh.h | 10 +++++++ .../KDAlloc/suballocators/sized_regions.h | 28 +++++++++++++++++++ 3 files changed, 64 insertions(+) diff --git a/include/klee/KDAlloc/allocator.h b/include/klee/KDAlloc/allocator.h index d7b1e0e2cf..2d8a07acae 100644 --- a/include/klee/KDAlloc/allocator.h +++ b/include/klee/KDAlloc/allocator.h @@ -61,6 +61,19 @@ class Allocator final : public TaggedLogger { 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; @@ -134,6 +147,19 @@ class Allocator final : public TaggedLogger { } } + 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 location_info(void const *const ptr, std::size_t const size) const noexcept { assert(*this && "Invalid allocator"); diff --git a/include/klee/KDAlloc/suballocators/loh.h b/include/klee/KDAlloc/suballocators/loh.h index 4b99942b4e..d52306fc34 100644 --- a/include/klee/KDAlloc/suballocators/loh.h +++ b/include/klee/KDAlloc/suballocators/loh.h @@ -212,6 +212,16 @@ class LargeObjectAllocator final : public TaggedLogger { 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 && diff --git a/include/klee/KDAlloc/suballocators/sized_regions.h b/include/klee/KDAlloc/suballocators/sized_regions.h index 7adeea45ed..7236a61973 100644 --- a/include/klee/KDAlloc/suballocators/sized_regions.h +++ b/include/klee/KDAlloc/suballocators/sized_regions.h @@ -159,6 +159,34 @@ class SizedRegions { [[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; + 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; + } else { + assert(!closestPredecessor || currentNode->getBaseAddress() > + closestPredecessor->getBaseAddress()); + closestPredecessor = currentNode; + currentNode = &*currentNode->rhs; + } + } + + 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 From d46bbdd19b807cff0b59dfbc0b26ebc0d27456f5 Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Fri, 19 May 2023 22:27:25 +0000 Subject: [PATCH 157/320] Add `getMapping` primitive to allocator directly --- include/klee/KDAlloc/allocator.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/include/klee/KDAlloc/allocator.h b/include/klee/KDAlloc/allocator.h index 2d8a07acae..45d90536f4 100644 --- a/include/klee/KDAlloc/allocator.h +++ b/include/klee/KDAlloc/allocator.h @@ -117,6 +117,16 @@ class Allocator final : public TaggedLogger { 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"); From 2833e66c38a951c6663bf8644c0942f339b622c4 Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Fri, 19 May 2023 22:31:53 +0000 Subject: [PATCH 158/320] Improve error message when KDAlloc fails to create a mapping --- lib/Core/MemoryManager.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/Core/MemoryManager.cpp b/lib/Core/MemoryManager.cpp index ffd08886a3..55dd20f28d 100644 --- a/lib/Core/MemoryManager.cpp +++ b/lib/Core/MemoryManager.cpp @@ -243,9 +243,10 @@ MemoryManager::MemoryManager(ArrayCache *_arrayCache) start, size, DeterministicAllocationQuarantineSize); if (!factory.get()) { - klee_error( - "Deterministic allocator: Could not allocate mapping for %s: %s", - segment.c_str(), strerror(errno)); + 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)) { From 8600ab9be42443487145b6476e0d6be49d055bd2 Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Fri, 19 May 2023 22:56:55 +0000 Subject: [PATCH 159/320] Improve LOH deallocation scheme --- include/klee/KDAlloc/allocator.h | 2 +- include/klee/KDAlloc/suballocators/loh.h | 58 +++---- .../KDAlloc/suballocators/sized_regions.h | 159 ++++-------------- 3 files changed, 60 insertions(+), 159 deletions(-) diff --git a/include/klee/KDAlloc/allocator.h b/include/klee/KDAlloc/allocator.h index 45d90536f4..1e0d305acb 100644 --- a/include/klee/KDAlloc/allocator.h +++ b/include/klee/KDAlloc/allocator.h @@ -153,7 +153,7 @@ class Allocator final : public TaggedLogger { if (bin < static_cast(sizedBins.size())) { return sizedBins[bin].deallocate(control->sizedBins[bin], ptr); } else { - return largeObjectBin.deallocate(control->largeObjectBin, ptr, size); + return largeObjectBin.deallocate(control->largeObjectBin, ptr); } } diff --git a/include/klee/KDAlloc/suballocators/loh.h b/include/klee/KDAlloc/suballocators/loh.h index d52306fc34..16baf911ed 100644 --- a/include/klee/KDAlloc/suballocators/loh.h +++ b/include/klee/KDAlloc/suballocators/loh.h @@ -43,17 +43,17 @@ class LargeObjectAllocator final : public TaggedLogger { /// over sizes SizedRegions regions; - static_assert( - sizeof(void *) >= sizeof(std::size_t), - "The quarantine elements are alternating `void*` and `std::size_t`"); - static_assert( - alignof(void *) >= alignof(std::size_t), - "The quarantine elements are alternating `void*` and `std::size_t`"); + 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, size1, ptr2, size2, ...] + /// Structure: [pos, ptr1, ptr2, ...] QuarantineElement quarantine[]; Data() = default; @@ -90,7 +90,7 @@ class LargeObjectAllocator final : public TaggedLogger { this->quarantineSize = 0; this->unlimitedQuarantine = true; } else { - this->quarantineSize = quarantineSize == 0 ? 0 : quarantineSize * 2 + 1; + this->quarantineSize = quarantineSize == 0 ? 0 : quarantineSize + 1; this->unlimitedQuarantine = false; } @@ -140,32 +140,27 @@ class LargeObjectAllocator final : public TaggedLogger { assert(data->referenceCount == 1); } - std::pair - quarantine(Control const &control, void *const ptr, std::size_t const size) { + 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, size}; + 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 + 2 == control.quarantineSize) { + if (pos + 1 == control.quarantineSize) { reinterpret_cast(data->quarantine[0]) = 1; } else { - reinterpret_cast(data->quarantine[0]) = pos + 2; + reinterpret_cast(data->quarantine[0]) = pos + 1; } - auto quarantinedPtr = std::exchange( - reinterpret_cast(data->quarantine[pos]), std::move(ptr)); - auto quarantinedSize = std::exchange( - reinterpret_cast(data->quarantine[pos + 1]), - std::move(size)); - return {quarantinedPtr, quarantinedSize}; + return std::exchange(reinterpret_cast(data->quarantine[pos]), + std::move(ptr)); } public: @@ -293,39 +288,30 @@ class LargeObjectAllocator final : public TaggedLogger { return result; } - void deallocate(Control const &control, void *ptr, std::size_t size) { + 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 { - auto quantizedSize = roundUpToMultipleOf4096(size); - traceLine("Quarantining ", ptr, " with size ", size, " (", quantizedSize, - ") for ", (control.quarantineSize - 1) / 2, " deallocations"); - assert(size > 0); - assert(quantizedSize % 4096 == 0); + traceLine("Quarantining ", ptr, " for ", control.quarantineSize - 1, + " deallocations"); acquireData(control); // we will need quarantine and/or region ownership - std::tie(ptr, size) = quarantine(control, ptr, size); + ptr = quarantine(control, ptr); if (!ptr) { return; } - quantizedSize = roundUpToMultipleOf4096(size); - traceLine("Deallocating ", ptr, " with size ", size, " (", quantizedSize, - ")"); + traceLine("Deallocating ", ptr); assert(data->referenceCount == 1); - assert(size > 0); - assert(quantizedSize % 4096 == 0); - size = quantizedSize; traceContents(control); - traceLine("Merging region at ", - static_cast(static_cast(ptr) + size), - " with the preceding region"); + traceLine("Merging regions around ", + static_cast(static_cast(ptr))); - data->regions.mergeRegionWithPrevious(static_cast(ptr) + size); + data->regions.mergeAroundAddress(static_cast(ptr)); } } diff --git a/include/klee/KDAlloc/suballocators/sized_regions.h b/include/klee/KDAlloc/suballocators/sized_regions.h index 7236a61973..2fb12bf54d 100644 --- a/include/klee/KDAlloc/suballocators/sized_regions.h +++ b/include/klee/KDAlloc/suballocators/sized_regions.h @@ -412,136 +412,51 @@ class SizedRegions { } } -private: - static CoWPtr mergeRegionWithPreviousRec(CoWPtr &treap, - char *const baseAddress) { - assert(treap && "cannot extract region that is not part of the treap"); - if (baseAddress < treap->getBaseAddress()) { - auto &node = treap.acquire(); - if (auto greater = mergeRegionWithPreviousRec(node.lhs, baseAddress)) { - if (node.getBaseAddress() < greater->getBaseAddress()) { - auto newSize = static_cast(greater->getBaseAddress() - - node.getBaseAddress() + - greater->getSize()); - assert( - newSize > node.getSize() && - "Sizes only get greater by adding `greater - smaller` to them"); - node.setSize(newSize); - return {}; + /// 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 { - return greater; + break; } } else { - 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.getOwned(); - node.lhs = std::move(nodeTemp.rhs); - nodeTemp.rhs = std::move(treap); - treap = std::move(temp); - } - return {}; - } - } else if (treap->getBaseAddress() < baseAddress) { - auto &node = treap.acquire(); - if (auto greater = mergeRegionWithPreviousRec(node.rhs, baseAddress)) { - if (node.getBaseAddress() < greater->getBaseAddress()) { - auto newSize = static_cast(greater->getBaseAddress() - - node.getBaseAddress() + - greater->getSize()); - assert( - newSize > node.getSize() && - "Sizes only get greater by adding `greater - smaller` to them"); - node.setSize(newSize); - return {}; + assert(!closestPredecessor || + (*currentNode)->getBaseAddress() > + (*closestPredecessor)->getBaseAddress()); + closestPredecessor = currentNode; + if ((*currentNode)->rhs) { + currentNode = ¤tNode->acquire().rhs; } else { - return greater; - } - } else { - 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.getOwned(); - node.rhs = std::move(nodeTemp.lhs); - nodeTemp.lhs = std::move(treap); - treap = std::move(temp); + break; } - return greater; - } - } else { - assert(treap->getBaseAddress() == baseAddress); - // target is now the greater (w.r.t. the tree key) of the two regions we - // are looking for - if (treap->lhs) { - CoWPtr lhs, rhs; - if (treap.isOwned()) { - auto &node = treap.acquire(); - lhs = std::move(node.lhs); - rhs = std::move(node.rhs); - } else { - lhs = treap->lhs; - rhs = treap->rhs; - } - auto const greaterBaseAddress = treap->getBaseAddress(); - auto const greaterSize = treap->getSize(); - - auto *target = &lhs; - while ((*target)->rhs) { - target = &target->acquire().rhs; - } - treap = std::move(*target); - auto &node = treap.acquire(); - *target = std::move(node.lhs); - - assert(greaterBaseAddress > node.getBaseAddress()); - auto newSize = static_cast( - greaterBaseAddress - node.getBaseAddress() + greaterSize); - assert(newSize > node.getSize() && - "Sizes only get greater by adding `greater - smaller` to them"); - node.setSize(newSize); - - assert(!node.rhs && "We looked for a node that has no rhs"); - assert((!rhs || node.getBaseAddress() < rhs->getBaseAddress()) && - "`lesser` comes from the left subtree of `greater`, while " - "rhs is the right subtree of `greater`"); - assert((!rhs || node.getSize() > rhs->getSize()) && - "The old size of `greater` was >= that of its right subtree, " - "so the new size (of `lesser`) is strictly greater"); - node.rhs = std::move(rhs); - - assert(!node.lhs && "The lhs of this node has already been removed"); - assert((!lhs || lhs->getBaseAddress() < node.getBaseAddress()) && - "`lesser` is the greatest child of the `lhs` subtree"); - assert((!lhs || node.getSize() > lhs->getSize()) && - "The old size of `greater` was >= that of its left subtree, " - "so the new size (of `lesser`) is strictly greater"); - node.lhs = std::move(lhs); - return {}; - } else { - auto greater = std::move(treap); - if (greater->rhs) { - if (greater.isOwned()) { - treap = std::move(greater.acquire().rhs); - } else { - treap = greater->rhs; - } - } - return greater; // no move to enable copy elision } } - } -public: - /// This function merges the region starting at the given address, with the - /// region immediately preceding it. Both regions must exist. The resulting - /// region has the same base address as the lesser region with its size large - /// enough to cover the space to the end of the greater region (filling any - /// holes in the process). - inline void mergeRegionWithPrevious(char *const baseAddress) { - assert(root && "An empty treap holds no regions to merge"); - mergeRegionWithPreviousRec(root, baseAddress); + 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: From c588b9572eb09f00fa4a79340224f44a7bf3bf71 Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Fri, 19 May 2023 22:29:04 +0000 Subject: [PATCH 160/320] add unsized free to kdalloc --- include/klee/KDAlloc/allocator.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/include/klee/KDAlloc/allocator.h b/include/klee/KDAlloc/allocator.h index 1e0d305acb..4ed7670518 100644 --- a/include/klee/KDAlloc/allocator.h +++ b/include/klee/KDAlloc/allocator.h @@ -143,6 +143,20 @@ class Allocator final : public TaggedLogger { 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())) { + return 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! From 6d8c05c5349e7329e6f261317be6d43148bb20ed Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Tue, 14 Mar 2023 19:23:59 +0000 Subject: [PATCH 161/320] Refactored and fixed the code dealing with the entry point. main() should not be processed if the entry point is a different function. This also fixes an abnormal termination when --entry-point and --libc=uclibc are used together (#1572) --- test/Feature/EntryPointMissing.c | 1 - tools/klee/main.cpp | 54 +++++++++++++++++++------------- 2 files changed, 33 insertions(+), 22 deletions(-) diff --git a/test/Feature/EntryPointMissing.c b/test/Feature/EntryPointMissing.c index 3a0d0530a3..c18fe59004 100644 --- a/test/Feature/EntryPointMissing.c +++ b/test/Feature/EntryPointMissing.c @@ -1,6 +1,5 @@ // REQUIRES: posix-runtime // REQUIRES: uclibc -// XFAIL: * // RUN: %clang -emit-llvm -g -c %s -o %t.bc // RUN: rm -rf %t.klee-out diff --git a/tools/klee/main.cpp b/tools/klee/main.cpp index c35d956100..8fcfed0c30 100644 --- a/tools/klee/main.cpp +++ b/tools/klee/main.cpp @@ -688,6 +688,10 @@ std::string KleeHandler::getRunTimeLibraryPath(const char *argv0) { //===----------------------------------------------------------------------===// // main Driver function // + +static Function *mainFn = nullptr; +static Function *entryFn = nullptr; + static std::string strip(std::string &in) { unsigned len = in.size(); unsigned lead = 0, trail = len; @@ -707,26 +711,15 @@ static void parseArguments(int argc, char **argv) { static void preparePOSIX(std::vector> &loadedModules, llvm::StringRef libCPrefix) { - // Get the main function from the main module and rename it such that it can - // be called after the POSIX setup - Function *mainFn = nullptr; - for (auto &module : loadedModules) { - mainFn = module->getFunction(EntryPoint); - if (mainFn) - break; - } - - if (!mainFn) - klee_error("Entry function '%s' not found in module.", EntryPoint.c_str()); mainFn->setName("__klee_posix_wrapped_main"); - // Add a definition of the entry function if needed. This is the case if we + // Add a definition of the main function if needed. This is the case if we // link against a libc implementation. Preparing for libc linking (i.e. // linking with uClibc will expect a main function and rename it to // _user_main. We just provide the definition here. - if (!libCPrefix.empty() && !mainFn->getParent()->getFunction(EntryPoint)) + if (!libCPrefix.empty() && !mainFn->getParent()->getFunction("main")) llvm::Function::Create(mainFn->getFunctionType(), - llvm::Function::ExternalLinkage, EntryPoint, + llvm::Function::ExternalLinkage, "main", mainFn->getParent()); llvm::Function *wrapper = nullptr; @@ -739,7 +732,7 @@ preparePOSIX(std::vector> &loadedModules, // Rename the POSIX wrapper to prefixed entrypoint, e.g. _user_main as uClibc // would expect it or main otherwise - wrapper->setName(libCPrefix + EntryPoint); + wrapper->setName(libCPrefix + "main"); } @@ -1114,7 +1107,8 @@ linkWithUclibc(StringRef libDir, std::string opt_suffix, replaceOrRenameFunction(modules[i].get(), "__libc_fcntl", "fcntl"); } - createLibCWrapper(modules, EntryPoint, "__uClibc_main"); + if (mainFn) + createLibCWrapper(modules, "main", "__uClibc_main"); klee_message("NOTE: Using klee-uclibc : %s", uclibcBCA.c_str()); // Link the fortified library @@ -1262,6 +1256,22 @@ int main(int argc, char **argv, char **envp) { /*CheckDivZero=*/CheckDivZero, /*CheckOvershift=*/CheckOvershift); + // Get the main function + for (auto &module : loadedModules) { + mainFn = module->getFunction("main"); + if (mainFn) + break; + } + + // Get the entry point function + for (auto &module : loadedModules) { + entryFn = module->getFunction(EntryPoint); + if (entryFn) + break; + } + if (!entryFn) + klee_error("Entry function '%s' not found in module.", EntryPoint.c_str()); + if (WithPOSIXRuntime) { SmallString<128> Path(Opts.LibraryDir); llvm::sys::path::append(Path, "libkleeRuntimePOSIX" + opt_suffix + ".bca"); @@ -1272,7 +1282,8 @@ int main(int argc, char **argv, char **envp) { errorMsg.c_str()); std::string libcPrefix = (Libc == LibcType::UcLibc ? "__user_" : ""); - preparePOSIX(loadedModules, libcPrefix); + if (mainFn) + preparePOSIX(loadedModules, libcPrefix); } if (WithUBSanRuntime) { @@ -1405,8 +1416,8 @@ int main(int argc, char **argv, char **envp) { // locale and other data and then calls main. auto finalModule = interpreter->setModule(loadedModules, Opts); - Function *mainFn = finalModule->getFunction(EntryPoint); - if (!mainFn) { + entryFn = finalModule->getFunction(EntryPoint); + if (!entryFn) { klee_error("Entry function '%s' not found in module.", EntryPoint.c_str()); } @@ -1466,7 +1477,7 @@ int main(int argc, char **argv, char **envp) { << " bytes)" << " (" << ++i << "/" << kTestFiles.size() << ")\n"; // XXX should put envp in .ktest ? - interpreter->runFunctionAsMain(mainFn, out->numArgs, out->args, pEnvp); + interpreter->runFunctionAsMain(entryFn, out->numArgs, out->args, pEnvp); if (interrupted) break; } interpreter->setReplayKTest(0); @@ -1515,7 +1526,8 @@ int main(int argc, char **argv, char **envp) { sys::StrError(errno).c_str()); } } - interpreter->runFunctionAsMain(mainFn, pArgc, pArgv, pEnvp); + + interpreter->runFunctionAsMain(entryFn, pArgc, pArgv, pEnvp); while (!seeds.empty()) { kTest_free(seeds.back()); From d3db14ce3b0a3b4902d74a517c08fd19e8469e9e Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Thu, 16 Mar 2023 15:45:01 +0000 Subject: [PATCH 162/320] Some basic refactoring and pass through comments. In particular, it brings some related code together (deadline with EntryPoint and ReplayPathFile respectively) which was unnecessarily separated. --- tools/klee/main.cpp | 48 ++++++++++++++++++--------------------------- 1 file changed, 19 insertions(+), 29 deletions(-) diff --git a/tools/klee/main.cpp b/tools/klee/main.cpp index 8fcfed0c30..a12c5603d4 100644 --- a/tools/klee/main.cpp +++ b/tools/klee/main.cpp @@ -1027,9 +1027,6 @@ static void createLibCWrapper(std::vector> &modules, llvm::StringRef intendedFunction, llvm::StringRef libcMainFunction) { - // XXX we need to rearchitect so this can also be used with - // programs externally linked with libc implementation. - // We now need to swap things so that libcMainFunction is the entry // point, in such a way that the arguments are passed to // libcMainFunction correctly. We do this by renaming the user main @@ -1072,13 +1069,13 @@ createLibCWrapper(std::vector> &modules, BasicBlock *bb = BasicBlock::Create(ctx, "entry", stub); llvm::IRBuilder<> Builder(bb); - std::vector args; + std::vector args; args.push_back(llvm::ConstantExpr::getBitCast( cast(inModuleReference.getCallee()), ft->getParamType(0))); args.push_back(&*(stub->arg_begin())); // argc auto arg_it = stub->arg_begin(); - args.push_back(&*(++arg_it)); // argv + args.push_back(&*(++arg_it)); // argv args.push_back(Constant::getNullValue(ft->getParamType(3))); // app_init args.push_back(Constant::getNullValue(ft->getParamType(4))); // app_fini args.push_back(Constant::getNullValue(ft->getParamType(5))); // rtld_fini @@ -1134,10 +1131,6 @@ int main(int argc, char **argv, char **envp) { parseArguments(argc, argv); sys::PrintStackTraceOnErrorSignal(argv[0]); - if (EntryPoint.empty()) { - klee_error("entry-point cannot be empty"); - } - if (Watchdog) { if (MaxTime.empty()) { klee_error("--watchdog used without --max-time"); @@ -1155,23 +1148,22 @@ int main(int argc, char **argv, char **envp) { auto nextStep = time::getWallTime() + maxTime + (maxTime / 10); int level = 0; - // Simple stupid code... while (1) { sleep(1); int status, res = waitpid(pid, &status, WNOHANG); if (res < 0) { - if (errno==ECHILD) { // No child, no need to watch but - // return error since we didn't catch - // the exit. + if (errno == ECHILD) { + // No child, no need to watch but return error since + // we didn't catch the exit. klee_warning("KLEE: watchdog exiting (no child)\n"); return 1; - } else if (errno!=EINTR) { + } else if (errno != EINTR) { perror("watchdog waitpid"); exit(1); } - } else if (res==pid && WIFEXITED(status)) { + } else if (res == pid && WIFEXITED(status)) { return WEXITSTATUS(status); } else { auto time = time::getWallTime(); @@ -1191,7 +1183,7 @@ int main(int argc, char **argv, char **envp) { klee_warning( "KLEE: WATCHDOG: kill(9)ing child (I tried to be nice)\n"); kill(pid, SIGKILL); - return 1; // what more can we do + return 1; // what more can we do? } // Ideally this triggers a dump, which may take a while, @@ -1264,14 +1256,19 @@ int main(int argc, char **argv, char **envp) { } // Get the entry point function + if (EntryPoint.empty()) + klee_error("entry-point cannot be empty"); + for (auto &module : loadedModules) { entryFn = module->getFunction(EntryPoint); if (entryFn) break; } + if (!entryFn) klee_error("Entry function '%s' not found in module.", EntryPoint.c_str()); + if (WithPOSIXRuntime) { SmallString<128> Path(Opts.LibraryDir); llvm::sys::path::append(Path, "libkleeRuntimePOSIX" + opt_suffix + ".bca"); @@ -1393,12 +1390,6 @@ int main(int argc, char **argv, char **envp) { pArgv[i] = pArg; } - std::vector replayPath; - - if (ReplayPathFile != "") { - KleeHandler::loadPathFile(ReplayPathFile, replayPath); - } - Interpreter::InterpreterOptions IOpts; IOpts.MakeConcreteSymbolic = MakeConcreteSymbolic; KleeHandler *handler = new KleeHandler(pArgc, pArgv); @@ -1407,9 +1398,8 @@ int main(int argc, char **argv, char **envp) { assert(interpreter); handler->setInterpreter(interpreter); - for (int i=0; igetInfoStream() << argv[i] << (i+1getInfoStream() << argv[i] << (i + 1 < argc ? " " : "\n"); handler->getInfoStream() << "PID: " << getpid() << "\n"; // Get the desired main function. klee_main initializes uClibc @@ -1417,17 +1407,17 @@ int main(int argc, char **argv, char **envp) { auto finalModule = interpreter->setModule(loadedModules, Opts); entryFn = finalModule->getFunction(EntryPoint); - if (!entryFn) { + if (!entryFn) klee_error("Entry function '%s' not found in module.", EntryPoint.c_str()); - } externalsAndGlobalsCheck(finalModule); - if (ReplayPathFile != "") { + std::vector replayPath; + if (!ReplayPathFile.empty()) { + KleeHandler::loadPathFile(ReplayPathFile, replayPath); interpreter->setReplayPath(&replayPath); } - auto startTime = std::time(nullptr); { // output clock info and start time std::stringstream startInfo; From 1a087c7d23127b28610f76f201ddd5b750aa0080 Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Fri, 26 May 2023 01:06:45 +0000 Subject: [PATCH 163/320] Copy stats to test directory when running tests The sqlite3 databases used for the stats are journalled and potentially must be written to. Therefore, the sqlite3 driver used by `klee-stats` requires write permissions on the database files. By copying the stats files to the test directory, we can now compile and test an out-of-tree build without requiring any write permissions on the source folder at all. --- test/Feature/KleeStatsColumns.test | 6 +++++- test/Feature/KleeStatsCsv.test | 8 ++++++-- test/Feature/KleeStatsEmpty.test | 6 +++++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/test/Feature/KleeStatsColumns.test b/test/Feature/KleeStatsColumns.test index 6fcbdf4bb5..1ebe1e3705 100644 --- a/test/Feature/KleeStatsColumns.test +++ b/test/Feature/KleeStatsColumns.test @@ -1,4 +1,8 @@ -RUN: %klee-stats --print-all %S/klee-stats/missing_column %S/klee-stats/run %S/klee-stats/additional_column | FileCheck %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/klee-stats/missing_column %S/klee-stats/run %S/klee-stats/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 | |{{.*}}| |{{$}} diff --git a/test/Feature/KleeStatsCsv.test b/test/Feature/KleeStatsCsv.test index 26bfac0985..e923f68d3f 100644 --- a/test/Feature/KleeStatsCsv.test +++ b/test/Feature/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/klee-stats/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/Feature/KleeStatsEmpty.test b/test/Feature/KleeStatsEmpty.test index aae1fee129..64524f38f6 100644 --- a/test/Feature/KleeStatsEmpty.test +++ b/test/Feature/KleeStatsEmpty.test @@ -1,4 +1,8 @@ -RUN: %klee-stats %S/klee-stats/empty | FileCheck %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/klee-stats/empty %t.klee-stats/ +RUN: %klee-stats %t.klee-stats/empty | FileCheck %s CHECK: {{^}}|{{ *}}Path{{ *}}|{{$}} CHECK: {{^}}|{{.*}}empty{{ *}}|{{$}} From e9eaa77b9b5f9e2c9e3ebd8a4e5fad555fe77850 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20B=C3=BCning?= Date: Mon, 29 May 2023 13:17:17 +0200 Subject: [PATCH 164/320] CMake: remove unused TARGET_LIBS variable It appears that this variable was never used, already when it was first set in 7e75b491d389c15d48a5cfc455ba9442d7c108ed. --- CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e6daa815e6..f94b5d5228 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -260,7 +260,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() From e3c626b0c62c966fcfad5cff37393bf5ab428545 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20B=C3=BCning?= Date: Mon, 29 May 2023 13:28:44 +0200 Subject: [PATCH 165/320] CMake: remove obsolete KLEE_COMPONENT_EXTRA_LIBRARIES This variable was previously used by `klee_add_component()`, which got removed as part of 3ef5c9d0cd51babb7c4ec2d7bb76d0cb7e47a65c. --- CMakeLists.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f94b5d5228..469f36a58b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -260,7 +260,6 @@ if (ENABLE_ZLIB) message(STATUS "Zlib support enabled") if (ZLIB_FOUND) set(HAVE_ZLIB_H 1) # For config.h - 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") @@ -296,7 +295,6 @@ if (ENABLE_TCMALLOC) 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}) # TCMalloc's documentation says its safest to pass these flags when # building with gcc because gcc can optimize assuming its using its own @@ -633,7 +631,6 @@ 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}'") ################################################################################ From 182cc7a239f029353490349c237aa5196dbe3b5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20B=C3=BCning?= Date: Mon, 29 May 2023 13:35:16 +0200 Subject: [PATCH 166/320] CMake: remove obsolete comments obsoleted by changes in 3ef5c9d0cd51babb7c4ec2d7bb76d0cb7e47a65c --- CMakeLists.txt | 8 -------- cmake/compiler_warnings.cmake | 2 -- 2 files changed, 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 469f36a58b..b2842f9f9e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -76,14 +76,6 @@ set(CMAKE_SKIP_BUILD_RPATH FALSE) ################################################################################ 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. -################################################################################ - - ################################################################################ # Assertions ################################################################################ diff --git a/cmake/compiler_warnings.cmake b/cmake/compiler_warnings.cmake index b8d00a6ba7..b250483a1d 100644 --- a/cmake/compiler_warnings.cmake +++ b/cmake/compiler_warnings.cmake @@ -9,8 +9,6 @@ ############################################################################### # 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. add_compile_options( From 4ed6271f3022430041b73fc85476c614768f6432 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20B=C3=BCning?= Date: Mon, 29 May 2023 15:06:04 +0200 Subject: [PATCH 167/320] docs/CMakeLists.txt: drop support for old CMake versions minimum CMake version is 3.16.0 as of 3a0e434dc9d4053d75e9c0bbe6faa6dfb46717ae --- docs/CMakeLists.txt | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt index b8a4a38bd5..c49f6d3e8c 100644 --- a/docs/CMakeLists.txt +++ b/docs/CMakeLists.txt @@ -33,13 +33,8 @@ if (ENABLE_DOXYGEN) # 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) From a272d0260630ccebeab10403d3b0eecbc3ed0b10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20B=C3=BCning?= Date: Mon, 29 May 2023 15:19:59 +0200 Subject: [PATCH 168/320] README-CMake.md: clean up top-level targets * the old build system is long gone * clean_doxygen was removed by d5cbc2002bbf75f08036f7adf861b027768a0622 * clean_runtime was removed by 6156b4eeb9a429ccc370782d719d0d6c787a6f72 * clean_all was removed by a00424e64d56ff881a72bfd99ea0dbcbe6898b49 --- README-CMake.md | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/README-CMake.md b/README-CMake.md index 965e2b02f0..9d7ad37d21 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 From 162f2125a6aac2dc91eaa4b1d62acce8e11461a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20B=C3=BCning?= Date: Mon, 29 May 2023 16:04:50 +0200 Subject: [PATCH 169/320] CMake: use built-in FindSQLite3 module available since CMake version 3.14 --- CMakeLists.txt | 2 +- cmake/modules/FindSQLite3.cmake | 37 --------------------------------- lib/Core/CMakeLists.txt | 4 ++-- 3 files changed, 3 insertions(+), 40 deletions(-) delete mode 100644 cmake/modules/FindSQLite3.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index b2842f9f9e..f8ce0d166c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -305,7 +305,7 @@ endif() # Detect SQLite3 ################################################################################ find_package(SQLite3) -if (NOT SQLITE3_FOUND) +if (NOT SQLite3_FOUND) message( FATAL_ERROR "SQLite3 not found, please install" ) endif() 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/lib/Core/CMakeLists.txt b/lib/Core/CMakeLists.txt index fa5c2b5ae9..9005a1ff89 100644 --- a/lib/Core/CMakeLists.txt +++ b/lib/Core/CMakeLists.txt @@ -37,7 +37,7 @@ target_link_libraries(kleeCore PRIVATE ) 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_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}) From caeafa442bb89994e550414670375878f4e50f79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20B=C3=BCning?= Date: Mon, 29 May 2023 16:42:49 +0200 Subject: [PATCH 170/320] doxygen.cfg.in: DOXYGEN_OUTPUT_DIR resolves a FIXME to streamline doxygen.cfg generation a bit --- docs/CMakeLists.txt | 8 ++------ docs/doxygen.cfg.in | 12 ++++++------ 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt index c49f6d3e8c..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,10 +29,6 @@ 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") - set_directory_properties(PROPERTY ADDITIONAL_CLEAN_FILES "${DOXYGEN_OUTPUT_DIR}") 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 From a1665020e9ab501eedc7b5b77f9f0fe0ccc69317 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20B=C3=BCning?= Date: Fri, 14 Apr 2023 16:42:24 +0200 Subject: [PATCH 171/320] .clang-format: c++17 From the `clang-format` documentation: - "`Cpp11` is a deprecated alias for `Latest`" - `Latest`: "Parse and format using the latest supported language version." --- .clang-format | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 ... From 58fb505496b0bae75a300f618cd6e7279a460e95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20B=C3=BCning?= Date: Mon, 29 May 2023 18:14:30 +0200 Subject: [PATCH 172/320] config.h: include FSTATAT_PATH_ACCEPTS_NULL This variable was introduced by d2f5906da4ae37a41ae257e5308d50e19689877b but not included in `config.h` before. As a result `#ifdef` would always fail. Moving the code is necessary to set the variable before `config.h` is created using `configure_file()` in CMakeLists.txt. --- CMakeLists.txt | 6 +++++- include/klee/Config/config.h.cmin | 3 +++ runtime/POSIX/CMakeLists.txt | 5 ----- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f8ce0d166c..552d431a83 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -394,12 +394,16 @@ else() set(HAVE_SELINUX 0) endif() +try_compile (FSTATAT_PATH_ACCEPTS_NULL + ${CMAKE_BINARY_DIR} + ${PROJECT_SOURCE_DIR}/cmake/fstatat.c +) + ################################################################################ # 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" diff --git a/include/klee/Config/config.h.cmin b/include/klee/Config/config.h.cmin index 50ccf3fd60..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@ diff --git a/runtime/POSIX/CMakeLists.txt b/runtime/POSIX/CMakeLists.txt index d8208d9b04..02d06736fa 100644 --- a/runtime/POSIX/CMakeLists.txt +++ b/runtime/POSIX/CMakeLists.txt @@ -20,11 +20,6 @@ set(SRC_FILES stubs.c ) -try_compile (FSTATAT_PATH_ACCEPTS_NULL - ${CMAKE_BINARY_DIR} - ${PROJECT_SOURCE_DIR}/cmake/fstatat.c - ) - # Build it include("${CMAKE_SOURCE_DIR}/cmake/compile_bitcode_library.cmake") prefix_with_path("${SRC_FILES}" "${CMAKE_CURRENT_SOURCE_DIR}/" prefixed_files) From 5eca7f3cd6c6113f010737016da90454dd1a7602 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20B=C3=BCning?= Date: Mon, 29 May 2023 18:16:52 +0200 Subject: [PATCH 173/320] CMake: use check_c_source_compiles() for FSTATAT_PATH_ACCEPTS_NULL is a bit more convenient and avoids an extra file --- CMakeLists.txt | 23 +++++++++++++++++------ cmake/fstatat.c | 9 --------- 2 files changed, 17 insertions(+), 15 deletions(-) delete mode 100644 cmake/fstatat.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 552d431a83..43fd3edb1d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -99,13 +99,14 @@ 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(CheckFunctionExists) -include(CheckLibraryExists) ################################################################################ # Find LLVM @@ -394,10 +395,20 @@ else() set(HAVE_SELINUX 0) endif() -try_compile (FSTATAT_PATH_ACCEPTS_NULL - ${CMAKE_BINARY_DIR} - ${PROJECT_SOURCE_DIR}/cmake/fstatat.c -) +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 diff --git a/cmake/fstatat.c b/cmake/fstatat.c deleted file mode 100644 index 58aa93014a..0000000000 --- a/cmake/fstatat.c +++ /dev/null @@ -1,9 +0,0 @@ -#include -#include -#include - -int main(void) { - struct stat buf; - #pragma GCC diagnostic error "-Wnonnull" - fstatat(0, NULL, &buf, 0); -} From 3c42e214fb2ec4a101dd1e91e2d8c1ce4983a569 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthis=20G=C3=B6rdel?= Date: Sun, 2 Apr 2023 19:25:37 +0200 Subject: [PATCH 174/320] also check for default CHECK directive in ArrayOpt Tests --- test/ArrayOpt/test-mix.c | 25 ++++++++----------- test/ArrayOpt/test_and.c | 11 ++++---- test/ArrayOpt/test_array_index_array.c | 15 +++++------ .../test_array_index_array_diffsize.c | 15 +++++------ test/ArrayOpt/test_cache.c | 20 ++++++--------- test/ArrayOpt/test_const_arr-idx.c | 13 ++++++++-- test/ArrayOpt/test_expr_complex.c | 15 +++++------ test/ArrayOpt/test_expr_simple.c | 15 +++++------ test/ArrayOpt/test_feasible.c | 18 ++++++------- test/ArrayOpt/test_hybrid.c | 10 +++----- test/ArrayOpt/test_multindex.c | 11 ++++---- test/ArrayOpt/test_new.c | 13 +++++----- test/ArrayOpt/test_nier.c | 17 ++++++------- test/ArrayOpt/test_noncontiguous_idx.c | 13 ++++------ test/ArrayOpt/test_position.c | 15 +++++------ test/ArrayOpt/test_sub_idx.c | 15 +++++------ test/ArrayOpt/test_var_idx.c | 15 +++++------ 17 files changed, 110 insertions(+), 146 deletions(-) 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..8e7009b43e 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 @@ -36,19 +33,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_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; } From d3aee9c0e619fa097e296de81de93a09aaab82f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20B=C3=BCning?= Date: Sat, 11 Apr 2020 16:43:01 +0200 Subject: [PATCH 175/320] fix BatchingSearcher's disabled time budget The functionality of the batching searcher that increases the time budget if it is shorter than the time between two calls to `selectState()` ignored the disabled time budget. Effectively, the batching searcher thus picks a very arbitrary time budget on its own. --- lib/Core/Searcher.cpp | 2 +- ...2020-04-11-batching-search-zero-time-budget.c | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 test/regression/2020-04-11-batching-search-zero-time-budget.c diff --git a/lib/Core/Searcher.cpp b/lib/Core/Searcher.cpp index 080c31aa56..f5d6543fb4 100644 --- a/lib/Core/Searcher.cpp +++ b/lib/Core/Searcher.cpp @@ -423,7 +423,7 @@ ExecutionState &BatchingSearcher::selectState() { (time::getWallTime() - lastStartTime) > timeBudget)) || ((instructionBudget > 0) && (stats::instructions - lastStartInstructions) > instructionBudget)) { - if (lastState) { + if (lastState && timeBudget.toSeconds() > 0) { time::Span delta = time::getWallTime() - lastStartTime; auto t = timeBudget; t *= 1.1; 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; +} From 2e4bb296854878a160e84e697a10e9a0757619c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20B=C3=BCning?= Date: Mon, 29 May 2023 20:12:13 +0200 Subject: [PATCH 176/320] make BatchingSearcher more readable --- lib/Core/Searcher.cpp | 59 ++++++++++++++++++++++++++++--------------- lib/Core/Searcher.h | 5 ++++ 2 files changed, 43 insertions(+), 21 deletions(-) diff --git a/lib/Core/Searcher.cpp b/lib/Core/Searcher.cpp index f5d6543fb4..bf98ebc7a1 100644 --- a/lib/Core/Searcher.cpp +++ b/lib/Core/Searcher.cpp @@ -412,33 +412,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 && timeBudget.toSeconds() > 0) { - 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..e399c6161f 100644 --- a/lib/Core/Searcher.h +++ b/lib/Core/Searcher.h @@ -243,13 +243,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. From 0a240e58954753a44989cfdfb2cd6fa6f388cb49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20B=C3=BCning?= Date: Mon, 29 May 2023 12:46:12 +0200 Subject: [PATCH 177/320] re-enable StackTraceOutput.c test This test previously had a REQUIRES line with geq-llvm-7.0. Because LLVM version 7.0 is no longer "known" (test/lit.cfg), the required feature is not available and the test is discarded as unsupported by llvm-lit. --- test/Feature/StackTraceOutput.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/test/Feature/StackTraceOutput.c b/test/Feature/StackTraceOutput.c index 3d4e3c510e..a814adebcd 100644 --- a/test/Feature/StackTraceOutput.c +++ b/test/Feature/StackTraceOutput.c @@ -1,4 +1,3 @@ -// REQUIRES: geq-llvm-7.0 // 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 @@ -16,10 +15,10 @@ void foo(int i, int k) { ++i; ++k; assert(0); - // CHECK-DISCARD: {{.*}} in foo(symbolic, 12) at {{.*}}.c:18 - // CHECK-DISCARD: {{.*}} in main() at {{.*}}.c:28 - // CHECK-NODISCARD: {{.*}} in foo(i=symbolic, k=12) at {{.*}}.c:18 - // CHECK-NODISCARD: {{.*}} in main() at {{.*}}.c:28 + // CHECK-DISCARD: {{.*}} in foo(symbolic, 12) at {{.*}}.c:17 + // CHECK-DISCARD: {{.*}} in main() at {{.*}}.c:27 + // CHECK-NODISCARD: {{.*}} in foo(i=symbolic, k=12) at {{.*}}.c:17 + // CHECK-NODISCARD: {{.*}} in main() at {{.*}}.c:27 } int main(void) { From a39348ba3b0f3739e1be0ab45942209a2007ae4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20B=C3=BCning?= Date: Mon, 29 May 2023 12:48:53 +0200 Subject: [PATCH 178/320] test/Feature/StackTraceOutput.c: relative checks, clang-format --- test/Feature/StackTraceOutput.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/test/Feature/StackTraceOutput.c b/test/Feature/StackTraceOutput.c index a814adebcd..d28cb13c17 100644 --- a/test/Feature/StackTraceOutput.c +++ b/test/Feature/StackTraceOutput.c @@ -13,16 +13,19 @@ #include void foo(int i, int k) { - ++i; ++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); - // CHECK-DISCARD: {{.*}} in foo(symbolic, 12) at {{.*}}.c:17 - // CHECK-DISCARD: {{.*}} in main() at {{.*}}.c:27 - // CHECK-NODISCARD: {{.*}} in foo(i=symbolic, k=12) at {{.*}}.c:17 - // CHECK-NODISCARD: {{.*}} in main() at {{.*}}.c:27 } int main(void) { - int i, k=12; + int i, k = 12; klee_make_symbolic(&i, sizeof(i), "i"); - foo(i,k); + + // CHECK-DISCARD: {{.*}} in main() at {{.*}}.c:[[@LINE+2]] + // CHECK-NODISCARD: {{.*}} in main() at {{.*}}.c:[[@LINE+1]] + foo(i, k); } From a1edff4a0dbad80907a482eea062a58d6c595830 Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Thu, 25 May 2023 22:55:27 +0000 Subject: [PATCH 179/320] Further improve KDAlloc memory usage with infinite quarantine --- include/klee/KDAlloc/allocator.h | 195 ++++++++++- .../KDAlloc/suballocators/slot_allocator.h | 323 ++++++++++-------- 2 files changed, 372 insertions(+), 146 deletions(-) diff --git a/include/klee/KDAlloc/allocator.h b/include/klee/KDAlloc/allocator.h index 4ed7670518..a0c2f162f7 100644 --- a/include/klee/KDAlloc/allocator.h +++ b/include/klee/KDAlloc/allocator.h @@ -79,7 +79,7 @@ class Allocator final : public TaggedLogger { private: Mapping mapping; - std::array sizedBins; + std::array sizedBins; suballocators::LargeObjectAllocator::Control largeObjectBin; public: @@ -99,21 +99,161 @@ class Allocator final : public TaggedLogger { private: klee::ref control; - std::array sizedBins; + 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) = default; - Allocator &operator=(Allocator const &rhs) = default; - Allocator(Allocator &&) = default; - Allocator &operator=(Allocator &&) = default; - Allocator(klee::ref control) : control(std::move(control)) {} + 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(); } @@ -135,7 +275,15 @@ class Allocator final : public TaggedLogger { void *result = nullptr; if (bin < static_cast(sizedBins.size())) { - result = sizedBins[bin].allocate(control->sizedBins[bin]); + 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); } @@ -151,7 +299,15 @@ class Allocator final : public TaggedLogger { traceLine("Freeing ", ptr, " in bin ", bin); if (bin < static_cast(sizedBins.size())) { - return sizedBins[bin].deallocate(control->sizedBins[bin], ptr); + 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); } @@ -165,7 +321,15 @@ class Allocator final : public TaggedLogger { traceLine("Freeing ", ptr, " of size ", size, " in bin ", bin); if (bin < static_cast(sizedBins.size())) { - return sizedBins[bin].deallocate(control->sizedBins[bin], ptr); + 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); } @@ -199,7 +363,16 @@ class Allocator final : public TaggedLogger { ptr < control->sizedBins[i].mapping_end()) { if (reinterpret_cast(ptr) + size <= control->sizedBins[i].mapping_end()) { - return sizedBins[i].getLocationInfo(control->sizedBins[i], ptr, size); + 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; } diff --git a/include/klee/KDAlloc/suballocators/slot_allocator.h b/include/klee/KDAlloc/suballocators/slot_allocator.h index be8393d7d8..1d0d42a8f6 100644 --- a/include/klee/KDAlloc/suballocators/slot_allocator.h +++ b/include/klee/KDAlloc/suballocators/slot_allocator.h @@ -24,144 +24,150 @@ #include namespace klee::kdalloc::suballocators { -class SlotAllocator final : public TaggedLogger { - static_assert(static_cast(-1) == ~static_cast(0), - "-1 must be ~0 for size_t"); - 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 +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[]; +}; - /// 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 +class Control final : public TaggedLogger { + template + friend class SlotAllocator; - /// position in the quarantine, followed by the quarantine ring buffer, - /// followed by the bitmap - std::size_t quarantineAndBitmap[]; - }; + /// pointer to the start of the range managed by this allocator + char *baseAddress = nullptr; - static_assert(std::is_pod::value, "Data must be POD"); + /// size in bytes of the range managed by this allocator + std::size_t size = 0; -public: - class Control final : public TaggedLogger { - friend class SlotAllocator; + /// size in bytes of the slots that are managed in this slot allocator + std::size_t slotSize = 0; - /// pointer to the start of the range managed by this allocator - char *baseAddress = nullptr; + /// number of bytes before the start of the bitmap (includes ordinary + /// members and quarantine) + std::size_t prefixSize = -1; - /// size in bytes of the range managed by this allocator - std::size_t size = 0; + /// quarantine size *including* the position (=> is never 1) + std::uint32_t quarantineSize = 0; - /// size in bytes of the slots that are managed in this slot allocator - std::size_t slotSize = 0; + /// true iff the quarantine is unlimited (=> quarantineSize == 0) + bool unlimitedQuarantine = false; - /// number of bytes before the start of the bitmap (includes ordinary - /// members and quarantine) - std::size_t prefixSize = -1; + [[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!"); - /// quarantine size *including* the position (=> is never 1) - std::uint32_t quarantineSize = 0; + 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"); - /// true iff the quarantine is unlimited (=> _qurantine_size == 0) - bool unlimitedQuarantine = false; + 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 - 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!"); + [[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); - assert((index & highBit) != 0 && "Failed to compute high bit"); - assert((index ^ highBit) < highBit && "Failed to compute high bit"); + auto const highBit = static_cast(1) << (layer - 1); + auto layerIndex = Position >> (trailingZeroes + 1); + assert(layerIndex < highBit && "Tempered value was not restored correctly"); - 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; + 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"); - [[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 index = highBit ^ layerIndex; + return index - 1; + } - auto const highBit = static_cast(1) << (layer - 1); - auto layerIndex = Position >> (trailingZeroes + 1); - assert(layerIndex < highBit && - "Tempered value was not restored correctly"); +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); - 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"); + traceLine("Initialization complete"); + } - auto const index = highBit ^ layerIndex; - return index - 1; - } + inline std::ostream &logTag(std::ostream &out) const noexcept { + return out << "[slot " << slotSize << " Control] "; + } - 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); + bool isQuarantineUnlimited() const noexcept { return unlimitedQuarantine; } - traceLine("Initialization complete"); - } + constexpr void *mapping_begin() const noexcept { return baseAddress; } + constexpr void *mapping_end() const noexcept { + return static_cast(static_cast(baseAddress) + size); + } +}; - inline std::ostream &logTag(std::ostream &out) const noexcept { - return out << "[slot " << slotSize << " Control] "; - } +template<> +class SlotAllocator final : public TaggedLogger> { + static_assert(static_cast(-1) == ~static_cast(0), + "-1 must be ~0 for size_t"); - constexpr void *mapping_begin() const noexcept { return baseAddress; } - constexpr void *mapping_end() const noexcept { - return static_cast(static_cast(baseAddress) + size); - } - }; + static_assert(std::is_pod::value, "Data must be POD"); -private: Data *data = nullptr; inline void releaseData() noexcept { @@ -209,9 +215,6 @@ class SlotAllocator final : public TaggedLogger { std::size_t quarantine(Control const &control, std::size_t const index) { assert(!!data && "Deallocations can only happen if allocations happened beforehand"); - assert( - !control.unlimitedQuarantine && - "Please check for unlimited quarantine before calling this function"); if (control.quarantineSize == 0) { return index; @@ -487,26 +490,22 @@ class SlotAllocator final : public TaggedLogger { assert(!!data && "Deallocations can only happen if allocations happened beforehand"); - if (control.unlimitedQuarantine) { - traceLine("Quarantining ", ptr, " for ever"); - } else { - auto pos = static_cast(static_cast(ptr) - - control.baseAddress); - acquireData(control); // we will need quarantine and/or bitmap ownership + 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); + 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); + if (pos == static_cast(-1)) { + traceLine("Nothing to deallocate"); + } else { + traceLine("Deallocating ", pos); + traceContents(control); + assert(pos < control.size); - setFree(control, control.convertPositionToIndex(pos)); - } + setFree(control, control.convertPositionToIndex(pos)); } } @@ -533,6 +532,60 @@ class SlotAllocator final : public TaggedLogger { #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 From 4417ff31b45f540f0efcccd9f042d9a7ad429e6f Mon Sep 17 00:00:00 2001 From: Frank Busse Date: Mon, 5 Jun 2023 18:20:16 +0100 Subject: [PATCH 180/320] ktest-gen: remove unused function --- tools/ktest-gen/ktest-gen.cpp | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/tools/ktest-gen/ktest-gen.cpp b/tools/ktest-gen/ktest-gen.cpp index 93e428a965..5c2f3d80ec 100644 --- a/tools/ktest-gen/ktest-gen.cpp +++ b/tools/ktest-gen/ktest-gen.cpp @@ -36,17 +36,6 @@ static void push_obj(KTest *b, const char *name, unsigned total_bytes, memcpy(o->bytes, bytes, total_bytes); } -static void push_range(KTest *b, const char *name, unsigned value) { - KTestObject *o = &b->objects[b->numObjects++]; - assert(b->numObjects < MAX); - - o->name = strdup(name); - o->numBytes = 4; - o->bytes = (unsigned char *)malloc(o->numBytes); - - *(unsigned *)o->bytes = value; -} - void print_usage_and_exit(char *program_name) { fprintf(stderr, "%s: Tool for generating a ktest file from concrete input, e.g., for using a concrete crashing input as a ktest seed.\n" From ae071d86b503a0a9cba987ff3635dca6e09184ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20B=C3=BCning?= Date: Sun, 2 Apr 2023 17:54:21 +0200 Subject: [PATCH 181/320] unittests/CMakeLists.txt: gtest check for LLVM 13+ We previously used `LLVM_EXPORTED_TARGETS` defined in LLVMConfig.cmake. This variable is no longer defined starting from LLVM 13. Alternatively, we use the fact that LLVM's gtest target always depends on LLVMSupport. --- unittests/CMakeLists.txt | 107 +++++++++++++++++++++++++++++---------- 1 file changed, 81 insertions(+), 26 deletions(-) diff --git a/unittests/CMakeLists.txt b/unittests/CMakeLists.txt index 17644eddf7..2641b5b996 100644 --- a/unittests/CMakeLists.txt +++ b/unittests/CMakeLists.txt @@ -43,44 +43,99 @@ function(add_vanilla_googletest_subdirectory directory) add_subdirectory(${directory} "${CMAKE_CURRENT_BINARY_DIR}/gtest_build") endfunction() -if (TARGET gtest) - # try to reuse LLVM's 'gtest' target +function(ensure_valid_llvm_gtest_target) + block(SCOPE_FOR VARIABLES) + if ("${LLVM_VERSION_MAJOR}" LESS 13) + list(FIND LLVM_EXPORTED_TARGETS "gtest" _GTEST_INDEX) + if (${_GTEST_INDEX} GREATER -1) + return() + endif() + else() + # use that LLVM's Google Test always depends on LLVM's own support library + + # if LLVM was built using "BUILD_SHARED_LIBS=ON", we need to collect + # IMPORTED_LINK_DEPENDENT_LIBRARIES[_] for the target + get_target_property(_GTEST_DEPENDENCIES gtest + IMPORTED_LINK_DEPENDENT_LIBRARIES) + if (NOT _GTEST_DEPENDENCIES) + set(_GTEST_DEPENDENCIES "") + endif() + get_target_property(_GTEST_CONFIGS gtest IMPORTED_CONFIGURATIONS) + foreach(_GTEST_CONFIG "${_GTEST_CONFIGS}") + get_target_property(_GTEST_DEP_CONFIG gtest + IMPORTED_LINK_DEPENDENT_LIBRARIES_${_GTEST_CONFIG}) + if (_GTEST_DEP_CONFIG) + list(APPEND _GTEST_DEPENDENCIES "${_GTEST_DEP_CONFIG}") + endif() + endforeach() + + # PUBLIC and INTERFACE link dependencies (when LLVM uses static linking) + get_target_property(_GTEST_LINK_LIBS gtest INTERFACE_LINK_LIBRARIES) + if (_GTEST_LINK_LIBS) + list(APPEND _GTEST_DEPENDENCIES "${_GTEST_LINK_LIBS}") + endif() + + # determine the name of the library offering LLVM's support + if ("${LLVM_LINK_LLVM_DYLIB}") + set(_SUPPORT_DEPENDENCY "LLVM") + else() + llvm_map_components_to_libnames(_SUPPORT_DEPENDENCY support) + endif() + + # check if this support library is among the dependencies of gtest + list(FIND _GTEST_DEPENDENCIES "${_SUPPORT_DEPENDENCY}" _SUPPORT_INDEX) + if (${_SUPPORT_INDEX} GREATER -1) + return() + endif() + endif() + + message(FATAL_ERROR "An existing 'gtest' CMake target was imported. This " + "prevents KLEE from defining its own 'gtest' target (for Google Test).\n" + "KLEE has support for reusing the 'gtest' target exported by LLVM, but " + "the 'gtest' target imported does not appear to originate from LLVM.\n" + "Please make sure that no KLEE dependency (included with `find_package`) " + "exports a 'gtest' target in your configuration.") + endblock() +endfunction() - message(WARNING "LLVM exports its 'gtest' CMake target (for Google Test), so " - "KLEE cannot create its own. Thus, KLEE will reuse the existing one. This " - "is, however, only recommended if LLVM and KLEE were built using the same " +if (TARGET gtest) + # Google Test target is already defined, we cannot include Google Test twice. + # Thus, we try to reuse the 'gtest' target if it originates from LLVM. + # Otherwise, we fail with an error (and ask user to fix their configuration). + + message(STATUS "Google Test: Reusing 'gtest' target.") + ensure_valid_llvm_gtest_target() + + message(WARNING "LLVM exports its 'gtest' CMake target (for Google Test), " + "which is imported by KLEE (via `find_package`). This prevents KLEE from " + "defining its own 'gtest' target (for Google Test).\n" + "Thus, KLEE will reuse the imported 'gtest' target from LLVM. This is, " + "however, only recommended if LLVM and KLEE are built using the same " "compiler and linker flags (to prevent compatibility issues).\n" "To prevent CMake from reusing the target or to use a different version " "of Google Test, try either of the following:\n" "- Point LLVM_DIR to the directory containing the `LLVMConfig.cmake` file " "of an installed copy of LLVM instead of a build tree.\n" - "- Pass -DLLVM_INCLUDE_TESTS=OFF to CMake when building LLVM. This " - "prevents building unit tests in LLVM (but not in KLEE) and exporting the " - "target to the build tree.") + "- Pass -DLLVM_INCLUDE_TESTS=OFF to the CMake invocation used for building " + "LLVM. This prevents building unit tests in LLVM (but not in KLEE) and " + "exporting the target from LLVM's build tree.") if (GTEST_SRC_DIR) message(FATAL_ERROR "Cannot use GTEST_SRC_DIR when target 'gtest' is" "already defined.\n" - "Either reuse LLVM's Google Test setup by not setting GTEST_SRC_DIR or " - "choose one of the options to prevent LLVM from exporting this target.") + "Either let KLEE reuse LLVM's Google Test setup by not setting " + "GTEST_SRC_DIR explicitly or choose one of the options above to prevent" + "LLVM from exporting this target.") endif() - # check if it's really LLVM that exports the 'gtest' target - list(FIND LLVM_EXPORTED_TARGETS "gtest" _GTEST_INDEX) - if (${_GTEST_INDEX} GREATER -1) - message(STATUS "Google Test: Reusing LLVM's 'gtest' target.") - # in this case, only include directory has to be set - if (LLVM_BUILD_MAIN_SRC_DIR) - set(GTEST_INCLUDE_DIR - "${LLVM_BUILD_MAIN_SRC_DIR}/utils/unittest/googletest/include" - CACHE - PATH - "Path to Google Test include directory" - ) - endif() - else() - message(FATAL_ERROR "Reusing Google Test (target) from LLVM failed:" - "LLVM_EXPORTED_TARGETS does not contain 'gtest'.") + # in this case, only include directory has to be set + if (LLVM_BUILD_MAIN_SRC_DIR) + set(GTEST_INCLUDE_DIR + "${LLVM_BUILD_MAIN_SRC_DIR}/utils/unittest/googletest/include" + CACHE + PATH + "Path to Google Test include directory" + ) endif() else() # LLVM's 'gtest' target is not reused From ae1ee275c2268397fb843c4f9a7a04ce8030d1f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20B=C3=BCning?= Date: Sun, 28 May 2023 18:42:05 +0200 Subject: [PATCH 182/320] unittests/CMakeLists.txt: fix LLVM find_package support broken by 3ef5c9d0cd51babb7c4ec2d7bb76d0cb7e47a65c, which removed the "USE_CMAKE_FIND_PACKAGE_LLVM" variable and no longer includes AddLLVM.cmake --- README-CMake.md | 4 ++-- unittests/CMakeLists.txt | 10 ++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/README-CMake.md b/README-CMake.md index 9d7ad37d21..23cb7a1413 100644 --- a/README-CMake.md +++ b/README-CMake.md @@ -58,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`. diff --git a/unittests/CMakeLists.txt b/unittests/CMakeLists.txt index 2641b5b996..ca90aeadc3 100644 --- a/unittests/CMakeLists.txt +++ b/unittests/CMakeLists.txt @@ -141,11 +141,8 @@ else() # LLVM's 'gtest' target is not reused if (NOT GTEST_SRC_DIR) - if (USE_CMAKE_FIND_PACKAGE_LLVM AND LLVM_BUILD_MAIN_SRC_DIR) + if (IS_DIRECTORY "${LLVM_BUILD_MAIN_SRC_DIR}") # build from LLVM's utils directory - # NOTE: This can only be done using USE_CMAKE_FIND_PACKAGE_LLVM as - # LLVM replaced Google Test's CMakeLists.txt with its own, - # requiring add_llvm_library() from AddLLVM.cmake. message(STATUS "Google Test: Building from LLVM's source tree.") set(GTEST_INCLUDE_DIR @@ -155,6 +152,11 @@ else() "Path to Google Test include directory" ) + # LLVM replaced Google Test's CMakeLists.txt with its own, which requires + # add_llvm_library() from AddLLVM.cmake. + list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_DIR}") + include(AddLLVM) + add_subdirectory("${LLVM_BUILD_MAIN_SRC_DIR}/utils/unittest/" "${CMAKE_CURRENT_BINARY_DIR}/gtest_build") From 43414c9eaebbe47c9bd59338b8a1cd574feb37bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20B=C3=BCning?= Date: Sun, 2 Apr 2023 13:55:39 +0200 Subject: [PATCH 183/320] unittests/CMakeLists.txt: remove obsolete policy Checking for policy CMP0077 is obsolete as we now require CMake 3.16.0 as minimum version. --- unittests/CMakeLists.txt | 39 ++++++++++++--------------------------- 1 file changed, 12 insertions(+), 27 deletions(-) diff --git a/unittests/CMakeLists.txt b/unittests/CMakeLists.txt index ca90aeadc3..5fd9045714 100644 --- a/unittests/CMakeLists.txt +++ b/unittests/CMakeLists.txt @@ -8,36 +8,21 @@ #===------------------------------------------------------------------------===# function(add_vanilla_googletest_subdirectory directory) - if (POLICY CMP0077) - # Prevent Google Test from adding to our install target (Google Test 1.8.0+) - # However, this can only be disabled starting with 1.8.1 (a.k.a. 1.9.0) - set(INSTALL_GTEST OFF) - - # Google Mock is currently not used by our tests - set(BUILD_GMOCK OFF) - - # (only) Google Test 1.8.0 with BUILD_GMOCK=OFF needs BUILD_GTEST=ON - set(BUILD_GTEST ON) - - # Make option() in subdirectory respect normal variables (as set above). - # NOTE: The enclosing function limits the scope of this policy setting. - # FIXME: Remove once all supported Google Test versions require CMake 3.13+ - # (or set policy CMP0077 to NEW by themselves) - set(CMAKE_POLICY_DEFAULT_CMP0077 NEW) - else() - # FIXME: Remove with CMake minimum version 3.13+ - # Use cache variable workaround as option() ignores normal variables + # Prevent Google Test from adding to our install target (Google Test 1.8.0+) + # However, this can only be disabled starting with 1.8.1 (a.k.a. 1.9.0) + set(INSTALL_GTEST OFF) - # Prevent Google Test from adding to our install target (Google Test 1.8.0+) - # However, this can only be disabled starting with 1.8.1 (a.k.a. 1.9.0) - set(INSTALL_GTEST OFF CACHE BOOL "disable installing Google Test" FORCE) + # Google Mock is currently not used by our tests + set(BUILD_GMOCK OFF) - # Google Mock is currently not used by our tests - set(BUILD_GMOCK OFF CACHE BOOL "disable building Google Mock" FORCE) + # (only) Google Test 1.8.0 with BUILD_GMOCK=OFF needs BUILD_GTEST=ON + set(BUILD_GTEST ON) - # (only) Google Test 1.8.0 with BUILD_GMOCK=OFF needs BUILD_GTEST=ON - set(BUILD_GTEST ON CACHE BOOL "enable building Google Test" FORCE) - endif() + # Make option() in subdirectory respect normal variables (as set above). + # NOTE: The enclosing function limits the scope of this policy setting. + # FIXME: Remove once all supported Google Test versions require CMake 3.13+ + # (or set policy CMP0077 to NEW by themselves) + set(CMAKE_POLICY_DEFAULT_CMP0077 NEW) # include Google Test's CMakeLists.txt add_subdirectory(${directory} "${CMAKE_CURRENT_BINARY_DIR}/gtest_build") From 077f89136c06eb4a6b43e51a0c091ab70dab0d06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20B=C3=BCning?= Date: Sun, 2 Apr 2023 14:08:47 +0200 Subject: [PATCH 184/320] unittests/CMakeLists.txt: no UNITTEST_MAIN_LIBS variable obsoleted by 5607a7f1910e579acc0b93b1ae2caba88e7d5fd7 --- unittests/CMakeLists.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/unittests/CMakeLists.txt b/unittests/CMakeLists.txt index 5fd9045714..4eb75004b8 100644 --- a/unittests/CMakeLists.txt +++ b/unittests/CMakeLists.txt @@ -248,9 +248,6 @@ llvm_config(unittest_main "${USE_LLVM_SHARED}" support) target_link_libraries(unittest_main PUBLIC ${GTEST_TARGET_NAME} - - PRIVATE - ${UNITTEST_MAIN_LIBS} ) target_include_directories(unittest_main PUBLIC From e10d366aa7b052b2de9475f82c54ede827de939d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20B=C3=BCning?= Date: Sun, 28 May 2023 18:52:50 +0200 Subject: [PATCH 185/320] unittests/CMakeLists.txt: do not echo GTEST_SRC_DIR on error This prevents the error message to include the internal "GTEST_SRC_DIR-NOTFOUND" value. --- unittests/CMakeLists.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/unittests/CMakeLists.txt b/unittests/CMakeLists.txt index 4eb75004b8..6d2c9968d2 100644 --- a/unittests/CMakeLists.txt +++ b/unittests/CMakeLists.txt @@ -188,8 +188,7 @@ else() ) if (NOT EXISTS "${GTEST_SRC_DIR}") - message(FATAL_ERROR "Google Test source directory \"${GTEST_SRC_DIR}\" " - "cannot be found.\n" + message(FATAL_ERROR "Google Test source directory cannot be found.\n" "Try passing -DGTEST_SRC_DIR= to CMake where " " is the path to the Google Test source tree.\n" "Alternatively, you can disable unit tests by passing " From a31d20045b8e4a9a835459c52c946d2693a2403b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20B=C3=BCning?= Date: Sun, 28 May 2023 14:35:39 +0200 Subject: [PATCH 186/320] unittests/CMakeLists.txt: set gtest include dir only if necessary --- unittests/CMakeLists.txt | 48 +++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/unittests/CMakeLists.txt b/unittests/CMakeLists.txt index 6d2c9968d2..c868c115fa 100644 --- a/unittests/CMakeLists.txt +++ b/unittests/CMakeLists.txt @@ -113,14 +113,14 @@ if (TARGET gtest) "LLVM from exporting this target.") endif() - # in this case, only include directory has to be set - if (LLVM_BUILD_MAIN_SRC_DIR) - set(GTEST_INCLUDE_DIR - "${LLVM_BUILD_MAIN_SRC_DIR}/utils/unittest/googletest/include" - CACHE - PATH - "Path to Google Test include directory" - ) + # older LLVM versions do not set INTERFACE_INCLUDE_DIRECTORIES for gtest + if ("${LLVM_VERSION_MAJOR}" LESS 12) + if (IS_DIRECTORY "${LLVM_BUILD_MAIN_SRC_DIR}") + target_include_directories(gtest + INTERFACE + "${LLVM_BUILD_MAIN_SRC_DIR}/utils/unittest/googletest/include" + ) + endif() endif() else() # LLVM's 'gtest' target is not reused @@ -130,12 +130,6 @@ else() # build from LLVM's utils directory message(STATUS "Google Test: Building from LLVM's source tree.") - set(GTEST_INCLUDE_DIR - "${LLVM_BUILD_MAIN_SRC_DIR}/utils/unittest/googletest/include" - CACHE - PATH - "Path to Google Test include directory" - ) # LLVM replaced Google Test's CMakeLists.txt with its own, which requires # add_llvm_library() from AddLLVM.cmake. @@ -145,6 +139,14 @@ else() add_subdirectory("${LLVM_BUILD_MAIN_SRC_DIR}/utils/unittest/" "${CMAKE_CURRENT_BINARY_DIR}/gtest_build") + # older LLVM versions do not set INTERFACE_INCLUDE_DIRECTORIES for gtest + if ("${LLVM_VERSION_MAJOR}" LESS 12) + target_include_directories(gtest + INTERFACE + "${LLVM_BUILD_MAIN_SRC_DIR}/utils/unittest/googletest/include" + ) + endif() + # add includes for LLVM's modifications target_include_directories(gtest BEFORE PRIVATE ${LLVM_INCLUDE_DIRS}) # we cannot disable gtest_main, but will not use it later @@ -198,6 +200,12 @@ else() message(STATUS "GTEST_SRC_DIR: ${GTEST_SRC_DIR}") add_vanilla_googletest_subdirectory(${GTEST_SRC_DIR}) + + # Google Test versions < 1.8.0 do not set INTERFACE_INCLUDE_DIRECTORIES + target_include_directories(gtest + INTERFACE + ${GTEST_INCLUDE_DIR} + ) endif() if (NOT GTest_FOUND) @@ -219,15 +227,6 @@ define_property(GLOBAL FULL_DOCS "KLEE unit tests" ) -if (NOT GTest_FOUND) - # GTEST_INCLUDE_DIR is defined only when we build from sources. - if (NOT IS_DIRECTORY "${GTEST_INCLUDE_DIR}") - message(FATAL_ERROR - "Cannot find Google Test include directory \"${GTEST_INCLUDE_DIR}\"") - endif() - message(STATUS "GTEST_INCLUDE_DIR: ${GTEST_INCLUDE_DIR}") -endif() - if (TARGET gtest) set(GTEST_TARGET_NAME gtest) elseif (TARGET GTest::gtest) @@ -249,8 +248,7 @@ target_link_libraries(unittest_main ${GTEST_TARGET_NAME} ) target_include_directories(unittest_main - PUBLIC - ${GTEST_INCLUDE_DIR} + INTERFACE ${KLEE_COMPONENT_EXTRA_INCLUDE_DIRS} PRIVATE From b07fcca329fae84821414baa979fd5de53c1d37e Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Wed, 7 Jun 2023 17:14:23 +0100 Subject: [PATCH 187/320] Use recommended LLVM 13 as part of the Docker image --- Dockerfile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index d58fd2458a..d345ff5c63 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,10 @@ -FROM ghcr.io/klee/llvm:110_O_D_A_ubuntu_jammy-20230126 as llvm_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_110_ubuntu_jammy-20230126 as uclibc_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:110_ubuntu_jammy-20230126 as libcxx_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/ @@ -17,7 +17,7 @@ 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 @@ -56,7 +56,7 @@ RUN /tmp/klee_src/scripts/build/build.sh --debug --install-system-deps klee && p sudo rm -rf /var/lib/apt/lists/* -ENV PATH="$PATH:/tmp/llvm-110-install_O_D_A/bin:/home/klee/klee_build/bin:/home/klee/.local/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"' From 29ccb3165270f9a5ad8cda3e102eeef5e539c313 Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Wed, 7 Jun 2023 17:48:32 +0100 Subject: [PATCH 188/320] Build and push Docker image as part of a release --- .github/workflows/docker_release_push.yml | 34 +++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 .github/workflows/docker_release_push.yml diff --git a/.github/workflows/docker_release_push.yml b/.github/workflows/docker_release_push.yml new file mode 100644 index 0000000000..7337e3d436 --- /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@v3 + + - 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 From d4ad01eb8959f0b65bdf8428c0d730694cab9bba Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Sat, 20 May 2023 11:04:11 +1000 Subject: [PATCH 189/320] Fixed end date in the 2.3 release notes --- NEWS | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index de99b7e145..c4f7028871 100644 --- a/NEWS +++ b/NEWS @@ -1,7 +1,7 @@ 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 @@ -35,6 +35,7 @@ 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 ========================= From ed31a44a28bff499b16ad0884a415ad6e4f8c14c Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Wed, 7 Jun 2023 17:10:07 +0100 Subject: [PATCH 190/320] Set version number to 3.0 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 43fd3edb1d..e5e52e675f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,7 +17,7 @@ project(KLEE CXX C) # Project version ############################################################################### set(KLEE_VERSION_MAJOR 3) -set(KLEE_VERSION_MINOR 0-pre) +set(KLEE_VERSION_MINOR 0) set(KLEE_VERSION "${KLEE_VERSION_MAJOR}.${KLEE_VERSION_MINOR}") # If a patch is needed, we can add KLEE_VERSION_PATCH From dfa53ed4f5711ee2d378abb267bff1da8623f7e7 Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Fri, 26 May 2023 20:09:53 +0100 Subject: [PATCH 191/320] Release notes for KLEE 3.0 --- NEWS | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/NEWS b/NEWS index c4f7028871..4af44e3c9e 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,45 @@ +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 http://klee.github.io/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 ====================== From 6a0448e983a1f5565170092f9c56417192dce6f5 Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Wed, 7 Jun 2023 21:01:53 +0100 Subject: [PATCH 192/320] Changed version to 3.1-pre --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e5e52e675f..19e9fc06a5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,7 +17,7 @@ project(KLEE CXX C) # Project version ############################################################################### set(KLEE_VERSION_MAJOR 3) -set(KLEE_VERSION_MINOR 0) +set(KLEE_VERSION_MINOR 1-pre) set(KLEE_VERSION "${KLEE_VERSION_MAJOR}.${KLEE_VERSION_MINOR}") # If a patch is needed, we can add KLEE_VERSION_PATCH From b926b3d49d7650ba76c81f4dfe0fd9aad44150d2 Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Fri, 9 Jun 2023 21:30:22 +0100 Subject: [PATCH 193/320] Fixed a format specifier pointed to by a compiler warning. --- lib/Core/MemoryManager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Core/MemoryManager.cpp b/lib/Core/MemoryManager.cpp index 55dd20f28d..bdb89bb54f 100644 --- a/lib/Core/MemoryManager.cpp +++ b/lib/Core/MemoryManager.cpp @@ -201,7 +201,7 @@ MemoryManager::MemoryManager(ArrayCache *_arrayCache) #if LLVM_VERSION_CODE >= LLVM_VERSION(10, 0) if (start1 != 0 && !llvm::isAligned(pageAlignment, start1)) { klee_error("Deterministic allocator: Requested start address for %s " - "is not page aligned (page size: %zu B)", + "is not page aligned (page size: %" PRIu64 " B)", segment1.c_str(), pageAlignment.value()); } #else @@ -392,4 +392,4 @@ bool MemoryManager::markMappingsAsUnneeded() { size_t MemoryManager::getUsedDeterministicSize() { // TODO: implement return 0; -} \ No newline at end of file +} From f3a4b343b09a431f708e74870ce1a1021c94c93a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20B=C3=BCning?= Date: Sun, 11 Jun 2023 15:07:13 +0200 Subject: [PATCH 194/320] fix ktest-randgen: use after free --- tools/ktest-randgen/ktest-randgen.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/tools/ktest-randgen/ktest-randgen.cpp b/tools/ktest-randgen/ktest-randgen.cpp index 4bf3e23ca6..19a4a0d663 100644 --- a/tools/ktest-randgen/ktest-randgen.cpp +++ b/tools/ktest-randgen/ktest-randgen.cpp @@ -114,7 +114,6 @@ void create_stat(size_t size, struct stat *s) { if (write(fd, memset(buf, 0, size), size) != (int)size) { free(buf); - free(filename); error_exit("%s:%d: Error writing %s\n", __FILE__, __LINE__, filename); } #if defined(__has_feature) From dab1c0fa376771be1c3cdd5b8d564484755907dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20B=C3=BCning?= Date: Sun, 11 Jun 2023 15:45:26 +0200 Subject: [PATCH 195/320] SpecialFunctionHandler: use std::array for handlerInfo --- lib/Core/SpecialFunctionHandler.cpp | 46 +++++------------------------ lib/Core/SpecialFunctionHandler.h | 31 ------------------- 2 files changed, 8 insertions(+), 69 deletions(-) diff --git a/lib/Core/SpecialFunctionHandler.cpp b/lib/Core/SpecialFunctionHandler.cpp index 332e4b56ea..b2d857103e 100644 --- a/lib/Core/SpecialFunctionHandler.cpp +++ b/lib/Core/SpecialFunctionHandler.cpp @@ -36,6 +36,7 @@ DISABLE_WARNING_DEPRECATED_DECLARATIONS #include "llvm/IR/Module.h" DISABLE_WARNING_POP +#include #include #include @@ -69,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), @@ -82,7 +83,7 @@ static SpecialFunctionHandler::HandlerInfo handlerInfo[] = { addDNR("_assert", handleAssert), addDNR("abort", handleAbort), addDNR("_exit", handleExit), - { "exit", &SpecialFunctionHandler::handleExit, true, false, true }, + SpecialFunctionHandler::HandlerInfo{ "exit", &SpecialFunctionHandler::handleExit, true, false, true }, addDNR("klee_abort", handleAbort), addDNR("klee_silent_exit", handleSilentExit), addDNR("klee_report_error", handleReportError), @@ -147,40 +148,12 @@ static SpecialFunctionHandler::HandlerInfo handlerInfo[] = { #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 @@ -201,12 +174,9 @@ void SpecialFunctionHandler::prepare( } void SpecialFunctionHandler::bind() { - unsigned N = size(); - - for (unsigned i=0; imodule->getFunction(hi.name); - + if (f && (!hi.doNotOverride || f->isDeclaration())) handlers[f] = std::make_pair(hi.handler, hi.hasReturnValue); } diff --git a/lib/Core/SpecialFunctionHandler.h b/lib/Core/SpecialFunctionHandler.h index 230d392933..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 @@ -48,36 +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 { - using iterator_category = std::random_access_iterator_tag; - using value_type = HandlerInfo; - using difference_type = ptrdiff_t; - using pointer = void; - using reference = void; - - 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); From c10e9e926700773e01f44fbb1917deac7be2aaea Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Fri, 9 Jun 2023 23:06:41 +0100 Subject: [PATCH 196/320] Rewrote has_permission in the POSIX runtime. We now only return with permission error a single time in symbolic execution mode. The rewrite also fixes a bug reported in #1230. Rewrote the FilePerm.c test accordingly. --- runtime/POSIX/fd.c | 32 +++++++++----------------------- test/Runtime/POSIX/FilePerm.c | 15 ++++++++++----- 2 files changed, 19 insertions(+), 28 deletions(-) diff --git a/runtime/POSIX/fd.c b/runtime/POSIX/fd.c index be13a40bca..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; 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); } From 79f75a4dafe36c95b4fdf81c0bc4032fb111e52c Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Fri, 23 Jun 2023 22:41:50 +0100 Subject: [PATCH 197/320] Improved help message for --exit-on-error-type=Abort --- lib/Core/Executor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp index 5194aff26e..f01b7d990b 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -281,7 +281,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", From 4cd34bde5bb1a62b1c6c35326352cf1e6d77843d Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Fri, 23 Jun 2023 22:44:49 +0100 Subject: [PATCH 198/320] Fixed a couple of spelling issues in the help menu --- lib/Core/Executor.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp index f01b7d990b..361a4e2e31 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -207,7 +207,7 @@ cl::opt SuppressExternalWarnings( cl::opt AllExternalWarnings( "all-external-warnings", cl::init(false), - cl::desc("Issue a warning everytime an external call is made, " + cl::desc("Issue a warning every time an external call is made, " "as opposed to once per function (default=false)"), cl::cat(ExtCallsCat)); @@ -320,7 +320,7 @@ cl::list ExitOnErrorType( 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)); From d54695e92923dac61d01e0bb18c64632b7ca346f Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Fri, 23 Jun 2023 22:49:55 +0100 Subject: [PATCH 199/320] Remove parentheses around klee_ intrinsics from the help menu --- lib/Core/MergeHandler.cpp | 4 ++-- lib/Core/SpecialFunctionHandler.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/Core/MergeHandler.cpp b/lib/Core/MergeHandler.cpp index 3034dd7457..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( diff --git a/lib/Core/SpecialFunctionHandler.cpp b/lib/Core/SpecialFunctionHandler.cpp index b2d857103e..488fba5194 100644 --- a/lib/Core/SpecialFunctionHandler.cpp +++ b/lib/Core/SpecialFunctionHandler.cpp @@ -55,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 From 8b799c50ead1622691d870a1719c6dc7c34b5892 Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Fri, 23 Jun 2023 22:55:07 +0100 Subject: [PATCH 200/320] Consistently use ".ktest" when referring to .ktest files in the help menu --- tools/klee/main.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/klee/main.cpp b/tools/klee/main.cpp index a12c5603d4..483397c1c7 100644 --- a/tools/klee/main.cpp +++ b/tools/klee/main.cpp @@ -234,13 +234,13 @@ namespace { cl::list ReplayKTestFile("replay-ktest-file", - cl::desc("Specify a ktest file to use for replay"), - cl::value_desc("ktest file"), + cl::desc("Specify a .ktest file to use for replay"), + cl::value_desc(".ktest file"), cl::cat(ReplayCat)); cl::list ReplayKTestDir("replay-ktest-dir", - cl::desc("Specify a directory to replay ktest files from"), + cl::desc("Specify a directory to replay .ktest files from"), cl::value_desc("output directory"), cl::cat(ReplayCat)); From ca0d0951c1e43cb5a18e668371f22a12416a98df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20B=C3=BCning?= Date: Thu, 22 Jun 2023 17:44:36 +0200 Subject: [PATCH 201/320] RefTest: suppress -Wself-move This warning (introduced with GCC 13, also present in clang) warns precisely about what we want to test here. --- unittests/Ref/RefTest.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/unittests/Ref/RefTest.cpp b/unittests/Ref/RefTest.cpp index bf313513a9..2f17738f8b 100644 --- a/unittests/Ref/RefTest.cpp +++ b/unittests/Ref/RefTest.cpp @@ -95,8 +95,11 @@ TEST(RefTest, SelfMove) { struct Expr *r_e = new Expr(); ref r(r_e); +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wself-move" // Check self move r = std::move(r); +#pragma GCC diagnostic pop finished = 1; } EXPECT_EQ(1, finished_counter); From c699cc56365d828388b082ff0f64bc4d6f7496c7 Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Thu, 29 Jun 2023 00:57:09 +0000 Subject: [PATCH 202/320] Perform location_info tests in KDAlloc's random test --- unittests/KDAlloc/randomtest.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/unittests/KDAlloc/randomtest.cpp b/unittests/KDAlloc/randomtest.cpp index 1120ee4e41..c78746bb0e 100644 --- a/unittests/KDAlloc/randomtest.cpp +++ b/unittests/KDAlloc/randomtest.cpp @@ -78,7 +78,17 @@ class RandomTest { auto choice = std::uniform_int_distribution( 0, allocations.size() - 1)(rng); #if defined(USE_KDALLOC) + assert(allocator.location_info(allocations[choice].first, 1) == + klee::kdalloc::LocationInfo::LI_AllocatedOrQuarantined); + assert(allocator.location_info(allocations[choice].first, + allocations[choice].second) == + klee::kdalloc::LocationInfo::LI_AllocatedOrQuarantined); allocator.free(allocations[choice].first, allocations[choice].second); + assert(allocator.location_info(allocations[choice].first, 1) == + klee::kdalloc::LocationInfo::LI_Unallocated); + assert(allocator.location_info(allocations[choice].first, + allocations[choice].second) == + klee::kdalloc::LocationInfo::LI_Unallocated); #else free(allocations[choice].first); #endif @@ -152,7 +162,7 @@ int main() { auto start = std::chrono::steady_clock::now(); RandomTest tester; - tester.run(10'000'000); + tester.run(1'000'000); auto stop = std::chrono::steady_clock::now(); std::cout << std::dec From b374f04f313f65915df7017b5260654aa49c19b0 Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Thu, 29 Jun 2023 01:00:01 +0000 Subject: [PATCH 203/320] rename Allocator::location_info to Allocator::locationInfo for consistency --- include/klee/KDAlloc/allocator.h | 4 ++-- include/klee/KDAlloc/suballocators/sized_regions.h | 2 +- lib/Core/Executor.cpp | 8 ++++---- unittests/KDAlloc/randomtest.cpp | 12 ++++++------ 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/include/klee/KDAlloc/allocator.h b/include/klee/KDAlloc/allocator.h index a0c2f162f7..5588d1d1a0 100644 --- a/include/klee/KDAlloc/allocator.h +++ b/include/klee/KDAlloc/allocator.h @@ -348,8 +348,8 @@ class Allocator final : public TaggedLogger { } } - LocationInfo location_info(void const *const ptr, - std::size_t const size) const noexcept { + LocationInfo locationInfo(void const *const ptr, + std::size_t const size) const noexcept { assert(*this && "Invalid allocator"); if (!ptr || reinterpret_cast(ptr) < 4096) { diff --git a/include/klee/KDAlloc/suballocators/sized_regions.h b/include/klee/KDAlloc/suballocators/sized_regions.h index 2fb12bf54d..bb2a0b6956 100644 --- a/include/klee/KDAlloc/suballocators/sized_regions.h +++ b/include/klee/KDAlloc/suballocators/sized_regions.h @@ -193,7 +193,7 @@ class SizedRegions { /// 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"); + assert(root && "Cannot compute location info for an empty treap"); Node const *currentNode = &*root; Node const *closestPredecessor = nullptr; diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp index 361a4e2e31..906484c6ef 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -4255,9 +4255,9 @@ void Executor::resolveExact(ExecutionState &state, if (MemoryManager::isDeterministic && CE) { using kdalloc::LocationInfo; auto ptr = reinterpret_cast(CE->getZExtValue()); - auto locinfo = unbound->heapAllocator.location_info(ptr, 1); - if (locinfo == LocationInfo::LI_AllocatedOrQuarantined && - locinfo.getBaseAddress() == ptr && name == "free") { + 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)); @@ -4400,7 +4400,7 @@ void Executor::executeMemoryOperation(ExecutionState &state, return; } else if (MemoryManager::isDeterministic) { using kdalloc::LocationInfo; - auto li = unbound->heapAllocator.location_info(ptr, bytes); + 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. diff --git a/unittests/KDAlloc/randomtest.cpp b/unittests/KDAlloc/randomtest.cpp index c78746bb0e..4d2eca9cf4 100644 --- a/unittests/KDAlloc/randomtest.cpp +++ b/unittests/KDAlloc/randomtest.cpp @@ -78,16 +78,16 @@ class RandomTest { auto choice = std::uniform_int_distribution( 0, allocations.size() - 1)(rng); #if defined(USE_KDALLOC) - assert(allocator.location_info(allocations[choice].first, 1) == + assert(allocator.locationInfo(allocations[choice].first, 1) == klee::kdalloc::LocationInfo::LI_AllocatedOrQuarantined); - assert(allocator.location_info(allocations[choice].first, - allocations[choice].second) == + assert(allocator.locationInfo(allocations[choice].first, + allocations[choice].second) == klee::kdalloc::LocationInfo::LI_AllocatedOrQuarantined); allocator.free(allocations[choice].first, allocations[choice].second); - assert(allocator.location_info(allocations[choice].first, 1) == + assert(allocator.locationInfo(allocations[choice].first, 1) == klee::kdalloc::LocationInfo::LI_Unallocated); - assert(allocator.location_info(allocations[choice].first, - allocations[choice].second) == + assert(allocator.locationInfo(allocations[choice].first, + allocations[choice].second) == klee::kdalloc::LocationInfo::LI_Unallocated); #else free(allocations[choice].first); From 3734251539d2192aafa938c530fa8eb45e48ecef Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Thu, 29 Jun 2023 01:08:14 +0000 Subject: [PATCH 204/320] Have CoWPtr::get and CoWPtr::getOwned return pointers instead of references --- include/klee/KDAlloc/suballocators/cow_ptr.h | 37 ++++++------------- .../KDAlloc/suballocators/sized_regions.h | 21 +++++------ 2 files changed, 21 insertions(+), 37 deletions(-) diff --git a/include/klee/KDAlloc/suballocators/cow_ptr.h b/include/klee/KDAlloc/suballocators/cow_ptr.h index 20e127016e..ce5957df1c 100644 --- a/include/klee/KDAlloc/suballocators/cow_ptr.h +++ b/include/klee/KDAlloc/suballocators/cow_ptr.h @@ -87,41 +87,26 @@ template class CoWPtr { /// Accesses an existing object. /// Must not be called when `*this` is in an empty state. T const &operator*() const noexcept { - assert(ptr && "the `CoWPtr` must not be empty"); - return get(); + 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(ptr && "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 &get() const noexcept { - assert(ptr && "the `CoWPtr` must not be empty"); - return ptr->data; + assert(!isEmpty() && "the `CoWPtr` must not be empty"); + return get(); } - /// Accesses 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; - } + /// 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; } - /// Accesses an existing, owned object. + /// Gets a pointer to an existing, owned object. /// Must not be called when `*this` does not hold CoW ownership. - /// - /// Note: This function is included for completeness' sake. Instead of calling - /// `getOwned` on a constant, one should probably just call `get` as it - /// produces the same result without requiring the target object to hold - /// ownership of the data. - T const &getOwned() const noexcept { + T *getOwned() noexcept { assert(isOwned() && "the `CoWPtr` must be owned"); - return ptr->data; + return &ptr->data; } /// Acquires CoW ownership of an existing object and returns a reference to @@ -132,7 +117,7 @@ template class CoWPtr { assert(ptr->referenceCount > 0); if (ptr->referenceCount > 1) { --ptr->referenceCount; - ptr = new Wrapper(*ptr); + ptr = new Wrapper{*ptr}; ptr->referenceCount = 1; } assert(ptr->referenceCount == 1); diff --git a/include/klee/KDAlloc/suballocators/sized_regions.h b/include/klee/KDAlloc/suballocators/sized_regions.h index bb2a0b6956..d8dafa8646 100644 --- a/include/klee/KDAlloc/suballocators/sized_regions.h +++ b/include/klee/KDAlloc/suballocators/sized_regions.h @@ -162,7 +162,7 @@ class SizedRegions { [[nodiscard]] std::size_t getSize(char const *const address) const noexcept { assert(root && "Cannot get size from an empty treap"); - Node const *currentNode = &*root; + Node const *currentNode = root.get(); Node const *closestPredecessor = nullptr; Node const *closestSuccessor = nullptr; while (currentNode) { @@ -170,12 +170,12 @@ class SizedRegions { assert(!closestSuccessor || currentNode->getBaseAddress() < closestSuccessor->getBaseAddress()); closestSuccessor = currentNode; - currentNode = &*currentNode->lhs; + currentNode = currentNode->lhs.get(); } else { assert(!closestPredecessor || currentNode->getBaseAddress() > closestPredecessor->getBaseAddress()); closestPredecessor = currentNode; - currentNode = &*currentNode->rhs; + currentNode = currentNode->rhs.get(); } } @@ -195,7 +195,7 @@ class SizedRegions { std::size_t const size) const noexcept { assert(root && "Cannot compute location info for an empty treap"); - Node const *currentNode = &*root; + Node const *currentNode = root.get(); Node const *closestPredecessor = nullptr; for (;;) { if (currentNode->getBaseAddress() <= address) { @@ -213,7 +213,7 @@ class SizedRegions { closestPredecessor->getBaseAddress() + closestPredecessor->getSize()}; } - currentNode = &*currentNode->rhs; + currentNode = currentNode->rhs.get(); } } else { assert(closestPredecessor && @@ -229,7 +229,7 @@ class SizedRegions { closestPredecessor->getBaseAddress() + closestPredecessor->getSize()}; } - currentNode = &*currentNode->lhs; + currentNode = currentNode->lhs.get(); } } } @@ -307,7 +307,7 @@ class SizedRegions { target = &targetNode.lhs; } - update.getOwned().rhs = std::move(rhs); + update.getOwned()->rhs = std::move(rhs); *target = std::move(update); } @@ -324,7 +324,7 @@ class SizedRegions { target = &targetNode.rhs; } - update.getOwned().lhs = std::move(lhs); + update.getOwned()->lhs = std::move(lhs); *target = std::move(update); } @@ -423,9 +423,8 @@ class SizedRegions { CoWPtr *closestSuccessor = nullptr; for (;;) { if (address < (*currentNode)->getBaseAddress()) { - assert(!closestSuccessor || - (*currentNode)->getBaseAddress() < - (*closestSuccessor)->getBaseAddress()); + assert(!closestSuccessor || (*currentNode)->getBaseAddress() < + (*closestSuccessor)->getBaseAddress()); closestSuccessor = currentNode; if ((*currentNode)->lhs) { currentNode = ¤tNode->acquire().lhs; From 1fb67ef82f2d1e79a2cdb9d12bf05b3514dd45a3 Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Thu, 29 Jun 2023 01:13:26 +0000 Subject: [PATCH 205/320] Implement getLocationInfo in the same style as getSize --- .../KDAlloc/suballocators/sized_regions.h | 49 ++++++++----------- 1 file changed, 21 insertions(+), 28 deletions(-) diff --git a/include/klee/KDAlloc/suballocators/sized_regions.h b/include/klee/KDAlloc/suballocators/sized_regions.h index d8dafa8646..8683f4d9c8 100644 --- a/include/klee/KDAlloc/suballocators/sized_regions.h +++ b/include/klee/KDAlloc/suballocators/sized_regions.h @@ -197,41 +197,34 @@ class SizedRegions { Node const *currentNode = root.get(); Node const *closestPredecessor = nullptr; - for (;;) { - if (currentNode->getBaseAddress() <= address) { + 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 <= + if (address + size > currentNode->getBaseAddress() + currentNode->getSize()) { - return LocationInfo::LI_Unallocated; - } else { return LocationInfo::LI_Unaligned; + } else { + return LocationInfo::LI_Unallocated; } - } else { - closestPredecessor = currentNode; - if (!currentNode->rhs) { - return {LocationInfo::LI_AllocatedOrQuarantined, - closestPredecessor->getBaseAddress() + - closestPredecessor->getSize()}; - } - currentNode = currentNode->rhs.get(); - } - } else { - assert(closestPredecessor && - "If there is no closest predecessor, there must not be a " - "predecessor at all. Since regions are only ever split, " - "this would mean that the lookup is outside the valid " - "range, which has to be handled by the caller."); - if (currentNode->getBaseAddress() < address + size) { - return LocationInfo::LI_Unaligned; - } - if (!currentNode->lhs) { - return {LocationInfo::LI_AllocatedOrQuarantined, - closestPredecessor->getBaseAddress() + - closestPredecessor->getSize()}; } - currentNode = currentNode->lhs.get(); + 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) { From c8acc60e25a120f9b2c8f0773068c2ce963d947e Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Wed, 28 Jun 2023 15:13:50 +0000 Subject: [PATCH 206/320] Using std::memcpy prevents alignment problems and removes an unnecessary special case --- lib/Expr/Expr.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/Expr/Expr.cpp b/lib/Expr/Expr.cpp index 2d3670d814..2026a07bea 100644 --- a/lib/Expr/Expr.cpp +++ b/lib/Expr/Expr.cpp @@ -21,6 +21,7 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/raw_ostream.h" +#include #include using namespace klee; @@ -369,14 +370,11 @@ void ConstantExpr::toMemory(void *address) { 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; case Expr::Int128: case Expr::Int256: case Expr::Int512: - memcpy(address, value.getRawData(), width / 8); + std::memcpy(address, value.getRawData(), width / 8); } } From 3034ae5878f2b1f3216ab1a7d2706edf27c8ae4c Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Wed, 28 Jun 2023 22:37:05 +0000 Subject: [PATCH 207/320] Combine all `ConstantExpr::toMemory` cases into one. Note that (as it did previously), this relies on the native types having the same internal representation as the ApInt type. --- lib/Expr/Expr.cpp | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/lib/Expr/Expr.cpp b/lib/Expr/Expr.cpp index 2026a07bea..7feba8ab4a 100644 --- a/lib/Expr/Expr.cpp +++ b/lib/Expr/Expr.cpp @@ -363,19 +363,7 @@ ref ConstantExpr::fromMemory(void *address, Width width) { void ConstantExpr::toMemory(void *address) { auto width = getWidth(); - switch (width) { - 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; - case Expr::Fl80: - case Expr::Int128: - case Expr::Int256: - case Expr::Int512: - std::memcpy(address, value.getRawData(), width / 8); - } + std::memcpy(address, value.getRawData(), (width + 7) / 8); } void ConstantExpr::toString(std::string &Res, unsigned radix) const { From 125fb26ceae09da92d17505071cad881ad31ba88 Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Wed, 28 Jun 2023 23:21:39 +0000 Subject: [PATCH 208/320] Simplify KDAlloc tests --- unittests/KDAlloc/CMakeLists.txt | 2 +- unittests/KDAlloc/allocate.cpp | 8 +++--- unittests/KDAlloc/randomtest.cpp | 43 +++++--------------------------- unittests/KDAlloc/reuse.cpp | 8 +++--- unittests/KDAlloc/sample.cpp | 8 +++--- unittests/KDAlloc/stacktest.cpp | 43 +++++--------------------------- 6 files changed, 22 insertions(+), 90 deletions(-) diff --git a/unittests/KDAlloc/CMakeLists.txt b/unittests/KDAlloc/CMakeLists.txt index 87d016d75f..0d19891bc3 100644 --- a/unittests/KDAlloc/CMakeLists.txt +++ b/unittests/KDAlloc/CMakeLists.txt @@ -5,7 +5,7 @@ add_klee_unit_test(KDAllocTest rusage.cpp sample.cpp stacktest.cpp) -target_compile_definitions(KDAllocTest PRIVATE KDALLOC_CHECKED USE_KDALLOC USE_GTEST_INSTEAD_OF_MAIN) +target_compile_definitions(KDAllocTest PRIVATE USE_GTEST_INSTEAD_OF_MAIN) target_compile_definitions(KDAllocTest PRIVATE ${KLEE_COMPONENT_CXX_DEFINES}) target_compile_options(KDAllocTest PRIVATE ${KLEE_COMPONENT_CXX_FLAGS}) target_include_directories(KDAllocTest PRIVATE ${KLEE_INCLUDE_DIRS}) \ No newline at end of file diff --git a/unittests/KDAlloc/allocate.cpp b/unittests/KDAlloc/allocate.cpp index c691e114ff..eb13d5e166 100644 --- a/unittests/KDAlloc/allocate.cpp +++ b/unittests/KDAlloc/allocate.cpp @@ -18,11 +18,7 @@ #include #include -#if defined(USE_GTEST_INSTEAD_OF_MAIN) -int allocate_sample_test() { -#else -int main() { -#endif +void allocate_sample_test() { // initialize a factory and an associated allocator (1 MiB and no quarantine) klee::kdalloc::AllocatorFactory factory(static_cast(1) << 20, 0); klee::kdalloc::Allocator allocator = factory.makeAllocator(); @@ -62,4 +58,6 @@ int main() { TEST(KDAllocDeathTest, AllocateSample) { ASSERT_EXIT(allocate_sample_test(), ::testing::ExitedWithCode(0), ""); } +#else +int main() { allocate_sample_test(); } #endif diff --git a/unittests/KDAlloc/randomtest.cpp b/unittests/KDAlloc/randomtest.cpp index 4d2eca9cf4..c926fb84f5 100644 --- a/unittests/KDAlloc/randomtest.cpp +++ b/unittests/KDAlloc/randomtest.cpp @@ -29,9 +29,7 @@ namespace { class RandomTest { xoshiro512 rng; -#if defined(USE_KDALLOC) klee::kdalloc::Allocator allocator; -#endif std::vector> allocations; @@ -44,16 +42,10 @@ class RandomTest { std::uint64_t deallocation_count = 0; RandomTest(std::uint64_t seed = 0x31337) - : rng(seed) -#if defined(USE_KDALLOC) - , - allocator(klee::kdalloc::AllocatorFactory( - static_cast(1) << 42, 0)) -#endif - , + : rng(seed), allocator(klee::kdalloc::AllocatorFactory( + static_cast(1) << 42, 0)), allocation_bin_distribution(0.3), - large_allocation_distribution(0.00003) { - } + large_allocation_distribution(0.00003) {} void run(std::uint64_t const iterations) { std::uniform_int_distribution choice(0, 999); @@ -77,7 +69,6 @@ class RandomTest { while (!allocations.empty()) { auto choice = std::uniform_int_distribution( 0, allocations.size() - 1)(rng); -#if defined(USE_KDALLOC) assert(allocator.locationInfo(allocations[choice].first, 1) == klee::kdalloc::LocationInfo::LI_AllocatedOrQuarantined); assert(allocator.locationInfo(allocations[choice].first, @@ -89,9 +80,6 @@ class RandomTest { assert(allocator.locationInfo(allocations[choice].first, allocations[choice].second) == klee::kdalloc::LocationInfo::LI_Unallocated); -#else - free(allocations[choice].first); -#endif allocations[choice] = allocations.back(); allocations.pop_back(); } @@ -106,11 +94,7 @@ class RandomTest { auto max = static_cast(1) << (bin + 2); auto size = std::uniform_int_distribution(min, max)(rng); -#if defined(USE_KDALLOC) allocations.emplace_back(allocator.allocate(size), size); -#else - allocations.emplace_back(std::malloc(size), size); -#endif if (allocations.size() > maximum_concurrent_allocations) { maximum_concurrent_allocations = allocations.size(); } @@ -122,11 +106,7 @@ class RandomTest { size = large_allocation_distribution(rng) + 4097; } -#if defined(USE_KDALLOC) allocations.emplace_back(allocator.allocate(size), size); -#else - allocations.emplace_back(std::malloc(size), size); -#endif if (allocations.size() > maximum_concurrent_allocations) { maximum_concurrent_allocations = allocations.size(); } @@ -138,27 +118,14 @@ class RandomTest { } auto choice = std::uniform_int_distribution( 0, allocations.size() - 1)(rng); -#if defined(USE_KDALLOC) allocator.free(allocations[choice].first, allocations[choice].second); -#else - free(allocations[choice].first); -#endif allocations[choice] = allocations.back(); allocations.pop_back(); } }; } // namespace -#if defined(USE_GTEST_INSTEAD_OF_MAIN) -int random_test() { -#else -int main() { -#endif -#if defined(USE_KDALLOC) - std::cout << "Using kdalloc\n"; -#else - std::cout << "Using std::malloc\n"; -#endif +void random_test() { auto start = std::chrono::steady_clock::now(); RandomTest tester; @@ -184,4 +151,6 @@ int main() { TEST(KDAllocDeathTest, Random) { ASSERT_EXIT(random_test(), ::testing::ExitedWithCode(0), ""); } +#else +int main() { random_test(); } #endif diff --git a/unittests/KDAlloc/reuse.cpp b/unittests/KDAlloc/reuse.cpp index d886a9d627..e6c79ddc5f 100644 --- a/unittests/KDAlloc/reuse.cpp +++ b/unittests/KDAlloc/reuse.cpp @@ -19,11 +19,7 @@ #include #include -#if defined(USE_GTEST_INSTEAD_OF_MAIN) -int reuse_test() { -#else -int main() { -#endif +void reuse_test() { { static const std::size_t size = 8; static const std::uint32_t quarantine = 0; @@ -131,4 +127,6 @@ int main() { TEST(KDAllocDeathTest, Reuse) { ASSERT_EXIT(reuse_test(), ::testing::ExitedWithCode(0), ""); } +#else +int main() { reuse_test(); } #endif diff --git a/unittests/KDAlloc/sample.cpp b/unittests/KDAlloc/sample.cpp index 365e7e2146..ddf8b75d3a 100644 --- a/unittests/KDAlloc/sample.cpp +++ b/unittests/KDAlloc/sample.cpp @@ -15,11 +15,7 @@ #include -#if defined(USE_GTEST_INSTEAD_OF_MAIN) -int sample_test() { -#else -int main() { -#endif +void sample_test() { // initialize a factory and an associated allocator (1 TiB and no quarantine) klee::kdalloc::AllocatorFactory factory(static_cast(1) << 40, 0); klee::kdalloc::Allocator allocator = factory.makeAllocator(); @@ -64,4 +60,6 @@ int main() { TEST(KDAllocDeathTest, Sample) { ASSERT_EXIT(sample_test(), ::testing::ExitedWithCode(0), ""); } +#else +int main() { sample_test(); } #endif diff --git a/unittests/KDAlloc/stacktest.cpp b/unittests/KDAlloc/stacktest.cpp index 2844bf1136..e2251b766a 100644 --- a/unittests/KDAlloc/stacktest.cpp +++ b/unittests/KDAlloc/stacktest.cpp @@ -29,9 +29,7 @@ namespace { class RandomTest { xoshiro512 rng; -#if defined(USE_KDALLOC) klee::kdalloc::StackAllocator allocator; -#endif std::vector> allocations; @@ -44,16 +42,10 @@ class RandomTest { std::uint64_t deallocation_count = 0; RandomTest(std::mt19937_64::result_type seed = 0x31337) - : rng(seed) -#if defined(USE_KDALLOC) - , - allocator(klee::kdalloc::StackAllocatorFactory( - static_cast(1) << 42, 0)) -#endif - , + : rng(seed), allocator(klee::kdalloc::StackAllocatorFactory( + static_cast(1) << 42, 0)), allocation_bin_distribution(0.3), - large_allocation_distribution(0.00003) { - } + large_allocation_distribution(0.00003) {} void run(std::uint64_t const iterations) { allocations.reserve((iterations * 7) / 10); @@ -76,11 +68,7 @@ class RandomTest { void cleanup() { while (!allocations.empty()) { -#if defined(USE_KDALLOC) allocator.free(allocations.back().first, allocations.back().second); -#else - free(allocations.back().first); -#endif allocations.pop_back(); } } @@ -94,11 +82,7 @@ class RandomTest { auto max = static_cast(1) << (bin + 2); auto size = std::uniform_int_distribution(min, max)(rng); -#if defined(USE_KDALLOC) allocations.emplace_back(allocator.allocate(size), size); -#else - allocations.emplace_back(std::malloc(size), size); -#endif if (allocations.size() > maximum_concurrent_allocations) { maximum_concurrent_allocations = allocations.size(); } @@ -110,11 +94,7 @@ class RandomTest { size = large_allocation_distribution(rng) + 4097; } -#if defined(USE_KDALLOC) allocations.emplace_back(allocator.allocate(size), size); -#else - allocations.emplace_back(std::malloc(size), size); -#endif if (allocations.size() > maximum_concurrent_allocations) { maximum_concurrent_allocations = allocations.size(); } @@ -124,26 +104,13 @@ class RandomTest { if (allocations.empty()) { return; } -#if defined(USE_KDALLOC) allocator.free(allocations.back().first, allocations.back().second); -#else - free(allocations.back().first); -#endif allocations.pop_back(); } }; } // namespace -#if defined(USE_GTEST_INSTEAD_OF_MAIN) -int stack_test() { -#else -int main() { -#endif -#if defined(USE_KDALLOC) - std::cout << "Using kdalloc\n"; -#else - std::cout << "Using std::malloc\n"; -#endif +void stack_test() { auto start = std::chrono::steady_clock::now(); RandomTest tester; @@ -169,4 +136,6 @@ int main() { TEST(KDAllocDeathTest, Stack) { ASSERT_EXIT(stack_test(), ::testing::ExitedWithCode(0), ""); } +#else +int main() { stack_test(); } #endif From 8ad9f2aaf4e9e51c3f8b5e24aec56dae4e49e983 Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Wed, 5 Jul 2023 14:11:42 +0000 Subject: [PATCH 209/320] remove timings from kdalloc tests --- unittests/KDAlloc/randomtest.cpp | 11 ----------- unittests/KDAlloc/stacktest.cpp | 11 ----------- 2 files changed, 22 deletions(-) diff --git a/unittests/KDAlloc/randomtest.cpp b/unittests/KDAlloc/randomtest.cpp index c926fb84f5..1216df1a74 100644 --- a/unittests/KDAlloc/randomtest.cpp +++ b/unittests/KDAlloc/randomtest.cpp @@ -15,7 +15,6 @@ #endif #include -#include #include #include #include @@ -126,19 +125,9 @@ class RandomTest { } // namespace void random_test() { - auto start = std::chrono::steady_clock::now(); - RandomTest tester; tester.run(1'000'000); - auto stop = std::chrono::steady_clock::now(); - std::cout << std::dec - << std::chrono::duration_cast(stop - - start) - .count() - << " ms\n"; - std::cout << "\n"; - std::cout << "Allocations: " << tester.allocation_count << "\n"; std::cout << "Deallocations: " << tester.deallocation_count << "\n"; std::cout << "Maximum concurrent allocations: " diff --git a/unittests/KDAlloc/stacktest.cpp b/unittests/KDAlloc/stacktest.cpp index e2251b766a..614a0379ac 100644 --- a/unittests/KDAlloc/stacktest.cpp +++ b/unittests/KDAlloc/stacktest.cpp @@ -15,7 +15,6 @@ #endif #include -#include #include #include #include @@ -111,19 +110,9 @@ class RandomTest { } // namespace void stack_test() { - auto start = std::chrono::steady_clock::now(); - RandomTest tester; tester.run(10'000'000); - auto stop = std::chrono::steady_clock::now(); - std::cout << std::dec - << std::chrono::duration_cast(stop - - start) - .count() - << " ms\n"; - std::cout << "\n"; - std::cout << "Allocations: " << tester.allocation_count << "\n"; std::cout << "Deallocations: " << tester.deallocation_count << "\n"; std::cout << "Maximum concurrent allocations: " From 9cb9fd54846415d0c271cd178d4a9bfe6493ad00 Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Fri, 23 Jun 2023 22:05:12 +0100 Subject: [PATCH 210/320] Replaced --suppress-external-warnings and --all-external-warnings with --external-call-warnings=none|once-per-function|all. This eliminates the ambiguity when both of the old options were set. Added test for the new option. --- lib/Core/Executor.cpp | 37 +++++++++++++++++++++------------- test/Feature/ExtCallWarnings.c | 26 ++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 14 deletions(-) create mode 100644 test/Feature/ExtCallWarnings.c diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp index 906484c6ef..b4da6a086a 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -198,17 +198,27 @@ cl::opt ExternalCalls( 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 every time 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(ExternalCallPolicy::All, "all", + "Always warn")), + cl::init(ExtCallWarnings::OncePerFunction), cl::cat(ExtCallsCat)); cl::opt ExternalPageThreshold( @@ -1323,7 +1333,7 @@ Executor::toConstant(ExecutionState &state, << " to value " << value << " (" << (*(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()); @@ -3966,8 +3976,7 @@ 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: " << callable->getName().str() << "("; @@ -3978,7 +3987,7 @@ void Executor::callExternalFunction(ExecutionState &state, } os << ") at " << state.pc->getSourceLocation(); - if (AllExternalWarnings) + if (ExternalCallWarnings == ExtCallWarnings::All) klee_warning("%s", os.str().c_str()); else klee_warning_once(callable->getValue(), "%s", os.str().c_str()); 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 +} From 974f140d79a621785b1fe4a0fc7fe321ba1089e2 Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Fri, 7 Jul 2023 23:55:47 +0100 Subject: [PATCH 211/320] Move some options to the klee namespace and declare them in OptionCategories.h --- include/klee/Support/OptionCategories.h | 5 +++++ lib/Core/MemoryManager.cpp | 2 -- lib/Core/StatsTracker.cpp | 4 ++-- lib/Core/UserSearcher.cpp | 11 +++++------ 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/include/klee/Support/OptionCategories.h b/include/klee/Support/OptionCategories.h index bde9a4eb50..430ff7b183 100644 --- a/include/klee/Support/OptionCategories.h +++ b/include/klee/Support/OptionCategories.h @@ -22,11 +22,16 @@ 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 SeedingCat; extern llvm::cl::OptionCategory SolvingCat; + extern llvm::cl::OptionCategory StatsCat; extern llvm::cl::OptionCategory TerminationCat; extern llvm::cl::OptionCategory TestGenCat; } diff --git a/lib/Core/MemoryManager.cpp b/lib/Core/MemoryManager.cpp index bdb89bb54f..a6c3cb25f8 100644 --- a/lib/Core/MemoryManager.cpp +++ b/lib/Core/MemoryManager.cpp @@ -43,9 +43,7 @@ std::uint32_t MemoryManager::quarantine; std::size_t MemoryManager::pageSize = sysconf(_SC_PAGE_SIZE); bool MemoryManager::isDeterministic; -} // namespace klee -namespace { llvm::cl::OptionCategory MemoryCat("Memory management options", "These options control memory management."); diff --git a/lib/Core/StatsTracker.cpp b/lib/Core/StatsTracker.cpp index 305c6da220..6cb14cf350 100644 --- a/lib/Core/StatsTracker.cpp +++ b/lib/Core/StatsTracker.cpp @@ -54,7 +54,7 @@ using namespace llvm; /// -namespace { +namespace klee { cl::OptionCategory StatsCat("Statistics options", "These options control the statistics generated by KLEE."); @@ -116,7 +116,7 @@ cl::opt UseCallPaths("use-call-paths", cl::init(true), "level statistics (default=true)"), cl::cat(StatsCat)); -} // namespace +} // namespace klee /// diff --git a/lib/Core/UserSearcher.cpp b/lib/Core/UserSearcher.cpp index 398c44a98c..19ac37180c 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,6 +100,7 @@ bool klee::userSearcherRequiresMD2U() { std::find(CoreSearch.begin(), CoreSearch.end(), Searcher::NURS_QC) != CoreSearch.end()); } +} // namespace klee Searcher *getNewSearcher(Searcher::CoreSearchType type, RNG &rng, PTree &processTree) { Searcher *searcher = nullptr; From 7082eafd05b4f268132ab94772c0243dbebf5087 Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Fri, 23 Jun 2023 22:34:12 +0100 Subject: [PATCH 212/320] Add code to only keep in the --help menu the KLEE/Kleaver option categories --- include/klee/Solver/SolverCmdLine.h | 12 +++++++----- lib/Solver/SolverCmdLine.cpp | 16 ++++++++++++---- tools/kleaver/main.cpp | 6 +----- tools/klee/main.cpp | 23 +++++++++++------------ 4 files changed, 31 insertions(+), 26 deletions(-) diff --git a/include/klee/Solver/SolverCmdLine.h b/include/klee/Solver/SolverCmdLine.h index 90c162ee6b..4414dc7ae1 100644 --- a/include/klee/Solver/SolverCmdLine.h +++ b/include/klee/Solver/SolverCmdLine.h @@ -24,6 +24,8 @@ DISABLE_WARNING_DEPRECATED_DECLARATIONS #include "llvm/Support/CommandLine.h" DISABLE_WARNING_POP +#include + namespace klee { extern llvm::cl::opt UseFastCexSolver; @@ -86,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/lib/Solver/SolverCmdLine.cpp b/lib/Solver/SolverCmdLine.cpp index b0bff6e69a..a371d5e40e 100644 --- a/lib/Solver/SolverCmdLine.cpp +++ b/lib/Solver/SolverCmdLine.cpp @@ -112,16 +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 (elem.first() == "version" || elem.first() == "color" || + elem.first() == "help" || elem.first() == "help-list") + continue; + + bool keep = false; for (auto &cat : elem.second->Categories) { - 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/tools/kleaver/main.cpp b/tools/kleaver/main.cpp index 51298dfb22..42ca0c5576 100644 --- a/tools/kleaver/main.cpp +++ b/tools/kleaver/main.cpp @@ -382,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/main.cpp b/tools/klee/main.cpp index 483397c1c7..a3062d24fa 100644 --- a/tools/klee/main.cpp +++ b/tools/klee/main.cpp @@ -9,18 +9,18 @@ // //===----------------------------------------------------------------------===// +#include "klee/ADT/KTest.h" #include "klee/ADT/TreeStream.h" #include "klee/Config/Version.h" #include "klee/Core/Interpreter.h" #include "klee/Expr/Expr.h" -#include "klee/ADT/KTest.h" -#include "klee/Support/OptionCategories.h" -#include "klee/Statistics/Statistics.h" #include "klee/Solver/SolverCmdLine.h" +#include "klee/Statistics/Statistics.h" #include "klee/Support/Debug.h" #include "klee/Support/ErrorHandling.h" #include "klee/Support/FileHandling.h" #include "klee/Support/ModuleUtil.h" +#include "klee/Support/OptionCategories.h" #include "klee/Support/PrintVersion.h" #include "klee/System/Time.h" @@ -44,15 +44,15 @@ DISABLE_WARNING_DEPRECATED_DECLARATIONS #include "llvm/Support/Path.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/Support/TargetSelect.h" #include "llvm/Support/Signals.h" +#include "llvm/Support/TargetSelect.h" DISABLE_WARNING_POP #include #include -#include #include #include +#include #include #include @@ -61,7 +61,6 @@ DISABLE_WARNING_POP #include #include - using namespace llvm; using namespace klee; @@ -1118,13 +1117,13 @@ linkWithUclibc(StringRef libDir, std::string opt_suffix, } int main(int argc, char **argv, char **envp) { - atexit(llvm_shutdown); // Call llvm_shutdown() on exit. + atexit(llvm_shutdown); // Call llvm_shutdown() on exit -#if LLVM_VERSION_CODE >= LLVM_VERSION(13, 0) - KCommandLine::HideOptions(llvm::cl::getGeneralCategory()); -#else - KCommandLine::HideOptions(llvm::cl::GeneralCategory); -#endif + KCommandLine::KeepOnlyCategories( + {&ChecksCat, &DebugCat, &ExtCallsCat, &ExprCat, &LinkCat, + &MemoryCat, &MergeCat, &MiscCat, &ModuleCat, &ReplayCat, + &SearchCat, &SeedingCat, &SolvingCat, &StartCat, &StatsCat, + &TerminationCat, &TestCaseCat, &TestGenCat}); llvm::InitializeNativeTarget(); From 9912da3912436a71949b1b97d96975bddcb169e3 Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Fri, 18 Aug 2023 15:07:27 +0100 Subject: [PATCH 213/320] Remove broken experimental optimisation for validity (--cex-cache-exp) --- lib/Solver/CexCachingSolver.cpp | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/lib/Solver/CexCachingSolver.cpp b/lib/Solver/CexCachingSolver.cpp index dbbd351660..87e6169ca6 100644 --- a/lib/Solver/CexCachingSolver.cpp +++ b/lib/Solver/CexCachingSolver.cpp @@ -48,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 /// @@ -302,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; From 2e393db175cd55662f369d15905ce4eb44b154a9 Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Fri, 18 Aug 2023 15:32:52 +0100 Subject: [PATCH 214/320] Changed use-after-free and double-free tests to expect KDAlloc, plus some small improvements. --- test/Feature/DoubleFree.c | 8 +++++--- test/Feature/MultipleFreeResolution.c | 10 ++++++---- test/Feature/OneFreeError.c | 8 +++++--- ...07-10-11-illegal-access-after-free-and-branch.c | 14 +++++++------- 4 files changed, 23 insertions(+), 17 deletions(-) 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/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/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/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); From 9edf8e8bba51f2d217ead0a9b2469b0b551ad255 Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Fri, 18 Aug 2023 15:36:16 +0100 Subject: [PATCH 215/320] Make KDAlloc the default memory allocator --- lib/Core/MemoryManager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Core/MemoryManager.cpp b/lib/Core/MemoryManager.cpp index a6c3cb25f8..3b0f506407 100644 --- a/lib/Core/MemoryManager.cpp +++ b/lib/Core/MemoryManager.cpp @@ -49,8 +49,8 @@ llvm::cl::OptionCategory MemoryCat("Memory management options", llvm::cl::opt DeterministicAllocation( "kdalloc", - llvm::cl::desc("Allocate memory deterministically (default=false)"), - llvm::cl::location(MemoryManager::isDeterministic), llvm::cl::init(false), + 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( From fc83f06b17221bf5ef20e30d9da1ccff927beb17 Mon Sep 17 00:00:00 2001 From: Daniel Schemmel Date: Tue, 17 Oct 2023 12:05:22 +0100 Subject: [PATCH 216/320] replace deprecated (as of c++20) std::is_pod with std::trivial && std::is_standard_layout --- .../klee/KDAlloc/suballocators/slot_allocator.h | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/include/klee/KDAlloc/suballocators/slot_allocator.h b/include/klee/KDAlloc/suballocators/slot_allocator.h index 1d0d42a8f6..9be5d2df4e 100644 --- a/include/klee/KDAlloc/suballocators/slot_allocator.h +++ b/include/klee/KDAlloc/suballocators/slot_allocator.h @@ -25,8 +25,7 @@ namespace klee::kdalloc::suballocators { namespace slotallocator { -template -class SlotAllocator; +template class SlotAllocator; struct Data final { /// The reference count. @@ -51,8 +50,7 @@ struct Data final { }; class Control final : public TaggedLogger { - template - friend class SlotAllocator; + template friend class SlotAllocator; /// pointer to the start of the range managed by this allocator char *baseAddress = nullptr; @@ -161,12 +159,14 @@ class Control final : public TaggedLogger { } }; -template<> +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_pod::value, "Data must be POD"); + static_assert(std::is_trivial::value && + std::is_standard_layout::value, + "Data must be POD"); Data *data = nullptr; @@ -533,8 +533,7 @@ class SlotAllocator final : public TaggedLogger> { } }; - -template<> +template <> class SlotAllocator final : public TaggedLogger> { std::size_t next; From 19b6ae578b0658115d15848604a28434845bb3e3 Mon Sep 17 00:00:00 2001 From: Frank Busse Date: Fri, 24 Mar 2023 21:14:02 +0000 Subject: [PATCH 217/320] new: persistent ptree (-write-ptree) and klee-ptree Introduce three different kinds of process trees: 1. Noop: does nothing (e.g. no allocations for DFS) 2. InMemory: same behaviour as before (e.g. RandomPathSearcher) 3. Persistent: similar to InMemory but writes nodes to ptree.db and tracks information such as branch type, termination type or source location (asm) in nodes. Enabled with -write-ptree ptree.db files can be analysed/plotted with the new "klee-ptree" tool. --- CMakeLists.txt | 10 + include/klee/Support/OptionCategories.h | 1 + lib/Core/CMakeLists.txt | 1 + lib/Core/Executor.cpp | 23 +- lib/Core/Executor.h | 5 +- lib/Core/PTree.cpp | 172 ++++++++--- lib/Core/PTree.h | 205 +++++++++++--- lib/Core/PTreeWriter.cpp | 196 +++++++++++++ lib/Core/PTreeWriter.h | 46 +++ lib/Core/Searcher.cpp | 23 +- lib/Core/Searcher.h | 4 +- lib/Core/SpecialFunctionHandler.cpp | 8 +- lib/Core/UserSearcher.cpp | 12 +- lib/Core/UserSearcher.h | 1 + test/CMakeLists.txt | 2 +- test/Feature/KleePtreeBogus.test | 65 +++++ test/Feature/WritePtree.c | 78 +++++ test/Feature/ptree-dbs/duplicated_node.csv | 5 + test/Feature/ptree-dbs/empty_db.csv | 1 + test/Feature/ptree-dbs/invalid_btype.csv | 4 + test/Feature/ptree-dbs/invalid_ttype.csv | 4 + test/Feature/ptree-dbs/loop.csv | 5 + test/Feature/ptree-dbs/missing_after_max.csv | 5 + test/Feature/ptree-dbs/missing_before_max.csv | 5 + test/Feature/ptree-dbs/node_id0.csv | 6 + test/Feature/ptree-dbs/not_a.db | 1 + test/lit.cfg | 9 + test/lit.site.cfg.in | 3 + tools/CMakeLists.txt | 1 + tools/klee-ptree/CMakeLists.txt | 16 ++ tools/klee-ptree/DFSVisitor.cpp | 46 +++ tools/klee-ptree/DFSVisitor.h | 31 ++ tools/klee-ptree/Printers.cpp | 266 ++++++++++++++++++ tools/klee-ptree/Printers.h | 30 ++ tools/klee-ptree/Tree.cpp | 208 ++++++++++++++ tools/klee-ptree/Tree.h | 53 ++++ tools/klee-ptree/main.cpp | 68 +++++ tools/klee/main.cpp | 2 +- unittests/Searcher/CMakeLists.txt | 4 +- unittests/Searcher/SearcherTest.cpp | 26 +- 40 files changed, 1520 insertions(+), 131 deletions(-) create mode 100644 lib/Core/PTreeWriter.cpp create mode 100644 lib/Core/PTreeWriter.h create mode 100644 test/Feature/KleePtreeBogus.test create mode 100644 test/Feature/WritePtree.c create mode 100644 test/Feature/ptree-dbs/duplicated_node.csv create mode 100644 test/Feature/ptree-dbs/empty_db.csv create mode 100644 test/Feature/ptree-dbs/invalid_btype.csv create mode 100644 test/Feature/ptree-dbs/invalid_ttype.csv create mode 100644 test/Feature/ptree-dbs/loop.csv create mode 100644 test/Feature/ptree-dbs/missing_after_max.csv create mode 100644 test/Feature/ptree-dbs/missing_before_max.csv create mode 100644 test/Feature/ptree-dbs/node_id0.csv create mode 100644 test/Feature/ptree-dbs/not_a.db create mode 100644 tools/klee-ptree/CMakeLists.txt create mode 100644 tools/klee-ptree/DFSVisitor.cpp create mode 100644 tools/klee-ptree/DFSVisitor.h create mode 100644 tools/klee-ptree/Printers.cpp create mode 100644 tools/klee-ptree/Printers.h create mode 100644 tools/klee-ptree/Tree.cpp create mode 100644 tools/klee-ptree/Tree.h create mode 100644 tools/klee-ptree/main.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 19e9fc06a5..4fd68d4257 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -310,6 +310,16 @@ 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() + ################################################################################ # Detect libcap ################################################################################ diff --git a/include/klee/Support/OptionCategories.h b/include/klee/Support/OptionCategories.h index 430ff7b183..152241c9a3 100644 --- a/include/klee/Support/OptionCategories.h +++ b/include/klee/Support/OptionCategories.h @@ -29,6 +29,7 @@ namespace klee { extern llvm::cl::OptionCategory MiscCat; extern llvm::cl::OptionCategory ModuleCat; extern llvm::cl::OptionCategory SearchCat; + extern llvm::cl::OptionCategory PTreeCat; extern llvm::cl::OptionCategory SeedingCat; extern llvm::cl::OptionCategory SolvingCat; extern llvm::cl::OptionCategory StatsCat; diff --git a/lib/Core/CMakeLists.txt b/lib/Core/CMakeLists.txt index 9005a1ff89..8df3e25980 100644 --- a/lib/Core/CMakeLists.txt +++ b/lib/Core/CMakeLists.txt @@ -20,6 +20,7 @@ add_library(kleeCore Memory.cpp MemoryManager.cpp PTree.cpp + PTreeWriter.cpp Searcher.cpp SeedInfo.cpp SpecialFunctionHandler.cpp diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp index b4da6a086a..8f70540c2e 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -3639,14 +3639,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(); + processTree->setTerminationType(state, reason); std::vector::iterator it = std::find(addedStates.begin(), addedStates.end(), &state); @@ -3690,7 +3691,7 @@ void Executor::terminateStateOnExit(ExecutionState &state) { terminationTypeFileExtension(StateTerminationType::Exit).c_str()); interpreterHandler->incPathsCompleted(); - terminateState(state); + terminateState(state, StateTerminationType::Exit); } void Executor::terminateStateEarly(ExecutionState &state, const Twine &message, @@ -3707,7 +3708,7 @@ void Executor::terminateStateEarly(ExecutionState &state, const Twine &message, terminationTypeFileExtension(reason).c_str()); } - terminateState(state); + terminateState(state, reason); } void Executor::terminateStateEarlyAlgorithm(ExecutionState &state, @@ -3815,7 +3816,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; @@ -3848,9 +3849,14 @@ void Executor::terminateStateOnSolverError(ExecutionState &state, } void Executor::terminateStateOnUserError(ExecutionState &state, - const llvm::Twine &message) { + const llvm::Twine &message, + bool writeErr) { ++stats::terminationUserError; - terminateStateOnError(state, message, StateTerminationType::User, ""); + if (writeErr) { + terminateStateOnError(state, message, StateTerminationType::User, ""); + } else { + terminateState(state, StateTerminationType::User); + } } // XXX shoot me @@ -4601,7 +4607,8 @@ void Executor::runFunctionAsMain(Function *f, initializeGlobals(*state); - processTree = std::make_unique(state); + processTree = createPTree(*state, userSearcherRequiresInMemoryPTree(), + *interpreterHandler); run(*state); processTree = nullptr; diff --git a/lib/Core/Executor.h b/lib/Core/Executor.h index 204638e857..3635de78a9 100644 --- a/lib/Core/Executor.h +++ b/lib/Core/Executor.h @@ -412,7 +412,7 @@ class Executor : public Interpreter { /// Remove state from queue and delete state. This function should only be /// used in the termination functions below. - void terminateState(ExecutionState &state); + void terminateState(ExecutionState &state, StateTerminationType reason); /// Call exit handler and terminate state normally /// (end of execution path) @@ -467,7 +467,8 @@ 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(); diff --git a/lib/Core/PTree.cpp b/lib/Core/PTree.cpp index 6c17e29698..c5b640d3cc 100644 --- a/lib/Core/PTree.cpp +++ b/lib/Core/PTree.cpp @@ -11,49 +11,88 @@ #include "ExecutionState.h" -#include "klee/Expr/Expr.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; -using namespace llvm; + +namespace klee { +llvm::cl::OptionCategory + PTreeCat("Process tree related options", + "These options affect the process tree handling."); +} namespace { +llvm::cl::opt CompressProcessTree( + "compress-process-tree", + llvm::cl::desc("Remove intermediate nodes in the process " + "tree whenever possible (default=false)"), + llvm::cl::init(false), llvm::cl::cat(PTreeCat)); + +llvm::cl::opt WritePTree( + "write-ptree", llvm::cl::init(false), + llvm::cl::desc("Write process tree into ptree.db (default=false)"), + llvm::cl::cat(PTreeCat)); +} // 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)); +// PTreeNode -} // namespace +PTreeNode::PTreeNode(PTreeNode *parent, ExecutionState *state) noexcept + : parent{parent}, left{nullptr}, right{nullptr}, state{state} { + state->ptreeNode = this; +} + +// AnnotatedPTreeNode + +AnnotatedPTreeNode::AnnotatedPTreeNode(PTreeNode *parent, + ExecutionState *state) noexcept + : PTreeNode(parent, state) { + id = nextID++; +} -PTree::PTree(ExecutionState *initialState) - : root(PTreeNodePtr(new PTreeNode(nullptr, initialState))) { - initialState->ptreeNode = root.getPointer(); +// NoopPTree + +void NoopPTree::dump(llvm::raw_ostream &os) noexcept { + os << "digraph G {\nTreeNotAvailable [shape=box]\n}"; } -void PTree::attach(PTreeNode *node, ExecutionState *leftState, - ExecutionState *rightState, BranchType reason) { +// InMemoryPTree + +InMemoryPTree::InMemoryPTree(ExecutionState &initialState) noexcept { + root = PTreeNodePtr(createNode(nullptr, &initialState)); + initialState.ptreeNode = root.getPointer(); +} + +PTreeNode *InMemoryPTree::createNode(PTreeNode *parent, ExecutionState *state) { + return new PTreeNode(parent, state); +} + +void InMemoryPTree::attach(PTreeNode *node, ExecutionState *leftState, + ExecutionState *rightState, + BranchType reason) noexcept { 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)); + node->left = PTreeNodePtr(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 = PTreeNodePtr(new PTreeNode(node, rightState), currentNodeTag); + node->right = PTreeNodePtr(createNode(node, rightState), currentNodeTag); + updateBranchingNode(*node, reason); + node->state = nullptr; } -void PTree::remove(PTreeNode *n) { +void InMemoryPTree::remove(PTreeNode *n) noexcept { assert(!n->left.getPointer() && !n->right.getPointer()); + updateTerminatingNode(*n); do { PTreeNode *p = n->parent; if (p) { @@ -92,17 +131,17 @@ void PTree::remove(PTreeNode *n) { } } -void PTree::dump(llvm::raw_ostream &os) { - ExprPPrinter *pp = ExprPPrinter::create(os); +void InMemoryPTree::dump(llvm::raw_ostream &os) noexcept { + std::unique_ptr 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; + 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 PTreeNode *n = stack.back(); @@ -112,24 +151,85 @@ void PTree::dump(llvm::raw_ostream &os) { os << ",fillcolor=green"; os << "];\n"; if (n->left.getPointer()) { - os << "\tn" << n << " -> n" << n->left.getPointer(); - os << " [label=0b" + 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(); - os << " [label=0b" + 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"; - delete pp; } -PTreeNode::PTreeNode(PTreeNode *parent, ExecutionState *state) : parent{parent}, state{state} { - state->ptreeNode = this; - left = PTreeNodePtr(nullptr); - right = PTreeNodePtr(nullptr); +std::uint8_t InMemoryPTree::getNextId() noexcept { + static_assert(PtrBitCount <= 8); + std::uint8_t id = 1 << registeredIds++; + if (registeredIds > PtrBitCount) { + klee_error("PTree cannot support more than %d RandomPathSearchers", + PtrBitCount); + } + return id; +} + +// PersistentPTree + +PersistentPTree::PersistentPTree(ExecutionState &initialState, + InterpreterHandler &ih) noexcept + : writer(ih.getOutputFilename("ptree.db")) { + root = PTreeNodePtr(createNode(nullptr, &initialState)); + initialState.ptreeNode = root.getPointer(); +} + +void PersistentPTree::dump(llvm::raw_ostream &os) noexcept { + writer.batchCommit(true); + InMemoryPTree::dump(os); +} + +PTreeNode *PersistentPTree::createNode(PTreeNode *parent, + ExecutionState *state) { + return new AnnotatedPTreeNode(parent, state); +} + +void PersistentPTree::setTerminationType(ExecutionState &state, + StateTerminationType type) { + auto *annotatedNode = llvm::cast(state.ptreeNode); + annotatedNode->kind = type; +} + +void PersistentPTree::updateBranchingNode(PTreeNode &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 PersistentPTree::updateTerminatingNode(PTreeNode &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::createPTree(ExecutionState &initialState, + bool inMemory, + InterpreterHandler &ih) { + if (WritePTree) + return std::make_unique(initialState, ih); + + if (inMemory) + return std::make_unique(initialState); + + return std::make_unique(); +}; diff --git a/lib/Core/PTree.h b/lib/Core/PTree.h index dbee70dda9..ab3f04334a 100644 --- a/lib/Core/PTree.h +++ b/lib/Core/PTree.h @@ -10,57 +10,170 @@ #ifndef KLEE_PTREE_H #define KLEE_PTREE_H +#include "PTreeWriter.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 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; - } - }; -} +class ExecutionState; +class Executor; +class InMemoryPTree; +class InterpreterHandler; +class PTreeNode; +class Searcher; + +/* 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 std::uint8_t PtrBitCount = 3; +using PTreeNodePtr = llvm::PointerIntPair; + +class PTreeNode { +public: + enum class NodeType : std::uint8_t { Basic, Annotated }; + + PTreeNode *parent{nullptr}; + PTreeNodePtr left; + PTreeNodePtr right; + ExecutionState *state{nullptr}; + + PTreeNode(PTreeNode *parent, ExecutionState *state) noexcept; + virtual ~PTreeNode() = default; + PTreeNode(const PTreeNode &) = delete; + PTreeNode &operator=(PTreeNode const &) = delete; + PTreeNode(PTreeNode &&) = delete; + PTreeNode &operator=(PTreeNode &&) = delete; + + [[nodiscard]] virtual NodeType getType() const { return NodeType::Basic; } + static bool classof(const PTreeNode *N) { return true; } +}; + +class AnnotatedPTreeNode : public PTreeNode { + 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}; + + AnnotatedPTreeNode(PTreeNode *parent, ExecutionState *state) noexcept; + ~AnnotatedPTreeNode() override = default; + + [[nodiscard]] NodeType getType() const override { return NodeType::Annotated; } + static bool classof(const PTreeNode *N) { + return N->getType() == NodeType::Annotated; + } +}; + +class PTree { +public: + enum class PTreeType : std::uint8_t { Basic, Noop, InMemory, Persistent }; + + /// Branch from PTreeNode and attach states, convention: rightState is + /// parent + virtual void attach(PTreeNode *node, ExecutionState *leftState, + ExecutionState *rightState, BranchType reason) = 0; + /// Dump process tree in .dot format into os (debug) + virtual void dump(llvm::raw_ostream &os) = 0; + /// Remove node from tree + virtual void remove(PTreeNode *node) = 0; + /// Set termination type (on state removal) + virtual void setTerminationType(ExecutionState &state, + StateTerminationType type){} + + virtual ~PTree() = default; + PTree(PTree const &) = delete; + PTree &operator=(PTree const &) = delete; + PTree(PTree &&) = delete; + PTree &operator=(PTree &&) = delete; + + [[nodiscard]] virtual PTreeType getType() const = 0; + static bool classof(const PTreeNode *N) { return true; } + +protected: + explicit PTree() noexcept = default; +}; + +/// @brief A pseudo process tree that does not maintain any nodes. +class NoopPTree final : public PTree { +public: + NoopPTree() noexcept = default; + ~NoopPTree() override = default; + void attach(PTreeNode *node, ExecutionState *leftState, + ExecutionState *rightState, + BranchType reason) noexcept override{} + void dump(llvm::raw_ostream &os) noexcept override; + void remove(PTreeNode *node) noexcept override{} + + [[nodiscard]] PTreeType getType() const override { return PTreeType::Noop; }; + static bool classof(const PTree *T) { return T->getType() == PTreeType::Noop; } +}; + +/// @brief An in-memory process tree required by RandomPathSearcher +class InMemoryPTree : public PTree { +public: + PTreeNodePtr root; + +private: + /// Number of registered IDs ("users", e.g. RandomPathSearcher) + std::uint8_t registeredIds = 0; + + virtual PTreeNode *createNode(PTreeNode *parent, ExecutionState *state); + virtual void updateBranchingNode(PTreeNode &node, BranchType reason){} + virtual void updateTerminatingNode(PTreeNode &node){} + +public: + InMemoryPTree() noexcept = default; + explicit InMemoryPTree(ExecutionState &initialState) noexcept; + ~InMemoryPTree() override = default; + + void attach(PTreeNode *node, ExecutionState *leftState, + ExecutionState *rightState, BranchType reason) noexcept override; + void dump(llvm::raw_ostream &os) noexcept override; + std::uint8_t getNextId() noexcept; + void remove(PTreeNode *node) noexcept override; + + [[nodiscard]] PTreeType getType() const override { return PTreeType::InMemory; }; + static bool classof(const PTree *T) { + return (T->getType() == PTreeType::InMemory) || (T->getType() == PTreeType::Persistent); + } +}; + +/// @brief An in-memory process tree that also writes its nodes into an SQLite +/// database (ptree.db) with a PTreeWriter +class PersistentPTree : public InMemoryPTree { + PTreeWriter writer; + + PTreeNode *createNode(PTreeNode *parent, ExecutionState *state) override; + void updateBranchingNode(PTreeNode &node, BranchType reason) override; + void updateTerminatingNode(PTreeNode &node) override; + +public: + explicit PersistentPTree(ExecutionState &initialState, + InterpreterHandler &ih) noexcept; + ~PersistentPTree() override = default; + void dump(llvm::raw_ostream &os) noexcept override; + void setTerminationType(ExecutionState &state, + StateTerminationType type) override; + + [[nodiscard]] PTreeType getType() const override { return PTreeType::Persistent; }; + static bool classof(const PTree *T) { return T->getType() == PTreeType::Persistent; } +}; + +std::unique_ptr createPTree(ExecutionState &initialState, bool inMemory, + InterpreterHandler &ih); +} // namespace klee #endif /* KLEE_PTREE_H */ diff --git a/lib/Core/PTreeWriter.cpp b/lib/Core/PTreeWriter.cpp new file mode 100644 index 0000000000..a8067a5d0b --- /dev/null +++ b/lib/Core/PTreeWriter.cpp @@ -0,0 +1,196 @@ +//===-- PTreeWriter.cpp ---------------------------------------------------===// +// +// The KLEE Symbolic Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "PTreeWriter.h" + +#include "PTree.h" +#include "klee/Support/ErrorHandling.h" +#include "klee/Support/OptionCategories.h" + +#include "llvm/Support/CommandLine.h" + +namespace { +llvm::cl::opt BatchSize( + "ptree-batch-size", llvm::cl::init(100U), + llvm::cl::desc("Number of process tree nodes to batch for writing, " + "see --write-ptree (default=100)"), + llvm::cl::cat(klee::PTreeCat)); +} // 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("Process tree database: can't prepare query: %s [%s]", + sqlite3_errmsg(db), query.c_str()); + sqlite3_close(db); + klee_error("Process tree database: can't prepare query: %s", query.c_str()); + } +} + +PTreeWriter::PTreeWriter(const std::string &dbPath) { + // create database file + if (sqlite3_open(dbPath.c_str(), &db) != SQLITE_OK) + klee_error("Can't create process 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("Process tree database: can't set option: %s", errMsg); + sqlite3_free(errMsg); + } + if (sqlite3_exec(db, "PRAGMA journal_mode = WAL;", nullptr, nullptr, + &errMsg) != SQLITE_OK) { + klee_warning("Process tree database: can't 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("Process tree database: initialisation error: %s", zErr); + sqlite3_free(zErr); + sqlite3_close(db); + klee_error("Process 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("Process tree database: can't begin transaction: %s", + sqlite3_errmsg(db)); + } + if (sqlite3_reset(transactionBeginStmt) != SQLITE_OK) { + klee_warning("Process tree database: can't reset transaction: %s", + sqlite3_errmsg(db)); + } +} + +PTreeWriter::~PTreeWriter() { + 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("Process tree database: can't end transaction: %s", + sqlite3_errmsg(db)); + } + + if (sqlite3_close(db) != SQLITE_OK) { + klee_warning("Process tree database: can't close database: %s", + sqlite3_errmsg(db)); + } +} + +void PTreeWriter::batchCommit(bool force) { + ++batch; + if (batch < BatchSize && !force) + return; + + // commit and begin transaction + if (sqlite3_step(transactionCommitStmt) != SQLITE_DONE) { + klee_warning("Process tree database: transaction commit error: %s", + sqlite3_errmsg(db)); + } + + if (sqlite3_reset(transactionCommitStmt) != SQLITE_OK) { + klee_warning("Process tree database: transaction reset error: %s", + sqlite3_errmsg(db)); + } + + if (sqlite3_step(transactionBeginStmt) != SQLITE_DONE) { + klee_warning("Process tree database: transaction begin error: %s", + sqlite3_errmsg(db)); + } + + if (sqlite3_reset(transactionBeginStmt) != SQLITE_OK) { + klee_warning("Process tree database: transaction reset error: %s", + sqlite3_errmsg(db)); + } + + batch = 0; + flushed = true; +} + +void PTreeWriter::write(const AnnotatedPTreeNode &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 && "PTreeWriter: 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("Process tree database: can't persist data for node: %u", + node.id); + } + + // insert + if (sqlite3_step(insertStmt) != SQLITE_DONE) { + klee_warning("Process tree database: can't persist data for node: %u: %s", + node.id, sqlite3_errmsg(db)); + } + + if (sqlite3_reset(insertStmt) != SQLITE_OK) { + klee_warning("Process tree database: error reset node: %u: %s", node.id, + sqlite3_errmsg(db)); + } + + batchCommit(); +} diff --git a/lib/Core/PTreeWriter.h b/lib/Core/PTreeWriter.h new file mode 100644 index 0000000000..12709116c9 --- /dev/null +++ b/lib/Core/PTreeWriter.h @@ -0,0 +1,46 @@ +//===-- PTreeWriter.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 AnnotatedPTreeNode; + +/// @brief Writes process tree nodes into an SQLite database +class PTreeWriter { + friend class PersistentPTree; + + ::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 PTreeWriter(const std::string &dbPath); + ~PTreeWriter(); + PTreeWriter(const PTreeWriter &other) = delete; + PTreeWriter(PTreeWriter &&other) noexcept = delete; + PTreeWriter &operator=(const PTreeWriter &other) = delete; + PTreeWriter &operator=(PTreeWriter &&other) noexcept = delete; + + /// Write new node into database + void write(const AnnotatedPTreeNode &node); +}; + +} // namespace klee diff --git a/lib/Core/Searcher.cpp b/lib/Core/Searcher.cpp index bf98ebc7a1..1c57eb4ea1 100644 --- a/lib/Core/Searcher.cpp +++ b/lib/Core/Searcher.cpp @@ -261,15 +261,18 @@ 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(InMemoryPTree *processTree, RNG &rng) + : processTree{processTree}, theRNG{rng}, + idBitMask{ + static_cast(processTree ? processTree->getNextId() : 0)} { + + assert(processTree); +}; 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(processTree->root.getInt() & idBitMask && "Root should belong to the searcher"); + PTreeNode *n = processTree->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"); @@ -302,7 +305,7 @@ void RandomPathSearcher::update(ExecutionState *current, childPtr = parent ? ((parent->left.getPointer() == pnode) ? &parent->left : &parent->right) - : &processTree.root; + : &processTree->root; while (pnode && !IS_OUR_NODE_VALID(*childPtr)) { childPtr->setInt(childPtr->getInt() | idBitMask); pnode = parent; @@ -312,7 +315,7 @@ void RandomPathSearcher::update(ExecutionState *current, childPtr = parent ? ((parent->left.getPointer() == pnode) ? &parent->left : &parent->right) - : &processTree.root; + : &processTree->root; } } @@ -325,7 +328,7 @@ void RandomPathSearcher::update(ExecutionState *current, auto childPtr = parent ? ((parent->left.getPointer() == pnode) ? &parent->left : &parent->right) - : &processTree.root; + : &processTree->root; assert(IS_OUR_NODE_VALID(*childPtr) && "Removing pTree child not ours"); childPtr->setInt(childPtr->getInt() & ~idBitMask); pnode = parent; @@ -336,7 +339,7 @@ void RandomPathSearcher::update(ExecutionState *current, } bool RandomPathSearcher::empty() { - return !IS_OUR_NODE_VALID(processTree.root); + return !IS_OUR_NODE_VALID(processTree->root); } void RandomPathSearcher::printName(llvm::raw_ostream &os) { diff --git a/lib/Core/Searcher.h b/lib/Core/Searcher.h index e399c6161f..ddd4926443 100644 --- a/lib/Core/Searcher.h +++ b/lib/Core/Searcher.h @@ -172,7 +172,7 @@ namespace klee { /// /// The ownership bits are maintained in the update method. class RandomPathSearcher final : public Searcher { - PTree &processTree; + InMemoryPTree *processTree; RNG &theRNG; // Unique bitmask of this searcher @@ -181,7 +181,7 @@ namespace klee { public: /// \param processTree The process tree. /// \param RNG A random number generator. - RandomPathSearcher(PTree &processTree, RNG &rng); + RandomPathSearcher(InMemoryPTree *processTree, RNG &rng); ~RandomPathSearcher() override = default; ExecutionState &selectState() override; diff --git a/lib/Core/SpecialFunctionHandler.cpp b/lib/Core/SpecialFunctionHandler.cpp index 488fba5194..4589471cae 100644 --- a/lib/Core/SpecialFunctionHandler.cpp +++ b/lib/Core/SpecialFunctionHandler.cpp @@ -480,12 +480,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); } diff --git a/lib/Core/UserSearcher.cpp b/lib/Core/UserSearcher.cpp index 19ac37180c..735075f175 100644 --- a/lib/Core/UserSearcher.cpp +++ b/lib/Core/UserSearcher.cpp @@ -100,9 +100,13 @@ bool userSearcherRequiresMD2U() { std::find(CoreSearch.begin(), CoreSearch.end(), Searcher::NURS_QC) != CoreSearch.end()); } +bool userSearcherRequiresInMemoryPTree() { + 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, InMemoryPTree *processTree) { Searcher *searcher = nullptr; switch (type) { case Searcher::DFS: searcher = new DFSSearcher(); break; @@ -122,15 +126,15 @@ Searcher *getNewSearcher(Searcher::CoreSearchType type, RNG &rng, PTree &process } Searcher *klee::constructUserSearcher(Executor &executor) { - - Searcher *searcher = getNewSearcher(CoreSearch[0], executor.theRNG, *executor.processTree); + auto *ptree = llvm::dyn_cast(executor.processTree.get()); + Searcher *searcher = getNewSearcher(CoreSearch[0], executor.theRNG, ptree); 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, ptree)); searcher = new InterleavedSearcher(s); } diff --git a/lib/Core/UserSearcher.h b/lib/Core/UserSearcher.h index b0df8239ed..fe75eb6d63 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 userSearcherRequiresInMemoryPTree(); void initializeSearchOptions(); diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index b4716dae70..ae038b80e5 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -147,7 +147,7 @@ file(GENERATE add_custom_target(systemtests COMMAND "${LIT_TOOL}" ${LIT_ARGS} "${CMAKE_CURRENT_BINARY_DIR}" - DEPENDS klee kleaver klee-replay kleeRuntest ktest-gen ktest-randgen + DEPENDS klee kleaver klee-ptree klee-replay kleeRuntest ktest-gen ktest-randgen COMMENT "Running system tests" USES_TERMINAL ) diff --git a/test/Feature/KleePtreeBogus.test b/test/Feature/KleePtreeBogus.test new file mode 100644 index 0000000000..11fe87c899 --- /dev/null +++ b/test/Feature/KleePtreeBogus.test @@ -0,0 +1,65 @@ +REQUIRES: sqlite3 + +fail on broken db (not sqlite) +RUN: not %klee-ptree tree-info %S/ptree-dbs/not_a.db 2> %t.err +RUN: FileCheck -check-prefix=CHECK-CORRUPT -input-file=%t.err %s +CHECK-CORRUPT: Can't prepare read statement: file is not a database + +empty tree +RUN: rm -f %t.db +RUN: %sqlite3 -separator ',' %t.db ".import %S/ptree-dbs/empty_db.csv nodes" +RUN: %klee-ptree 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/ptree-dbs/duplicated_node.csv nodes" +RUN: not %klee-ptree tree-info %t.db 2> %t.err +RUN: FileCheck -check-prefix=CHECK-DUP -input-file=%t.err %s +CHECK-DUP: PTree 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/ptree-dbs/invalid_btype.csv nodes" +RUN: not %klee-ptree tree-info %t.db 2> %t.err +RUN: FileCheck -check-prefix=CHECK-BTYPE -input-file=%t.err %s +CHECK-BTYPE: PTree 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/ptree-dbs/invalid_ttype.csv nodes" +RUN: not %klee-ptree tree-info %t.db 2> %t.err +RUN: FileCheck -check-prefix=CHECK-TTYPE -input-file=%t.err %s +CHECK-TTYPE: PTree 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/ptree-dbs/loop.csv nodes" +RUN: not %klee-ptree tree-info %t.db 2> %t.err +RUN: FileCheck -check-prefix=CHECK-LOOP -input-file=%t.err %s +CHECK-LOOP: PTree 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/ptree-dbs/missing_after_max.csv nodes" +RUN: not %klee-ptree tree-info %t.db 2> %t.err +RUN: FileCheck -check-prefix=CHECK-MISSA -input-file=%t.err %s +CHECK-MISSA: PTree 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/ptree-dbs/missing_before_max.csv nodes" +RUN: not %klee-ptree tree-info %t.db 2> %t.err +RUN: FileCheck -check-prefix=CHECK-MISSB -input-file=%t.err %s +CHECK-MISSB: PTree 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/ptree-dbs/node_id0.csv nodes" +RUN: not %klee-ptree tree-info %t.db 2> %t.err +RUN: FileCheck -check-prefix=CHECK-ID0 -input-file=%t.err %s +CHECK-ID0: PTree DB contains illegal node ID (0) + +cleanup +RUN rm -f %t.db diff --git a/test/Feature/WritePtree.c b/test/Feature/WritePtree.c new file mode 100644 index 0000000000..e7bf59ce67 --- /dev/null +++ b/test/Feature/WritePtree.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-ptree --output-dir=%t.klee-out %t.bc +// RUN: %klee-ptree branches %t.klee-out/ptree.db | FileCheck --check-prefix=CHECK-BRANCH %s +// RUN: %klee-ptree depths %t.klee-out | FileCheck --check-prefix=CHECK-DEPTH %s +// RUN: %klee-ptree instructions %t.klee-out | FileCheck --check-prefix=CHECK-INSTR %s +// RUN: %klee-ptree terminations %t.klee-out | FileCheck --check-prefix=CHECK-TERM %s +// RUN: %klee-ptree tree-dot %t.klee-out | FileCheck --check-prefix=CHECK-DOT %s +// RUN: %klee-ptree tree-info %t.klee-out | FileCheck --check-prefix=CHECK-TINFO %s +// RUN: not %klee-ptree dot %t.klee-out/ptree-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 PTree { +// 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/Feature/ptree-dbs/duplicated_node.csv b/test/Feature/ptree-dbs/duplicated_node.csv new file mode 100644 index 0000000000..7882b911e2 --- /dev/null +++ b/test/Feature/ptree-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/Feature/ptree-dbs/empty_db.csv b/test/Feature/ptree-dbs/empty_db.csv new file mode 100644 index 0000000000..4dac8a1748 --- /dev/null +++ b/test/Feature/ptree-dbs/empty_db.csv @@ -0,0 +1 @@ +ID,stateID,leftID,rightID,asmLine,kind diff --git a/test/Feature/ptree-dbs/invalid_btype.csv b/test/Feature/ptree-dbs/invalid_btype.csv new file mode 100644 index 0000000000..01ee428cc9 --- /dev/null +++ b/test/Feature/ptree-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/Feature/ptree-dbs/invalid_ttype.csv b/test/Feature/ptree-dbs/invalid_ttype.csv new file mode 100644 index 0000000000..0d185bee80 --- /dev/null +++ b/test/Feature/ptree-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/Feature/ptree-dbs/loop.csv b/test/Feature/ptree-dbs/loop.csv new file mode 100644 index 0000000000..4fc2b9f281 --- /dev/null +++ b/test/Feature/ptree-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/Feature/ptree-dbs/missing_after_max.csv b/test/Feature/ptree-dbs/missing_after_max.csv new file mode 100644 index 0000000000..16e99a357c --- /dev/null +++ b/test/Feature/ptree-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/Feature/ptree-dbs/missing_before_max.csv b/test/Feature/ptree-dbs/missing_before_max.csv new file mode 100644 index 0000000000..2131ea56f9 --- /dev/null +++ b/test/Feature/ptree-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/Feature/ptree-dbs/node_id0.csv b/test/Feature/ptree-dbs/node_id0.csv new file mode 100644 index 0000000000..51a31e4996 --- /dev/null +++ b/test/Feature/ptree-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/Feature/ptree-dbs/not_a.db b/test/Feature/ptree-dbs/not_a.db new file mode 100644 index 0000000000..d81cc0710e --- /dev/null +++ b/test/Feature/ptree-dbs/not_a.db @@ -0,0 +1 @@ +42 diff --git a/test/lit.cfg b/test/lit.cfg index cb47d3d4c5..8abf7012d1 100644 --- a/test/lit.cfg +++ b/test/lit.cfg @@ -116,6 +116,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',"") @@ -134,6 +139,7 @@ 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-ptree', 'klee-ptree', ''), ('%klee-replay', 'klee-replay', ''), ('%klee-stats', 'klee-stats', ''), ('%klee-zesti', 'klee-zesti', ''), @@ -233,3 +239,6 @@ config.available_features.add('{}32bit-support'.format('' if config.have_32bit_s 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 c7063057da..d82b8a2cd1 100644 --- a/test/lit.site.cfg.in +++ b/test/lit.site.cfg.in @@ -26,6 +26,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 @@ -39,6 +41,7 @@ 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/tools/CMakeLists.txt b/tools/CMakeLists.txt index b641885cc1..40089c4075 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -10,6 +10,7 @@ add_subdirectory(ktest-gen) add_subdirectory(ktest-randgen) add_subdirectory(kleaver) add_subdirectory(klee) +add_subdirectory(klee-ptree) add_subdirectory(klee-replay) add_subdirectory(klee-stats) add_subdirectory(klee-zesti) diff --git a/tools/klee-ptree/CMakeLists.txt b/tools/klee-ptree/CMakeLists.txt new file mode 100644 index 0000000000..b5c3fa09de --- /dev/null +++ b/tools/klee-ptree/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-ptree main.cpp Tree.cpp DFSVisitor.cpp Printers.cpp) + +target_compile_features(klee-ptree PRIVATE cxx_std_17) +target_include_directories(klee-ptree PRIVATE ${KLEE_INCLUDE_DIRS} ${SQLite3_INCLUDE_DIRS}) +target_link_libraries(klee-ptree PUBLIC ${SQLite3_LIBRARIES}) + +install(TARGETS klee-ptree DESTINATION bin) diff --git a/tools/klee-ptree/DFSVisitor.cpp b/tools/klee-ptree/DFSVisitor.cpp new file mode 100644 index 0000000000..c87afc3ebf --- /dev/null +++ b/tools/klee-ptree/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-ptree/DFSVisitor.h b/tools/klee-ptree/DFSVisitor.h new file mode 100644 index 0000000000..60d7b3bdb0 --- /dev/null +++ b/tools/klee-ptree/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 a process 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-ptree/Printers.cpp b/tools/klee-ptree/Printers.cpp new file mode 100644 index 0000000000..950d1b0943 --- /dev/null +++ b/tools/klee-ptree/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 PTree {\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-ptree/Printers.h b/tools/klee-ptree/Printers.h new file mode 100644 index 0000000000..d20db4a107 --- /dev/null +++ b/tools/klee-ptree/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-ptree/Tree.cpp b/tools/klee-ptree/Tree.cpp new file mode 100644 index 0000000000..207726005c --- /dev/null +++ b/tools/klee-ptree/Tree.cpp @@ -0,0 +1,208 @@ +//===-- 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 << "Can't open process 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 << "Can't 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 << "Can't 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 << "Can't 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 << "PTree DB contains illegal node ID (0)" << std::endl; + exit(EXIT_FAILURE); + } + + if (left > maxID || right > maxID) { + std::cerr << "PTree 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: PTree 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 << "PTree 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 << "PTree 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 << "PTree 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 << "PTree DB contains unknown termination type (" + << (unsigned)static_cast(terminationType) + << ") in node " << id << std::endl; + exit(EXIT_FAILURE); + } + } + } +} diff --git a/tools/klee-ptree/Tree.h b/tools/klee-ptree/Tree.h new file mode 100644 index 0000000000..65b7baeb1f --- /dev/null +++ b/tools/klee-ptree/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 a PTreeNode +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 process 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; // PTree node IDs start with 1! + + /// Reads complete ptree.db into memory + explicit Tree(const std::filesystem::path &path); + ~Tree() = default; +}; diff --git a/tools/klee-ptree/main.cpp b/tools/klee-ptree/main.cpp new file mode 100644 index 0000000000..96d2be7553 --- /dev/null +++ b/tools/klee-ptree/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-ptree