Skip to content

Feature/compiler extension #36

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions .github/workflows/llvm.yml
Original file line number Diff line number Diff line change
@@ -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:
- "-DLLVM_ENABLE_PROJECTS:STRING=clang;polly"
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 }}
7 changes: 7 additions & 0 deletions clang/lib/CodeGen/BackendUtil.cpp
Original file line number Diff line number Diff line change
@@ -75,6 +75,10 @@
using namespace clang;
using namespace llvm;

#define HANDLE_EXTENSION(Ext) \
llvm::PassPluginLibraryInfo get##Ext##PluginInfo();
#include "llvm/Support/Extension.def"

namespace {

// Default filename used for profile generation.
@@ -1086,6 +1090,9 @@ void EmitAssemblyHelper::EmitAssemblyWithNewPassManager(
<< PluginFN << toString(PassPlugin.takeError());
}
}
#define HANDLE_EXTENSION(Ext) \
get##Ext##PluginInfo().RegisterPassBuilderCallbacks(PB);
#include "llvm/Support/Extension.def"

LoopAnalysisManager LAM(CodeGenOpts.DebugPassManager);
FunctionAnalysisManager FAM(CodeGenOpts.DebugPassManager);
2 changes: 2 additions & 0 deletions clang/lib/CodeGen/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -95,6 +95,8 @@ add_clang_library(clangCodeGen
TargetInfo.cpp
VarBypassDetector.cpp

ENABLE_PLUGINS

DEPENDS
${codegen_deps}

4 changes: 0 additions & 4 deletions clang/tools/driver/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -122,7 +122,3 @@ if(CLANG_ORDER_FILE AND
set_target_properties(clang PROPERTIES LINK_DEPENDS ${CLANG_ORDER_FILE})
endif()
endif()

if(WITH_POLLY AND LINK_POLLY_INTO_TOOLS)
target_link_libraries(clang PRIVATE Polly)
endif(WITH_POLLY AND LINK_POLLY_INTO_TOOLS)
11 changes: 0 additions & 11 deletions clang/tools/driver/cc1_main.cpp
Original file line number Diff line number Diff line change
@@ -72,12 +72,6 @@ static void LLVMErrorHandler(void *UserData, const std::string &Message,
exit(GenCrashDiag ? 70 : 1);
}

#ifdef LINK_POLLY_INTO_TOOLS
namespace polly {
void initializePollyPasses(llvm::PassRegistry &Registry);
}
#endif

#ifdef CLANG_HAVE_RLIMITS
#if defined(__linux__) && defined(__PIE__)
static size_t getCurrentStackAllocation() {
@@ -203,11 +197,6 @@ int cc1_main(ArrayRef<const char *> Argv, const char *Argv0, void *MainAddr) {
llvm::InitializeAllAsmPrinters();
llvm::InitializeAllAsmParsers();

#ifdef LINK_POLLY_INTO_TOOLS
llvm::PassRegistry &Registry = *llvm::PassRegistry::getPassRegistry();
polly::initializePollyPasses(Registry);
#endif

// Buffer diagnostics from argument parsing so that we can output them using a
// well formed diagnostic object.
IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions();
25 changes: 2 additions & 23 deletions llvm/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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 )
@@ -1109,3 +1086,5 @@ endif()
if (LLVM_INCLUDE_UTILS AND LLVM_INCLUDE_TOOLS)
add_subdirectory(utils/llvm-locstats)
endif()

process_llvm_pass_plugins()
75 changes: 73 additions & 2 deletions llvm/cmake/modules/AddLLVM.cmake
Original file line number Diff line number Diff line change
@@ -400,7 +400,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"
"MODULE;SHARED;STATIC;OBJECT;DISABLE_LLVM_LINK_LLVM_DYLIB;SONAME;NO_INSTALL_RPATH;ENABLE_PLUGINS"
"OUTPUT_NAME;PLUGIN_TOOL;ENTITLEMENTS;BUNDLE_PATH"
"ADDITIONAL_HEADERS;DEPENDS;LINK_COMPONENTS;LINK_LIBS;OBJLIBS"
${ARGN})
@@ -414,6 +414,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)
@@ -732,7 +735,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})
@@ -819,10 +822,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
26 changes: 26 additions & 0 deletions llvm/docs/WritingAnLLVMPass.rst
Original file line number Diff line number Diff line change
@@ -1175,6 +1175,32 @@ 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 sets to ``ON``, turns the project into
a statically linked extension


Registering dynamically loaded passes
=====================================

69 changes: 69 additions & 0 deletions llvm/examples/Bye/Bye.cpp
Original file line number Diff line number Diff line change
@@ -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 changes: 13 additions & 0 deletions llvm/examples/Bye/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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()

