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