summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2013-10-03 18:29:09 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2013-10-03 18:29:09 +0000
commit438900938c3ac9d7fac2dd5d2c85ca4b9b2e35f7 (patch)
treeee292d94cfa7c8661cc4cd598f32e66289df9aeb /tools
parent1df59ef1aa271a4e33cf8973e14bcaf55c585231 (diff)
downloadllvm-438900938c3ac9d7fac2dd5d2c85ca4b9b2e35f7.tar.gz
llvm-438900938c3ac9d7fac2dd5d2c85ca4b9b2e35f7.tar.bz2
llvm-438900938c3ac9d7fac2dd5d2c85ca4b9b2e35f7.tar.xz
Optimize linkonce_odr unnamed_addr functions during LTO.
Generalize the API so we can distinguish symbols that are needed just for a DSO symbol table from those that are used from some native .o. The symbols that are only wanted for the dso symbol table can be dropped if llvm can prove every other dso has a copy (linkonce_odr) and the address is not important (unnamed_addr). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@191922 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools')
-rw-r--r--tools/gold/gold-plugin.cpp7
-rw-r--r--tools/llvm-lto/llvm-lto.cpp8
-rw-r--r--tools/lto/lto.cpp4
3 files changed, 18 insertions, 1 deletions
diff --git a/tools/gold/gold-plugin.cpp b/tools/gold/gold-plugin.cpp
index bd11d1b555..119631cfa7 100644
--- a/tools/gold/gold-plugin.cpp
+++ b/tools/gold/gold-plugin.cpp
@@ -197,7 +197,7 @@ ld_plugin_status onload(ld_plugin_tv *tv) {
case LDPT_ADD_SYMBOLS:
add_symbols = tv->tv_u.tv_add_symbols;
break;
- case LDPT_GET_SYMBOLS:
+ case LDPT_GET_SYMBOLS_V2:
get_symbols = tv->tv_u.tv_get_symbols;
break;
case LDPT_ADD_INPUT_FILE:
@@ -386,6 +386,11 @@ static ld_plugin_status all_symbols_read_hook(void) {
if (options::generate_api_file)
api_file << I->syms[i].name << "\n";
+ } else if (I->syms[i].resolution == LDPR_PREVAILING_DEF_IRONLY_EXP) {
+ lto_codegen_add_dso_symbol(code_gen, I->syms[i].name);
+
+ if (options::generate_api_file)
+ api_file << I->syms[i].name << " dso only\n";
}
}
}
diff --git a/tools/llvm-lto/llvm-lto.cpp b/tools/llvm-lto/llvm-lto.cpp
index 3ecd13f5c7..1d03fa62a8 100644
--- a/tools/llvm-lto/llvm-lto.cpp
+++ b/tools/llvm-lto/llvm-lto.cpp
@@ -50,6 +50,10 @@ ExportedSymbols("exported-symbol",
cl::desc("Symbol to export from the resulting object file"),
cl::ZeroOrMore);
+static cl::list<std::string>
+DSOSymbols("dso-symbol",
+ cl::desc("Symbol to put in the symtab in the resulting dso"),
+ cl::ZeroOrMore);
int main(int argc, char **argv) {
// Print a stack trace if we signal out.
@@ -117,6 +121,10 @@ int main(int argc, char **argv) {
for (unsigned i = 0; i < ExportedSymbols.size(); ++i)
CodeGen.addMustPreserveSymbol(ExportedSymbols[i].c_str());
+ // Add all the dso symbols to the table of symbols to expose.
+ for (unsigned i = 0; i < DSOSymbols.size(); ++i)
+ CodeGen.addDSOSymbol(DSOSymbols[i].c_str());
+
if (!OutputFilename.empty()) {
size_t len = 0;
std::string ErrorInfo;
diff --git a/tools/lto/lto.cpp b/tools/lto/lto.cpp
index 7bfddcd9ec..a3acd4c950 100644
--- a/tools/lto/lto.cpp
+++ b/tools/lto/lto.cpp
@@ -260,6 +260,10 @@ void lto_codegen_add_must_preserve_symbol(lto_code_gen_t cg,
cg->addMustPreserveSymbol(symbol);
}
+void lto_codegen_add_dso_symbol(lto_code_gen_t cg, const char *symbol) {
+ cg->addDSOSymbol(symbol);
+}
+
/// lto_codegen_write_merged_modules - Writes a new file at the specified path
/// that contains the merged contents of all modules added so far. Returns true
/// on error (check lto_get_error_message() for details).