about summary refs log tree commit diff homepage
path: root/scripts/build/p-llvm.inc
diff options
context:
space:
mode:
authorMartin Nowack <m.nowack@imperial.ac.uk>2022-03-25 23:07:40 +0000
committerCristian Cadar <c.cadar@imperial.ac.uk>2022-03-30 12:18:59 +0100
commit0373fd7d10fb5b23c86ebec2e932ea8f059f5b71 (patch)
tree785721f0b4202b1d30fa77160368e969e12a4eaa /scripts/build/p-llvm.inc
parent23548f09b7bff999b0b346a5511b2a316ec798b4 (diff)
downloadklee-0373fd7d10fb5b23c86ebec2e932ea8f059f5b71.tar.gz
Clearly separate between LLVM, a bitcode compiler, and sanitizer compiler
All three can be different but also provided by the same package.
By separating the different use-cases, it allows to set them
independently.
Diffstat (limited to 'scripts/build/p-llvm.inc')
-rw-r--r--scripts/build/p-llvm.inc343
1 files changed, 183 insertions, 160 deletions
diff --git a/scripts/build/p-llvm.inc b/scripts/build/p-llvm.inc
index e335ad73..d1b9374e 100644
--- a/scripts/build/p-llvm.inc
+++ b/scripts/build/p-llvm.inc
@@ -1,92 +1,92 @@
 validate_build_config_llvm() {
-    # Check variables that are needed for building 
-    [[ -n "${LLVM_SRC_BASE}" ]] || { echo "LLVM_SRC_BASE not set"; exit 1; }
-    [[ -n "${LLVM_VERSION_SHORT}" ]] || { echo "LLVM_VERSION_SHORT not set"; exit 1; }
+  # Check variables that are needed for building
+  [[ -n "${LLVM_SRC_BASE}" ]] || {
+    echo "LLVM_SRC_BASE not set"
+    exit 1
+  }
+  [[ -n "${LLVM_VERSION_SHORT}" ]] || {
+    echo "LLVM_VERSION_SHORT not set"
+    exit 1
+  }
 }
 
 setup_build_variables_llvm() {
-    LLVM_SUFFIX=""
-
-    local BuildMode=""
-    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}")
-
-    if [[ "${enable_optimized}" == "1" ]]; then
-      LLVM_SUFFIX+="_O"
-      BuildMode="Release"
-    else
-      LLVM_SUFFIX+="_NO"
-    fi
+  source "${DIR}/common-functions"
+  LLVM_SUFFIX=""
 
-    if [[ ("${enable_debug}" == "1") || ("${enable_optimized}" != "1") ]]; then
-      LLVM_SUFFIX+="_D"
-      [ -z "$BuildMode" ] && BuildMode="Debug" || BuildMode="$BuildMode+Debug"
-    else
-      LLVM_SUFFIX+="_ND"
-    fi
+  local BuildMode=""
+  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}")
 
-    if [[ "${disable_assertions}" == "1" || -z "${disable_assertions}" ]]; then
-      LLVM_SUFFIX+="_NA"
-    else
-      LLVM_SUFFIX+="_A"
-      [ -z "$BuildMode" ] && BuildMode="Asserts" || BuildMode="$BuildMode+Asserts"
-    fi
+  if [[ "${enable_optimized}" == "1" ]]; then
+    LLVM_SUFFIX+="_O"
+    BuildMode="Release"
+  else
+    LLVM_SUFFIX+="_NO"
+  fi
 
-    if [[ "${requires_rtti}" == "1" ]]; then
-      LLVM_SUFFIX+="_RTTI"
-    fi
+  if [[ ("${enable_debug}" == "1") || ("${enable_optimized}" != "1") ]]; then
+    LLVM_SUFFIX+="_D"
+    [ -z "$BuildMode" ] && BuildMode="Debug" || BuildMode="$BuildMode+Debug"
+  else
+    LLVM_SUFFIX+="_ND"
+  fi
 
-    if [[ "${SANITIZER_SUFFIX}x" != "x" ]]; then
-      LLVM_SUFFIX+="${SANITIZER_SUFFIX}"
-    fi
+  if [[ "${disable_assertions}" == "1" || -z "${disable_assertions}" ]]; then
+    LLVM_SUFFIX+="_NA"
+  else
+    LLVM_SUFFIX+="_A"
+    [ -z "$BuildMode" ] && BuildMode="Asserts" || BuildMode="$BuildMode+Asserts"
+  fi
+
+  if [[ "${requires_rtti}" == "1" ]]; then
+    LLVM_SUFFIX+="_RTTI"
+  fi
 
-    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++"
-
-
-    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"
-
-        SANITIZER_C_COMPILER="${SANITIZER_LLVM_UNINSTRUMENTED}/bin/clang"
-        SANITIZER_CXX_COMPILER="${SANITIZER_LLVM_UNINSTRUMENTED}/bin/clang++"
-        SANITIZER_CMAKE_C_COMPILER=("-DCMAKE_C_COMPILER=${SANITIZER_C_COMPILER}")
-        SANITIZER_CMAKE_CXX_COMPILER=("-DCMAKE_CXX_COMPILER=${SANITIZER_CXX_COMPILER}")
-
-        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[@]}")
-
-        # 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
-      # Setup default sanitizer arguments
-      SANITIZER_C_COMPILER="${LLVM_BIN}/clang"
-      SANITIZER_CXX_COMPILER="${LLVM_BIN}/clang++"
-    done
+  if [[ "${SANITIZER_SUFFIX}x" != "x" ]]; then
+    LLVM_SUFFIX+="${SANITIZER_SUFFIX}"
+  fi
+
+  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++"
+
+  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() {
@@ -98,73 +98,74 @@ download_llvm() {
 
   branch_name="release/${LLVM_VERSION_MAJOR}.x"
   git_clone_or_update "https://github.com/llvm/llvm-project.git" "${LLVM_SRC_BASE}" "${branch_name}" || exit 1
-
   # Apply existing patches if needed
   if [ -f "${DIR}/patches/llvm${LLVM_VERSION_SHORT}.patch" ]; then
-     cd "${LLVM_SRC_BASE}" || (echo "Directory does not exist"; exit 1)
-     patch -p1 --follow-symlinks -i "${DIR}/patches/llvm${LLVM_VERSION_SHORT}.patch" || return 1
+    cd "${LLVM_SRC_BASE}" || (
+      echo "Directory does not exist"
+      exit 1
+    )
+    patch -p1 --follow-symlinks -i "${DIR}/patches/llvm${LLVM_VERSION_SHORT}.patch" || return 1
   fi
 
-  touch "${LLVM_SRC_BASE}/.src_checked_out" 
+  touch "${LLVM_SRC_BASE}/.src_checked_out"
 }
 
-build_llvm() {
-    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}")
 
-    # 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 \
+configure_llvm() {
+  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}")
+
+  # 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_ENABLE_PROJECTS=clang;compiler-rt;libcxx;libcxxabi" \
       "-DLLVM_TARGETS_TO_BUILD=X86" \
-        "${LLVM_SRC_BASE}/llvm"
+      "${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 \
-        "${SANITIZER_CMAKE_C_COMPILER[@]}" \
-        "${SANITIZER_CMAKE_CXX_COMPILER[@]}" \
+    # 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 \
-          "${SANITIZER_CMAKE_C_COMPILER[@]}" \
-          "${SANITIZER_CMAKE_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}" \
+      "${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"
-      # Build clang as a dependency and install all needed packages
-    ninja clang || return 1
-      return 0
-    fi
+      "${LLVM_SRC_BASE}/llvm"
+    return 0
+  fi
 
   # Configure; build; and install
   mkdir -p "${LLVM_BUILD}"
@@ -175,8 +176,8 @@ build_llvm() {
 
   # Configure LLVM
   CONFIG=(
-     "-DCMAKE_INSTALL_PREFIX=${LLVM_INSTALL}"
-     "-DLLVM_BUILD_LLVM_DYLIB=TRUE"
+    "-DCMAKE_INSTALL_PREFIX=${LLVM_INSTALL}"
+    "-DLLVM_BUILD_LLVM_DYLIB=TRUE"
   )
 
   # Select components to build
@@ -213,38 +214,59 @@ build_llvm() {
 
   # Remove unneeded targets
   CONFIG+=(
-     "-DLLVM_INCLUDE_EXAMPLES=OFF"
-#     "-DLLVM_INCLUDE_TESTS=OFF"
+    "-DLLVM_INCLUDE_EXAMPLES=OFF"
     "-DCLANG_INCLUDE_TESTS=OFF"
-     "-DLLVM_INCLUDE_BENCHMARKS=OFF"
-     "-DBUILD_SHARED_LIBS=ON"
+    "-DLLVM_INCLUDE_BENCHMARKS=OFF"
+    "-DBUILD_SHARED_LIBS=ON"
     "-DLLVM_OPTIMIZED_TABLEGEN=ON"
     "-DLLVM_TARGETS_TO_BUILD=X86"
   )
 
-  local variables=("")
-
-  if [[ -n "${CC:-}" ]]; then
-    variables+=("CC=${CC}")
+  if [[ -n ${SANITIZER_BUILD} ]]; then
+    CC="${SANITIZER_C_COMPILER}"
+    CXX="${SANITIZER_CXX_COMPILER}"
   fi
 
-  if [[ -n "${CXX:-}" ]]; then
-    variables+=("CXX=${CXX}")
-  fi
+  (
+    if [[ -n "${CC:-}" ]]; then
+      export "CC=${CC}"
+    fi
 
-  if [[ -n "${LDFLAGS:-}" ]]; then
-    variables+=("LDFLAGS=${LLVM_LDFLAGS}")
-  fi
+    if [[ -n "${CXX:-}" ]]; then
+      export "CXX=${CXX}"
+    fi
+
+    if [[ -n "${LDFLAGS:-}" ]]; then
+      export "LDFLAGS=${LLVM_LDFLAGS}"
+    fi
 
-  if [[ -n "${variables[*]}" ]]; then
-    "${variables[*]}" cmake "${CONFIG[@]}" "${LLVM_SRC_BASE}/llvm"
-  else
     cmake "${CONFIG[@]}" "${LLVM_SRC_BASE}/llvm"
-  fi
+  )
+}
+build_llvm() {
+  configure_llvm
+  (
+    if [[ "${SANITIZER_BUILD}" == "memory" ]]; then
+      ninja clang|| return 1
+      return 0
+    fi
+
+    if [[ -n "${CC:-}" ]]; then
+      export "CC=${CC}"
+    fi
+
+    if [[ -n "${CXX:-}" ]]; then
+      export "CXX=${CXX}"
+    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
+    if [[ -n "${LDFLAGS:-}" ]]; then
+      export "LDFLAGS=${LLVM_LDFLAGS}"
+    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"
 }
 
@@ -254,24 +276,25 @@ install_llvm() {
     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=( \
+    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 )
-  
+      install-llvm-headers
+      )
+
     ninja "${LLVM_PACKAGES[@]}"
 
-    for i in $(ninja -t targets |grep install-LLVM | cut -d : -f 1); do ninja "$i"; done
-    
+    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