X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=tools%2Flto%2FLTOCodeGenerator.cpp;h=93eb0a561eacc686764c05e493a45e2b79c65ce5;hb=21c14e3649b3e2a70ac36ebb148f17648f10a2a9;hp=9596057733ea4290e6a140ad5b810f895afe29bf;hpb=a1bdcedc3879510a874d24c450e07feb170d9cd6;p=oota-llvm.git diff --git a/tools/lto/LTOCodeGenerator.cpp b/tools/lto/LTOCodeGenerator.cpp index 9596057733e..93eb0a561ea 100644 --- a/tools/lto/LTOCodeGenerator.cpp +++ b/tools/lto/LTOCodeGenerator.cpp @@ -24,6 +24,7 @@ #include "llvm/ModuleProvider.h" #include "llvm/PassManager.h" #include "llvm/ADT/StringExtras.h" +#include "llvm/ADT/Triple.h" #include "llvm/Analysis/Passes.h" #include "llvm/Analysis/LoopPass.h" #include "llvm/Analysis/Verifier.h" @@ -35,21 +36,20 @@ #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/StandardPasses.h" #include "llvm/Support/SystemUtils.h" +#include "llvm/System/Host.h" +#include "llvm/System/Program.h" #include "llvm/System/Signals.h" #include "llvm/Target/SubtargetFeature.h" #include "llvm/Target/TargetOptions.h" -#include "llvm/Target/TargetAsmInfo.h" +#include "llvm/MC/MCAsmInfo.h" #include "llvm/Target/TargetData.h" #include "llvm/Target/TargetMachine.h" -#include "llvm/Target/TargetMachineRegistry.h" +#include "llvm/Target/TargetRegistry.h" #include "llvm/Target/TargetSelect.h" #include "llvm/Transforms/IPO.h" #include "llvm/Transforms/Scalar.h" #include "llvm/Config/config.h" - - #include -#include #include #include @@ -75,11 +75,10 @@ LTOCodeGenerator::LTOCodeGenerator() _linker("LinkTimeOptimizer", "ld-temp.o", _context), _target(NULL), _emitDwarfDebugInfo(false), _scopeRestrictionsDone(false), _codeModel(LTO_CODEGEN_PIC_MODEL_DYNAMIC), - _nativeObjectFile(NULL), _gccPath(NULL), _assemblerPath(NULL) + _nativeObjectFile(NULL), _assemblerPath(NULL) { - InitializeAllTargets(); - InitializeAllAsmPrinters(); - + InitializeAllTargets(); + InitializeAllAsmPrinters(); } LTOCodeGenerator::~LTOCodeGenerator() @@ -126,13 +125,6 @@ bool LTOCodeGenerator::setCodePICModel(lto_codegen_model model, return true; } -void LTOCodeGenerator::setGccPath(const char* path) -{ - if ( _gccPath ) - delete _gccPath; - _gccPath = new sys::Path(path); -} - void LTOCodeGenerator::setAssemblerPath(const char* path) { if ( _assemblerPath ) @@ -146,31 +138,34 @@ void LTOCodeGenerator::addMustPreserveSymbol(const char* sym) } -bool LTOCodeGenerator::writeMergedModules(const char* path, std::string& errMsg) -{ - if ( this->determineTarget(errMsg) ) - return true; +bool LTOCodeGenerator::writeMergedModules(const char *path, + std::string &errMsg) { + if (determineTarget(errMsg)) + return true; - // mark which symbols can not be internalized - this->applyScopeRestrictions(); + // mark which symbols can not be internalized + applyScopeRestrictions(); - // create output file - std::ofstream out(path, std::ios_base::out|std::ios::trunc|std::ios::binary); - if ( out.fail() ) { - errMsg = "could not open bitcode file for writing: "; - errMsg += path; - return true; - } - - // write bitcode to it - WriteBitcodeToFile(_linker.getModule(), out); - if ( out.fail() ) { - errMsg = "could not write bitcode file: "; - errMsg += path; - return true; - } + // create output file + std::string ErrInfo; + raw_fd_ostream Out(path, ErrInfo, + raw_fd_ostream::F_Binary); + if (!ErrInfo.empty()) { + errMsg = "could not open bitcode file for writing: "; + errMsg += path; + return true; + } - return false; + // write bitcode to it + WriteBitcodeToFile(_linker.getModule(), Out); + + if (Out.has_error()) { + errMsg = "could not write bitcode file: "; + errMsg += path; + return true; + } + + return false; } @@ -185,9 +180,7 @@ const void* LTOCodeGenerator::compile(size_t* length, std::string& errMsg) // generate assembly code bool genResult = false; { - raw_fd_ostream asmFD(raw_fd_ostream(uniqueAsmPath.c_str(), - /*Binary=*/false, /*Force=*/true, - errMsg)); + raw_fd_ostream asmFD(uniqueAsmPath.c_str(), errMsg); formatted_raw_ostream asmFile(asmFD); if (!errMsg.empty()) return NULL; @@ -209,9 +202,8 @@ const void* LTOCodeGenerator::compile(size_t* length, std::string& errMsg) sys::RemoveFileOnSignal(uniqueObjPath); // assemble the assembly code - const std::string& uniqueObjStr = uniqueObjPath.toString(); - bool asmResult = this->assemble(uniqueAsmPath.toString(), - uniqueObjStr, errMsg); + const std::string& uniqueObjStr = uniqueObjPath.str(); + bool asmResult = this->assemble(uniqueAsmPath.str(), uniqueObjStr, errMsg); if ( !asmResult ) { // remove old buffer if compile() called twice delete _nativeObjectFile; @@ -240,9 +232,6 @@ bool LTOCodeGenerator::assemble(const std::string& asmPath, if ( _assemblerPath ) { tool = *_assemblerPath; needsCompilerOptions = false; - } - else if ( _gccPath ) { - tool = *_gccPath; } else { // find compiler driver tool = sys::Program::FindProgramByName("gcc"); @@ -254,51 +243,16 @@ bool LTOCodeGenerator::assemble(const std::string& asmPath, // build argument list std::vector args; - std::string targetTriple = _linker.getModule()->getTargetTriple(); + llvm::Triple targetTriple(_linker.getModule()->getTargetTriple()); + const char *arch = targetTriple.getArchNameForAssembler(); + args.push_back(tool.c_str()); - if ( targetTriple.find("darwin") != std::string::npos ) { + + if (targetTriple.getOS() == Triple::Darwin) { // darwin specific command line options - if (strncmp(targetTriple.c_str(), "i386-apple-", 11) == 0) { - args.push_back("-arch"); - args.push_back("i386"); - } - else if (strncmp(targetTriple.c_str(), "x86_64-apple-", 13) == 0) { - args.push_back("-arch"); - args.push_back("x86_64"); - } - else if (strncmp(targetTriple.c_str(), "powerpc-apple-", 14) == 0) { - args.push_back("-arch"); - args.push_back("ppc"); - } - else if (strncmp(targetTriple.c_str(), "powerpc64-apple-", 16) == 0) { - args.push_back("-arch"); - args.push_back("ppc64"); - } - else if (strncmp(targetTriple.c_str(), "arm-apple-", 10) == 0) { - args.push_back("-arch"); - args.push_back("arm"); - } - else if ((strncmp(targetTriple.c_str(), "armv4t-apple-", 13) == 0) || - (strncmp(targetTriple.c_str(), "thumbv4t-apple-", 15) == 0)) { + if (arch != NULL) { args.push_back("-arch"); - args.push_back("armv4t"); - } - else if ((strncmp(targetTriple.c_str(), "armv5-apple-", 12) == 0) || - (strncmp(targetTriple.c_str(), "armv5e-apple-", 13) == 0) || - (strncmp(targetTriple.c_str(), "thumbv5-apple-", 14) == 0) || - (strncmp(targetTriple.c_str(), "thumbv5e-apple-", 15) == 0)) { - args.push_back("-arch"); - args.push_back("armv5"); - } - else if ((strncmp(targetTriple.c_str(), "armv6-apple-", 12) == 0) || - (strncmp(targetTriple.c_str(), "thumbv6-apple-", 14) == 0)) { - args.push_back("-arch"); - args.push_back("armv6"); - } - else if ((strncmp(targetTriple.c_str(), "armv7-apple-", 12) == 0) || - (strncmp(targetTriple.c_str(), "thumbv7-apple-", 14) == 0)) { - args.push_back("-arch"); - args.push_back("armv7"); + args.push_back(arch); } // add -static to assembler command line when code model requires if ( (_assemblerPath != NULL) && (_codeModel == LTO_CODEGEN_PIC_MODEL_STATIC) ) @@ -327,11 +281,12 @@ bool LTOCodeGenerator::assemble(const std::string& asmPath, bool LTOCodeGenerator::determineTarget(std::string& errMsg) { if ( _target == NULL ) { + std::string Triple = _linker.getModule()->getTargetTriple(); + if (Triple.empty()) + Triple = sys::getHostTriple(); + // create target machine from info for merged modules - Module* mergedModule = _linker.getModule(); - const TargetMachineRegistry::entry* march = - TargetMachineRegistry::getClosestStaticTargetForModule( - *mergedModule, errMsg); + const Target *march = TargetRegistry::lookupTarget(Triple, errMsg); if ( march == NULL ) return true; @@ -350,9 +305,9 @@ bool LTOCodeGenerator::determineTarget(std::string& errMsg) } // 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()); + const std::string FeatureStr = + SubtargetFeatures::getDefaultSubtargetFeatures(llvm::Triple(Triple)); + _target = march->createTargetMachine(Triple, FeatureStr); } return false; } @@ -369,19 +324,19 @@ void LTOCodeGenerator::applyScopeRestrictions() // mark which symbols can not be internalized if ( !_mustPreserveSymbols.empty() ) { Mangler mangler(*mergedModule, - _target->getTargetAsmInfo()->getGlobalPrefix()); + _target->getMCAsmInfo()->getGlobalPrefix()); std::vector mustPreserveList; for (Module::iterator f = mergedModule->begin(), e = mergedModule->end(); f != e; ++f) { if ( !f->isDeclaration() && _mustPreserveSymbols.count(mangler.getMangledName(f)) ) - mustPreserveList.push_back(::strdup(f->getName().c_str())); + mustPreserveList.push_back(::strdup(f->getNameStr().c_str())); } for (Module::global_iterator v = mergedModule->global_begin(), e = mergedModule->global_end(); v != e; ++v) { if ( !v->isDeclaration() && _mustPreserveSymbols.count(mangler.getMangledName(v)) ) - mustPreserveList.push_back(::strdup(v->getName().c_str())); + mustPreserveList.push_back(::strdup(v->getNameStr().c_str())); } passes.add(createInternalizePass(mustPreserveList)); } @@ -396,7 +351,7 @@ void LTOCodeGenerator::applyScopeRestrictions() bool LTOCodeGenerator::generateAssemblyCode(formatted_raw_ostream& out, std::string& errMsg) { - if ( this->determineTarget(errMsg) ) + if ( this->determineTarget(errMsg) ) return true; // mark which symbols can not be internalized @@ -404,9 +359,19 @@ bool LTOCodeGenerator::generateAssemblyCode(formatted_raw_ostream& out, Module* mergedModule = _linker.getModule(); - // If target supports exception handling then enable it now. - if ( _target->getTargetAsmInfo()->doesSupportExceptionHandling() ) - llvm::ExceptionHandling = true; + // If target supports exception handling then enable it now. + switch (_target->getMCAsmInfo()->getExceptionHandlingType()) { + case ExceptionHandling::Dwarf: + llvm::DwarfExceptionHandling = true; + break; + case ExceptionHandling::SjLj: + llvm::SjLjExceptionHandling = true; + break; + case ExceptionHandling::None: + break; + default: + assert (0 && "Unknown exception handling model!"); + } // if options were requested, set them if ( !_codegenOptions.empty() ) @@ -470,6 +435,7 @@ bool LTOCodeGenerator::generateAssemblyCode(formatted_raw_ostream& out, codeGenPasses->run(*it); codeGenPasses->doFinalization(); + return false; // success } @@ -477,12 +443,12 @@ bool LTOCodeGenerator::generateAssemblyCode(formatted_raw_ostream& out, /// Optimize merged modules using various IPO passes void LTOCodeGenerator::setCodeGenDebugOptions(const char* options) { - std::string ops(options); - for (std::string o = getToken(ops); !o.empty(); o = getToken(ops)) { + for (std::pair o = getToken(options); + !o.first.empty(); o = getToken(o.second)) { // ParseCommandLineOptions() expects argv[0] to be program name. // Lazily add that. if ( _codegenOptions.empty() ) _codegenOptions.push_back("libLTO"); - _codegenOptions.push_back(strdup(o.c_str())); + _codegenOptions.push_back(strdup(o.first.str().c_str())); } }