From: Nick Lewycky Date: Sun, 26 Jul 2009 22:16:39 +0000 (+0000) Subject: Fix libLTO: X-Git-Tag: android-x86-6.0-r1~1003^2~17800 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=d42b58b61cd773e9f798d02c42652488d67d38df;p=android-x86%2Fexternal-llvm.git Fix libLTO: * Call InitializeAllTargets on every path where we might query the TargetRegistry. This fixes PR4604. * flush the formatted_raw_ostream& or else not all of the assembly will make it to the .s file. (It doesn't do this in its destructor?!) * Due to a reversed conditional, libLTO was reporting many symbols as both defined and undefined, including two definitions of the same symbol name in its symbol list. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77170 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/tools/lto/LTOCodeGenerator.cpp b/tools/lto/LTOCodeGenerator.cpp index a264e73904f..a5023fb2f4f 100644 --- a/tools/lto/LTOCodeGenerator.cpp +++ b/tools/lto/LTOCodeGenerator.cpp @@ -77,9 +77,8 @@ LTOCodeGenerator::LTOCodeGenerator() _codeModel(LTO_CODEGEN_PIC_MODEL_DYNAMIC), _nativeObjectFile(NULL), _gccPath(NULL), _assemblerPath(NULL) { - InitializeAllTargets(); - InitializeAllAsmPrinters(); - + InitializeAllTargets(); + InitializeAllAsmPrinters(); } LTOCodeGenerator::~LTOCodeGenerator() @@ -398,7 +397,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 @@ -472,6 +471,9 @@ bool LTOCodeGenerator::generateAssemblyCode(formatted_raw_ostream& out, codeGenPasses->run(*it); codeGenPasses->doFinalization(); + + out.flush(); + return false; // success } diff --git a/tools/lto/LTOModule.cpp b/tools/lto/LTOModule.cpp index 9968d488ff4..cbccfbb9b69 100644 --- a/tools/lto/LTOModule.cpp +++ b/tools/lto/LTOModule.cpp @@ -30,6 +30,7 @@ #include "llvm/Target/TargetAsmInfo.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetRegistry.h" +#include "llvm/Target/TargetSelect.h" using namespace llvm; @@ -125,6 +126,8 @@ LTOModule* LTOModule::makeLTOModule(const void* mem, size_t length, /// subtarget. It would be better if we could encode this information into the /// IR. See . std::string getFeatureString(const char *TargetTriple) { + InitializeAllTargets(); + SubtargetFeatures Features; if (strncmp(TargetTriple, "powerpc-apple-", 14) == 0) { @@ -140,6 +143,8 @@ std::string getFeatureString(const char *TargetTriple) { LTOModule* LTOModule::makeLTOModule(MemoryBuffer* buffer, std::string& errMsg) { + InitializeAllTargets(); + // parse bitcode buffer OwningPtr m(ParseBitcodeFile(buffer, getGlobalContext(), &errMsg)); if ( !m ) @@ -422,7 +427,7 @@ void LTOModule::addPotentialUndefinedSymbol(GlobalValue* decl, Mangler &mangler) -// Find exeternal symbols referenced by VALUE. This is a recursive function. +// Find external symbols referenced by VALUE. This is a recursive function. void LTOModule::findExternalRefs(Value* value, Mangler &mangler) { if (GlobalValue* gv = dyn_cast(value)) { @@ -508,7 +513,7 @@ void LTOModule::lazyParseSymbols() it != _undefines.end(); ++it) { // if this symbol also has a definition, then don't make an undefine // because it is a tentative definition - if ( _defines.count(it->getKey())) { + if ( _defines.count(it->getKey()) == 0 ) { NameAndAttributes info = it->getValue(); _symbols.push_back(info); }