diff --git a/clang/tools/driver/cc1_main.cpp b/clang/tools/driver/cc1_main.cpp index 19273f97c921..fd3b25ccb3cb 100644 --- a/clang/tools/driver/cc1_main.cpp +++ b/clang/tools/driver/cc1_main.cpp @@ -27,6 +27,7 @@ #include "clang/FrontendTool/Utils.h" #include "llvm/ADT/Statistic.h" #include "llvm/Config/llvm-config.h" +#include "llvm/LinkAllPasses.h" #include "llvm/MC/TargetRegistry.h" #include "llvm/Option/Arg.h" #include "llvm/Option/ArgList.h" diff --git a/llvm/docs/WritingAnLLVMPass.rst b/llvm/docs/WritingAnLLVMPass.rst index c9955d177036..133775c92dde 100644 --- a/llvm/docs/WritingAnLLVMPass.rst +++ b/llvm/docs/WritingAnLLVMPass.rst @@ -1308,6 +1308,11 @@ option. Registering instruction schedulers is similar except use the ``RegisterScheduler::FunctionPassCtor`` is significantly different from ``RegisterRegAlloc::FunctionPassCtor``. +To force the load/linking of your register allocator into the +:program:`llc`/:program:`lli` tools, add your creator function's global +declaration to ``Passes.h`` and add a "pseudo" call line to +``llvm/Codegen/LinkAllCodegenComponents.h``. + Creating new registries ----------------------- diff --git a/llvm/include/llvm/CodeGen/LinkAllAsmWriterComponents.h b/llvm/include/llvm/CodeGen/LinkAllAsmWriterComponents.h new file mode 100644 index 000000000000..81b0025fdddc --- /dev/null +++ b/llvm/include/llvm/CodeGen/LinkAllAsmWriterComponents.h @@ -0,0 +1,37 @@ +//===- llvm/Codegen/LinkAllAsmWriterComponents.h ----------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This header file pulls in all assembler writer related passes for tools like +// llc that need this functionality. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CODEGEN_LINKALLASMWRITERCOMPONENTS_H +#define LLVM_CODEGEN_LINKALLASMWRITERCOMPONENTS_H + +#include "llvm/IR/BuiltinGCs.h" +#include + +namespace { + struct ForceAsmWriterLinking { + ForceAsmWriterLinking() { + // We must reference the plug-ins in such a way that compilers will not + // delete it all as dead code, even with whole program optimization, + // yet is effectively a NO-OP. As the compiler isn't smart enough + // to know that getenv() never returns -1, this will do the job. + if (std::getenv("bar") != (char*) -1) + return; + + llvm::linkOcamlGCPrinter(); + llvm::linkErlangGCPrinter(); + + } + } ForceAsmWriterLinking; // Force link by creating a global definition. +} + +#endif // LLVM_CODEGEN_LINKALLASMWRITERCOMPONENTS_H diff --git a/llvm/include/llvm/CodeGen/LinkAllCodegenComponents.h b/llvm/include/llvm/CodeGen/LinkAllCodegenComponents.h new file mode 100644 index 000000000000..1b13ff53ac85 --- /dev/null +++ b/llvm/include/llvm/CodeGen/LinkAllCodegenComponents.h @@ -0,0 +1,54 @@ +//===- llvm/Codegen/LinkAllCodegenComponents.h ------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This header file pulls in all codegen related passes for tools like lli and +// llc that need this functionality. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CODEGEN_LINKALLCODEGENCOMPONENTS_H +#define LLVM_CODEGEN_LINKALLCODEGENCOMPONENTS_H + +#include "llvm/IR/BuiltinGCs.h" +#include "llvm/CodeGen/Passes.h" +#include "llvm/CodeGen/SchedulerRegistry.h" +#include "llvm/Target/TargetMachine.h" +#include + +namespace { + struct ForceCodegenLinking { + ForceCodegenLinking() { + // We must reference the passes in such a way that compilers will not + // delete it all as dead code, even with whole program optimization, + // yet is effectively a NO-OP. As the compiler isn't smart enough + // to know that getenv() never returns -1, this will do the job. + if (std::getenv("bar") != (char*) -1) + return; + + (void) llvm::createFastRegisterAllocator(); + (void) llvm::createBasicRegisterAllocator(); + (void) llvm::createGreedyRegisterAllocator(); + (void) llvm::createDefaultPBQPRegisterAllocator(); + + llvm::linkAllBuiltinGCs(); + + (void) llvm::createBURRListDAGScheduler(nullptr, + llvm::CodeGenOpt::Default); + (void) llvm::createSourceListDAGScheduler(nullptr, + llvm::CodeGenOpt::Default); + (void) llvm::createHybridListDAGScheduler(nullptr, + llvm::CodeGenOpt::Default); + (void) llvm::createFastDAGScheduler(nullptr, llvm::CodeGenOpt::Default); + (void) llvm::createDefaultScheduler(nullptr, llvm::CodeGenOpt::Default); + (void) llvm::createVLIWDAGScheduler(nullptr, llvm::CodeGenOpt::Default); + + } + } ForceCodegenLinking; // Force link by creating a global definition. +} + +#endif diff --git a/llvm/include/llvm/LinkAllIR.h b/llvm/include/llvm/LinkAllIR.h new file mode 100644 index 000000000000..4b0aabeee701 --- /dev/null +++ b/llvm/include/llvm/LinkAllIR.h @@ -0,0 +1,51 @@ +//===----- LinkAllIR.h - Reference All VMCore Code --------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This header file pulls in all the object modules of the VMCore library so +// that tools like llc, opt, and lli can ensure they are linked with all symbols +// from libVMCore.a It should only be used from a tool's main program. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LINKALLIR_H +#define LLVM_LINKALLIR_H + +#include "llvm/BinaryFormat/Dwarf.h" +#include "llvm/IR/InlineAsm.h" +#include "llvm/IR/Instructions.h" +#include "llvm/IR/LLVMContext.h" +#include "llvm/IR/Module.h" +#include "llvm/IR/Verifier.h" +#include "llvm/Support/DynamicLibrary.h" +#include "llvm/Support/MathExtras.h" +#include "llvm/Support/Memory.h" +#include "llvm/Support/Mutex.h" +#include "llvm/Support/Path.h" +#include "llvm/Support/Process.h" +#include "llvm/Support/Program.h" +#include "llvm/Support/Signals.h" +#include + +namespace { + struct ForceVMCoreLinking { + ForceVMCoreLinking() { + // We must reference VMCore in such a way that compilers will not + // delete it all as dead code, even with whole program optimization, + // yet is effectively a NO-OP. As the compiler isn't smart enough + // to know that getenv() never returns -1, this will do the job. + if (std::getenv("bar") != (char*) -1) + return; + llvm::LLVMContext Context; + (void)new llvm::Module("", Context); + (void)new llvm::UnreachableInst(Context); + (void) llvm::createVerifierPass(); + } + } ForceVMCoreLinking; +} + +#endif diff --git a/llvm/include/llvm/LinkAllPasses.h b/llvm/include/llvm/LinkAllPasses.h new file mode 100644 index 000000000000..45978828a8ce --- /dev/null +++ b/llvm/include/llvm/LinkAllPasses.h @@ -0,0 +1,253 @@ +//===- llvm/LinkAllPasses.h ------------ Reference All Passes ---*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This header file pulls in all transformation and analysis passes for tools +// like opt and bugpoint that need this functionality. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LINKALLPASSES_H +#define LLVM_LINKALLPASSES_H + +#include "llvm/ADT/Statistic.h" +#include "llvm/Analysis/AliasAnalysisEvaluator.h" +#include "llvm/Analysis/AliasSetTracker.h" +#include "llvm/Analysis/BasicAliasAnalysis.h" +#include "llvm/Analysis/CFLAndersAliasAnalysis.h" +#include "llvm/Analysis/CFLSteensAliasAnalysis.h" +#include "llvm/Analysis/CallPrinter.h" +#include "llvm/Analysis/DomPrinter.h" +#include "llvm/Analysis/GlobalsModRef.h" +#include "llvm/Analysis/IntervalPartition.h" +#include "llvm/Analysis/Lint.h" +#include "llvm/Analysis/Passes.h" +#include "llvm/Analysis/PostDominators.h" +#include "llvm/Analysis/RegionPass.h" +#include "llvm/Analysis/RegionPrinter.h" +#include "llvm/Analysis/ScalarEvolution.h" +#include "llvm/Analysis/ScalarEvolutionAliasAnalysis.h" +#include "llvm/Analysis/ScopedNoAliasAA.h" +#include "llvm/Analysis/TargetLibraryInfo.h" +#include "llvm/Analysis/TypeBasedAliasAnalysis.h" +#include "llvm/CodeGen/Passes.h" +#include "llvm/IR/Function.h" +#include "llvm/IR/IRPrintingPasses.h" +#include "llvm/Support/Valgrind.h" +#include "llvm/Transforms/AggressiveInstCombine/AggressiveInstCombine.h" +#include "llvm/Transforms/IPO.h" +#include "llvm/Transforms/IPO/AlwaysInliner.h" +#include "llvm/Transforms/IPO/Attributor.h" +#include "llvm/Transforms/IPO/FunctionAttrs.h" +#include "llvm/Transforms/InstCombine/InstCombine.h" +#include "llvm/Transforms/Instrumentation.h" +#include "llvm/Transforms/Instrumentation/BoundsChecking.h" +#include "llvm/Transforms/ObjCARC.h" +#include "llvm/Transforms/Scalar.h" +#include "llvm/Transforms/Scalar/GVN.h" +#include "llvm/Transforms/Scalar/InstSimplifyPass.h" +#include "llvm/Transforms/Scalar/Scalarizer.h" +#include "llvm/Transforms/Utils.h" +#include "llvm/Transforms/Utils/SymbolRewriter.h" +#include "llvm/Transforms/Utils/UnifyFunctionExitNodes.h" +#include "llvm/Transforms/Vectorize.h" +#include + +namespace { + struct ForcePassLinking { + ForcePassLinking() { + // We must reference the passes in such a way that compilers will not + // delete it all as dead code, even with whole program optimization, + // yet is effectively a NO-OP. As the compiler isn't smart enough + // to know that getenv() never returns -1, this will do the job. + if (std::getenv("bar") != (char*) -1) + return; + + (void) llvm::createAAEvalPass(); + (void) llvm::createAggressiveDCEPass(); + (void) llvm::createAggressiveInstCombinerPass(); + (void) llvm::createBitTrackingDCEPass(); + (void)llvm::createOpenMPOptCGSCCLegacyPass(); + (void) llvm::createArgumentPromotionPass(); + (void) llvm::createAlignmentFromAssumptionsPass(); + (void) llvm::createBasicAAWrapperPass(); + (void) llvm::createSCEVAAWrapperPass(); + (void) llvm::createTypeBasedAAWrapperPass(); + (void) llvm::createScopedNoAliasAAWrapperPass(); + (void) llvm::createBoundsCheckingLegacyPass(); + (void) llvm::createBreakCriticalEdgesPass(); + (void) llvm::createCallGraphDOTPrinterPass(); + (void) llvm::createCallGraphViewerPass(); + (void) llvm::createCFGSimplificationPass(); + (void) llvm::createCFLAndersAAWrapperPass(); + (void) llvm::createCFLSteensAAWrapperPass(); + (void) llvm::createStructurizeCFGPass(); + (void) llvm::createLibCallsShrinkWrapPass(); + (void) llvm::createCalledValuePropagationPass(); + (void) llvm::createConstantMergePass(); + (void) llvm::createControlHeightReductionLegacyPass(); + (void) llvm::createCostModelAnalysisPass(); + (void) llvm::createDeadArgEliminationPass(); + (void) llvm::createDeadCodeEliminationPass(); + (void) llvm::createDeadStoreEliminationPass(); + (void) llvm::createDependenceAnalysisWrapperPass(); + (void) llvm::createDomOnlyPrinterPass(); + (void) llvm::createDomPrinterPass(); + (void) llvm::createDomOnlyViewerPass(); + (void) llvm::createDomViewerPass(); + (void) llvm::createGCOVProfilerPass(); + (void) llvm::createPGOInstrumentationGenLegacyPass(); + (void) llvm::createPGOInstrumentationUseLegacyPass(); + (void) llvm::createPGOInstrumentationGenCreateVarLegacyPass(); + (void) llvm::createPGOIndirectCallPromotionLegacyPass(); + (void) llvm::createPGOMemOPSizeOptLegacyPass(); + (void) llvm::createInstrProfilingLegacyPass(); + (void) llvm::createFunctionImportPass(); + (void) llvm::createFunctionInliningPass(); + (void) llvm::createAlwaysInlinerLegacyPass(); + (void) llvm::createGlobalDCEPass(); + (void) llvm::createGlobalOptimizerPass(); + (void) llvm::createGlobalsAAWrapperPass(); + (void) llvm::createGuardWideningPass(); + (void) llvm::createLoopGuardWideningPass(); + (void) llvm::createIPSCCPPass(); + (void) llvm::createInductiveRangeCheckEliminationPass(); + (void) llvm::createIndVarSimplifyPass(); + (void) llvm::createInstSimplifyLegacyPass(); + (void) llvm::createInstructionCombiningPass(); + (void) llvm::createInternalizePass(); + (void) llvm::createLCSSAPass(); + (void) llvm::createLegacyDivergenceAnalysisPass(); + (void) llvm::createLICMPass(); + (void) llvm::createLoopSinkPass(); + (void) llvm::createLazyValueInfoPass(); + (void) llvm::createLoopExtractorPass(); + (void) llvm::createLoopInterchangePass(); + (void) llvm::createLoopFlattenPass(); + (void) llvm::createLoopPredicationPass(); + (void) llvm::createLoopSimplifyPass(); + (void) llvm::createLoopSimplifyCFGPass(); + (void) llvm::createLoopStrengthReducePass(); + (void) llvm::createLoopRerollPass(); + (void) llvm::createLoopUnrollPass(); + (void) llvm::createLoopUnrollAndJamPass(); + (void) llvm::createLoopUnswitchPass(); + (void) llvm::createLoopVersioningLICMPass(); + (void) llvm::createLoopIdiomPass(); + (void) llvm::createLoopRotatePass(); + (void) llvm::createLowerConstantIntrinsicsPass(); + (void) llvm::createLowerExpectIntrinsicPass(); + (void) llvm::createLowerInvokePass(); + (void) llvm::createLowerSwitchPass(); + (void) llvm::createNaryReassociatePass(); + (void) llvm::createObjCARCAAWrapperPass(); + (void) llvm::createObjCARCAPElimPass(); + (void) llvm::createObjCARCExpandPass(); + (void) llvm::createObjCARCContractPass(); + (void) llvm::createObjCARCOptPass(); + (void) llvm::createPAEvalPass(); + (void) llvm::createPromoteMemoryToRegisterPass(); + (void) llvm::createDemoteRegisterToMemoryPass(); + (void) llvm::createPruneEHPass(); + (void) llvm::createPostDomOnlyPrinterPass(); + (void) llvm::createPostDomPrinterPass(); + (void) llvm::createPostDomOnlyViewerPass(); + (void) llvm::createPostDomViewerPass(); + (void) llvm::createReassociatePass(); + (void) llvm::createRedundantDbgInstEliminationPass(); + (void) llvm::createRegionInfoPass(); + (void) llvm::createRegionOnlyPrinterPass(); + (void) llvm::createRegionOnlyViewerPass(); + (void) llvm::createRegionPrinterPass(); + (void) llvm::createRegionViewerPass(); + (void) llvm::createSCCPPass(); + (void) llvm::createSafeStackPass(); + (void) llvm::createSROAPass(); + (void) llvm::createSingleLoopExtractorPass(); + (void) llvm::createStripSymbolsPass(); + (void) llvm::createStripNonDebugSymbolsPass(); + (void) llvm::createStripDeadDebugInfoPass(); + (void) llvm::createStripDeadPrototypesPass(); + (void) llvm::createTailCallEliminationPass(); + (void) llvm::createJumpThreadingPass(); + (void) llvm::createDFAJumpThreadingPass(); + (void) llvm::createUnifyFunctionExitNodesPass(); + (void) llvm::createInstCountPass(); + (void) llvm::createConstantHoistingPass(); + (void) llvm::createCodeGenPreparePass(); + (void) llvm::createEntryExitInstrumenterPass(); + (void) llvm::createPostInlineEntryExitInstrumenterPass(); + (void) llvm::createEarlyCSEPass(); + (void) llvm::createGVNHoistPass(); + (void) llvm::createMergedLoadStoreMotionPass(); + (void) llvm::createGVNPass(); + (void) llvm::createNewGVNPass(); + (void) llvm::createMemCpyOptPass(); + (void) llvm::createLoopDeletionPass(); + (void) llvm::createPostDomTree(); + (void) llvm::createInstructionNamerPass(); + (void) llvm::createMetaRenamerPass(); + (void) llvm::createAttributorLegacyPass(); + (void) llvm::createAttributorCGSCCLegacyPass(); + (void) llvm::createPostOrderFunctionAttrsLegacyPass(); + (void) llvm::createReversePostOrderFunctionAttrsPass(); + (void) llvm::createMergeFunctionsPass(); + (void) llvm::createMergeICmpsLegacyPass(); + (void) llvm::createExpandMemCmpPass(); + (void) llvm::createExpandVectorPredicationPass(); + std::string buf; + llvm::raw_string_ostream os(buf); + (void) llvm::createPrintModulePass(os); + (void) llvm::createPrintFunctionPass(os); + (void) llvm::createModuleDebugInfoPrinterPass(); + (void) llvm::createPartialInliningPass(); + (void) llvm::createLintLegacyPassPass(); + (void) llvm::createSinkingPass(); + (void) llvm::createLowerAtomicPass(); + (void) llvm::createCorrelatedValuePropagationPass(); + (void) llvm::createMemDepPrinter(); + (void) llvm::createLoopVectorizePass(); + (void) llvm::createSLPVectorizerPass(); + (void) llvm::createLoadStoreVectorizerPass(); + (void) llvm::createVectorCombinePass(); + (void) llvm::createPartiallyInlineLibCallsPass(); + (void) llvm::createScalarizerPass(); + (void) llvm::createSeparateConstOffsetFromGEPPass(); + (void) llvm::createSpeculativeExecutionPass(); + (void) llvm::createSpeculativeExecutionIfHasBranchDivergencePass(); + (void) llvm::createRewriteSymbolsPass(); + (void) llvm::createStraightLineStrengthReducePass(); + (void) llvm::createMemDerefPrinter(); + (void) llvm::createMustExecutePrinter(); + (void) llvm::createMustBeExecutedContextPrinter(); + (void) llvm::createFloat2IntPass(); + (void) llvm::createEliminateAvailableExternallyPass(); + (void)llvm::createScalarizeMaskedMemIntrinLegacyPass(); + (void) llvm::createWarnMissedTransformationsPass(); + (void) llvm::createHardwareLoopsPass(); + (void) llvm::createInjectTLIMappingsLegacyPass(); + (void) llvm::createUnifyLoopExitsPass(); + (void) llvm::createFixIrreduciblePass(); + (void)llvm::createFunctionSpecializationPass(); + + (void)new llvm::IntervalPartition(); + (void)new llvm::ScalarEvolutionWrapperPass(); + llvm::Function::Create(nullptr, llvm::GlobalValue::ExternalLinkage)->viewCFGOnly(); + llvm::RGPassManager RGM; + llvm::TargetLibraryInfoImpl TLII; + llvm::TargetLibraryInfo TLI(TLII); + llvm::AliasAnalysis AA(TLI); + llvm::AliasSetTracker X(AA); + X.add(nullptr, llvm::LocationSize::beforeOrAfterPointer(), + llvm::AAMDNodes()); // for -print-alias-sets + (void) llvm::AreStatisticsEnabled(); + (void) llvm::sys::RunningOnValgrind(); + } + } ForcePassLinking; // Force link by creating a global definition. +} + +#endif diff --git a/llvm/include/llvm/module.modulemap b/llvm/include/llvm/module.modulemap index 2d4a05f35699..6cbbb9a4028e 100644 --- a/llvm/include/llvm/module.modulemap +++ b/llvm/include/llvm/module.modulemap @@ -23,6 +23,11 @@ module LLVM_Backend { umbrella "CodeGen" module * { export * } + // Exclude these; they're intended to be included into only a single + // translation unit (or none) and aren't part of this module. + exclude header "CodeGen/LinkAllAsmWriterComponents.h" + exclude header "CodeGen/LinkAllCodegenComponents.h" + // These are intended for (repeated) textual inclusion. textual header "CodeGen/DIEValue.def" textual header "CodeGen/MachinePassRegistry.def" diff --git a/llvm/lib/Analysis/CallPrinter.cpp b/llvm/lib/Analysis/CallPrinter.cpp index f6499bc8779c..829532a0fa10 100644 --- a/llvm/lib/Analysis/CallPrinter.cpp +++ b/llvm/lib/Analysis/CallPrinter.cpp @@ -298,6 +298,10 @@ char CallGraphDOTPrinter::ID = 0; INITIALIZE_PASS(CallGraphDOTPrinter, "dot-callgraph", "Print call graph to 'dot' file", false, false) +// Create methods available outside of this file, to use them +// "include/llvm/LinkAllPasses.h". Otherwise the pass would be deleted by +// the link time optimization. + ModulePass *llvm::createCallGraphViewerPass() { return new CallGraphViewer(); } ModulePass *llvm::createCallGraphDOTPrinterPass() { diff --git a/llvm/lib/Analysis/DomPrinter.cpp b/llvm/lib/Analysis/DomPrinter.cpp index 86a1472dc3a5..ebbe0d3e2c5f 100644 --- a/llvm/lib/Analysis/DomPrinter.cpp +++ b/llvm/lib/Analysis/DomPrinter.cpp @@ -261,6 +261,10 @@ INITIALIZE_PASS(PostDomOnlyPrinter, "dot-postdom-only", "(with no function bodies)", false, false) +// Create methods available outside of this file, to use them +// "include/llvm/LinkAllPasses.h". Otherwise the pass would be deleted by +// the link time optimization. + FunctionPass *llvm::createDomPrinterPass() { return new DomPrinter(); } diff --git a/llvm/lib/Analysis/RegionInfo.cpp b/llvm/lib/Analysis/RegionInfo.cpp index d069cc56a1c9..3ba0bb9eaf2c 100644 --- a/llvm/lib/Analysis/RegionInfo.cpp +++ b/llvm/lib/Analysis/RegionInfo.cpp @@ -166,6 +166,10 @@ INITIALIZE_PASS_DEPENDENCY(DominanceFrontierWrapperPass) INITIALIZE_PASS_END(RegionInfoPass, "regions", "Detect single entry single exit regions", true, true) +// Create methods available outside of this file, to use them +// "include/llvm/LinkAllPasses.h". Otherwise the pass would be deleted by +// the link time optimization. + namespace llvm { FunctionPass *createRegionInfoPass() { diff --git a/llvm/lib/CodeGen/MachineRegionInfo.cpp b/llvm/lib/CodeGen/MachineRegionInfo.cpp index e6304c34a03d..45cdcbfeab9f 100644 --- a/llvm/lib/CodeGen/MachineRegionInfo.cpp +++ b/llvm/lib/CodeGen/MachineRegionInfo.cpp @@ -136,6 +136,10 @@ INITIALIZE_PASS_DEPENDENCY(MachineDominanceFrontier) INITIALIZE_PASS_END(MachineRegionInfoPass, DEBUG_TYPE, "Detect single entry single exit regions", true, true) +// Create methods available outside of this file, to use them +// "include/llvm/LinkAllPasses.h". Otherwise the pass would be deleted by +// the link time optimization. + namespace llvm { FunctionPass *createMachineRegionInfoPass() { diff --git a/llvm/tools/bugpoint/bugpoint.cpp b/llvm/tools/bugpoint/bugpoint.cpp index def5eb6b986e..937ec23231b0 100644 --- a/llvm/tools/bugpoint/bugpoint.cpp +++ b/llvm/tools/bugpoint/bugpoint.cpp @@ -19,6 +19,8 @@ #include "llvm/IR/LegacyPassManager.h" #include "llvm/IR/LegacyPassNameParser.h" #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" @@ -26,10 +28,8 @@ #include "llvm/Support/PluginLoader.h" #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/Process.h" -#include "llvm/Support/Signals.h" #include "llvm/Support/TargetSelect.h" #include "llvm/Support/Valgrind.h" -#include "llvm/Transforms/IPO.h" #include "llvm/Transforms/IPO/AlwaysInliner.h" #include "llvm/Transforms/IPO/PassManagerBuilder.h" diff --git a/llvm/tools/llc/llc.cpp b/llvm/tools/llc/llc.cpp index 7a536323aaca..9d80f062c8f9 100644 --- a/llvm/tools/llc/llc.cpp +++ b/llvm/tools/llc/llc.cpp @@ -17,6 +17,8 @@ #include "llvm/ADT/Triple.h" #include "llvm/Analysis/TargetLibraryInfo.h" #include "llvm/CodeGen/CommandFlags.h" +#include "llvm/CodeGen/LinkAllAsmWriterComponents.h" +#include "llvm/CodeGen/LinkAllCodegenComponents.h" #include "llvm/CodeGen/MIRParser/MIRParser.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineModuleInfo.h" diff --git a/llvm/tools/lli/lli.cpp b/llvm/tools/lli/lli.cpp index c71911507155..d20daa07196b 100644 --- a/llvm/tools/lli/lli.cpp +++ b/llvm/tools/lli/lli.cpp @@ -18,6 +18,7 @@ #include "llvm/ADT/Triple.h" #include "llvm/Bitcode/BitcodeReader.h" #include "llvm/CodeGen/CommandFlags.h" +#include "llvm/CodeGen/LinkAllCodegenComponents.h" #include "llvm/Config/llvm-config.h" #include "llvm/ExecutionEngine/GenericValue.h" #include "llvm/ExecutionEngine/Interpreter.h" diff --git a/llvm/tools/opt/opt.cpp b/llvm/tools/opt/opt.cpp index 27f890254da3..7793a5471793 100644 --- a/llvm/tools/opt/opt.cpp +++ b/llvm/tools/opt/opt.cpp @@ -35,6 +35,8 @@ #include "llvm/IR/Verifier.h" #include "llvm/IRReader/IRReader.h" #include "llvm/InitializePasses.h" +#include "llvm/LinkAllIR.h" +#include "llvm/LinkAllPasses.h" #include "llvm/MC/SubtargetFeature.h" #include "llvm/MC/TargetRegistry.h" #include "llvm/Remarks/HotnessThresholdParser.h" @@ -50,7 +52,6 @@ #include "llvm/Support/YAMLTraits.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Transforms/Coroutines.h" -#include "llvm/Transforms/IPO.h" #include "llvm/Transforms/IPO/AlwaysInliner.h" #include "llvm/Transforms/IPO/PassManagerBuilder.h" #include "llvm/Transforms/IPO/WholeProgramDevirt.h"