diff options
Diffstat (limited to 'contrib/llvm/tools/clang/lib/CodeGen/BackendUtil.cpp')
| -rw-r--r-- | contrib/llvm/tools/clang/lib/CodeGen/BackendUtil.cpp | 88 | 
1 files changed, 68 insertions, 20 deletions
| diff --git a/contrib/llvm/tools/clang/lib/CodeGen/BackendUtil.cpp b/contrib/llvm/tools/clang/lib/CodeGen/BackendUtil.cpp index cec48f35a2e9..25ecec586244 100644 --- a/contrib/llvm/tools/clang/lib/CodeGen/BackendUtil.cpp +++ b/contrib/llvm/tools/clang/lib/CodeGen/BackendUtil.cpp @@ -33,11 +33,13 @@  #include "llvm/Target/TargetLibraryInfo.h"  #include "llvm/Target/TargetMachine.h"  #include "llvm/Target/TargetOptions.h" +#include "llvm/Target/TargetSubtargetInfo.h"  #include "llvm/Transforms/IPO.h"  #include "llvm/Transforms/IPO/PassManagerBuilder.h"  #include "llvm/Transforms/Instrumentation.h"  #include "llvm/Transforms/ObjCARC.h"  #include "llvm/Transforms/Scalar.h" +#include "llvm/Transforms/Utils/SymbolRewriter.h"  #include <memory>  using namespace clang;  using namespace llvm; @@ -61,7 +63,7 @@ private:    PassManager *getCodeGenPasses() const {      if (!CodeGenPasses) {        CodeGenPasses = new PassManager(); -      CodeGenPasses->add(new DataLayoutPass(TheModule)); +      CodeGenPasses->add(new DataLayoutPass());        if (TM)          TM->addAnalysisPasses(*CodeGenPasses);      } @@ -71,7 +73,7 @@ private:    PassManager *getPerModulePasses() const {      if (!PerModulePasses) {        PerModulePasses = new PassManager(); -      PerModulePasses->add(new DataLayoutPass(TheModule)); +      PerModulePasses->add(new DataLayoutPass());        if (TM)          TM->addAnalysisPasses(*PerModulePasses);      } @@ -81,7 +83,7 @@ private:    FunctionPassManager *getPerFunctionPasses() const {      if (!PerFunctionPasses) {        PerFunctionPasses = new FunctionPassManager(TheModule); -      PerFunctionPasses->add(new DataLayoutPass(TheModule)); +      PerFunctionPasses->add(new DataLayoutPass());        if (TM)          TM->addAnalysisPasses(*PerFunctionPasses);      } @@ -121,7 +123,7 @@ public:      delete PerModulePasses;      delete PerFunctionPasses;      if (CodeGenOpts.DisableFree) -      BuryPointer(TM.release()); +      BuryPointer(std::move(TM));    }    std::unique_ptr<TargetMachine> TM; @@ -178,6 +180,14 @@ static void addBoundsCheckingPass(const PassManagerBuilder &Builder,    PM.add(createBoundsCheckingPass());  } +static void addSanitizerCoveragePass(const PassManagerBuilder &Builder, +                                     PassManagerBase &PM) { +  const PassManagerBuilderWrapper &BuilderWrapper = +      static_cast<const PassManagerBuilderWrapper&>(Builder); +  const CodeGenOptions &CGOpts = BuilderWrapper.getCGOpts(); +  PM.add(createSanitizerCoverageModulePass(CGOpts.SanitizeCoverage)); +} +  static void addAddressSanitizerPasses(const PassManagerBuilder &Builder,                                        PassManagerBase &PM) {    PM.add(createAddressSanitizerFunctionPass()); @@ -213,8 +223,27 @@ static void addDataFlowSanitizerPass(const PassManagerBuilder &Builder,                                       PassManagerBase &PM) {    const PassManagerBuilderWrapper &BuilderWrapper =        static_cast<const PassManagerBuilderWrapper&>(Builder); -  const CodeGenOptions &CGOpts = BuilderWrapper.getCGOpts(); -  PM.add(createDataFlowSanitizerPass(CGOpts.SanitizerBlacklistFile)); +  const LangOptions &LangOpts = BuilderWrapper.getLangOpts(); +  PM.add(createDataFlowSanitizerPass(LangOpts.SanitizerBlacklistFile)); +} + +static TargetLibraryInfo *createTLI(llvm::Triple &TargetTriple, +                                    const CodeGenOptions &CodeGenOpts) { +  TargetLibraryInfo *TLI = new TargetLibraryInfo(TargetTriple); +  if (!CodeGenOpts.SimplifyLibCalls) +    TLI->disableAllFunctions(); +  return TLI; +} + +static void addSymbolRewriterPass(const CodeGenOptions &Opts, +                                  PassManager *MPM) { +  llvm::SymbolRewriter::RewriteDescriptorList DL; + +  llvm::SymbolRewriter::RewriteMapParser MapParser; +  for (const auto &MapFile : Opts.RewriteMapFiles) +    MapParser.parse(MapFile, &DL); + +  MPM->add(createRewriteSymbolsPass(DL));  }  void EmitAssemblyHelper::CreatePasses() { @@ -238,6 +267,7 @@ void EmitAssemblyHelper::CreatePasses() {    PMBuilder.DisableTailCalls = CodeGenOpts.DisableTailCalls;    PMBuilder.DisableUnitAtATime = !CodeGenOpts.UnitAtATime;    PMBuilder.DisableUnrollLoops = !CodeGenOpts.UnrollLoops; +  PMBuilder.MergeFunctions = CodeGenOpts.MergeFunctions;    PMBuilder.RerollLoops = CodeGenOpts.RerollLoops;    PMBuilder.addExtension(PassManagerBuilder::EP_EarlyAsPossible, @@ -257,35 +287,42 @@ void EmitAssemblyHelper::CreatePasses() {                             addObjCARCOptPass);    } -  if (LangOpts.Sanitize.LocalBounds) { +  if (LangOpts.Sanitize.has(SanitizerKind::LocalBounds)) {      PMBuilder.addExtension(PassManagerBuilder::EP_ScalarOptimizerLate,                             addBoundsCheckingPass);      PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,                             addBoundsCheckingPass);    } -  if (LangOpts.Sanitize.Address) { +  if (CodeGenOpts.SanitizeCoverage) { +    PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast, +                           addSanitizerCoveragePass); +    PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0, +                           addSanitizerCoveragePass); +  } + +  if (LangOpts.Sanitize.has(SanitizerKind::Address)) {      PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,                             addAddressSanitizerPasses);      PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,                             addAddressSanitizerPasses);    } -  if (LangOpts.Sanitize.Memory) { +  if (LangOpts.Sanitize.has(SanitizerKind::Memory)) {      PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,                             addMemorySanitizerPass);      PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,                             addMemorySanitizerPass);    } -  if (LangOpts.Sanitize.Thread) { +  if (LangOpts.Sanitize.has(SanitizerKind::Thread)) {      PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,                             addThreadSanitizerPass);      PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,                             addThreadSanitizerPass);    } -  if (LangOpts.Sanitize.DataFlow) { +  if (LangOpts.Sanitize.has(SanitizerKind::DataFlow)) {      PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,                             addDataFlowSanitizerPass);      PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0, @@ -294,9 +331,7 @@ void EmitAssemblyHelper::CreatePasses() {    // Figure out TargetLibraryInfo.    Triple TargetTriple(TheModule->getTargetTriple()); -  PMBuilder.LibraryInfo = new TargetLibraryInfo(TargetTriple); -  if (!CodeGenOpts.SimplifyLibCalls) -    PMBuilder.LibraryInfo->disableAllFunctions(); +  PMBuilder.LibraryInfo = createTLI(TargetTriple, CodeGenOpts);    switch (Inlining) {    case CodeGenOptions::NoInlining: break; @@ -323,6 +358,8 @@ void EmitAssemblyHelper::CreatePasses() {    // Set up the per-module pass manager.    PassManager *MPM = getPerModulePasses(); +  if (!CodeGenOpts.RewriteMapFiles.empty()) +    addSymbolRewriterPass(CodeGenOpts, MPM);    if (CodeGenOpts.VerifyModule)      MPM->add(createDebugInfoVerifierPass()); @@ -343,6 +380,12 @@ void EmitAssemblyHelper::CreatePasses() {        MPM->add(createStripSymbolsPass(true));    } +  if (CodeGenOpts.ProfileInstrGenerate) { +    InstrProfOptions Options; +    Options.NoRedZone = CodeGenOpts.DisableRedZone; +    MPM->add(createInstrProfilingPass(Options)); +  } +    PMBuilder.populateModulePassManager(*MPM);  } @@ -418,6 +461,11 @@ TargetMachine *EmitAssemblyHelper::CreateTargetMachine(bool MustCreateTM) {    llvm::TargetOptions Options; +  Options.ThreadModel = +    llvm::StringSwitch<llvm::ThreadModel::Model>(CodeGenOpts.ThreadModel) +      .Case("posix", llvm::ThreadModel::POSIX) +      .Case("single", llvm::ThreadModel::Single); +    if (CodeGenOpts.DisableIntegratedAS)      Options.DisableIntegratedAS = true; @@ -476,7 +524,9 @@ TargetMachine *EmitAssemblyHelper::CreateTargetMachine(bool MustCreateTM) {    Options.MCOptions.MCSaveTempLabels = CodeGenOpts.SaveTempLabels;    Options.MCOptions.MCUseDwarfDirectory = !CodeGenOpts.NoDwarfDirectoryAsm;    Options.MCOptions.MCNoExecStack = CodeGenOpts.NoExecStack; +  Options.MCOptions.MCFatalWarnings = CodeGenOpts.FatalWarnings;    Options.MCOptions.AsmVerbose = CodeGenOpts.AsmVerbose; +  Options.MCOptions.ABIName = TargetOpts.ABI;    TargetMachine *TM = TheTarget->createTargetMachine(Triple, TargetOpts.CPU,                                                       FeaturesStr, Options, @@ -493,10 +543,7 @@ bool EmitAssemblyHelper::AddEmitPasses(BackendAction Action,    // Add LibraryInfo.    llvm::Triple TargetTriple(TheModule->getTargetTriple()); -  TargetLibraryInfo *TLI = new TargetLibraryInfo(TargetTriple); -  if (!CodeGenOpts.SimplifyLibCalls) -    TLI->disableAllFunctions(); -  PM->add(TLI); +  PM->add(createTLI(TargetTriple, CodeGenOpts));    // Add Target specific analysis passes.    TM->addAnalysisPasses(*PM); @@ -600,8 +647,9 @@ void clang::EmitBackendOutput(DiagnosticsEngine &Diags,    // If an optional clang TargetInfo description string was passed in, use it to    // verify the LLVM TargetMachine's DataLayout.    if (AsmHelper.TM && !TDesc.empty()) { -    std::string DLDesc = -        AsmHelper.TM->getDataLayout()->getStringRepresentation(); +    std::string DLDesc = AsmHelper.TM->getSubtargetImpl() +                             ->getDataLayout() +                             ->getStringRepresentation();      if (DLDesc != TDesc) {        unsigned DiagID = Diags.getCustomDiagID(            DiagnosticsEngine::Error, "backend data layout '%0' does not match " | 
