From eb93ae4cc688fcf1eb4dbcf6f1429084b2726e23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20H=C3=BCck?= Date: Sat, 4 Jan 2025 12:26:34 +0100 Subject: [PATCH 1/3] Update CMake --- CMakeLists.txt | 2 +- cmake/ToolchainOptions.cmake | 19 ++++++++++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 291961e..2c35725 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 3.14) +CMAKE_MINIMUM_REQUIRED(VERSION 3.20) PROJECT(irprinter) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) diff --git a/cmake/ToolchainOptions.cmake b/cmake/ToolchainOptions.cmake index 7fc0798..662b48e 100644 --- a/cmake/ToolchainOptions.cmake +++ b/cmake/ToolchainOptions.cmake @@ -1,8 +1,21 @@ +include(FeatureSummary) + set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules) -# Setup of all necessary include/lib dirs for the development of a Clang based tool -find_package(LLVM 10 REQUIRED) -find_package(Clang REQUIRED) +find_package(LLVM CONFIG HINTS "${LLVM_DIR}") +if(NOT LLVM_FOUND) + message(STATUS "LLVM not found at: ${LLVM_DIR}.") + find_package(LLVM REQUIRED CONFIG) +endif() + +set_package_properties(LLVM PROPERTIES + URL https://llvm.org/ + TYPE REQUIRED + PURPOSE + "LLVM framework installation required to compile." +) + +message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_DIR}") From 1ee7e7a85f2ee598aec2912824b83d6dd506170a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20H=C3=BCck?= Date: Sat, 4 Jan 2025 12:39:24 +0100 Subject: [PATCH 2/3] Compile with Clang 14 and 18 --- .github/workflows/basic-ci.yml | 88 +++++++++++++++++++++++--------- CMakeLists.txt | 2 +- cmake/ToolchainOptions.cmake | 4 +- cmake/modules/FindLibEdit.cmake | 18 ------- cmake/modules/clang-format.cmake | 4 +- cmake/modules/clang-tidy.cmake | 4 +- cmake/modules/log-util.cmake | 2 +- cmake/modules/target-util.cmake | 2 +- include/Util.h | 8 ++- src/main.cpp | 21 +++++--- 10 files changed, 96 insertions(+), 57 deletions(-) delete mode 100644 cmake/modules/FindLibEdit.cmake diff --git a/.github/workflows/basic-ci.yml b/.github/workflows/basic-ci.yml index d064b89..4f94ea5 100644 --- a/.github/workflows/basic-ci.yml +++ b/.github/workflows/basic-ci.yml @@ -5,38 +5,80 @@ on: branches: [ master, devel ] pull_request: +env: + CXX: clang++ + CC: clang + jobs: - formatting-check: - runs-on: ubuntu-20.04 - if: "!contains(github.event.head_commit.message, '[ci skip]')" + format-check: + runs-on: ubuntu-22.04 + steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - - name: Check code format - uses: jidicula/clang-format-action@v3.2.0 - with: - clang-format-version: '10' + - name: Format source code + run: | + find demo lib test \ + -type f \ + -a \( -name "*.c" -o -name "*.cpp" -o -name "*.h" \) \ + -print0 \ + | xargs -0 clang-format-14 -i + + - name: Format check + run: | + git status --porcelain --untracked-files=no + git status --porcelain --untracked-files=no | xargs -o -I {} test -z \"{}\" + + codespell: + runs-on: ubuntu-22.04 - build-and-run-test: - runs-on: ubuntu-20.04 - if: "!contains(github.event.head_commit.message, '[ci skip]')" steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 + - uses: codespell-project/actions-codespell@v2 - - name: Install Clang and libs - run: sudo apt-get install clang-tools-10 clang-tidy-10 libclang-10-dev libclang-cpp10-dev libedit-dev + build-project: + strategy: + fail-fast: false + matrix: + include: + - llvm-version: 12 + os: ubuntu-20.04 + preset: develop + - llvm-version: 14 + os: ubuntu-22.04 + preset: develop + - llvm-version: 18 + os: ubuntu-24.04 + preset: develop + + runs-on: ${{ matrix.os }} + + steps: + - uses: actions/checkout@v4 + + - name: Update apt + run: sudo apt-get update + + - name: Install LLVM + run: sudo apt-get install libllvm${{ matrix.llvm-version }} llvm-${{ matrix.llvm-version }} llvm-${{ matrix.llvm-version }}-dev + + - name: Install Clang + run: sudo apt-get install clang-${{ matrix.llvm-version }} clang-tidy-${{ matrix.llvm-version }} clang-tools-${{ matrix.llvm-version }} libclang-${{ matrix.llvm-version }}-dev libclang-cpp${{ matrix.llvm-version }}-dev libedit-dev - name: Setup env run: | - sudo ln -f -s /usr/bin/clang-10 /usr/bin/clang - sudo ln -f -s /usr/bin/clang++-10 /usr/bin/clang++ - sudo ln -f -s /usr/bin/FileCheck-10 /usr/bin/FileCheck - sudo ln -f -s /usr/bin/clang-tidy-10 /usr/bin/clang-tidy - echo "CC=clang-10" >> $GITHUB_ENV - echo "CXX=clang++-10" >> $GITHUB_ENV - echo "EXTERNAL_LIT=/usr/lib/llvm-10/build/utils/lit/lit.py" >> $GITHUB_ENV + sudo ln -f -s /usr/bin/clang-${{ matrix.llvm-version }} /usr/bin/clang + sudo ln -f -s /usr/bin/clang++-${{ matrix.llvm-version }} /usr/bin/clang++ + echo "LLVM_CMAKE_DIR=/usr/lib/llvm-${{ matrix.llvm-version }}/cmake" >> $GITHUB_ENV + echo "CLANG_CMAKE_DIR=/usr/lib/llvm-${{ matrix.llvm-version }}/lib/cmake/clang" >> $GITHUB_ENV + echo "EXTERNAL_LIT=/usr/lib/llvm-${{ matrix.llvm-version }}/build/utils/lit/lit.py" >> $GITHUB_ENV - name: Build IRPrinter run: | - cmake -B build -DCMAKE_BUILD_TYPE=Debug - cmake --build build --parallel --target install + cmake -B build -DCMAKE_BUILD_TYPE=Debug -DLLVM_DIR=${LLVM_CMAKE_DIR} -DClang_DIR=${CLANG_CMAKE_DIR} + cmake --build build --parallel + + - name: Build IRPrinter release + run: | + cmake -B build_rel -DCMAKE_BUILD_TYPE=Release -DLLVM_DIR=${LLVM_CMAKE_DIR} -DClang_DIR=${CLANG_CMAKE_DIR} + cmake --build build_rel --parallel --target install diff --git a/CMakeLists.txt b/CMakeLists.txt index 2c35725..4016615 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,4 +21,4 @@ add_format_target(format-sources include/*.h ) -add_subdirectory(src) \ No newline at end of file +add_subdirectory(src) diff --git a/cmake/ToolchainOptions.cmake b/cmake/ToolchainOptions.cmake index 662b48e..6278f0c 100644 --- a/cmake/ToolchainOptions.cmake +++ b/cmake/ToolchainOptions.cmake @@ -19,6 +19,8 @@ message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_DIR}") +find_package(Clang REQUIRED HINTS "${Clang_DIR}") + include(AddLLVM) include(clang-tidy) include(clang-format) @@ -35,4 +37,4 @@ endif () if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) set(CMAKE_INSTALL_PREFIX "${irprinter_SOURCE_DIR}/install/irprinter" CACHE PATH "Default install path" FORCE) message(STATUS "Installing to (default): ${CMAKE_INSTALL_PREFIX}") -endif () \ No newline at end of file +endif () diff --git a/cmake/modules/FindLibEdit.cmake b/cmake/modules/FindLibEdit.cmake deleted file mode 100644 index 4f8a7b2..0000000 --- a/cmake/modules/FindLibEdit.cmake +++ /dev/null @@ -1,18 +0,0 @@ -include(FindPackageHandleStandardArgs) - -find_path(libedit_INCLUDE_DIRS - editline/readline.h - PATHS ${LIBEDIT_INCLUDE_DIR} /usr/include /usr/local/include -) - -find_library(libedit_LIBRARIES - NAMES edit - PATHS ${LIBEDIT_LIBRARY_DIR} /usr/lib /usr/local/lib /usr/lib64 /usr/local/lib64 -) - -find_package_handle_standard_args(libedit - FOUND_VAR libedit_FOUND - REQUIRED_VARS - libedit_LIBRARIES - libedit_INCLUDE_DIRS -) \ No newline at end of file diff --git a/cmake/modules/clang-format.cmake b/cmake/modules/clang-format.cmake index c852e25..900e3e2 100644 --- a/cmake/modules/clang-format.cmake +++ b/cmake/modules/clang-format.cmake @@ -20,7 +20,7 @@ function(add_format_target target comment) endforeach() find_program(FORMAT_COMMAND - NAMES clang-format clang-format-6.0 clang-format-5.0 clang-format-4.0) + NAMES clang-format clang-format-12 clang-format-14 clang-format-18) if(FORMAT_COMMAND) add_custom_target(${target} COMMAND ${FORMAT_COMMAND} -i -style=file ${ARG_OTHER} ${ARG_UNPARSED_ARGUMENTS} @@ -34,4 +34,4 @@ function(add_format_target target comment) add_custom_target(${target} COMMAND ${CMAKE_COMMAND} -E echo "${target} does nothing, no clang-format found.") endif() -endfunction() \ No newline at end of file +endfunction() diff --git a/cmake/modules/clang-tidy.cmake b/cmake/modules/clang-tidy.cmake index b67bde2..33ededd 100644 --- a/cmake/modules/clang-tidy.cmake +++ b/cmake/modules/clang-tidy.cmake @@ -15,7 +15,7 @@ function(add_tidy_target target comment) endforeach() find_program(TIDY_COMMAND - NAMES clang-tidy clang-tidy-6.0 clang-tidy-5.0 clang-tidy-4.0) + NAMES clang-tidy clang-tidy-12 clang-tidy-14 clang-tidy-18) if(TIDY_COMMAND) add_custom_target(${target} COMMAND ${TIDY_COMMAND} -p ${CMAKE_BINARY_DIR} @@ -54,4 +54,4 @@ function(make_tidy_check name sources) SOURCES ${sources} OTHER --header-filter=${CMAKE_CURRENT_SOURCE_DIR} -checks=-*,modernize-*,llvm-namespace-comment,google-explicit-constructor ) -endfunction() \ No newline at end of file +endfunction() diff --git a/cmake/modules/log-util.cmake b/cmake/modules/log-util.cmake index 43e7d10..40ebd7f 100644 --- a/cmake/modules/log-util.cmake +++ b/cmake/modules/log-util.cmake @@ -17,4 +17,4 @@ function(target_define_file_basename targetname) PROPERTIES COMPILE_DEFINITIONS ${compile_defs} ) endforeach() -endfunction() \ No newline at end of file +endfunction() diff --git a/cmake/modules/target-util.cmake b/cmake/modules/target-util.cmake index ece95c5..a7a7112 100644 --- a/cmake/modules/target-util.cmake +++ b/cmake/modules/target-util.cmake @@ -36,4 +36,4 @@ function(target_project_compile_definitions target) "${ARG_PUBLIC_DEFS}" ) endif () -endfunction() \ No newline at end of file +endfunction() diff --git a/include/Util.h b/include/Util.h index b47932d..f7a1312 100644 --- a/include/Util.h +++ b/include/Util.h @@ -74,8 +74,12 @@ inline std::string dump(const Val& s) { template inline std::string try_demangle(String s) { - std::string name = s; - auto demangle = llvm::itaniumDemangle(s.data(), nullptr, nullptr, nullptr); + std::string name{s}; +#if LLVM_VERSION_MAJOR == 18 + auto demangle = llvm::itaniumDemangle(s.data()); +#else + auto demangle = llvm::itaniumDemangle(s.data(), nullptr, nullptr, nullptr); +#endif if (demangle && std::string(demangle) != "") { return std::string(demangle); } diff --git a/src/main.cpp b/src/main.cpp index 69882a9..1f205f6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,7 +1,7 @@ #include #include -#include +#include #include #include #include @@ -41,9 +41,18 @@ StringRef lexWord(StringRef word) { } // namespace int main(int argc, const char** argv) { +#if LLVM_VERSION_MAJOR < 14 CommonOptionsParser op(argc, argv, IRPrinter); - irprinter::IRNodeFinder ir(op); +#else + auto op = CommonOptionsParser::create(argc, argv, IRPrinter); + if (!op) { + llvm::outs() << "Erroneous input"; + return 1; + } + irprinter::IRNodeFinder ir(op.get()); +#endif + auto ret = ir.parse(); if (ret != 0) { @@ -52,7 +61,7 @@ int main(int argc, const char** argv) { } llvm::LineEditor le("ir-printer"); - while (llvm::Optional line = le.readLine()) { + while (auto line = le.readLine()) { StringRef ref = *line; auto cmd = lexWord(ref); @@ -80,13 +89,13 @@ int main(int argc, const char** argv) { } } if (cmd == "p" || cmd == "print") { - ir.printFunction(str); + ir.printFunction(std::string{str}); } else { - ir.listFunction(str); + ir.listFunction(std::string{str}); } } else if (cmd == "d" || cmd == "demangle") { auto str = lexWord(StringRef(cmd.end(), ref.end() - cmd.end())); - auto demangled_name = irprinter::IRNodeFinder::demangle(str); + auto demangled_name = irprinter::IRNodeFinder::demangle(std::string{str}); llvm::outs() << "Demangled name: " << demangled_name << "\n"; } From 722a8faf61011a202deb59ff1d0a84049017cc06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20H=C3=BCck?= Date: Sat, 4 Jan 2025 12:43:49 +0100 Subject: [PATCH 3/3] Codespell --- .codespellrc | 7 +++++++ cmake/ToolchainOptions.cmake | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 .codespellrc diff --git a/.codespellrc b/.codespellrc new file mode 100644 index 0000000..9d4307c --- /dev/null +++ b/.codespellrc @@ -0,0 +1,7 @@ +[codespell] +builtin = clear,rare,en-GB_to_en-US,names,informal,code +check-filenames = +check-hidden = +skip = */.git,*/build*,*/.codespellrc,*/install +quiet-level = 2 +ignore-regex = ^#include <(?:stdio)\.h>$|DEPENDEES|\\endcode diff --git a/cmake/ToolchainOptions.cmake b/cmake/ToolchainOptions.cmake index 6278f0c..165da8b 100644 --- a/cmake/ToolchainOptions.cmake +++ b/cmake/ToolchainOptions.cmake @@ -27,7 +27,7 @@ include(clang-format) include(log-util) include(target-util) -set(LOG_LEVEL 0 CACHE STRING "Granularity of the logger. 3 ist most verbose, 0 is least.") +set(LOG_LEVEL 0 CACHE STRING "Granularity of the logger. 3 is most verbose, 0 is least.") if (NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Debug CACHE STRING "" FORCE)