diff --git a/tools/gold/gold-plugin.cpp b/tools/gold/gold-plugin.cpp index 15df7d03152..c8542b17520 100644 --- a/tools/gold/gold-plugin.cpp +++ b/tools/gold/gold-plugin.cpp @@ -41,6 +41,7 @@ namespace { ld_plugin_add_symbols add_symbols = NULL; 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_message message = discard_message; int api_version = 0; @@ -64,6 +65,7 @@ namespace options { static generate_bc generate_bc_file = BC_NO; static std::string bc_path; static std::string as_path; + static std::vector pass_through; // 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. @@ -86,6 +88,9 @@ namespace options { } else { as_path = opt.substr(strlen("as=")); } + } else if (opt.startswith("pass-through=")) { + llvm::StringRef item = opt.substr(strlen("pass-through=")); + pass_through.push_back(item.str()); } else if (opt == "emit-llvm") { generate_bc_file = BC_ONLY; } else if (opt == "also-emit-llvm") { @@ -190,6 +195,9 @@ ld_plugin_status onload(ld_plugin_tv *tv) { case LDPT_ADD_INPUT_FILE: add_input_file = tv->tv_u.tv_add_input_file; break; + case LDPT_ADD_INPUT_LIBRARY: + add_input_library = tv->tv_u.tv_add_input_file; + break; case LDPT_MESSAGE: message = tv->tv_u.tv_message; break; @@ -437,6 +445,24 @@ static ld_plugin_status all_symbols_read_hook(void) { return LDPS_ERR; } + for (std::vector::iterator i = options::pass_through.begin(), + e = options::pass_through.end(); + i != e; ++i) { + std::string &item = *i; + char *item_p = const_cast(item.c_str()); + if (llvm::StringRef(item).startswith("-l")) { + if (add_input_library(item_p + 2) != LDPS_OK) { + (*message)(LDPL_ERROR, "Unable to add library to the link."); + return LDPS_ERR; + } + } else { + if (add_input_file(item_p) != LDPS_OK) { + (*message)(LDPL_ERROR, "Unable to add .o file to the link."); + return LDPS_ERR; + } + } + } + Cleanup.push_back(uniqueObjPath); return LDPS_OK;