From cb15b739ef253b415724c512218fb21ab05ac436 Mon Sep 17 00:00:00 2001 From: Teresa Johnson Date: Wed, 16 Dec 2015 16:34:06 +0000 Subject: [PATCH] Add RAII wrapper for gold plugin file management Suggested in review of r255256. llvm-svn: 255779 --- llvm/tools/gold/gold-plugin.cpp | 54 +++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/llvm/tools/gold/gold-plugin.cpp b/llvm/tools/gold/gold-plugin.cpp index 186097fccf62..909322f07087 100644 --- a/llvm/tools/gold/gold-plugin.cpp +++ b/llvm/tools/gold/gold-plugin.cpp @@ -57,12 +57,38 @@ 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 { struct claimed_file { void *handle; std::vector 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 { bool IsLinkonceOdr = 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_get_symbols get_symbols = 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_get_view get_view = nullptr; -static ld_plugin_message message = discard_message; static Reloc::Model RelocationModel = Reloc::Default; static std::string output_name = ""; static std::list Modules; @@ -847,19 +864,14 @@ static ld_plugin_status allSymbolsReadHook(raw_fd_ostream *ApiFile) { FunctionInfoIndex CombinedIndex; uint64_t NextModuleId = 0; for (claimed_file &F : Modules) { - ld_plugin_input_file File; - if (get_input_file(F.handle, &File) != LDPS_OK) - message(LDPL_FATAL, "Failed to get file information"); + PluginInputFile InputFile(F.handle); std::unique_ptr Index = - getFunctionIndexForFile(F, File); + getFunctionIndexForFile(F, InputFile.file()); // Skip files without a function summary. if (Index) 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; @@ -886,12 +898,10 @@ static ld_plugin_status allSymbolsReadHook(raw_fd_ostream *ApiFile) { StringSet<> Internalize; StringSet<> Maybe; for (claimed_file &F : Modules) { - ld_plugin_input_file File; - if (get_input_file(F.handle, &File) != LDPS_OK) - message(LDPL_FATAL, "Failed to get file information"); + PluginInputFile InputFile(F.handle); std::vector Keep; - std::unique_ptr M = - getModuleForFile(Context, F, File, ApiFile, Internalize, Maybe, Keep); + std::unique_ptr M = getModuleForFile( + Context, F, InputFile.file(), ApiFile, Internalize, Maybe, Keep); if (!options::triple.empty()) M->setTargetTriple(options::triple.c_str()); 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) {})) 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) {