diff options
author | Nick Lewycky <nicholas@mxc.ca> | 2009-07-26 22:16:39 +0000 |
---|---|---|
committer | Nick Lewycky <nicholas@mxc.ca> | 2009-07-26 22:16:39 +0000 |
commit | d42b58b61cd773e9f798d02c42652488d67d38df (patch) | |
tree | e3d199cc81f873c8dfffcb4335f5e81029ce4215 /tools/lto | |
parent | 2749b3e745240832c3c9ddf5b6cf8a589497238b (diff) |
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
Diffstat (limited to 'tools/lto')
-rw-r--r-- | tools/lto/LTOCodeGenerator.cpp | 10 | ||||
-rw-r--r-- | tools/lto/LTOModule.cpp | 9 |
2 files changed, 13 insertions, 6 deletions
diff --git a/tools/lto/LTOCodeGenerator.cpp b/tools/lto/LTOCodeGenerator.cpp index a264e73904..a5023fb2f4 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 9968d488ff..cbccfbb9b6 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 <rdar://5972456>. 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<Module> 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<GlobalValue>(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); } |