Skip to content

Commit

Permalink
Add modules to codegen as soon as possible. This reduces the link time
Browse files Browse the repository at this point in the history
of libxul from 12m31.084s to 7m1.359s.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@126052 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
espindola committed Feb 19, 2011
1 parent 17dce36 commit 37d42f8
Showing 1 changed file with 24 additions and 30 deletions.
54 changes: 24 additions & 30 deletions tools/gold/gold-plugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,6 @@ namespace {
int gold_version = 0;

struct claimed_file {
lto_module_t M;
void *handle;
std::vector<ld_plugin_symbol> syms;
};
Expand All @@ -65,6 +64,7 @@ namespace {
std::string output_name = "";
std::list<claimed_file> Modules;
std::vector<sys::Path> Cleanup;
lto_code_gen_t code_gen;
}

namespace options {
Expand Down Expand Up @@ -236,6 +236,8 @@ ld_plugin_status onload(ld_plugin_tv *tv) {
return LDPS_ERR;
}

code_gen = lto_codegen_create();

return LDPS_OK;
}

Expand Down Expand Up @@ -277,6 +279,11 @@ static ld_plugin_status claim_file_hook(const ld_plugin_input_file *file,
return LDPS_OK;
}
M = lto_module_create_from_memory(buf, file->filesize);
if (!M) {
(*message)(LDPL_ERROR, "Failed to create LLVM module: %s",
lto_get_error_message());
return LDPS_ERR;
}
free(buf);
} else {
// FIXME: We should not need to pass -1 as the file size, but there
Expand All @@ -299,29 +306,22 @@ static ld_plugin_status claim_file_hook(const ld_plugin_input_file *file,
*claimed = 1;
Modules.resize(Modules.size() + 1);
claimed_file &cf = Modules.back();
cf.M = M;

if (!cf.M) {
(*message)(LDPL_ERROR, "Failed to create LLVM module: %s",
lto_get_error_message());
return LDPS_ERR;
}

if (!options::triple.empty())
lto_module_set_target_triple(cf.M, options::triple.c_str());
lto_module_set_target_triple(M, options::triple.c_str());

cf.handle = file->handle;
unsigned sym_count = lto_module_get_num_symbols(cf.M);
unsigned sym_count = lto_module_get_num_symbols(M);
cf.syms.reserve(sym_count);

for (unsigned i = 0; i != sym_count; ++i) {
lto_symbol_attributes attrs = lto_module_get_symbol_attribute(cf.M, i);
lto_symbol_attributes attrs = lto_module_get_symbol_attribute(M, i);
if ((attrs & LTO_SYMBOL_SCOPE_MASK) == LTO_SYMBOL_SCOPE_INTERNAL)
continue;

cf.syms.push_back(ld_plugin_symbol());
ld_plugin_symbol &sym = cf.syms.back();
sym.name = const_cast<char *>(lto_module_get_symbol_name(cf.M, i));
sym.name = const_cast<char *>(lto_module_get_symbol_name(M, i));
sym.version = NULL;

int scope = attrs & LTO_SYMBOL_SCOPE_MASK;
Expand Down Expand Up @@ -379,6 +379,7 @@ static ld_plugin_status claim_file_hook(const ld_plugin_input_file *file,
}
}

lto_codegen_add_module(code_gen, M);
return LDPS_OK;
}

Expand All @@ -387,12 +388,6 @@ static ld_plugin_status claim_file_hook(const ld_plugin_input_file *file,
/// been overridden by a native object file. Then, perform optimization and
/// codegen.
static ld_plugin_status all_symbols_read_hook(void) {
lto_code_gen_t cg = lto_codegen_create();

for (std::list<claimed_file>::iterator I = Modules.begin(),
E = Modules.end(); I != E; ++I)
lto_codegen_add_module(cg, I->M);

std::ofstream api_file;
if (options::generate_api_file) {
api_file.open("apifile.txt", std::ofstream::out | std::ofstream::trunc);
Expand All @@ -410,7 +405,7 @@ static ld_plugin_status all_symbols_read_hook(void) {
(*get_symbols)(I->handle, I->syms.size(), &I->syms[0]);
for (unsigned i = 0, e = I->syms.size(); i != e; i++) {
if (I->syms[i].resolution == LDPR_PREVAILING_DEF) {
lto_codegen_add_must_preserve_symbol(cg, I->syms[i].name);
lto_codegen_add_must_preserve_symbol(code_gen, I->syms[i].name);
anySymbolsPreserved = true;

if (options::generate_api_file)
Expand All @@ -424,36 +419,35 @@ static ld_plugin_status all_symbols_read_hook(void) {

if (!anySymbolsPreserved) {
// All of the IL is unnecessary!
lto_codegen_dispose(cg);
lto_codegen_dispose(code_gen);
return LDPS_OK;
}

lto_codegen_set_pic_model(cg, output_type);
lto_codegen_set_debug_model(cg, LTO_DEBUG_MODEL_DWARF);
lto_codegen_set_pic_model(code_gen, output_type);
lto_codegen_set_debug_model(code_gen, LTO_DEBUG_MODEL_DWARF);
if (!options::as_path.empty()) {
sys::Path p = sys::Program::FindProgramByName(options::as_path);
lto_codegen_set_assembler_path(cg, p.c_str());
lto_codegen_set_assembler_path(code_gen, p.c_str());
}
if (!options::as_args.empty()) {
std::vector<const char *> as_args_p;
for (std::vector<std::string>::iterator I = options::as_args.begin(),
E = options::as_args.end(); I != E; ++I) {
as_args_p.push_back(I->c_str());
}
lto_codegen_set_assembler_args(cg, &as_args_p[0], as_args_p.size());
lto_codegen_set_assembler_args(code_gen, &as_args_p[0], as_args_p.size());
}
if (!options::mcpu.empty())
lto_codegen_set_cpu(cg, options::mcpu.c_str());
lto_codegen_set_cpu(code_gen, options::mcpu.c_str());

// Pass through extra options to the code generator.
if (!options::extra.empty()) {
for (std::vector<std::string>::iterator it = options::extra.begin();
it != options::extra.end(); ++it) {
lto_codegen_debug_options(cg, (*it).c_str());
lto_codegen_debug_options(code_gen, (*it).c_str());
}
}


if (options::generate_bc_file != options::BC_NO) {
std::string path;
if (options::generate_bc_file == options::BC_ONLY)
Expand All @@ -462,14 +456,14 @@ static ld_plugin_status all_symbols_read_hook(void) {
path = options::bc_path;
else
path = output_name + ".bc";
bool err = lto_codegen_write_merged_modules(cg, path.c_str());
bool err = lto_codegen_write_merged_modules(code_gen, path.c_str());
if (err)
(*message)(LDPL_FATAL, "Failed to write the output file.");
if (options::generate_bc_file == options::BC_ONLY)
exit(0);
}
size_t bufsize = 0;
const char *buffer = static_cast<const char *>(lto_codegen_compile(cg,
const char *buffer = static_cast<const char *>(lto_codegen_compile(code_gen,
&bufsize));

std::string ErrMsg;
Expand Down Expand Up @@ -502,7 +496,7 @@ static ld_plugin_status all_symbols_read_hook(void) {
}
objFile.keep();

lto_codegen_dispose(cg);
lto_codegen_dispose(code_gen);

if ((*add_input_file)(objPath) != LDPS_OK) {
(*message)(LDPL_ERROR, "Unable to add .o file to the link.");
Expand Down

0 comments on commit 37d42f8

Please sign in to comment.