summaryrefslogtreecommitdiff
path: root/tools/gold/gold-plugin.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2010-06-23 20:20:59 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2010-06-23 20:20:59 +0000
commit11f403cf2be4d562f731571aee90bc25bd2d38ae (patch)
treed4cc40e99d796c92730dcdca2ca5a7c46bb72db4 /tools/gold/gold-plugin.cpp
parent7dbfd07e321dfdc90501d71a144749c69263659f (diff)
downloadllvm-11f403cf2be4d562f731571aee90bc25bd2d38ae.tar.gz
llvm-11f403cf2be4d562f731571aee90bc25bd2d38ae.tar.bz2
llvm-11f403cf2be4d562f731571aee90bc25bd2d38ae.tar.xz
Add an extra-library-path option to the plugin. This is used to support
having a library both as bitcode and native code. We want to use the bitcode first, but if codegen produces new undefined references we have to use the native code to satisfy those references. Gold has no notion of bitcode and native search directories, so instead it has an API where the plugin can instruct it to look for the libraries it is passing to it. This patch uses that API. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@106674 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/gold/gold-plugin.cpp')
-rw-r--r--tools/gold/gold-plugin.cpp13
1 files changed, 13 insertions, 0 deletions
diff --git a/tools/gold/gold-plugin.cpp b/tools/gold/gold-plugin.cpp
index 15ad405c6a..13bc64e835 100644
--- a/tools/gold/gold-plugin.cpp
+++ b/tools/gold/gold-plugin.cpp
@@ -42,6 +42,7 @@ namespace {
ld_plugin_get_symbols get_symbols = NULL;
ld_plugin_add_input_file add_input_file = NULL;
ld_plugin_add_input_library add_input_library = NULL;
+ ld_plugin_set_extra_library_path set_extra_library_path = NULL;
ld_plugin_message message = discard_message;
int api_version = 0;
@@ -66,6 +67,7 @@ namespace options {
static std::string bc_path;
static std::string as_path;
static std::vector<std::string> pass_through;
+ static std::string extra_library_path;
// Additional options to pass into the code generator.
// Note: This array will contain all plugin options which are not claimed
// as plugin exclusive to pass to the code generator.
@@ -88,6 +90,8 @@ namespace options {
} else {
as_path = opt.substr(strlen("as="));
}
+ } else if (opt.startswith("extra-library-path=")) {
+ extra_library_path = opt.substr(strlen("extra_library_path="));
} else if (opt.startswith("pass-through=")) {
llvm::StringRef item = opt.substr(strlen("pass-through="));
pass_through.push_back(item.str());
@@ -198,6 +202,9 @@ ld_plugin_status onload(ld_plugin_tv *tv) {
case LDPT_ADD_INPUT_LIBRARY:
add_input_library = tv->tv_u.tv_add_input_file;
break;
+ case LDPT_SET_EXTRA_LIBRARY_PATH:
+ set_extra_library_path = tv->tv_u.tv_set_extra_library_path;
+ break;
case LDPT_MESSAGE:
message = tv->tv_u.tv_message;
break;
@@ -445,6 +452,12 @@ static ld_plugin_status all_symbols_read_hook(void) {
return LDPS_ERR;
}
+ if (!options::extra_library_path.empty() &&
+ set_extra_library_path(options::extra_library_path.c_str()) != LDPS_OK) {
+ (*message)(LDPL_ERROR, "Unable to set the extra library path.");
+ return LDPS_ERR;
+ }
+
for (std::vector<std::string>::iterator i = options::pass_through.begin(),
e = options::pass_through.end();
i != e; ++i) {