Add RAII wrapper for gold plugin file management
Suggested in review of r255256. llvm-svn: 255779
This commit is contained in:
parent
fb3f4907c0
commit
cb15b739ef
|
@ -57,12 +57,38 @@
|
||||||
|
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
|
static ld_plugin_status discard_message(int level, const char *format, ...) {
|
||||||
|
// Die loudly. Recent versions of Gold pass ld_plugin_message as the first
|
||||||
|
// callback in the transfer vector. This should never be called.
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
static ld_plugin_release_input_file release_input_file = nullptr;
|
||||||
|
static ld_plugin_get_input_file get_input_file = nullptr;
|
||||||
|
static ld_plugin_message message = discard_message;
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
struct claimed_file {
|
struct claimed_file {
|
||||||
void *handle;
|
void *handle;
|
||||||
std::vector<ld_plugin_symbol> syms;
|
std::vector<ld_plugin_symbol> syms;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// RAII wrapper to manage opening and releasing of a ld_plugin_input_file.
|
||||||
|
struct PluginInputFile {
|
||||||
|
void *handle;
|
||||||
|
ld_plugin_input_file File;
|
||||||
|
|
||||||
|
PluginInputFile(void *handle) : handle(handle) {
|
||||||
|
if (get_input_file(handle, &File) != LDPS_OK)
|
||||||
|
message(LDPL_FATAL, "Failed to get file information");
|
||||||
|
}
|
||||||
|
~PluginInputFile() {
|
||||||
|
if (release_input_file(handle) != LDPS_OK)
|
||||||
|
message(LDPL_FATAL, "Failed to release file information");
|
||||||
|
}
|
||||||
|
ld_plugin_input_file &file() { return File; }
|
||||||
|
};
|
||||||
|
|
||||||
struct ResolutionInfo {
|
struct ResolutionInfo {
|
||||||
bool IsLinkonceOdr = true;
|
bool IsLinkonceOdr = true;
|
||||||
bool UnnamedAddr = true;
|
bool UnnamedAddr = true;
|
||||||
|
@ -75,20 +101,11 @@ struct ResolutionInfo {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
static ld_plugin_status discard_message(int level, const char *format, ...) {
|
|
||||||
// Die loudly. Recent versions of Gold pass ld_plugin_message as the first
|
|
||||||
// callback in the transfer vector. This should never be called.
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
|
|
||||||
static ld_plugin_get_input_file get_input_file = nullptr;
|
|
||||||
static ld_plugin_release_input_file release_input_file = nullptr;
|
|
||||||
static ld_plugin_add_symbols add_symbols = nullptr;
|
static ld_plugin_add_symbols add_symbols = nullptr;
|
||||||
static ld_plugin_get_symbols get_symbols = nullptr;
|
static ld_plugin_get_symbols get_symbols = nullptr;
|
||||||
static ld_plugin_add_input_file add_input_file = nullptr;
|
static ld_plugin_add_input_file add_input_file = nullptr;
|
||||||
static ld_plugin_set_extra_library_path set_extra_library_path = nullptr;
|
static ld_plugin_set_extra_library_path set_extra_library_path = nullptr;
|
||||||
static ld_plugin_get_view get_view = nullptr;
|
static ld_plugin_get_view get_view = nullptr;
|
||||||
static ld_plugin_message message = discard_message;
|
|
||||||
static Reloc::Model RelocationModel = Reloc::Default;
|
static Reloc::Model RelocationModel = Reloc::Default;
|
||||||
static std::string output_name = "";
|
static std::string output_name = "";
|
||||||
static std::list<claimed_file> Modules;
|
static std::list<claimed_file> Modules;
|
||||||
|
@ -847,19 +864,14 @@ static ld_plugin_status allSymbolsReadHook(raw_fd_ostream *ApiFile) {
|
||||||
FunctionInfoIndex CombinedIndex;
|
FunctionInfoIndex CombinedIndex;
|
||||||
uint64_t NextModuleId = 0;
|
uint64_t NextModuleId = 0;
|
||||||
for (claimed_file &F : Modules) {
|
for (claimed_file &F : Modules) {
|
||||||
ld_plugin_input_file File;
|
PluginInputFile InputFile(F.handle);
|
||||||
if (get_input_file(F.handle, &File) != LDPS_OK)
|
|
||||||
message(LDPL_FATAL, "Failed to get file information");
|
|
||||||
|
|
||||||
std::unique_ptr<FunctionInfoIndex> Index =
|
std::unique_ptr<FunctionInfoIndex> Index =
|
||||||
getFunctionIndexForFile(F, File);
|
getFunctionIndexForFile(F, InputFile.file());
|
||||||
|
|
||||||
// Skip files without a function summary.
|
// Skip files without a function summary.
|
||||||
if (Index)
|
if (Index)
|
||||||
CombinedIndex.mergeFrom(std::move(Index), ++NextModuleId);
|
CombinedIndex.mergeFrom(std::move(Index), ++NextModuleId);
|
||||||
|
|
||||||
if (release_input_file(F.handle) != LDPS_OK)
|
|
||||||
message(LDPL_FATAL, "Failed to release file information");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::error_code EC;
|
std::error_code EC;
|
||||||
|
@ -886,12 +898,10 @@ static ld_plugin_status allSymbolsReadHook(raw_fd_ostream *ApiFile) {
|
||||||
StringSet<> Internalize;
|
StringSet<> Internalize;
|
||||||
StringSet<> Maybe;
|
StringSet<> Maybe;
|
||||||
for (claimed_file &F : Modules) {
|
for (claimed_file &F : Modules) {
|
||||||
ld_plugin_input_file File;
|
PluginInputFile InputFile(F.handle);
|
||||||
if (get_input_file(F.handle, &File) != LDPS_OK)
|
|
||||||
message(LDPL_FATAL, "Failed to get file information");
|
|
||||||
std::vector<GlobalValue *> Keep;
|
std::vector<GlobalValue *> Keep;
|
||||||
std::unique_ptr<Module> M =
|
std::unique_ptr<Module> M = getModuleForFile(
|
||||||
getModuleForFile(Context, F, File, ApiFile, Internalize, Maybe, Keep);
|
Context, F, InputFile.file(), ApiFile, Internalize, Maybe, Keep);
|
||||||
if (!options::triple.empty())
|
if (!options::triple.empty())
|
||||||
M->setTargetTriple(options::triple.c_str());
|
M->setTargetTriple(options::triple.c_str());
|
||||||
else if (M->getTargetTriple().empty())
|
else if (M->getTargetTriple().empty())
|
||||||
|
@ -899,8 +909,6 @@ static ld_plugin_status allSymbolsReadHook(raw_fd_ostream *ApiFile) {
|
||||||
|
|
||||||
if (L.move(*M, Keep, [](GlobalValue &, IRMover::ValueAdder) {}))
|
if (L.move(*M, Keep, [](GlobalValue &, IRMover::ValueAdder) {}))
|
||||||
message(LDPL_FATAL, "Failed to link module");
|
message(LDPL_FATAL, "Failed to link module");
|
||||||
if (release_input_file(F.handle) != LDPS_OK)
|
|
||||||
message(LDPL_FATAL, "Failed to release file information");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const auto &Name : Internalize) {
|
for (const auto &Name : Internalize) {
|
||||||
|
|
Loading…
Reference in New Issue