<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 19 June 2014 14:14, Rafael Espindola <span dir="ltr"><<a href="mailto:rafael.espindola@gmail.com" target="_blank">rafael.espindola@gmail.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rafael<br>
Date: Thu Jun 19 16:14:13 2014<br>
New Revision: 211315<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=211315&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=211315&view=rev</a><br>
Log:<br>
Use lib/LTO directly in the gold plugin.<br>
<br>
The tools/lto API is not the best choice for implementing a gold plugin. Among<br>
other issues:<br>
<br>
* It is an stable ABI. Old errors stay and we have to be really careful<br>
  before adding new features.<br>
* It has to support two fairly different linkers: gold and ld64.<br>
* We end up with a plugin that depends on a shared lib, something quiet<br>
  unusual in LLVM land.<br>
* It hides LLVM. For some features in the gold plugin it would be really<br>
  nice to be able to just get a Module or a GlobalValue.<br>
<br>
This change is intended to be a very direct translation from the C API. It<br>
will just enable other fixes and cleanups.<br></blockquote><div><br></div><div>Huh, okay. Cool. This came as a surprise to me but I guess it's the logical progression now that liblto is split into lib/LTO and tools/LTO.</div>

<div><br></div><div>At this point I'll stop protecting (read: caring about) the tools/lto C API since the only consumer is now Apple's LD?</div><div><br></div><div>Nick</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

Tested with a LTO bootstrap on linux.<br>
<br>
Modified:<br>
    llvm/trunk/tools/gold/CMakeLists.txt<br>
    llvm/trunk/tools/gold/gold-plugin.cpp<br>
<br>
Modified: llvm/trunk/tools/gold/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/gold/CMakeLists.txt?rev=211315&r1=211314&r2=211315&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/gold/CMakeLists.txt?rev=211315&r1=211314&r2=211315&view=diff</a><br>


==============================================================================<br>
--- llvm/trunk/tools/gold/CMakeLists.txt (original)<br>
+++ llvm/trunk/tools/gold/CMakeLists.txt Thu Jun 19 16:14:13 2014<br>
@@ -14,13 +14,14 @@ else()<br>
   # ABI compatibility.<br>
   add_definitions( -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 )<br>
<br>
-  set(LLVM_LINK_COMPONENTS support)<br>
+  set(LLVM_LINK_COMPONENTS<br>
+     ${LLVM_TARGETS_TO_BUILD}<br>
+     LTO<br>
+     )<br>
<br>
   add_llvm_loadable_module(LLVMgold<br>
     gold-plugin.cpp<br>
     )<br>
<br>
-  target_link_libraries(LLVMgold ${cmake_2_8_12_PRIVATE} LTO)<br>
-<br>
 endif()<br>
<br>
<br>
Modified: llvm/trunk/tools/gold/gold-plugin.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/gold/gold-plugin.cpp?rev=211315&r1=211314&r2=211315&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/gold/gold-plugin.cpp?rev=211315&r1=211314&r2=211315&view=diff</a><br>


==============================================================================<br>
--- llvm/trunk/tools/gold/gold-plugin.cpp (original)<br>
+++ llvm/trunk/tools/gold/gold-plugin.cpp Thu Jun 19 16:14:13 2014<br>
@@ -15,11 +15,15 @@<br>
 #include "llvm/Config/config.h" // plugin-api.h requires HAVE_STDINT_H<br>
 #include "llvm-c/lto.h"<br>
 #include "llvm/ADT/StringSet.h"<br>
+#include "llvm/CodeGen/CommandFlags.h"<br>
+#include "llvm/LTO/LTOCodeGenerator.h"<br>
+#include "llvm/LTO/LTOModule.h"<br>
 #include "llvm/Support/Errno.h"<br>
 #include "llvm/Support/FileSystem.h"<br>
 #include "llvm/Support/MemoryBuffer.h"<br>
 #include "llvm/Support/Path.h"<br>
 #include "llvm/Support/Program.h"<br>
+#include "llvm/Support/TargetSelect.h"<br>
 #include "llvm/Support/ToolOutputFile.h"<br>
 #include <cerrno><br>
 #include <cstdlib><br>
@@ -72,9 +76,10 @@ namespace {<br>
   std::string output_name = "";<br>
   std::list<claimed_file> Modules;<br>
   std::vector<std::string> Cleanup;<br>
-  lto_code_gen_t code_gen = NULL;<br>
+  LTOCodeGenerator *CodeGen = nullptr;<br>
   StringSet<> CannotBeHidden;<br>
 }<br>
+static llvm::TargetOptions TargetOpts;<br>
<br>
 namespace options {<br>
   enum generate_bc { BC_NO, BC_ALSO, BC_ONLY };<br>
@@ -142,6 +147,7 @@ ld_plugin_status onload(ld_plugin_tv *tv<br>
   // for services.<br>
<br>
   bool registeredClaimFile = false;<br>
+  bool RegisteredAllSymbolsRead = false;<br>
<br>
   for (; tv->tv_tag != LDPT_NULL; ++tv) {<br>
     switch (tv->tv_tag) {<br>
@@ -189,7 +195,7 @@ ld_plugin_status onload(ld_plugin_tv *tv<br>
         if ((*callback)(all_symbols_read_hook) != LDPS_OK)<br>
           return LDPS_ERR;<br>
<br>
-        code_gen = lto_codegen_create();<br>
+        RegisteredAllSymbolsRead = true;<br>
       } break;<br>
       case LDPT_REGISTER_CLEANUP_HOOK: {<br>
         ld_plugin_register_cleanup callback;<br>
@@ -233,6 +239,28 @@ ld_plugin_status onload(ld_plugin_tv *tv<br>
     return LDPS_ERR;<br>
   }<br>
<br>
+  if (RegisteredAllSymbolsRead) {<br>
+    InitializeAllTargetInfos();<br>
+    InitializeAllTargets();<br>
+    InitializeAllTargetMCs();<br>
+    InitializeAllAsmParsers();<br>
+    InitializeAllAsmPrinters();<br>
+    InitializeAllDisassemblers();<br>
+    TargetOpts = InitTargetOptionsFromCodeGenFlags();<br>
+    CodeGen = new LTOCodeGenerator();<br>
+    CodeGen->setTargetOptions(TargetOpts);<br>
+    if (MAttrs.size()) {<br>
+      std::string Attrs;<br>
+      for (unsigned I = 0; I < MAttrs.size(); ++I) {<br>
+        if (I > 0)<br>
+          Attrs.append(",");<br>
+        Attrs.append(MAttrs[I]);<br>
+      }<br>
+<br>
+      CodeGen->setAttr(Attrs.c_str());<br>
+    }<br>
+  }<br>
+<br>
   return LDPS_OK;<br>
 }<br>
<br>
@@ -241,7 +269,7 @@ ld_plugin_status onload(ld_plugin_tv *tv<br>
 /// with add_symbol if possible.<br>
 static ld_plugin_status claim_file_hook(const ld_plugin_input_file *file,<br>
                                         int *claimed) {<br>
-  lto_module_t M;<br>
+  LTOModule *M;<br>
   const void *view;<br>
   std::unique_ptr<MemoryBuffer> buffer;<br>
   if (get_view) {<br>
@@ -264,17 +292,15 @@ static ld_plugin_status claim_file_hook(<br>
     view = buffer->getBufferStart();<br>
   }<br>
<br>
-  if (!lto_module_is_object_file_in_memory(view, file->filesize))<br>
+  if (!LTOModule::isBitcodeFile(view, file->filesize))<br>
     return LDPS_OK;<br>
<br>
-  M = lto_module_create_from_memory(view, file->filesize);<br>
+  std::string Error;<br>
+  M = LTOModule::makeLTOModule(view, file->filesize, TargetOpts, Error);<br>
   if (!M) {<br>
-    if (const char* msg = lto_get_error_message()) {<br>
-      (*message)(LDPL_ERROR,<br>
-                 "LLVM gold plugin has failed to create LTO module: %s",<br>
-                 msg);<br>
-      return LDPS_ERR;<br>
-    }<br>
+    (*message)(LDPL_ERROR,<br>
+               "LLVM gold plugin has failed to create LTO module: %s",<br>
+               Error.c_str());<br>
     return LDPS_OK;<br>
   }<br>
<br>
@@ -283,20 +309,20 @@ static ld_plugin_status claim_file_hook(<br>
   claimed_file &cf = Modules.back();<br>
<br>
   if (!options::triple.empty())<br>
-    lto_module_set_target_triple(M, options::triple.c_str());<br>
+    M->setTargetTriple(options::triple.c_str());<br>
<br>
   cf.handle = file->handle;<br>
-  unsigned sym_count = lto_module_get_num_symbols(M);<br>
+  unsigned sym_count = M->getSymbolCount();<br>
   cf.syms.reserve(sym_count);<br>
<br>
   for (unsigned i = 0; i != sym_count; ++i) {<br>
-    lto_symbol_attributes attrs = lto_module_get_symbol_attribute(M, i);<br>
+    lto_symbol_attributes attrs = M->getSymbolAttributes(i);<br>
     if ((attrs & LTO_SYMBOL_SCOPE_MASK) == LTO_SYMBOL_SCOPE_INTERNAL)<br>
       continue;<br>
<br>
     cf.syms.push_back(ld_plugin_symbol());<br>
     ld_plugin_symbol &sym = cf.syms.back();<br>
-    <a href="http://sym.name" target="_blank">sym.name</a> = const_cast<char *>(lto_module_get_symbol_name(M, i));<br>
+    <a href="http://sym.name" target="_blank">sym.name</a> = const_cast<char *>(M->getSymbolName(i));<br>
     <a href="http://sym.name" target="_blank">sym.name</a> = strdup(<a href="http://sym.name" target="_blank">sym.name</a>);<br>
     sym.version = NULL;<br>
<br>
@@ -359,15 +385,15 @@ static ld_plugin_status claim_file_hook(<br>
     }<br>
   }<br>
<br>
-  if (code_gen) {<br>
-    if (lto_codegen_add_module(code_gen, M)) {<br>
-      (*message)(LDPL_ERROR, "Error linking module: %s",<br>
-                 lto_get_error_message());<br>
+  if (CodeGen) {<br>
+    std::string Error;<br>
+    if (!CodeGen->addModule(M, Error)) {<br>
+      (*message)(LDPL_ERROR, "Error linking module: %s", Error.c_str());<br>
       return LDPS_ERR;<br>
     }<br>
   }<br>
<br>
-  lto_module_dispose(M);<br>
+  delete M;<br>
<br>
   return LDPS_OK;<br>
 }<br>
@@ -386,7 +412,7 @@ static bool mustPreserve(const claimed_f<br>
 /// codegen.<br>
 static ld_plugin_status all_symbols_read_hook(void) {<br>
   std::ofstream api_file;<br>
-  assert(code_gen);<br>
+  assert(CodeGen);<br>
<br>
   if (options::generate_api_file) {<br>
     api_file.open("apifile.txt", std::ofstream::out | std::ofstream::trunc);<br>
@@ -403,7 +429,7 @@ static ld_plugin_status all_symbols_read<br>
     (*get_symbols)(I->handle, I->syms.size(), &I->syms[0]);<br>
     for (unsigned i = 0, e = I->syms.size(); i != e; i++) {<br>
       if (mustPreserve(*I, i)) {<br>
-        lto_codegen_add_must_preserve_symbol(code_gen, I->syms[i].name);<br>
+        CodeGen->addMustPreserveSymbol(I->syms[i].name);<br>
<br>
         if (options::generate_api_file)<br>
           api_file << I->syms[i].name << "\n";<br>
@@ -414,16 +440,16 @@ static ld_plugin_status all_symbols_read<br>
   if (options::generate_api_file)<br>
     api_file.close();<br>
<br>
-  lto_codegen_set_pic_model(code_gen, output_type);<br>
-  lto_codegen_set_debug_model(code_gen, LTO_DEBUG_MODEL_DWARF);<br>
+  CodeGen->setCodePICModel(output_type);<br>
+  CodeGen->setDebugInfo(LTO_DEBUG_MODEL_DWARF);<br>
   if (!options::mcpu.empty())<br>
-    lto_codegen_set_cpu(code_gen, options::mcpu.c_str());<br>
+    CodeGen->setCpu(options::mcpu.c_str());<br>
<br>
   // Pass through extra options to the code generator.<br>
   if (!options::extra.empty()) {<br>
     for (std::vector<std::string>::iterator it = options::extra.begin();<br>
          it != options::extra.end(); ++it) {<br>
-      lto_codegen_debug_options(code_gen, (*it).c_str());<br>
+      CodeGen->setCodeGenDebugOptions((*it).c_str());<br>
     }<br>
   }<br>
<br>
@@ -435,11 +461,12 @@ static ld_plugin_status all_symbols_read<br>
       path = options::bc_path;<br>
     else<br>
       path = output_name + ".bc";<br>
-    bool err = lto_codegen_write_merged_modules(code_gen, path.c_str());<br>
-    if (err)<br>
+    CodeGen->parseCodeGenDebugOptions();<br>
+    std::string Error;<br>
+    if (!CodeGen->writeMergedModules(path.c_str(), Error))<br>
       (*message)(LDPL_FATAL, "Failed to write the output file.");<br>
     if (options::generate_bc_file == options::BC_ONLY) {<br>
-      lto_codegen_dispose(code_gen);<br>
+      delete CodeGen;<br>
       exit(0);<br>
     }<br>
   }<br>
@@ -447,13 +474,15 @@ static ld_plugin_status all_symbols_read<br>
   std::string ObjPath;<br>
   {<br>
     const char *Temp;<br>
-    if (lto_codegen_compile_to_file(code_gen, &Temp)) {<br>
+    CodeGen->parseCodeGenDebugOptions();<br>
+    std::string Error;<br>
+    if (!CodeGen->compile_to_file(&Temp, /*DisableOpt*/ false, /*DisableInline*/<br>
+                                  false, /*DisableGVNLoadPRE*/ false, Error))<br>
       (*message)(LDPL_ERROR, "Could not produce a combined object file\n");<br>
-    }<br>
     ObjPath = Temp;<br>
   }<br>
<br>
-  lto_codegen_dispose(code_gen);<br>
+  delete CodeGen;<br>
   for (std::list<claimed_file>::iterator I = Modules.begin(),<br>
          E = Modules.end(); I != E; ++I) {<br>
     for (unsigned i = 0; i != I->syms.size(); ++i) {<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>