diff options
Diffstat (limited to 'contrib/llvm/tools/clang/lib/CodeGen/BackendUtil.cpp')
-rw-r--r-- | contrib/llvm/tools/clang/lib/CodeGen/BackendUtil.cpp | 42 |
1 files changed, 28 insertions, 14 deletions
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/BackendUtil.cpp b/contrib/llvm/tools/clang/lib/CodeGen/BackendUtil.cpp index 69efe43..9897b1b 100644 --- a/contrib/llvm/tools/clang/lib/CodeGen/BackendUtil.cpp +++ b/contrib/llvm/tools/clang/lib/CodeGen/BackendUtil.cpp @@ -26,6 +26,7 @@ #include "llvm/Support/raw_ostream.h" #include "llvm/Target/SubtargetFeature.h" #include "llvm/Target/TargetData.h" +#include "llvm/Target/TargetLibraryInfo.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetOptions.h" #include "llvm/Target/TargetRegistry.h" @@ -42,14 +43,14 @@ class EmitAssemblyHelper { Timer CodeGenerationTime; - mutable FunctionPassManager *CodeGenPasses; + mutable PassManager *CodeGenPasses; mutable PassManager *PerModulePasses; mutable FunctionPassManager *PerFunctionPasses; private: - FunctionPassManager *getCodeGenPasses() const { + PassManager *getCodeGenPasses() const { if (!CodeGenPasses) { - CodeGenPasses = new FunctionPassManager(TheModule); + CodeGenPasses = new PassManager(); CodeGenPasses->add(new TargetData(TheModule)); } return CodeGenPasses; @@ -107,14 +108,22 @@ void EmitAssemblyHelper::CreatePasses() { OptLevel = 0; Inlining = CodeGenOpts.NoInlining; } + + FunctionPassManager *FPM = getPerFunctionPasses(); + + TargetLibraryInfo *TLI = + new TargetLibraryInfo(Triple(TheModule->getTargetTriple())); + if (!CodeGenOpts.SimplifyLibCalls) + TLI->disableAllFunctions(); + FPM->add(TLI); // In -O0 if checking is disabled, we don't even have per-function passes. if (CodeGenOpts.VerifyModule) - getPerFunctionPasses()->add(createVerifierPass()); + FPM->add(createVerifierPass()); // Assume that standard function passes aren't run for -O0. if (OptLevel > 0) - llvm::createStandardFunctionPasses(getPerFunctionPasses(), OptLevel); + llvm::createStandardFunctionPasses(FPM, OptLevel); llvm::Pass *InliningPass = 0; switch (Inlining) { @@ -136,8 +145,15 @@ void EmitAssemblyHelper::CreatePasses() { break; } + PassManager *MPM = getPerModulePasses(); + + TLI = new TargetLibraryInfo(Triple(TheModule->getTargetTriple())); + if (!CodeGenOpts.SimplifyLibCalls) + TLI->disableAllFunctions(); + MPM->add(TLI); + // For now we always create per module passes. - llvm::createStandardModulePasses(getPerModulePasses(), OptLevel, + llvm::createStandardModulePasses(MPM, OptLevel, CodeGenOpts.OptimizeSize, CodeGenOpts.UnitAtATime, CodeGenOpts.UnrollLoops, @@ -183,7 +199,11 @@ bool EmitAssemblyHelper::AddEmitPasses(BackendAction Action, llvm::FloatABIType = llvm::FloatABI::Default; } + llvm::LessPreciseFPMADOption = CodeGenOpts.LessPreciseFPMAD; + llvm::NoInfsFPMath = CodeGenOpts.NoInfsFPMath; + llvm::NoNaNsFPMath = CodeGenOpts.NoNaNsFPMath; NoZerosInBSS = CodeGenOpts.NoZeroInitializedInBSS; + llvm::UnsafeFPMath = CodeGenOpts.UnsafeFPMath; llvm::UseSoftFloat = CodeGenOpts.SoftFloat; UnwindTablesMandatory = CodeGenOpts.UnwindTables; @@ -248,7 +268,7 @@ bool EmitAssemblyHelper::AddEmitPasses(BackendAction Action, TM->setMCRelaxAll(true); // Create the code generator passes. - FunctionPassManager *PM = getCodeGenPasses(); + PassManager *PM = getCodeGenPasses(); CodeGenOpt::Level OptLevel = CodeGenOpt::Default; switch (CodeGenOpts.OptimizationLevel) { @@ -320,13 +340,7 @@ void EmitAssemblyHelper::EmitAssembly(BackendAction Action, raw_ostream *OS) { if (CodeGenPasses) { PrettyStackTraceString CrashInfo("Code generation"); - - CodeGenPasses->doInitialization(); - for (Module::iterator I = TheModule->begin(), - E = TheModule->end(); I != E; ++I) - if (!I->isDeclaration()) - CodeGenPasses->run(*I); - CodeGenPasses->doFinalization(); + CodeGenPasses->run(*TheModule); } } |