1 change: 1 addition & 0 deletions llvm/examples/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -7,6 +7,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)
3 changes: 0 additions & 3 deletions llvm/include/llvm/Config/llvm-config.h.cmake
Original file line number Diff line number Diff line change
@@ -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}"

11 changes: 11 additions & 0 deletions llvm/test/Feature/load_extension.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
; RUN: opt %s -load=%llvmshlibdir/libBye%shlibext -goodbye -wave-goodbye \
; RUN: -disable-output 2>&1 | FileCheck %s
; REQUIRES: plugins
; CHECK: Bye

@junk = global i32 0

define i32* @somefunk() {
ret i32* @junk
}

26 changes: 21 additions & 5 deletions llvm/test/Other/new-pm-defaults.ll
Original file line number Diff line number Diff line change
@@ -9,68 +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: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O2 \
; RUN: --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: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-O3 \
; RUN: --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: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-Os \
; RUN: --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: | FileCheck %s --check-prefix=CHECK-O --check-prefix=CHECK-Oz \
; RUN: --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=%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
; 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
; 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
; 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
; 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
; 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
; 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
; 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
; 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-O: Running analysis: PassInstrumentationAnalysis
@@ -234,6 +249,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
13 changes: 7 additions & 6 deletions llvm/test/Other/new-pm-thinlto-defaults.ll
Original file line number Diff line number Diff line change
@@ -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-POSTLINK-O,CHECK-POSTLINK-O2
; RUN: | FileCheck %s --check-prefixes=CHECK-O,CHECK-O2,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-POSTLINK-O,CHECK-POSTLINK-O3
; RUN: | FileCheck %s --check-prefixes=CHECK-O,CHECK-O3,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-POSTLINK-O,CHECK-POSTLINK-Os
; RUN: | FileCheck %s --check-prefixes=CHECK-O,CHECK-Os,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-POSTLINK-O,CHECK-POSTLINK-Oz
; RUN: | FileCheck %s --check-prefixes=CHECK-O,CHECK-Oz,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-POSTLINK-O,CHECK-POSTLINK-O2
; RUN: | FileCheck %s --check-prefixes=CHECK-O,CHECK-O2,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
3 changes: 2 additions & 1 deletion llvm/test/Other/opt-O0-pipeline.ll
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
; 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

; CHECK-LABEL: Pass Arguments:
; 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
4 changes: 3 additions & 1 deletion llvm/test/Other/opt-O2-pipeline.ll
Original file line number Diff line number Diff line change
@@ -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
4 changes: 3 additions & 1 deletion llvm/test/Other/opt-O3-pipeline.ll
Original file line number Diff line number Diff line change
@@ -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
4 changes: 3 additions & 1 deletion llvm/test/Other/opt-Os-pipeline.ll
Original file line number Diff line number Diff line change
@@ -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
8 changes: 8 additions & 0 deletions llvm/test/lit.cfg.py
Original file line number Diff line number Diff line change
@@ -195,6 +195,14 @@ def get_asan_rtlib():
if config.has_plugins:
config.available_features.add('plugins')

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=%llvmshlibdir/libBye%shlibext'))

# 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')
1 change: 1 addition & 0 deletions llvm/test/lit.site.cfg.py.in
Original file line number Diff line number Diff line change
@@ -47,6 +47,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 = "@LLVM_BYE_LINK_INTO_TOOLS@".lower() in (1, "on", "yes", "true", "y",)

# Support substitution of the tools_dir with user parameters. This is
# used when we can't determine the tool dir at configuration time.
10 changes: 2 additions & 8 deletions llvm/tools/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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()
@@ -50,6 +42,8 @@ add_llvm_external_project(lldb)
# 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})
8 changes: 2 additions & 6 deletions llvm/tools/bugpoint/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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)
10 changes: 0 additions & 10 deletions llvm/tools/bugpoint/bugpoint.cpp
Original file line number Diff line number Diff line change
@@ -133,12 +133,6 @@ static void AddOptimizationPasses(legacy::FunctionPassManager &FPM,
Builder.populateModulePassManager(FPM);
}

#ifdef LINK_POLLY_INTO_TOOLS
namespace polly {
void initializePollyPasses(llvm::PassRegistry &Registry);
}
#endif

int main(int argc, char **argv) {
#ifndef DEBUG_BUGPOINT
InitLLVM X(argc, argv);
@@ -158,10 +152,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();
6 changes: 2 additions & 4 deletions llvm/tools/opt/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -33,16 +33,14 @@ 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)

