From fcf7ca186b5daa68a7de0a550382568b31f2742b Mon Sep 17 00:00:00 2001 From: serge-sans-paille Date: Wed, 13 Nov 2019 23:19:56 +0100 Subject: [PATCH 1/3] Setup default build action for llvm --- .github/workflows/llvm.yml | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 .github/workflows/llvm.yml diff --git a/.github/workflows/llvm.yml b/.github/workflows/llvm.yml new file mode 100644 index 0000000000000..c18b3c27d547c --- /dev/null +++ b/.github/workflows/llvm.yml @@ -0,0 +1,34 @@ +name: CI + +on: [push] + +jobs: + build_llvm: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: + - ubuntu-latest + - windows-latest + - macOS-latest + cmake_args: + - "" + steps: + - name: Setup Windows + if: startsWith(matrix.os, 'windows') + uses: tstellar/actions/setup-windows@master + with: + arch: amd64 + - uses: actions/checkout@v1 + with: + fetch-depth: 1 + - name: Install Ninja + uses: tstellar/actions/install-ninja@master + with: + os: ${{ runner.os }} + - name: Test LLVM + uses: tstellar/actions/build-test-llvm-project@master + with: + cmake_args: -G Ninja -DCMAKE_BUILD_TYPE=Release ${{ matrix.cmake_args }} + os: ${{ runner.os }} From 760094e09f9f6e5de090c1ad429d043d9dbae9ce Mon Sep 17 00:00:00 2001 From: serge-sans-paille Date: Tue, 7 Jan 2020 09:15:27 +0100 Subject: [PATCH 2/3] Specific github validation --- .github/workflows/llvm.yml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/workflows/llvm.yml b/.github/workflows/llvm.yml index c18b3c27d547c..47a6d4b46fa57 100644 --- a/.github/workflows/llvm.yml +++ b/.github/workflows/llvm.yml @@ -12,8 +12,6 @@ jobs: - ubuntu-latest - windows-latest - macOS-latest - cmake_args: - - "" steps: - name: Setup Windows if: startsWith(matrix.os, 'windows') @@ -27,8 +25,14 @@ jobs: uses: tstellar/actions/install-ninja@master with: os: ${{ runner.os }} - - name: Test LLVM + - name: Test LLVM / dynamic + if: startsWith(matrix.os, 'windows') == false uses: tstellar/actions/build-test-llvm-project@master with: - cmake_args: -G Ninja -DCMAKE_BUILD_TYPE=Release ${{ matrix.cmake_args }} + cmake_args: -G Ninja -DCMAKE_BUILD_TYPE=Release ${{ matrix.cmake_args }} -DLLVM_ENABLE_PROJECTS='polly;clang' -DPOLLY_ENABLE_GPGPU_CODEGEN=OFF -DLLVM_ENABLE_ASSERTIONS=ON -DLLVM_POLLY_LINK_INTO_TOOLS=OFF -DLLVM_BUILD_EXAMPLES=ON + os: ${{ runner.os }} + - name: Test LLVM / static + uses: tstellar/actions/build-test-llvm-project@master + with: + cmake_args: -G Ninja -DCMAKE_BUILD_TYPE=Release ${{ matrix.cmake_args }} -DLLVM_ENABLE_PROJECTS='polly;clang' -DPOLLY_ENABLE_GPGPU_CODEGEN=ON -DLLVM_ENABLE_ASSERTIONS=ON -DLLVM_POLLY_LINK_INTO_TOOLS=ON -DLLVM_BUILD_EXAMPLES=ON os: ${{ runner.os }} From 2f8705d42c9d0b275e3968a0c6dc0980dd187b54 Mon Sep 17 00:00:00 2001 From: serge-sans-paille Date: Tue, 7 Jan 2020 21:53:37 +0100 Subject: [PATCH 3/3] Compiler extension patch --- llvm/cmake/modules/AddLLVM.cmake | 36 +++++++++++-------- llvm/examples/Bye/CMakeLists.txt | 30 ++++++---------- llvm/include/llvm/Support/DynamicLibrary.h | 4 +++ llvm/lib/Support/DynamicLibrary.cpp | 5 +++ .../lib/Transforms/IPO/PassManagerBuilder.cpp | 9 +++++ llvm/test/Feature/load_extension.ll | 5 +-- llvm/test/lit.cfg.py | 4 +-- polly/lib/CMakeLists.txt | 1 + 8 files changed, 54 insertions(+), 40 deletions(-) diff --git a/llvm/cmake/modules/AddLLVM.cmake b/llvm/cmake/modules/AddLLVM.cmake index 75e0f10d68ac1..fce36ba212532 100644 --- a/llvm/cmake/modules/AddLLVM.cmake +++ b/llvm/cmake/modules/AddLLVM.cmake @@ -847,32 +847,40 @@ macro(add_llvm_executable name) llvm_codesign(${name} ENTITLEMENTS ${ARG_ENTITLEMENTS} BUNDLE_PATH ${ARG_BUNDLE_PATH}) endmacro(add_llvm_executable name) -# add_llvm_pass_plugin(name) +# add_llvm_pass_plugin(name [NO_MODULE] ...) # Add ${name} as an llvm plugin. # If option LLVM_${name_upper}_LINK_INTO_TOOLS is set to ON, the plugin is registered statically. # Otherwise a pluggable shared library is registered. +# +# If NO_MODULE is specified, when option LLVM_${name_upper}_LINK_INTO_TOOLS is set to OFF, +# only an object library is built, and no module is built. This is specific to the Polly use case. function(add_llvm_pass_plugin name) + cmake_parse_arguments(ARG + "NO_MODULE" "" "" + ${ARGN}) string(TOUPPER ${name} name_upper) option(LLVM_${name_upper}_LINK_INTO_TOOLS "Statically link ${name} into tools (if available)" OFF) - # process_llvm_pass_plugins takes care of the actual linking, just create an - # object library as of now - add_llvm_library(${name} OBJECT ${ARGN}) - - if(LLVM_${name_upper}_LINK_INTO_TOOLS) - target_compile_definitions(${name} PRIVATE LLVM_${name_upper}_LINK_INTO_TOOLS) - set_property(TARGET ${name} APPEND PROPERTY COMPILE_DEFINITIONS LLVM_LINK_INTO_TOOLS) - if (TARGET intrinsics_gen) - add_dependencies(obj.${name} intrinsics_gen) - endif() - endif() - - message(STATUS "Registering ${name} as a pass plugin (static build: ${LLVM_${name_upper}_LINK_INTO_TOOLS})") if(LLVM_${name_upper}_LINK_INTO_TOOLS) + list(REMOVE_ITEM ARG_UNPARSED_ARGUMENTS BUILDTREE_ONLY) + # process_llvm_pass_plugins takes care of the actual linking, just create an + # object library as of now + add_llvm_library(${name} OBJECT ${ARG_UNPARSED_ARGUMENTS}) + target_compile_definitions(${name} PRIVATE LLVM_${name_upper}_LINK_INTO_TOOLS) + set_property(TARGET ${name} APPEND PROPERTY COMPILE_DEFINITIONS LLVM_LINK_INTO_TOOLS) + if (TARGET intrinsics_gen) + add_dependencies(obj.${name} intrinsics_gen) + endif() + message(STATUS "Registering ${name} as a pass plugin (static build: ${LLVM_${name_upper}_LINK_INTO_TOOLS})") set_property(GLOBAL APPEND PROPERTY LLVM_COMPILE_EXTENSIONS ${name}) + elseif(NOT ARG_NO_MODULE) + add_llvm_library(${name} MODULE ${ARG_UNPARSED_ARGUMENTS}) + else() + add_llvm_library(${name} OBJECT ${ARG_UNPARSED_ARGUMENTS}) endif() + endfunction(add_llvm_pass_plugin) # Generate X Macro file for extension handling. It provides a diff --git a/llvm/examples/Bye/CMakeLists.txt b/llvm/examples/Bye/CMakeLists.txt index a6767209491af..3206f90d09166 100644 --- a/llvm/examples/Bye/CMakeLists.txt +++ b/llvm/examples/Bye/CMakeLists.txt @@ -1,23 +1,13 @@ -add_llvm_pass_plugin(Bye - Bye.cpp - DEPENDS - intrinsics_gen - BUILDTREE_ONLY - ) - -if (LLVM_LINK_LLVM_DYLIB) - target_link_libraries(Bye PUBLIC LLVM) -else() - target_link_libraries(Bye - PUBLIC - LLVMSupport - LLVMCore - LLVMipo - LLVMPasses - ) +if(LLVM_BYE_LINK_INTO_TOOLS) + message(WARNING "Setting LLVM_BYE_LINK_INTO_TOOLS=ON only makes sense for testing purpose") endif() -if( LLVM_BUILD_EXAMPLES ) - install(TARGETS ${name} RUNTIME DESTINATION examples) -endif() +add_llvm_pass_plugin(Bye + Bye.cpp + DEPENDS + intrinsics_gen + BUILDTREE_ONLY + ) + +install(TARGETS ${name} RUNTIME DESTINATION examples) set_target_properties(${name} PROPERTIES FOLDER "Examples") diff --git a/llvm/include/llvm/Support/DynamicLibrary.h b/llvm/include/llvm/Support/DynamicLibrary.h index 95d5ba281e225..2f997c516caf2 100644 --- a/llvm/include/llvm/Support/DynamicLibrary.h +++ b/llvm/include/llvm/Support/DynamicLibrary.h @@ -123,6 +123,10 @@ namespace sys { /// Add searchable symbol/value pair. static void AddSymbol(StringRef symbolName, void *symbolValue); + /// Ensure the underlying library registry is properly constructed. + /// This is only useful to force ManagedStatic registration ordering. + static void ensureConstructed(); + class HandleSet; }; diff --git a/llvm/lib/Support/DynamicLibrary.cpp b/llvm/lib/Support/DynamicLibrary.cpp index d23716016fb29..51b66e1724380 100644 --- a/llvm/lib/Support/DynamicLibrary.cpp +++ b/llvm/lib/Support/DynamicLibrary.cpp @@ -145,6 +145,11 @@ void DynamicLibrary::AddSymbol(StringRef SymbolName, void *SymbolValue) { (*ExplicitSymbols)[SymbolName] = SymbolValue; } +void DynamicLibrary::ensureConstructed() { + (void)*OpenedHandles; +} + + DynamicLibrary DynamicLibrary::getPermanentLibrary(const char *FileName, std::string *Err) { // Force OpenedHandles to be added into the ManagedStatic list before any diff --git a/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp b/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp index 9c992830879ae..bbad575e5c8ca 100644 --- a/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp +++ b/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp @@ -27,6 +27,7 @@ #include "llvm/IR/LegacyPassManager.h" #include "llvm/IR/Verifier.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/DynamicLibrary.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Transforms/AggressiveInstCombine/AggressiveInstCombine.h" #include "llvm/Transforms/IPO.h" @@ -194,12 +195,20 @@ static ManagedStaticempty(); } void PassManagerBuilder::addGlobalExtension( PassManagerBuilder::ExtensionPointTy Ty, PassManagerBuilder::ExtensionFn Fn) { + // See comment in GlobalExtensionsNotEmpty + sys::DynamicLibrary::ensureConstructed(); GlobalExtensions->push_back(std::make_pair(Ty, std::move(Fn))); } diff --git a/llvm/test/Feature/load_extension.ll b/llvm/test/Feature/load_extension.ll index fc4804e4069e1..bce6fc40df24f 100644 --- a/llvm/test/Feature/load_extension.ll +++ b/llvm/test/Feature/load_extension.ll @@ -1,8 +1,5 @@ -; This is currently failing on multiple platforms. Disable while investigation occurs. -; XFAIL: * - ; RUN: opt %s %loadbye -goodbye -wave-goodbye -disable-output 2>&1 | FileCheck %s -; REQUIRES: plugins, examples +; REQUIRES: plugins ; CHECK: Bye @junk = global i32 0 diff --git a/llvm/test/lit.cfg.py b/llvm/test/lit.cfg.py index e785b220540f3..b57b87ad657f4 100644 --- a/llvm/test/lit.cfg.py +++ b/llvm/test/lit.cfg.py @@ -200,13 +200,13 @@ def get_asan_rtlib(): if config.build_examples: config.available_features.add('examples') -if config.linked_bye_extension and config.build_examples: +if config.linked_bye_extension: config.substitutions.append(('%llvmcheckext', 'CHECK-EXT')) config.substitutions.append(('%loadbye', '')) else: config.substitutions.append(('%llvmcheckext', 'CHECK-NOEXT')) config.substitutions.append(('%loadbye', - '-load={}/libBye{}'.format(config.llvm_shlib_dir, + '-load={}/Bye{}'.format(config.llvm_shlib_dir, config.llvm_shlib_ext))) # Static libraries are not built if BUILD_SHARED_LIBS is ON. diff --git a/polly/lib/CMakeLists.txt b/polly/lib/CMakeLists.txt index 9e8cd1906d625..ee0834cc8e323 100644 --- a/polly/lib/CMakeLists.txt +++ b/polly/lib/CMakeLists.txt @@ -24,6 +24,7 @@ endif () # Use an object-library to add the same files to multiple libs without requiring # the sources them to be recompiled for each of them. add_llvm_pass_plugin(Polly + NO_MODULE Analysis/DependenceInfo.cpp Analysis/PolyhedralInfo.cpp Analysis/ScopDetection.cpp