X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=tools%2Flto2%2FLTOCodeGenerator.cpp;h=5b7a067b4c389cf4400cac14e12f5eedbc8f9781;hb=95df6b3603e228cea714be21997fec82cb03011e;hp=f8957296577b0771937ed0c2d770d99d8e7918cf;hpb=baa154330e93d7139ebac2e4e350d2b7655fc9bc;p=oota-llvm.git diff --git a/tools/lto2/LTOCodeGenerator.cpp b/tools/lto2/LTOCodeGenerator.cpp index f8957296577..5b7a067b4c3 100644 --- a/tools/lto2/LTOCodeGenerator.cpp +++ b/tools/lto2/LTOCodeGenerator.cpp @@ -32,6 +32,7 @@ #include "llvm/Analysis/Verifier.h" #include "llvm/Analysis/LoadValueNumbering.h" #include "llvm/CodeGen/FileWriters.h" +#include "llvm/Target/SubtargetFeature.h" #include "llvm/Target/TargetOptions.h" #include "llvm/Target/TargetData.h" #include "llvm/Target/TargetMachine.h" @@ -261,8 +262,11 @@ bool LTOCodeGenerator::determineTarget(std::string& errMsg) *mergedModule, errMsg); if ( march == NULL ) return true; - std::string features; - _target = march->CtorFn(*mergedModule, features); + + // construct LTModule, hand over ownership of module and target + std::string FeatureStr = + getFeatureString(_linker.getModule()->getTargetTriple().c_str()); + _target = march->CtorFn(*mergedModule, FeatureStr.c_str()); } return false; } @@ -302,7 +306,6 @@ void LTOCodeGenerator::applyScopeRestrictions() } } - /// Optimize merged modules using various IPO passes bool LTOCodeGenerator::generateAssemblyCode(std::ostream& out, std::string& errMsg) { @@ -360,12 +363,9 @@ bool LTOCodeGenerator::generateAssemblyCode(std::ostream& out, std::string& errM // function pointers. When this happens, we often have to resolve varargs // calls, etc, so let instcombine do this. passes.add(createInstructionCombiningPass()); - - passes.add(createFunctionInliningPass()); // Inline small functions - - passes.add(createPruneEHPass()); // Remove dead EH info - - passes.add(createGlobalDCEPass()); // Remove dead functions + passes.add(createFunctionInliningPass()); // Inline small functions + passes.add(createPruneEHPass()); // Remove dead EH info + passes.add(createGlobalDCEPass()); // Remove dead functions // If we didn't decide to inline a function, check to see if we can // transform it to pass arguments by value instead of by reference. @@ -377,16 +377,14 @@ bool LTOCodeGenerator::generateAssemblyCode(std::ostream& out, std::string& errM passes.add(createScalarReplAggregatesPass()); // Break up allocas // Run a few AA driven optimizations here and now, to cleanup the code. - passes.add(createGlobalsModRefPass()); // IP alias analysis - - passes.add(createLICMPass()); // Hoist loop invariants - passes.add(createGVNPass()); // Remove common subexprs - passes.add(createMemCpyOptPass()); // Remove dead memcpy's + passes.add(createGlobalsModRefPass()); // IP alias analysis + passes.add(createLICMPass()); // Hoist loop invariants + passes.add(createGVNPass()); // Remove common subexprs + passes.add(createMemCpyOptPass()); // Remove dead memcpy's passes.add(createDeadStoreEliminationPass()); // Nuke dead stores // Cleanup and simplify the code after the scalar optimizations. passes.add(createInstructionCombiningPass()); - passes.add(createJumpThreadingPass()); // Thread jumps. // Delete basic blocks, which optimization passes may have killed... @@ -431,13 +429,13 @@ bool LTOCodeGenerator::generateAssemblyCode(std::ostream& out, std::string& errM // Run the code generator, and write assembly file codeGenPasses->doInitialization(); - for (Module::iterator it = mergedModule->begin(), - e = mergedModule->end(); it != e; ++it) { - if (!it->isDeclaration()) - codeGenPasses->run(*it); - } - codeGenPasses->doFinalization(); + for (Module::iterator + it = mergedModule->begin(), e = mergedModule->end(); it != e; ++it) + if (!it->isDeclaration()) + codeGenPasses->run(*it); + + codeGenPasses->doFinalization(); return false; // success }