mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 02:33:06 +01:00
Generalize the pass registration mechanism used by Polly to any third-party tool
There's quite a lot of references to Polly in the LLVM CMake codebase. However the registration pattern used by Polly could be useful to other external projects: thanks to that mechanism it would be possible to develop LLVM extension without touching the LLVM code base. This patch has two effects: 1. Remove all code specific to Polly in the llvm/clang codebase, replaicing it with a generic mechanism 2. Provide a generic mechanism to register compiler extensions. A compiler extension is similar to a pass plugin, with the notable difference that the compiler extension can be configured to be built dynamically (like plugins) or statically (like regular passes). As a result, people willing to add extra passes to clang/opt can do it using a separate code repo, but still have their pass be linked in clang/opt as built-in passes. Differential Revision: https://reviews.llvm.org/D61446
This commit is contained in:
parent
fc85d8d705
commit
d4f51b5c4f
@ -465,29 +465,6 @@ set(LLVM_LIB_FUZZING_ENGINE "" CACHE PATH
|
||||
option(LLVM_USE_SPLIT_DWARF
|
||||
"Use -gsplit-dwarf when compiling llvm." OFF)
|
||||
|
||||
option(LLVM_POLLY_LINK_INTO_TOOLS "Statically link Polly into tools (if available)" ON)
|
||||
option(LLVM_POLLY_BUILD "Build LLVM with Polly" ON)
|
||||
|
||||
if (EXISTS ${LLVM_MAIN_SRC_DIR}/tools/polly/CMakeLists.txt)
|
||||
set(POLLY_IN_TREE TRUE)
|
||||
elseif(LLVM_EXTERNAL_POLLY_SOURCE_DIR)
|
||||
set(POLLY_IN_TREE TRUE)
|
||||
else()
|
||||
set(POLLY_IN_TREE FALSE)
|
||||
endif()
|
||||
|
||||
if (LLVM_POLLY_BUILD AND POLLY_IN_TREE)
|
||||
set(WITH_POLLY ON)
|
||||
else()
|
||||
set(WITH_POLLY OFF)
|
||||
endif()
|
||||
|
||||
if (LLVM_POLLY_LINK_INTO_TOOLS AND WITH_POLLY)
|
||||
set(LINK_POLLY_INTO_TOOLS ON)
|
||||
else()
|
||||
set(LINK_POLLY_INTO_TOOLS OFF)
|
||||
endif()
|
||||
|
||||
# Define an option controlling whether we should build for 32-bit on 64-bit
|
||||
# platforms, where supported.
|
||||
if( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
|
||||
@ -1112,3 +1089,5 @@ endif()
|
||||
if (LLVM_INCLUDE_UTILS AND LLVM_INCLUDE_TOOLS)
|
||||
add_subdirectory(utils/llvm-locstats)
|
||||
endif()
|
||||
|
||||
process_llvm_pass_plugins()
|
||||
|
@ -404,7 +404,7 @@ endfunction(set_windows_version_resource_properties)
|
||||
# )
|
||||
function(llvm_add_library name)
|
||||
cmake_parse_arguments(ARG
|
||||
"MODULE;SHARED;STATIC;OBJECT;DISABLE_LLVM_LINK_LLVM_DYLIB;SONAME;NO_INSTALL_RPATH;COMPONENT_LIB"
|
||||
"MODULE;SHARED;STATIC;OBJECT;DISABLE_LLVM_LINK_LLVM_DYLIB;SONAME;NO_INSTALL_RPATH;COMPONENT_LIB;ENABLE_PLUGINS"
|
||||
"OUTPUT_NAME;PLUGIN_TOOL;ENTITLEMENTS;BUNDLE_PATH"
|
||||
"ADDITIONAL_HEADERS;DEPENDS;LINK_COMPONENTS;LINK_LIBS;OBJLIBS"
|
||||
${ARGN})
|
||||
@ -418,6 +418,9 @@ function(llvm_add_library name)
|
||||
else()
|
||||
llvm_process_sources(ALL_FILES ${ARG_UNPARSED_ARGUMENTS} ${ARG_ADDITIONAL_HEADERS})
|
||||
endif()
|
||||
if(ARG_ENABLE_PLUGINS)
|
||||
set_property(GLOBAL APPEND PROPERTY LLVM_PLUGIN_TARGETS ${name})
|
||||
endif()
|
||||
|
||||
if(ARG_MODULE)
|
||||
if(ARG_SHARED OR ARG_STATIC)
|
||||
@ -745,7 +748,7 @@ endmacro(add_llvm_library name)
|
||||
|
||||
macro(add_llvm_executable name)
|
||||
cmake_parse_arguments(ARG
|
||||
"DISABLE_LLVM_LINK_LLVM_DYLIB;IGNORE_EXTERNALIZE_DEBUGINFO;NO_INSTALL_RPATH;SUPPORT_PLUGINS"
|
||||
"DISABLE_LLVM_LINK_LLVM_DYLIB;IGNORE_EXTERNALIZE_DEBUGINFO;NO_INSTALL_RPATH;SUPPORT_PLUGINS;ENABLE_PLUGINS"
|
||||
"ENTITLEMENTS;BUNDLE_PATH"
|
||||
"DEPENDS"
|
||||
${ARGN})
|
||||
@ -832,10 +835,78 @@ macro(add_llvm_executable name)
|
||||
# API for all shared libaries loaded by this executable.
|
||||
target_link_libraries(${name} PRIVATE ${LLVM_PTHREAD_LIB})
|
||||
endif()
|
||||
if(ARG_ENABLE_PLUGINS)
|
||||
set_property(GLOBAL APPEND PROPERTY LLVM_PLUGIN_TARGETS ${name})
|
||||
endif()
|
||||
|
||||
llvm_codesign(${name} ENTITLEMENTS ${ARG_ENTITLEMENTS} BUNDLE_PATH ${ARG_BUNDLE_PATH})
|
||||
endmacro(add_llvm_executable name)
|
||||
|
||||
# add_llvm_pass_plugin(name)
|
||||
# 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.
|
||||
function(add_llvm_pass_plugin name)
|
||||
|
||||
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)
|
||||
set_property(GLOBAL APPEND PROPERTY LLVM_COMPILE_EXTENSIONS ${name})
|
||||
endif()
|
||||
endfunction(add_llvm_pass_plugin)
|
||||
|
||||
# Generate X Macro file for extension handling. It provides a
|
||||
# HANDLE_EXTENSION(extension_namespace, ExtensionProject) call for each extension
|
||||
# allowing client code to define HANDLE_EXTENSION to have a specific code be run for
|
||||
# each extension.
|
||||
#
|
||||
# Also correctly set lib dependencies between plugins and tools.
|
||||
function(process_llvm_pass_plugins)
|
||||
get_property(LLVM_EXTENSIONS GLOBAL PROPERTY LLVM_COMPILE_EXTENSIONS)
|
||||
file(WRITE "${CMAKE_BINARY_DIR}/include/llvm/Support/Extension.def.tmp" "//extension handlers\n")
|
||||
foreach(llvm_extension ${LLVM_EXTENSIONS})
|
||||
string(TOLOWER ${llvm_extension} llvm_extension_lower)
|
||||
|
||||
string(TOUPPER ${llvm_extension} llvm_extension_upper)
|
||||
string(SUBSTRING ${llvm_extension_upper} 0 1 llvm_extension_upper_first)
|
||||
string(SUBSTRING ${llvm_extension_lower} 1 -1 llvm_extension_lower_tail)
|
||||
string(CONCAT llvm_extension_project ${llvm_extension_upper_first} ${llvm_extension_lower_tail})
|
||||
|
||||
if(LLVM_${llvm_extension_upper}_LINK_INTO_TOOLS)
|
||||
file(APPEND "${CMAKE_BINARY_DIR}/include/llvm/Support/Extension.def.tmp" "HANDLE_EXTENSION(${llvm_extension_project})\n")
|
||||
|
||||
get_property(llvm_plugin_targets GLOBAL PROPERTY LLVM_PLUGIN_TARGETS)
|
||||
foreach(llvm_plugin_target ${llvm_plugin_targets})
|
||||
set_property(TARGET ${llvm_plugin_target} APPEND PROPERTY LINK_LIBRARIES ${llvm_extension})
|
||||
set_property(TARGET ${llvm_plugin_target} APPEND PROPERTY INTERFACE_LINK_LIBRARIES ${llvm_extension})
|
||||
endforeach()
|
||||
else()
|
||||
add_llvm_library(${llvm_extension_lower} MODULE obj.${llvm_extension_lower})
|
||||
endif()
|
||||
|
||||
endforeach()
|
||||
file(APPEND "${CMAKE_BINARY_DIR}/include/llvm/Support/Extension.def.tmp" "#undef HANDLE_EXTENSION\n")
|
||||
|
||||
# only replace if there's an actual change
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_BINARY_DIR}/include/llvm/Support/Extension.def.tmp" "${CMAKE_BINARY_DIR}/include/llvm/Support/Extension.def")
|
||||
file(REMOVE "${CMAKE_BINARY_DIR}/include/llvm/Support/Extension.def.tmp")
|
||||
endfunction()
|
||||
|
||||
function(export_executable_symbols target)
|
||||
if (LLVM_EXPORTED_SYMBOL_FILE)
|
||||
# The symbol file should contain the symbols we want the executable to
|
||||
|
@ -1175,6 +1175,51 @@ implement ``releaseMemory`` to, well, release the memory allocated to maintain
|
||||
this internal state. This method is called after the ``run*`` method for the
|
||||
class, before the next call of ``run*`` in your pass.
|
||||
|
||||
Building pass plugins
|
||||
=====================
|
||||
|
||||
As an alternative to using ``PLUGIN_TOOL``, LLVM provides a mechanism to
|
||||
automatically register pass plugins within ``clang``, ``opt`` and ``bugpoint``.
|
||||
One first needs to create an independent project and add it to either ``tools/``
|
||||
or, using the MonoRepo layout, at the root of the repo alongside other projects.
|
||||
This project must contain the following minimal ``CMakeLists.txt``:
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
add_llvm_pass_plugin(Name source0.cpp)
|
||||
|
||||
The pass must provide two entry points for the new pass manager, one for static
|
||||
registration and one for dynamically loaded plugins:
|
||||
|
||||
- ``llvm::PassPluginLibraryInfo get##Name##PluginInfo();``
|
||||
- ``extern "C" ::llvm::PassPluginLibraryInfo llvmGetPassPluginInfo() LLVM_ATTRIBUTE_WEAK;``
|
||||
|
||||
Pass plugins are compiled and link dynamically by default, but it's
|
||||
possible to set the following variables to change this behavior:
|
||||
|
||||
- ``LLVM_${NAME}_LINK_INTO_TOOLS``, when set to ``ON``, turns the project into
|
||||
a statically linked extension
|
||||
|
||||
|
||||
When building a tool that uses the new pass manager, one can use the following snippet to
|
||||
include statically linked pass plugins:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
// fetch the declaration
|
||||
#define HANDLE_EXTENSION(Ext) llvm::PassPluginLibraryInfo get##Ext##PluginInfo();
|
||||
#include "llvm/Support/Extension.def"
|
||||
|
||||
[...]
|
||||
|
||||
// use them, PB is an llvm::PassBuilder instance
|
||||
#define HANDLE_EXTENSION(Ext) get##Ext##PluginInfo().RegisterPassBuilderCallbacks(PB);
|
||||
#include "llvm/Support/Extension.def"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Registering dynamically loaded passes
|
||||
=====================================
|
||||
|
||||
|
69
examples/Bye/Bye.cpp
Normal file
69
examples/Bye/Bye.cpp
Normal file
@ -0,0 +1,69 @@
|
||||
#include "llvm/IR/Function.h"
|
||||
#include "llvm/IR/LegacyPassManager.h"
|
||||
#include "llvm/Pass.h"
|
||||
#include "llvm/Passes/PassBuilder.h"
|
||||
#include "llvm/Passes/PassPlugin.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/Transforms/IPO/PassManagerBuilder.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
static cl::opt<bool> Wave("wave-goodbye", cl::init(false),
|
||||
cl::desc("wave good bye"));
|
||||
|
||||
namespace {
|
||||
|
||||
bool runBye(Function &F) {
|
||||
if (Wave) {
|
||||
errs() << "Bye: ";
|
||||
errs().write_escaped(F.getName()) << '\n';
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
struct LegacyBye : public FunctionPass {
|
||||
static char ID;
|
||||
LegacyBye() : FunctionPass(ID) {}
|
||||
bool runOnFunction(Function &F) override { return runBye(F); }
|
||||
};
|
||||
|
||||
struct Bye : PassInfoMixin<Bye> {
|
||||
PreservedAnalyses run(Function &F, FunctionAnalysisManager &) {
|
||||
if (!runBye(F))
|
||||
return PreservedAnalyses::all();
|
||||
return PreservedAnalyses::none();
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
char LegacyBye::ID = 0;
|
||||
|
||||
static RegisterPass<LegacyBye> X("goodbye", "Good Bye World Pass",
|
||||
false /* Only looks at CFG */,
|
||||
false /* Analysis Pass */);
|
||||
|
||||
/* Legacy PM Registration */
|
||||
static llvm::RegisterStandardPasses RegisterBye(
|
||||
llvm::PassManagerBuilder::EP_EarlyAsPossible,
|
||||
[](const llvm::PassManagerBuilder &Builder,
|
||||
llvm::legacy::PassManagerBase &PM) { PM.add(new LegacyBye()); });
|
||||
|
||||
/* New PM Registration */
|
||||
llvm::PassPluginLibraryInfo getByePluginInfo() {
|
||||
return {LLVM_PLUGIN_API_VERSION, "Bye", LLVM_VERSION_STRING,
|
||||
[](PassBuilder &PB) {
|
||||
PB.registerVectorizerStartEPCallback(
|
||||
[](llvm::FunctionPassManager &PM,
|
||||
llvm::PassBuilder::OptimizationLevel Level) {
|
||||
PM.addPass(Bye());
|
||||
});
|
||||
}};
|
||||
}
|
||||
|
||||
#ifndef LLVM_BYE_LINK_INTO_TOOLS
|
||||
extern "C" LLVM_ATTRIBUTE_WEAK ::llvm::PassPluginLibraryInfo
|
||||
llvmGetPassPluginInfo() {
|
||||
return getByePluginInfo();
|
||||
}
|
||||
#endif
|
13
examples/Bye/CMakeLists.txt
Normal file
13
examples/Bye/CMakeLists.txt
Normal file
@ -0,0 +1,13 @@
|
||||
add_llvm_pass_plugin(Bye Bye.cpp)
|
||||
if (LLVM_LINK_LLVM_DYLIB)
|
||||
target_link_libraries(Bye PUBLIC LLVM)
|
||||
else()
|
||||
target_link_libraries(Bye
|
||||
PUBLIC
|
||||
LLVMSupport
|
||||
LLVMCore
|
||||
LLVMipo
|
||||
LLVMPasses
|
||||
)
|
||||
endif()
|
||||
|
@ -6,6 +6,7 @@ add_subdirectory(LLJITExamples)
|
||||
add_subdirectory(Kaleidoscope)
|
||||
add_subdirectory(ModuleMaker)
|
||||
add_subdirectory(SpeculativeJIT)
|
||||
add_subdirectory(Bye)
|
||||
|
||||
if(LLVM_ENABLE_EH AND (NOT WIN32) AND (NOT "${LLVM_NATIVE_ARCH}" STREQUAL "ARM"))
|
||||
add_subdirectory(ExceptionDemo)
|
||||
|
@ -17,9 +17,6 @@
|
||||
/* Define if LLVM_ENABLE_DUMP is enabled */
|
||||
#cmakedefine LLVM_ENABLE_DUMP
|
||||
|
||||
/* Define if we link Polly to the tools */
|
||||
#cmakedefine LINK_POLLY_INTO_TOOLS
|
||||
|
||||
/* Target triple LLVM will generate code for by default */
|
||||
#cmakedefine LLVM_DEFAULT_TARGET_TRIPLE "${LLVM_DEFAULT_TARGET_TRIPLE}"
|
||||
|
||||
|
10
test/Feature/load_extension.ll
Normal file
10
test/Feature/load_extension.ll
Normal file
@ -0,0 +1,10 @@
|
||||
; RUN: opt %s %loadbye -goodbye -wave-goodbye -disable-output | FileCheck %s
|
||||
; REQUIRES: plugins, examples
|
||||
; CHECK: Bye
|
||||
|
||||
@junk = global i32 0
|
||||
|
||||
define i32* @somefunk() {
|
||||
ret i32* @junk
|
||||
}
|
||||
|
@ -9,72 +9,83 @@
|
||||
|
||||
; RUN: opt -disable-verify -debug-pass-manager \
|
||||
; RUN: -passes='default<O1>' -S %s 2>&1 \
|
||||
; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O1
|
||||
; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O1 \
|
||||
; RUN: --check-prefix=%llvmcheckext
|
||||
; RUN: opt -disable-verify -debug-pass-manager \
|
||||
; RUN: -passes='default<O2>' -S %s 2>&1 \
|
||||
; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O2 \
|
||||
; RUN: --check-prefix=CHECK-O23SZ
|
||||
; RUN: --check-prefix=CHECK-O23SZ --check-prefix=%llvmcheckext
|
||||
; RUN: opt -disable-verify -debug-pass-manager \
|
||||
; RUN: -passes='default<O3>' -S %s 2>&1 \
|
||||
; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O3 \
|
||||
; RUN: --check-prefix=CHECK-O23SZ
|
||||
; RUN: --check-prefix=CHECK-O23SZ --check-prefix=%llvmcheckext
|
||||
; RUN: opt -disable-verify -debug-pass-manager \
|
||||
; RUN: -passes='default<Os>' -S %s 2>&1 \
|
||||
; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-Os \
|
||||
; RUN: --check-prefix=CHECK-O23SZ
|
||||
; RUN: --check-prefix=CHECK-O23SZ --check-prefix=%llvmcheckext
|
||||
; RUN: opt -disable-verify -debug-pass-manager \
|
||||
; RUN: -passes='default<Oz>' -S %s 2>&1 \
|
||||
; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-Oz \
|
||||
; RUN: --check-prefix=CHECK-O23SZ
|
||||
; RUN: --check-prefix=CHECK-O23SZ --check-prefix=%llvmcheckext
|
||||
; RUN: opt -disable-verify -debug-pass-manager \
|
||||
; RUN: -passes='lto-pre-link<O2>' -S %s 2>&1 \
|
||||
; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O2 \
|
||||
; RUN: --check-prefix=CHECK-O2-LTO --check-prefix=CHECK-O23SZ
|
||||
; RUN: --check-prefix=CHECK-O23SZ --check-prefix=%llvmcheckext \
|
||||
; RUN: --check-prefix=CHECK-O2-LTO
|
||||
|
||||
; RUN: opt -disable-verify -debug-pass-manager \
|
||||
; RUN: -passes-ep-peephole='no-op-function' \
|
||||
; RUN: -passes='default<O3>' -S %s 2>&1 \
|
||||
; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O3 \
|
||||
; RUN: --check-prefix=%llvmcheckext \
|
||||
; RUN: --check-prefix=CHECK-EP-PEEPHOLE --check-prefix=CHECK-O23SZ
|
||||
; RUN: opt -disable-verify -debug-pass-manager \
|
||||
; RUN: -passes-ep-late-loop-optimizations='no-op-loop' \
|
||||
; RUN: -passes='default<O3>' -S %s 2>&1 \
|
||||
; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O3 \
|
||||
; RUN: --check-prefix=%llvmcheckext \
|
||||
; RUN: --check-prefix=CHECK-EP-LOOP-LATE --check-prefix=CHECK-O23SZ
|
||||
; RUN: opt -disable-verify -debug-pass-manager \
|
||||
; RUN: -passes-ep-loop-optimizer-end='no-op-loop' \
|
||||
; RUN: -passes='default<O3>' -S %s 2>&1 \
|
||||
; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O3 \
|
||||
; RUN: --check-prefix=%llvmcheckext \
|
||||
; RUN: --check-prefix=CHECK-EP-LOOP-END --check-prefix=CHECK-O23SZ
|
||||
; RUN: opt -disable-verify -debug-pass-manager \
|
||||
; RUN: -passes-ep-scalar-optimizer-late='no-op-function' \
|
||||
; RUN: -passes='default<O3>' -S %s 2>&1 \
|
||||
; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O3 \
|
||||
; RUN: --check-prefix=%llvmcheckext \
|
||||
; RUN: --check-prefix=CHECK-EP-SCALAR-LATE --check-prefix=CHECK-O23SZ
|
||||
; RUN: opt -disable-verify -debug-pass-manager \
|
||||
; RUN: -passes-ep-cgscc-optimizer-late='no-op-cgscc' \
|
||||
; RUN: -passes='default<O3>' -S %s 2>&1 \
|
||||
; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O3 \
|
||||
; RUN: --check-prefix=%llvmcheckext \
|
||||
; RUN: --check-prefix=CHECK-EP-CGSCC-LATE --check-prefix=CHECK-O23SZ
|
||||
; RUN: opt -disable-verify -debug-pass-manager \
|
||||
; RUN: -passes-ep-vectorizer-start='no-op-function' \
|
||||
; RUN: -passes='default<O3>' -S %s 2>&1 \
|
||||
; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O3 \
|
||||
; RUN: --check-prefix=%llvmcheckext \
|
||||
; RUN: --check-prefix=CHECK-EP-VECTORIZER-START --check-prefix=CHECK-O23SZ
|
||||
; RUN: opt -disable-verify -debug-pass-manager \
|
||||
; RUN: -passes-ep-pipeline-start='no-op-module' \
|
||||
; RUN: -passes='default<O3>' -S %s 2>&1 \
|
||||
; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O3 \
|
||||
; RUN: --check-prefix=%llvmcheckext \
|
||||
; RUN: --check-prefix=CHECK-EP-PIPELINE-START --check-prefix=CHECK-O23SZ
|
||||
; RUN: opt -disable-verify -debug-pass-manager \
|
||||
; RUN: -passes-ep-pipeline-start='no-op-module' \
|
||||
; RUN: -passes='lto-pre-link<O3>' -S %s 2>&1 \
|
||||
; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O3 \
|
||||
; RUN: --check-prefix=%llvmcheckext \
|
||||
; RUN: --check-prefix=CHECK-EP-PIPELINE-START --check-prefix=CHECK-O23SZ
|
||||
; RUN: opt -disable-verify -debug-pass-manager \
|
||||
; RUN: -passes-ep-optimizer-last='no-op-function' \
|
||||
; RUN: -passes='default<O3>' -S %s 2>&1 \
|
||||
; RUN: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O3 \
|
||||
; RUN: --check-prefix=%llvmcheckext \
|
||||
; RUN: --check-prefix=CHECK-EP-OPTIMIZER-LAST --check-prefix=CHECK-O23SZ
|
||||
|
||||
; CHECK-O: Running analysis: PassInstrumentationAnalysis
|
||||
@ -226,6 +237,7 @@
|
||||
; CHECK-O-NEXT: Running pass: Float2IntPass
|
||||
; CHECK-O-NEXT: Running pass: LowerConstantIntrinsicsPass on foo
|
||||
; CHECK-EP-VECTORIZER-START-NEXT: Running pass: NoOpFunctionPass
|
||||
; CHECK-EXT: Running pass: {{.*}}::Bye on foo
|
||||
; CHECK-O-NEXT: Running pass: FunctionToLoopPassAdaptor<{{.*}}LoopRotatePass
|
||||
; CHECK-O-NEXT: Starting llvm::Function pass manager run.
|
||||
; CHECK-O-NEXT: Running pass: LoopSimplifyPass
|
||||
|
@ -30,22 +30,22 @@
|
||||
; Postlink pipelines:
|
||||
; RUN: opt -disable-verify -debug-pass-manager \
|
||||
; RUN: -passes='thinlto<O1>' -S %s 2>&1 \
|
||||
; RUN: | FileCheck %s --check-prefixes=CHECK-O,CHECK-O1,CHECK-POSTLINK-O,CHECK-POSTLINK-O1
|
||||
; RUN: | FileCheck %s --check-prefixes=CHECK-O,CHECK-O1,CHECK-POSTLINK-O,%llvmcheckext,CHECK-POSTLINK-O1
|
||||
; RUN: opt -disable-verify -debug-pass-manager \
|
||||
; RUN: -passes='thinlto<O2>' -S %s 2>&1 \
|
||||
; RUN: | FileCheck %s --check-prefixes=CHECK-O,CHECK-O2,CHECK-O23SZ,CHECK-POSTLINK-O,CHECK-POSTLINK-O2
|
||||
; RUN: | FileCheck %s --check-prefixes=CHECK-O,CHECK-O2,CHECK-O23SZ,CHECK-POSTLINK-O,%llvmcheckext,CHECK-POSTLINK-O2
|
||||
; RUN: opt -disable-verify -debug-pass-manager -passes-ep-pipeline-start='no-op-module' \
|
||||
; RUN: -passes='thinlto<O3>' -S %s 2>&1 \
|
||||
; RUN: | FileCheck %s --check-prefixes=CHECK-O,CHECK-O3,CHECK-O23SZ,CHECK-POSTLINK-O,CHECK-POSTLINK-O3
|
||||
; RUN: | FileCheck %s --check-prefixes=CHECK-O,CHECK-O3,CHECK-O23SZ,CHECK-POSTLINK-O,%llvmcheckext,CHECK-POSTLINK-O3
|
||||
; RUN: opt -disable-verify -debug-pass-manager \
|
||||
; RUN: -passes='thinlto<Os>' -S %s 2>&1 \
|
||||
; RUN: | FileCheck %s --check-prefixes=CHECK-O,CHECK-Os,CHECK-O23SZ,CHECK-POSTLINK-O,CHECK-POSTLINK-Os
|
||||
; RUN: | FileCheck %s --check-prefixes=CHECK-O,CHECK-Os,CHECK-O23SZ,CHECK-POSTLINK-O,%llvmcheckext,CHECK-POSTLINK-Os
|
||||
; RUN: opt -disable-verify -debug-pass-manager \
|
||||
; RUN: -passes='thinlto<Oz>' -S %s 2>&1 \
|
||||
; RUN: | FileCheck %s --check-prefixes=CHECK-O,CHECK-Oz,CHECK-O23SZ,CHECK-POSTLINK-O,CHECK-POSTLINK-Oz
|
||||
; RUN: | FileCheck %s --check-prefixes=CHECK-O,CHECK-Oz,CHECK-O23SZ,CHECK-POSTLINK-O,%llvmcheckext,CHECK-POSTLINK-Oz
|
||||
; RUN: opt -disable-verify -debug-pass-manager -new-pm-debug-info-for-profiling \
|
||||
; RUN: -passes='thinlto<O2>' -S %s 2>&1 \
|
||||
; RUN: | FileCheck %s --check-prefixes=CHECK-O,CHECK-O2,CHECK-O23SZ,CHECK-POSTLINK-O,CHECK-POSTLINK-O2
|
||||
; RUN: | FileCheck %s --check-prefixes=CHECK-O,CHECK-O2,CHECK-O23SZ,CHECK-POSTLINK-O,%llvmcheckext,CHECK-POSTLINK-O2
|
||||
;
|
||||
; CHECK-O: Running analysis: PassInstrumentationAnalysis
|
||||
; CHECK-O-NEXT: Starting llvm::Module pass manager run.
|
||||
@ -207,6 +207,7 @@
|
||||
; CHECK-POSTLINK-O-NEXT: Starting llvm::Function pass manager run.
|
||||
; CHECK-POSTLINK-O-NEXT: Running pass: Float2IntPass
|
||||
; CHECK-POSTLINK-O-NEXT: Running pass: LowerConstantIntrinsicsPass
|
||||
; CHECK-EXT: Running pass: {{.*}}::Bye
|
||||
; CHECK-POSTLINK-O-NEXT: Running pass: FunctionToLoopPassAdaptor<{{.*}}LoopRotatePass
|
||||
; CHECK-POSTLINK-O-NEXT: Starting llvm::Function pass manager run
|
||||
; CHECK-POSTLINK-O-NEXT: Running pass: LoopSimplifyPass
|
||||
|
@ -1,4 +1,4 @@
|
||||
; RUN: opt -mtriple=x86_64-- -O0 -debug-pass=Structure < %s -o /dev/null 2>&1 | FileCheck %s
|
||||
; RUN: opt -mtriple=x86_64-- -O0 -debug-pass=Structure < %s -o /dev/null 2>&1 | FileCheck %s --check-prefixes=CHECK,%llvmcheckext
|
||||
|
||||
; REQUIRES: asserts
|
||||
|
||||
@ -6,6 +6,7 @@
|
||||
; CHECK-NEXT: Target Transform Information
|
||||
; CHECK-NEXT: FunctionPass Manager
|
||||
; CHECK-NEXT: Module Verifier
|
||||
; CHECK-EXT: Good Bye World Pass
|
||||
; CHECK-NEXT: Instrument function entry/exit with calls to e.g. mcount() (pre inlining)
|
||||
; CHECK-NEXT: Pass Arguments:
|
||||
; CHECK-NEXT: Target Library Information
|
||||
|
@ -1,4 +1,4 @@
|
||||
; RUN: opt -mtriple=x86_64-- -O2 -debug-pass=Structure < %s -o /dev/null 2>&1 | FileCheck %s
|
||||
; RUN: opt -mtriple=x86_64-- -O2 -debug-pass=Structure < %s -o /dev/null 2>&1 | FileCheck --check-prefixes=CHECK-,%llvmcheckext %s
|
||||
|
||||
; REQUIRES: asserts
|
||||
|
||||
@ -10,6 +10,8 @@
|
||||
; CHECK-NEXT: Target Library Information
|
||||
; CHECK-NEXT: FunctionPass Manager
|
||||
; CHECK-NEXT: Module Verifier
|
||||
; CHECK-EXT: Good Bye World Pass
|
||||
; CHECK-NOEXT-NOT: Good Bye World Pass
|
||||
; CHECK-NEXT: Instrument function entry/exit with calls to e.g. mcount() (pre inlining)
|
||||
; CHECK-NEXT: Simplify the CFG
|
||||
; CHECK-NEXT: Dominator Tree Construction
|
||||
|
@ -1,4 +1,4 @@
|
||||
; RUN: opt -mtriple=x86_64-- -O3 -debug-pass=Structure < %s -o /dev/null 2>&1 | FileCheck %s
|
||||
; RUN: opt -mtriple=x86_64-- -O3 -debug-pass=Structure < %s -o /dev/null 2>&1 | FileCheck --check-prefixes=CHECK-,%llvmcheckext %s
|
||||
|
||||
; REQUIRES: asserts
|
||||
|
||||
@ -10,6 +10,8 @@
|
||||
; CHECK-NEXT: Target Library Information
|
||||
; CHECK-NEXT: FunctionPass Manager
|
||||
; CHECK-NEXT: Module Verifier
|
||||
; CHECK-EXT: Good Bye World Pass
|
||||
; CHECK-NOEXT-NOT: Good Bye World Pass
|
||||
; CHECK-NEXT: Instrument function entry/exit with calls to e.g. mcount() (pre inlining)
|
||||
; CHECK-NEXT: Simplify the CFG
|
||||
; CHECK-NEXT: Dominator Tree Construction
|
||||
|
@ -1,4 +1,4 @@
|
||||
; RUN: opt -mtriple=x86_64-- -Os -debug-pass=Structure < %s -o /dev/null 2>&1 | FileCheck %s
|
||||
; RUN: opt -mtriple=x86_64-- -Os -debug-pass=Structure < %s -o /dev/null 2>&1 | FileCheck --check-prefixes=CHECK-,%llvmcheckext %s
|
||||
|
||||
; REQUIRES: asserts
|
||||
|
||||
@ -10,6 +10,8 @@
|
||||
; CHECK-NEXT: Target Library Information
|
||||
; CHECK-NEXT: FunctionPass Manager
|
||||
; CHECK-NEXT: Module Verifier
|
||||
; CHECK-EXT: Good Bye World Pass
|
||||
; CHECK-NOEXT-NOT: Good Bye World Pass
|
||||
; CHECK-NEXT: Instrument function entry/exit with calls to e.g. mcount() (pre inlining)
|
||||
; CHECK-NEXT: Simplify the CFG
|
||||
; CHECK-NEXT: Dominator Tree Construction
|
||||
|
@ -197,6 +197,18 @@ else:
|
||||
if config.has_plugins:
|
||||
config.available_features.add('plugins')
|
||||
|
||||
if config.build_examples:
|
||||
config.available_features.add('examples')
|
||||
|
||||
if config.linked_bye_extension and config.build_examples:
|
||||
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,
|
||||
config.llvm_shlib_ext)))
|
||||
|
||||
# Static libraries are not built if BUILD_SHARED_LIBS is ON.
|
||||
if not config.build_shared_libs and not config.link_llvm_dylib:
|
||||
config.available_features.add('static-libs')
|
||||
|
@ -2,6 +2,9 @@
|
||||
|
||||
import sys
|
||||
|
||||
def cmake_bool(val):
|
||||
return val.lower() in (1, "on", "yes", "true", "y",)
|
||||
|
||||
config.host_triple = "@LLVM_HOST_TRIPLE@"
|
||||
config.target_triple = "@TARGET_TRIPLE@"
|
||||
config.llvm_src_root = "@LLVM_SOURCE_DIR@"
|
||||
@ -47,6 +50,7 @@ config.host_arch = "@HOST_ARCH@"
|
||||
config.have_opt_viewer_modules = @LLVM_HAVE_OPT_VIEWER_MODULES@
|
||||
config.libcxx_used = @LLVM_LIBCXX_USED@
|
||||
config.has_plugins = @LLVM_ENABLE_PLUGINS@
|
||||
config.linked_bye_extension = cmake_bool("@LLVM_BYE_LINK_INTO_TOOLS@")
|
||||
|
||||
# Support substitution of the tools_dir with user parameters. This is
|
||||
# used when we can't determine the tool dir at configuration time.
|
||||
|
@ -9,14 +9,6 @@
|
||||
# traversing each directory.
|
||||
create_llvm_tool_options()
|
||||
|
||||
# Build polly before the tools: the tools link against polly when
|
||||
# LINK_POLLY_INTO_TOOLS is set.
|
||||
if(WITH_POLLY)
|
||||
add_llvm_external_project(polly)
|
||||
else()
|
||||
set(LLVM_TOOL_POLLY_BUILD Off)
|
||||
endif()
|
||||
|
||||
if(NOT LLVM_BUILD_LLVM_DYLIB AND NOT LLVM_BUILD_LLVM_C_DYLIB)
|
||||
set(LLVM_TOOL_LLVM_SHLIB_BUILD Off)
|
||||
endif()
|
||||
@ -51,6 +43,8 @@ add_llvm_external_project(mlir)
|
||||
# file as external projects.
|
||||
add_llvm_implicit_projects()
|
||||
|
||||
add_llvm_external_project(polly)
|
||||
|
||||
# Add subprojects specified using LLVM_EXTERNAL_PROJECTS
|
||||
foreach(p ${LLVM_EXTERNAL_PROJECTS})
|
||||
add_llvm_external_project(${p})
|
||||
|
@ -32,14 +32,10 @@ add_llvm_tool(bugpoint
|
||||
ToolRunner.cpp
|
||||
bugpoint.cpp
|
||||
|
||||
ENABLE_PLUGINS
|
||||
|
||||
DEPENDS
|
||||
intrinsics_gen
|
||||
SUPPORT_PLUGINS
|
||||
)
|
||||
export_executable_symbols(bugpoint)
|
||||
|
||||
if(WITH_POLLY AND LINK_POLLY_INTO_TOOLS)
|
||||
target_link_libraries(bugpoint PRIVATE Polly)
|
||||
# Ensure LLVMTarget can resolve dependences in Polly.
|
||||
target_link_libraries(bugpoint PRIVATE LLVMTarget)
|
||||
endif(WITH_POLLY AND LINK_POLLY_INTO_TOOLS)
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include "llvm/InitializePasses.h"
|
||||
#include "llvm/LinkAllIR.h"
|
||||
#include "llvm/LinkAllPasses.h"
|
||||
#include "llvm/Passes/PassPlugin.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/InitLLVM.h"
|
||||
#include "llvm/Support/ManagedStatic.h"
|
||||
@ -134,11 +135,9 @@ static void AddOptimizationPasses(legacy::FunctionPassManager &FPM,
|
||||
Builder.populateModulePassManager(FPM);
|
||||
}
|
||||
|
||||
#ifdef LINK_POLLY_INTO_TOOLS
|
||||
namespace polly {
|
||||
void initializePollyPasses(llvm::PassRegistry &Registry);
|
||||
}
|
||||
#endif
|
||||
#define HANDLE_EXTENSION(Ext) \
|
||||
llvm::PassPluginLibraryInfo get##Ext##PluginInfo();
|
||||
#include "llvm/Support/Extension.def"
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
#ifndef DEBUG_BUGPOINT
|
||||
@ -159,10 +158,6 @@ int main(int argc, char **argv) {
|
||||
initializeInstrumentation(Registry);
|
||||
initializeTarget(Registry);
|
||||
|
||||
#ifdef LINK_POLLY_INTO_TOOLS
|
||||
polly::initializePollyPasses(Registry);
|
||||
#endif
|
||||
|
||||
if (std::getenv("bar") == (char*) -1) {
|
||||
InitializeAllTargets();
|
||||
InitializeAllTargetMCs();
|
||||
@ -234,6 +229,13 @@ int main(int argc, char **argv) {
|
||||
sys::Process::PreventCoreFiles();
|
||||
#endif
|
||||
|
||||
// Needed to pull in symbols from statically linked extensions, including static
|
||||
// registration. It is unused otherwise because bugpoint has no support for
|
||||
// NewPM.
|
||||
#define HANDLE_EXTENSION(Ext) \
|
||||
(void)get##Ext##PluginInfo();
|
||||
#include "llvm/Support/Extension.def"
|
||||
|
||||
if (Error E = D.run()) {
|
||||
errs() << toString(std::move(E));
|
||||
return 1;
|
||||
|
@ -33,12 +33,10 @@ add_llvm_tool(opt
|
||||
PrintSCC.cpp
|
||||
opt.cpp
|
||||
|
||||
ENABLE_PLUGINS
|
||||
|
||||
DEPENDS
|
||||
intrinsics_gen
|
||||
SUPPORT_PLUGINS
|
||||
)
|
||||
export_executable_symbols(opt)
|
||||
|
||||
if(WITH_POLLY AND LINK_POLLY_INTO_TOOLS)
|
||||
target_link_libraries(opt PRIVATE Polly)
|
||||
endif(WITH_POLLY AND LINK_POLLY_INTO_TOOLS)
|
||||
|
@ -202,11 +202,9 @@ static void registerEPCallbacks(PassBuilder &PB, bool VerifyEachPass,
|
||||
});
|
||||
}
|
||||
|
||||
#ifdef LINK_POLLY_INTO_TOOLS
|
||||
namespace polly {
|
||||
void RegisterPollyPasses(PassBuilder &);
|
||||
}
|
||||
#endif
|
||||
#define HANDLE_EXTENSION(Ext) \
|
||||
llvm::PassPluginLibraryInfo get##Ext##PluginInfo();
|
||||
#include "llvm/Support/Extension.def"
|
||||
|
||||
bool llvm::runPassPipeline(StringRef Arg0, Module &M, TargetMachine *TM,
|
||||
ToolOutputFile *Out, ToolOutputFile *ThinLTOLinkOut,
|
||||
@ -290,9 +288,9 @@ bool llvm::runPassPipeline(StringRef Arg0, Module &M, TargetMachine *TM,
|
||||
return false;
|
||||
});
|
||||
|
||||
#ifdef LINK_POLLY_INTO_TOOLS
|
||||
polly::RegisterPollyPasses(PB);
|
||||
#endif
|
||||
#define HANDLE_EXTENSION(Ext) \
|
||||
get##Ext##PluginInfo().RegisterPassBuilderCallbacks(PB);
|
||||
#include "llvm/Support/Extension.def"
|
||||
|
||||
// Specially handle the alias analysis manager so that we can register
|
||||
// a custom pipeline of AA passes with it.
|
||||
|
@ -482,11 +482,6 @@ static TargetMachine* GetTargetMachine(Triple TheTriple, StringRef CPUStr,
|
||||
getCodeModel(), GetCodeGenOptLevel());
|
||||
}
|
||||
|
||||
#ifdef LINK_POLLY_INTO_TOOLS
|
||||
namespace polly {
|
||||
void initializePollyPasses(llvm::PassRegistry &Registry);
|
||||
}
|
||||
#endif
|
||||
|
||||
void exportDebugifyStats(llvm::StringRef Path, const DebugifyStatsMap &Map) {
|
||||
std::error_code EC;
|
||||
@ -564,10 +559,6 @@ int main(int argc, char **argv) {
|
||||
initializeHardwareLoopsPass(Registry);
|
||||
initializeTypePromotionPass(Registry);
|
||||
|
||||
#ifdef LINK_POLLY_INTO_TOOLS
|
||||
polly::initializePollyPasses(Registry);
|
||||
#endif
|
||||
|
||||
cl::ParseCommandLineOptions(argc, argv,
|
||||
"llvm .bc -> .bc modular optimizer and analysis printer\n");
|
||||
|
||||
|
@ -319,7 +319,6 @@ write_cmake_config("llvm-config") {
|
||||
output = "$target_gen_dir/llvm-config.h"
|
||||
values = [
|
||||
"LLVM_ENABLE_DUMP=",
|
||||
"LINK_POLLY_INTO_TOOLS=",
|
||||
"LLVM_DEFAULT_TARGET_TRIPLE=$llvm_target_triple",
|
||||
"LLVM_HAS_ATOMICS=1",
|
||||
"LLVM_HOST_TRIPLE=$llvm_current_triple",
|
||||
|
Loading…
Reference in New Issue
Block a user