if(LLVM_BUILD_EXAMPLES)
target_link_libraries(opt PRIVATE ExampleIRTransforms)
endif(LLVM_BUILD_EXAMPLES)
14 changes: 6 additions & 8 deletions llvm/tools/opt/NewPMDriver.cpp
Original file line number Diff line number Diff line change
@@ -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.
9 changes: 0 additions & 9 deletions llvm/tools/opt/opt.cpp
Original file line number Diff line number Diff line change
@@ -486,11 +486,6 @@ static TargetMachine* GetTargetMachine(Triple TheTriple, StringRef CPUStr,
void initializeExampleIRTransforms(llvm::PassRegistry &Registry);
#endif

#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;
@@ -571,10 +566,6 @@ int main(int argc, char **argv) {
initializeExampleIRTransforms(Registry);
#endif

#ifdef LINK_POLLY_INTO_TOOLS
polly::initializePollyPasses(Registry);
#endif

cl::ParseCommandLineOptions(argc, argv,
"llvm .bc -> .bc modular optimizer and analysis printer\n");

1 change: 0 additions & 1 deletion llvm/utils/gn/secondary/llvm/include/llvm/Config/BUILD.gn
Original file line number Diff line number Diff line change
@@ -323,7 +323,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",
3 changes: 2 additions & 1 deletion polly/include/polly/RegisterPasses.h
Original file line number Diff line number Diff line change
@@ -15,13 +15,14 @@

namespace llvm {
class PassRegistry;
class PassBuilder;
namespace legacy {
class PassManagerBase;
} // namespace legacy
} // namespace llvm

namespace polly {
void initializePollyPasses(llvm::PassRegistry &Registry);
void registerPollyPasses(llvm::legacy::PassManagerBase &PM);
void RegisterPollyPasses(llvm::PassBuilder &PB);
} // namespace polly
#endif
15 changes: 9 additions & 6 deletions polly/lib/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -23,7 +23,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_library(PollyCore OBJECT
add_llvm_pass_plugin(Polly
Analysis/DependenceInfo.cpp
Analysis/PolyhedralInfo.cpp
Analysis/ScopDetection.cpp
@@ -70,13 +70,13 @@ add_library(PollyCore OBJECT
Transform/ScopInliner.cpp
${POLLY_HEADER_FILES}
)
set_target_properties(PollyCore PROPERTIES FOLDER "Polly")
set_target_properties(obj.Polly PROPERTIES FOLDER "Polly")
set_target_properties(Polly PROPERTIES FOLDER "Polly")

# Create the library that can be linked into LLVM's tools and Polly's unittests.
# It depends on all library it needs, such that with
# LLVM_POLLY_LINK_INTO_TOOLS=ON, its dependencies like PollyISL are linked as
# well.
add_polly_library(Polly $<TARGET_OBJECTS:PollyCore>)
target_link_libraries(Polly PUBLIC
${ISL_TARGET}
)
@@ -124,6 +124,9 @@ else ()
LLVMTarget
LLVMVectorize
)

# Polly-ACC requires the NVPTX target to be present in the executable it is linked to
set_property(TARGET bugpoint APPEND PROPERTY LINK_LIBRARIES LLVMTarget)
endif ()

# Create a loadable module Polly.so that can be loaded using
@@ -134,8 +137,8 @@ if (MSVC)
set_target_properties(LLVMPolly PROPERTIES FOLDER "Polly")
else ()
add_polly_loadable_module(LLVMPolly
Polly.cpp
$<TARGET_OBJECTS:PollyCore>
Plugin/Polly.cpp
$<TARGET_OBJECTS:obj.Polly>
)

# Only add the dependencies that are not part of LLVM. The latter are assumed
@@ -159,5 +162,5 @@ endif ()

if (TARGET intrinsics_gen)
# Check if we are building as part of an LLVM build
add_dependencies(PollyCore intrinsics_gen)
add_dependencies(obj.Polly intrinsics_gen)
endif()
12 changes: 12 additions & 0 deletions polly/lib/Polly.cpp → polly/lib/Plugin/Polly.cpp
Original file line number Diff line number Diff line change
@@ -10,6 +10,7 @@

#include "polly/RegisterPasses.h"
#include "llvm/PassRegistry.h"
#include "llvm/Passes/PassPlugin.h"

namespace {

@@ -27,3 +28,14 @@ class StaticInitializer {
};
static StaticInitializer InitializeEverything;
} // end of anonymous namespace.

// Pass Plugin Entrypoints
llvm::PassPluginLibraryInfo getPollyPluginInfo() {
return {LLVM_PLUGIN_API_VERSION, "Polly", LLVM_VERSION_STRING,
polly::RegisterPollyPasses};
}

extern "C" LLVM_ATTRIBUTE_WEAK ::llvm::PassPluginLibraryInfo
llvmGetPassPluginInfo() {
return getPollyPluginInfo();
}
7 changes: 0 additions & 7 deletions polly/lib/Support/RegisterPasses.cpp
Original file line number Diff line number Diff line change
@@ -700,10 +700,3 @@ void RegisterPollyPasses(PassBuilder &PB) {
// FIXME else Error?
}
} // namespace polly

// Plugin Entrypoint:
extern "C" ::llvm::PassPluginLibraryInfo LLVM_ATTRIBUTE_WEAK
llvmGetPassPluginInfo() {
return {LLVM_PLUGIN_API_VERSION, "Polly", LLVM_VERSION_STRING,
polly::RegisterPollyPasses};
}
2 changes: 1 addition & 1 deletion polly/test/Unit/lit.site.cfg.in
Original file line number Diff line number Diff line change
@@ -13,7 +13,7 @@ config.enable_shared = @ENABLE_SHARED@
config.shlibdir = "@SHLIBDIR@"
config.target_triple = "@TARGET_TRIPLE@"
config.enable_gpgpu_codegen = "@GPU_CODEGEN@"
config.link_polly_into_tools = "@LINK_POLLY_INTO_TOOLS@"
config.llvm_polly_link_into_tools = "@LLVM_POLLY_LINK_INTO_TOOLS@"
config.has_unittests = @POLLY_GTEST_AVAIL@

# Support substitution of the tools_dir, libs_dirs, and build_mode with user
18 changes: 9 additions & 9 deletions polly/test/lit.site.cfg.in
Original file line number Diff line number Diff line change
@@ -8,7 +8,7 @@ config.polly_obj_root = "@POLLY_BINARY_DIR@"
config.polly_lib_dir = "@POLLY_LIB_DIR@"
config.target_triple = "@TARGET_TRIPLE@"
config.enable_gpgpu_codegen = "@GPU_CODEGEN@"
config.link_polly_into_tools = "@LINK_POLLY_INTO_TOOLS@"
config.llvm_polly_link_into_tools = "@LLVM_POLLY_LINK_INTO_TOOLS@"
config.targets_to_build = "@TARGETS_TO_BUILD@"
config.extra_paths = "@POLLY_TEST_EXTRA_PATHS@".split(";")

@@ -36,14 +36,14 @@ except KeyError:
# directories.
config.excludes = ['Inputs']

if config.link_polly_into_tools == '' or \
config.link_polly_into_tools.lower() == '0' or \
config.link_polly_into_tools.lower() == 'n' or \
config.link_polly_into_tools.lower() == 'no' or \
config.link_polly_into_tools.lower() == 'off' or \
config.link_polly_into_tools.lower() == 'false' or \
config.link_polly_into_tools.lower() == 'notfound' or \
config.link_polly_into_tools.lower() == 'link_polly_into_tools-notfound':
if config.llvm_polly_link_into_tools == '' or \
config.llvm_polly_link_into_tools.lower() == '0' or \
config.llvm_polly_link_into_tools.lower() == 'n' or \
config.llvm_polly_link_into_tools.lower() == 'no' or \
config.llvm_polly_link_into_tools.lower() == 'off' or \
config.llvm_polly_link_into_tools.lower() == 'false' or \
config.llvm_polly_link_into_tools.lower() == 'notfound' or \
config.llvm_polly_link_into_tools.lower() == 'llvm_polly_link_into_tools-notfound':
config.substitutions.append(('%loadPolly', '-load '
+ config.polly_lib_dir + '/LLVMPolly@LLVM_SHLIBEXT@'
+ ' -load-pass-plugin '
4 changes: 2 additions & 2 deletions polly/test/update_check.py
Original file line number Diff line number Diff line change
@@ -15,7 +15,7 @@
polly_lib_dir = '''@POLLY_LIB_DIR@'''
shlibext = '''@LLVM_SHLIBEXT@'''
llvm_tools_dir = '''@LLVM_TOOLS_DIR@'''
link_polly_into_tools = not '''@LINK_POLLY_INTO_TOOLS@'''.lower() in {'','0','n','no','off','false','notfound','link_polly_into_tools-notfound'}
llvm_polly_link_into_tools = not '''@LLVM_POLLY_LINK_INTO_TOOLS@'''.lower() in {'','0','n','no','off','false','notfound','llvm_polly_link_into_tools-notfound'}

runre = re.compile(r'\s*\;\s*RUN\s*\:(?P<tool>.*)')
filecheckre = re.compile(r'\s*(?P<tool>.*)\|\s*(?P<filecheck>FileCheck\s[^|]*)')
@@ -298,7 +298,7 @@ def main():
toolarg = toolarg.replace('%s', filename)
toolarg = toolarg.replace('%S', os.path.dirname(filename))
if toolarg == '%loadPolly':
if not link_polly_into_tools:
if not llvm_polly_link_into_tools:
newtool += ['-load',os.path.join(polly_lib_dir,'LLVMPolly' + shlibext)]
newtool.append('-polly-process-unprofitable')
newtool.append('-polly-remarks-minimal')