Use lazy parsing in LTO. Unfortunately this is only a 3% time saving for

'ar'. Have to figure out how to make libLTO even lazier.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@127901 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2011-03-18 19:51:00 +00:00
parent 19f6f503d6
commit f19d7a7af3
2 changed files with 27 additions and 8 deletions

View File

@ -87,6 +87,10 @@ LTOCodeGenerator::~LTOCodeGenerator()
bool LTOCodeGenerator::addModule(LTOModule* mod, std::string& errMsg)
{
if(mod->getLLVVMModule()->MaterializeAllPermanently(&errMsg))
return true;
bool ret = _linker.LinkInModule(mod->getLLVVMModule(), &errMsg);
const std::vector<const char*> &undefs = mod->getAsmUndefinedRefs();

View File

@ -91,7 +91,7 @@ LTOModule *LTOModule::makeLTOModule(const char *path,
errMsg = ec.message();
return NULL;
}
return makeLTOModule(buffer.get(), errMsg);
return makeLTOModule(buffer.take(), errMsg);
}
LTOModule *LTOModule::makeLTOModule(int fd, const char *path,
@ -111,7 +111,7 @@ LTOModule *LTOModule::makeLTOModule(int fd, const char *path,
errMsg = ec.message();
return NULL;
}
return makeLTOModule(buffer.get(), errMsg);
return makeLTOModule(buffer.take(), errMsg);
}
/// makeBuffer - Create a MemoryBuffer from a memory range.
@ -126,7 +126,7 @@ LTOModule *LTOModule::makeLTOModule(const void *mem, size_t length,
OwningPtr<MemoryBuffer> buffer(makeBuffer(mem, length));
if (!buffer)
return NULL;
return makeLTOModule(buffer.get(), errMsg);
return makeLTOModule(buffer.take(), errMsg);
}
LTOModule *LTOModule::makeLTOModule(MemoryBuffer *buffer,
@ -139,9 +139,12 @@ LTOModule *LTOModule::makeLTOModule(MemoryBuffer *buffer,
}
// parse bitcode buffer
OwningPtr<Module> m(ParseBitcodeFile(buffer, getGlobalContext(), &errMsg));
if (!m)
OwningPtr<Module> m(getLazyBitcodeModule(buffer, getGlobalContext(),
&errMsg));
if (!m) {
delete buffer;
return NULL;
}
std::string Triple = m->getTargetTriple();
if (Triple.empty())
@ -638,6 +641,18 @@ bool LTOModule::addAsmGlobalSymbols(MCContext &Context) {
return false;
}
static bool isDeclaration(const GlobalValue &V) {
if (V.hasAvailableExternallyLinkage())
return true;
if (V.isMaterializable())
return false;
return V.isDeclaration();
}
static bool isAliasToDeclaration(const GlobalAlias &V) {
return isDeclaration(*V.getAliasedGlobal());
}
bool LTOModule::ParseSymbols() {
// Use mangler to add GlobalPrefix to names to match linker names.
MCContext Context(*_target->getMCAsmInfo(), NULL);
@ -645,7 +660,7 @@ bool LTOModule::ParseSymbols() {
// add functions
for (Module::iterator f = _module->begin(); f != _module->end(); ++f) {
if (f->isDeclaration() || f->hasAvailableExternallyLinkage())
if (isDeclaration(*f))
addPotentialUndefinedSymbol(f, mangler);
else
addDefinedFunctionSymbol(f, mangler);
@ -654,7 +669,7 @@ bool LTOModule::ParseSymbols() {
// add data
for (Module::global_iterator v = _module->global_begin(),
e = _module->global_end(); v != e; ++v) {
if (v->isDeclaration() || v->hasAvailableExternallyLinkage())
if (isDeclaration(*v))
addPotentialUndefinedSymbol(v, mangler);
else
addDefinedDataSymbol(v, mangler);
@ -667,7 +682,7 @@ bool LTOModule::ParseSymbols() {
// add aliases
for (Module::alias_iterator i = _module->alias_begin(),
e = _module->alias_end(); i != e; ++i) {
if (i->isDeclaration())
if (isAliasToDeclaration(*i))
addPotentialUndefinedSymbol(i, mangler);
else
addDefinedDataSymbol(i, mangler);