From 4e79a786ce49d12d28c398e48e1fba8baba7b27e Mon Sep 17 00:00:00 2001 From: Lucas Briese Date: Mon, 17 Feb 2025 08:21:23 +0100 Subject: [PATCH 1/4] package(docker): update to clang-19 --- .dockerignore | 18 +++- CMakeLists.txt | 10 +- Dockerfile | 93 +++++++------------ cmake/phasar_macros.cmake | 6 +- .../Problems/IDEGeneralizedLCATest.cpp | 3 +- utils/InitializeEnvironment.sh | 7 -- utils/InstallAptDependencies.sh | 87 ++++++++++++++++- 7 files changed, 144 insertions(+), 80 deletions(-) delete mode 100755 utils/InitializeEnvironment.sh diff --git a/.dockerignore b/.dockerignore index ea7ac67581..2b31c69a2b 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,2 +1,16 @@ -./docker -./build +* +!.git +!cmake/ +!config/ +!include/ +!lib/ +!test/ +!tools/ +!unittests/ +!utils/*.sh +!utils/*.py + +!.gitmodules +!CMakeLists.txt +!Config.cmake.in +!config.h.in diff --git a/CMakeLists.txt b/CMakeLists.txt index c9d6409c91..112ab6a1a5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required (VERSION 3.14) +cmake_minimum_required (VERSION 3.16) # Avoid IPO/LTO Warnings: cmake_policy(SET CMP0069 NEW) @@ -8,9 +8,11 @@ set(CMAKE_POLICY_DEFAULT_CMP0069 NEW) cmake_policy(SET CMP0077 NEW) set(CMAKE_POLICY_DEFAULT_CMP0077 NEW) -# Allow overwriting cache variables of external projects from this CMakeLists file -cmake_policy(SET CMP0126 NEW) -set(CMAKE_POLICY_DEFAULT_CMP0126 NEW) +if ("${CMAKE_VERSION}" GREATER_EQUAL "3.21") + # Allow overwriting cache variables of external projects from this CMakeLists file + cmake_policy(SET CMP0126 NEW) + set(CMAKE_POLICY_DEFAULT_CMP0126 NEW) +endif() # Allow portable use of CMAKE_VISIBILITY_INLINES_HIDDEN not only for shared libraries cmake_policy(SET CMP0063 NEW) diff --git a/Dockerfile b/Dockerfile index 2bed11717b..f8984852cc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,61 +1,32 @@ -FROM ubuntu:22.04 -ARG LLVM_INSTALL_DIR="/usr/local/llvm-14" -LABEL Name=phasar Version=2403 - -RUN apt -y update && apt install bash sudo -y - - -WORKDIR /usr/src/phasar -RUN mkdir -p /usr/src/phasar/utils - -COPY ./utils/InitializeEnvironment.sh /usr/src/phasar/utils/ -RUN ./utils/InitializeEnvironment.sh - -RUN apt-get -y install --no-install-recommends \ - cmake \ - ninja-build \ - libstdc++6 \ - libboost-graph-dev - -COPY ./utils/InstallAptDependencies.sh /usr/src/phasar/utils/ -RUN ./utils/InstallAptDependencies.sh - -RUN apt-get update && \ - apt-get install -y software-properties-common - -RUN apt-key adv --fetch-keys https://apt.llvm.org/llvm-snapshot.gpg.key && \ - add-apt-repository -y 'deb http://apt.llvm.org/focal/ llvm-toolchain-focal-14 main' && \ - apt-get update && \ - apt-get -y install --no-install-recommends \ - clang-14 \ - llvm-14-dev \ - libllvm14 \ - libclang-common-14-dev \ - libclang-14-dev \ - libclang-cpp14-dev \ - clang-tidy-14 \ - libclang-rt-14-dev - -RUN pip3 install Pygments pyyaml - - - -# installing wllvm -RUN pip3 install wllvm - -ENV CC=/usr/bin/clang-14 -ENV CXX=/usr/bin/clang++-14 - -COPY . /usr/src/phasar - -RUN git submodule init -RUN git submodule update -RUN mkdir -p build && cd build && \ - cmake .. \ - -DCMAKE_BUILD_TYPE=Release \ - -DPHASAR_TARGET_ARCH="" \ - -DCMAKE_CXX_COMPILER=$CXX \ - -G Ninja && \ - cmake --build . - -ENTRYPOINT [ "./build/tools/phasar-cli/phasar-cli" ] +ARG baseimage="ubuntu:24.04" +FROM "$baseimage" as build + +RUN --mount=type=bind,source=./utils/InstallAptDependencies.sh,target=/InstallAptDependencies.sh \ + set -eux; \ + ./InstallAptDependencies.sh --noninteractive tzdata clang-19 libclang-rt-19-dev + +ENV CC=/usr/bin/clang-19 \ + CXX=/usr/bin/clang++-19 + +FROM build + +ARG RUN_TESTS=OFF +RUN --mount=type=bind,source=.,target=/usr/src/phasar,rw \ + set -eux; \ + cd /usr/src/phasar; \ + git submodule update --init; \ + cmake -S . -B cmake-build/Release \ + -DCMAKE_BUILD_TYPE=Release \ + -DPHASAR_TARGET_ARCH="" \ + -DPHASAR_ENABLE_SANITIZERS=ON \ + -DBUILD_PHASAR_CLANG=ON \ + -DPHASAR_USE_Z3=ON \ + -DPHASAR_ALLOW_LTO_IN_RELEASE_BUILD=ON \ + -DPHASAR_BUILD_UNITTESTS=$RUN_TESTS \ + -DPHASAR_BUILD_OPENSSL_TS_UNITTESTS=OFF \ + -G Ninja; \ + ninja -C cmake-build/Release install; \ + [ "${RUN_TESTS}" = "ON" ] && ctest --test-dir cmake-build/Release --output-on-failure || true; \ + phasar-cli --version + +ENTRYPOINT [ "phasar-cli" ] diff --git a/cmake/phasar_macros.cmake b/cmake/phasar_macros.cmake index 9430659b82..31bd527a62 100644 --- a/cmake/phasar_macros.cmake +++ b/cmake/phasar_macros.cmake @@ -61,7 +61,11 @@ function(generate_ll_file) if (NOT clang) # Conan deps are available in in PATH - foreach(hint "${LLVM_TOOLS_BINARY_DIR}" "${Clang_INCLUDE_DIR}/../bin" "${LLVM_INCLUDE_DIR}/../bin" "/usr/local/llvm-${PHASAR_LLVM_VERSION}/bin") + set(default_llvm "${LLVM_TOOLS_BINARY_DIR}" ) + set(fallback_llvm "${Clang_INCLUDE_DIR}/../bin" "${LLVM_INCLUDE_DIR}/../bin") + set(user_compiled_llvm "/usr/local/llvm-${PHASAR_LLVM_VERSION}/bin") + set(package_manager_llvm "/usr/lib/llvm-${PHASAR_LLVM_VERSION}/bin/") + foreach(hint ${default_llvm} ${fallback_llvm} ${user_compiled_llvm} ${package_manager_llvm}) if ("${CMAKE_VERSION}" VERSION_GREATER_EQUAL "3.20") cmake_path(NORMAL_PATH hint OUTPUT_VARIABLE hint) endif() diff --git a/unittests/PhasarLLVM/DataFlow/IfdsIde/Problems/IDEGeneralizedLCATest.cpp b/unittests/PhasarLLVM/DataFlow/IfdsIde/Problems/IDEGeneralizedLCATest.cpp index 17a74b610d..03165a8abb 100644 --- a/unittests/PhasarLLVM/DataFlow/IfdsIde/Problems/IDEGeneralizedLCATest.cpp +++ b/unittests/PhasarLLVM/DataFlow/IfdsIde/Problems/IDEGeneralizedLCATest.cpp @@ -131,7 +131,8 @@ TEST_F(IDEGeneralizedLCATest, StringTestCpp) { getLastInstructionOf(HA->getProjectIRDB().getFunction("main")); GroundTruth.push_back({{EdgeValue("Hello, World")}, 3, - std::stoi(getMetaDataID(LastMainInstruction))}); + static_cast( + std::stoi(getMetaDataID(LastMainInstruction)))}); compareResults(GroundTruth); } diff --git a/utils/InitializeEnvironment.sh b/utils/InitializeEnvironment.sh deleted file mode 100755 index 74c382327c..0000000000 --- a/utils/InitializeEnvironment.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -# copied from "https://stackoverflow.com/questions/44331836/apt-get-install-tzdata-noninteractive" -export DEBIAN_FRONTEND=noninteractive - -ln -fs /usr/share/zoneinfo/America/New_York /etc/localtime -apt install -y tzdata -dpkg-reconfigure --frontend noninteractive tzdata diff --git a/utils/InstallAptDependencies.sh b/utils/InstallAptDependencies.sh index 8dba455bc0..3ab0313197 100755 --- a/utils/InstallAptDependencies.sh +++ b/utils/InstallAptDependencies.sh @@ -1,6 +1,85 @@ #!/bin/bash -set -e +set -euo pipefail -sudo apt-get update -sudo apt-get install git -y -sudo apt-get install zlib1g-dev python3 python3-pip g++ ninja-build cmake -y +if printf "%s\n" "$@" | grep -Eqe '^--noninteractive|-ni$'; then + readonly noninteractive="true" + shift +else + readonly noninteractive="false" +fi +readonly LLVM_IR_VERSION=14 +additional_dependencies=("$@") + +( + source /etc/os-release + distro="$ID" # ubuntu / debian / alpine / centos / rocky + codename="${VERSION_CODENAME:-}" # focal / stretch / - / - / - + distro_version="$VERSION_ID" # 22.04 / 12 / 3.21.2 / 8 / 9.3 + # can be used to adapt to different distros / version + + if "$noninteractive"; then + export DEBIAN_FRONTEND=noninteractive + fi + + packages=("${additional_dependencies[@]}") + packages+=( + git ca-certificates build-essential cmake ninja-build # build + binutils # LTO + "clang-$LLVM_IR_VERSION" # compiler for IR + "libclang-rt-$LLVM_IR_VERSION-dev" # ASAN + libboost-graph-dev libsqlite3-dev libssl-dev zlib1g-dev "libclang-$LLVM_IR_VERSION-dev" "llvm-$LLVM_IR_VERSION-dev" "libclang-common-$LLVM_IR_VERSION-dev" # build deps + ) + + + pkg_mgr=() + privileged=() + if which sudo >/dev/null 2>&1; then + privileged+=("sudo") + fi + + + if which apt-get >/dev/null 2>&1; then + pkg_mgr+=("${privileged[@]}" "apt-get") + else + echo "Couldn't determine package manager, sry." + exit 1 + fi + + function check_if_llvm_apt_is_required() { + # probe if llvm apt repositories are required + mapfile -t llvm_deps < <(printf "%s\n" "${packages[@]}" | grep -E 'clang-|llvm-') + mapfile -t llvm_versions < <(printf "%s\n" "${llvm_deps[@]}" | grep -Eo '[0-9]+' | sort | uniq) + + required_versions=() + for llvm_version in "${llvm_versions[@]}"; do + mapfile -t current_llvm_deps < <(printf "%s\n" "${llvm_deps[@]}" | grep -E "$llvm_version") + for dep in "${current_llvm_deps[@]}"; do + if ! apt search "^$dep$" 2>&1 | grep -qe "$dep"; then + echo "warning: couldn't find $dep via apt" + required_versions+=("$llvm_version") + break + fi + done + done + + if [ "${#required_versions[@]}" -gt 0 ]; then + if ! "$noninteractive"; then + echo "It seems I need additional apt repositories for:" + printf "missing llvm version %s\n" "${required_versions[@]}" + read -p "Should I add them? (y/n)" choice + fi + if "$noninteractive" || echo "$choice" | grep -Eqie '^y|yes$'; then + "${privileged[@]}" apt-get install -y gnupg ca-certificates + "${privileged[@]}" apt-key adv -v --fetch-keys https://apt.llvm.org/llvm-snapshot.gpg.key + for required_version in "${required_versions[@]}"; do + echo "deb http://apt.llvm.org/${codename}/ llvm-toolchain-${codename}-$required_version main" | "${privileged[@]}" tee "/etc/apt/sources.list.d/llvm-$required_version-$codename.list" + done + "${pkg_mgr[@]}" update + fi + fi + } + + "${pkg_mgr[@]}" update + check_if_llvm_apt_is_required + "${pkg_mgr[@]}" install --no-install-recommends -y "${packages[@]}" +) From f5475fb703d2a4ef41fae0cfa6239835f04c9cd0 Mon Sep 17 00:00:00 2001 From: Lucas Briese Date: Mon, 17 Feb 2025 09:41:38 +0100 Subject: [PATCH 2/4] ci: update github actions --- .github/workflows/docker.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index a8e0437a51..296f617840 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -7,17 +7,17 @@ on: jobs: push_to_registries: name: Push Docker image to multiple registries - runs-on: ubuntu-20.04 + runs-on: ubuntu-24.04 permissions: packages: write contents: read steps: - name: Check out the repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 # If we want to publish an image of PhASAR to the official docker hub we # can just use the following code and set the corresponding secrets. # - name: Log in to Docker Hub @@ -27,7 +27,7 @@ jobs: # password: ${{ secrets.DOCKER_TOKEN }} - name: Log in to the Container registry - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} @@ -41,7 +41,7 @@ jobs: # here we could add a second image for the official docker registry # sse/phasar - name: Build and push Docker images - uses: docker/build-push-action@v3 + uses: docker/build-push-action@v6 with: context: . platforms: linux/amd64,linux/arm64 From 7509afb1c083ac5ebe6ac6460838e0b87d880ee2 Mon Sep 17 00:00:00 2001 From: Lucas Briese Date: Mon, 17 Feb 2025 13:21:22 +0100 Subject: [PATCH 3/4] ci: update build to clang-19 --- .github/workflows/ci.yml | 22 +++------------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 79c2de56c1..8deb9a72bf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: true matrix: - compiler: [ [clang++-14, clang-14] ] + compiler: [ [clang++-19, clang-19, "clang-19 libclang-rt-19-dev"] ] build: [ Debug, Release, DebugLibdeps ] include: - build: Debug @@ -36,24 +36,7 @@ jobs: - name: Install Phasar Dependencies shell: bash run: | - ./utils/InstallAptDependencies.sh - sudo apt-get -y install --no-install-recommends libboost-graph-dev - - - name: Install Strategy Dependencies - shell: bash - run: | - sudo apt-key adv --fetch-keys https://apt.llvm.org/llvm-snapshot.gpg.key - sudo add-apt-repository -y 'deb http://apt.llvm.org/focal/ llvm-toolchain-focal-14 main' - sudo apt-get update - sudo apt-get -y install --no-install-recommends \ - ${{ matrix.compiler[1] }} \ - llvm-14-dev \ - libllvm14 \ - libclang-common-14-dev \ - libclang-14-dev \ - libclang-cpp14-dev \ - clang-tidy-14 \ - libclang-rt-14-dev + ./utils/InstallAptDependencies.sh --noninteractive tzdata ${{ matrix.compiler[2] }} - uses: swift-actions/setup-swift@v2 with: @@ -68,6 +51,7 @@ jobs: cd build cmake .. \ -DCMAKE_BUILD_TYPE=${{ matrix.cmake_build_type }} \ + -DBUILD_PHASAR_CLANG=ON \ -DBUILD_SWIFT_TESTS=ON \ -DPHASAR_USE_Z3=ON \ ${{ matrix.flags }} \ From 3f74cb77a07e3068ad17f58ff3a6b053fc6ce21a Mon Sep 17 00:00:00 2001 From: Lucas Briese Date: Mon, 17 Feb 2025 15:32:49 +0100 Subject: [PATCH 4/4] ci: disable clang to stop double linking? --- .github/workflows/ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8deb9a72bf..4b631fe009 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,6 +6,8 @@ on: pull_request: branches: [ master, development ] +# TODO test in tree build? +# TODO test conan build jobs: build: runs-on: ubuntu-20.04 @@ -47,16 +49,14 @@ jobs: CC: ${{ matrix.compiler[1] }} shell: bash run: | - mkdir build - cd build - cmake .. \ + cmake -S . -B build \ -DCMAKE_BUILD_TYPE=${{ matrix.cmake_build_type }} \ - -DBUILD_PHASAR_CLANG=ON \ + -DBUILD_PHASAR_CLANG=OFF \ -DBUILD_SWIFT_TESTS=ON \ -DPHASAR_USE_Z3=ON \ ${{ matrix.flags }} \ -G Ninja - cmake --build . + ninja -C build - name: Run Unittests shell: bash