forked from OSchip/llvm-project
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. llvm-svn: 77170
This commit is contained in:
parent
bcd92f1bc4
commit
fd6a2498ab
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue