<div dir="ltr"><div>+pcc</div>he bot is still red. <div>Bob or Peter, please fix or revert ASAP. </div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Feb 2, 2017 at 5:56 PM, Kostya Serebryany <span dir="ltr"><<a href="mailto:kcc@google.com" target="_blank">kcc@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">This makes the ubsan bot sad: <div><a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/2511/steps/check-llvm%20ubsan/logs/stdio" target="_blank">http://lab.llvm.org:8011/<wbr>builders/sanitizer-x86_64-<wbr>linux-fast/builds/2511/steps/<wbr>check-llvm%20ubsan/logs/stdio</a><br></div><div><pre style="font-family:"courier new",courier,monotype,monospace;color:rgb(0,0,0);font-size:medium"><span class="m_-5220768784200856313gmail-stdout">/mnt/b/sanitizer-buildbot3/<wbr>sanitizer-x86_64-linux-fast/<wbr>build/llvm/include/llvm/<wbr>Target/<wbr>TargetLoweringObjectFile.h:63:<wbr>40: runtime error: reference binding to null pointer of type 'llvm::Mangler'
    #0 0xffac44 in llvm::<wbr>TargetLoweringObjectFile::<wbr>getMangler() const /mnt/b/sanitizer-buildbot3/<wbr>sanitizer-x86_64-linux-fast/<wbr>build/llvm/include/llvm/<wbr>Target/<wbr>TargetLoweringObjectFile.h:63:<wbr>33
    #1 0x232ae80 in llvm::<wbr>TargetLoweringObjectFileCOFF::<wbr>emitLinkerFlagsForGlobal(llvm:<wbr>:raw_ostream&, llvm::GlobalValue const*) const /mnt/b/sanitizer-buildbot3/<wbr>sanitizer-x86_64-linux-fast/<wbr>build/llvm/lib/CodeGen/<wbr>TargetLoweringObjectFileImpl.<wbr>cpp:1156:59
    #2 0x18a63a5 in llvm::LTOModule::<wbr>parseMetadata() /mnt/b/sanitizer-buildbot3/<wbr>sanitizer-x86_64-linux-fast/<wbr>build/llvm/lib/LTO/LTOModule.<wbr>cpp:654:36</span></pre></div><div>please fix or revert ASAP. </div><div><br></div><div>--kcc </div><div><br></div><div><br></div><div><br></div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Feb 2, 2017 at 3:00 PM, Bob Haarman via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: inglorion<br>
Date: Thu Feb  2 17:00:49 2017<br>
New Revision: 293950<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=293950&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject?rev=293950&view=rev</a><br>
Log:<br>
[lto] add getLinkerOpts()<br>
<br>
Summary: Some compilers, including MSVC and Clang, allow linker options to be specified in source files. In the legacy LTO API, there is a getLinkerOpts() method that returns linker options for the bitcode module being processed. This change adds that method to the new API, so that the COFF linker can get the right linker options when using the new LTO API.<br>
<br>
Reviewers: pcc, ruiu, mehdi_amini, tejohnson<br>
<br>
Reviewed By: pcc<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D29207" rel="noreferrer" target="_blank">https://reviews.llvm.org/D2920<wbr>7</a><br>
<br>
<br>
Modified:<br>
    llvm/trunk/include/llvm/CodeGe<wbr>n/TargetLoweringObjectFileImpl<wbr>.h<br>
    llvm/trunk/include/llvm/LTO/LT<wbr>O.h<br>
    llvm/trunk/lib/CodeGen/TargetL<wbr>oweringObjectFileImpl.cpp<br>
    llvm/trunk/lib/LTO/LTO.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/CodeGe<wbr>n/TargetLoweringObjectFileImpl<wbr>.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h?rev=293950&r1=293949&r2=293950&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/include/llvm/<wbr>CodeGen/TargetLoweringObjectFi<wbr>leImpl.h?rev=293950&r1=293949&<wbr>r2=293950&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/CodeGe<wbr>n/TargetLoweringObjectFileImpl<wbr>.h (original)<br>
+++ llvm/trunk/include/llvm/CodeGe<wbr>n/TargetLoweringObjectFileImpl<wbr>.h Thu Feb  2 17:00:49 2017<br>
@@ -171,6 +171,9 @@ public:<br>
                                 const GlobalValue *GV) const override;<br>
 };<br>
<br>
+void emitLinkerFlagsForGlobalCOFF(r<wbr>aw_ostream &OS, const GlobalValue *GV,<br>
+                                  const Triple &TT, Mangler &Mangler);<br>
+<br>
 } // end namespace llvm<br>
<br>
 #endif<br>
<br>
Modified: llvm/trunk/include/llvm/LTO/LT<wbr>O.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/LTO/LTO.h?rev=293950&r1=293949&r2=293950&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/include/llvm/<wbr>LTO/LTO.h?rev=293950&r1=293949<wbr>&r2=293950&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/LTO/LT<wbr>O.h (original)<br>
+++ llvm/trunk/include/llvm/LTO/LT<wbr>O.h Thu Feb  2 17:00:49 2017<br>
@@ -25,6 +25,7 @@<br>
 #include "llvm/LTO/Config.h"<br>
 #include "llvm/Linker/IRMover.h"<br>
 #include "llvm/Object/IRObjectFile.h"<br>
+#include "llvm/Support/Error.h"<br>
 #include "llvm/Support/thread.h"<br>
 #include "llvm/Target/TargetOptions.h"<br>
 #include "llvm/Transforms/IPO/FunctionI<wbr>mport.h"<br>
@@ -226,6 +227,9 @@ public:<br>
         symbol_iterator(SymTab.symbol<wbr>s().end(), SymTab, this));<br>
   }<br>
<br>
+  /// Returns linker options specified in the input file.<br>
+  Expected<std::string> getLinkerOpts();<br>
+<br>
   /// Returns the path to the InputFile.<br>
   StringRef getName() const;<br>
<br>
<br>
Modified: llvm/trunk/lib/CodeGen/TargetL<wbr>oweringObjectFileImpl.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp?rev=293950&r1=293949&r2=293950&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/lib/CodeGen/T<wbr>argetLoweringObjectFileImpl.cp<wbr>p?rev=293950&r1=293949&r2=2939<wbr>50&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/CodeGen/TargetL<wbr>oweringObjectFileImpl.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/TargetL<wbr>oweringObjectFileImpl.cpp Thu Feb  2 17:00:49 2017<br>
@@ -919,6 +919,37 @@ static int getSelectionForCOFF(const Glo<br>
   return 0;<br>
 }<br>
<br>
+void llvm::emitLinkerFlagsForGlobal<wbr>COFF(raw_ostream &OS, const GlobalValue *GV,<br>
+                                        const Triple &TT, Mangler &Mangler) {<br>
+  if (!GV->hasDLLExportStorageClass<wbr>() || GV->isDeclaration())<br>
+    return;<br>
+<br>
+  if (TT.isKnownWindowsMSVCEnvironm<wbr>ent())<br>
+    OS << " /EXPORT:";<br>
+  else<br>
+    OS << " -export:";<br>
+<br>
+  if (TT.isWindowsGNUEnvironment() || TT.isWindowsCygwinEnvironment(<wbr>)) {<br>
+    std::string Flag;<br>
+    raw_string_ostream FlagOS(Flag);<br>
+    Mangler.getNameWithPrefix(Flag<wbr>OS, GV, false);<br>
+    FlagOS.flush();<br>
+    if (Flag[0] == GV->getParent()->getDataLayout<wbr>().getGlobalPrefix())<br>
+      OS << Flag.substr(1);<br>
+    else<br>
+      OS << Flag;<br>
+  } else {<br>
+    Mangler.getNameWithPrefix(OS, GV, false);<br>
+  }<br>
+<br>
+  if (!GV->getValueType()->isFuncti<wbr>onTy()) {<br>
+    if (TT.isKnownWindowsMSVCEnvironm<wbr>ent())<br>
+      OS << ",DATA";<br>
+    else<br>
+      OS << ",data";<br>
+  }<br>
+}<br>
+<br>
 MCSection *TargetLoweringObjectFileCOFF:<wbr>:getExplicitSectionGlobal(<br>
     const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {<br>
   int Selection = 0;<br>
@@ -1122,33 +1153,5 @@ MCSection *TargetLoweringObjectFileCOFF:<br>
<br>
 void TargetLoweringObjectFileCOFF::<wbr>emitLinkerFlagsForGlobal(<br>
     raw_ostream &OS, const GlobalValue *GV) const {<br>
-  if (!GV->hasDLLExportStorageClass<wbr>() || GV->isDeclaration())<br>
-    return;<br>
-<br>
-  const Triple &TT = getTargetTriple();<br>
-<br>
-  if (TT.isKnownWindowsMSVCEnvironm<wbr>ent())<br>
-    OS << " /EXPORT:";<br>
-  else<br>
-    OS << " -export:";<br>
-<br>
-  if (TT.isWindowsGNUEnvironment() || TT.isWindowsCygwinEnvironment(<wbr>)) {<br>
-    std::string Flag;<br>
-    raw_string_ostream FlagOS(Flag);<br>
-    getMangler().getNameWithPrefix<wbr>(FlagOS, GV, false);<br>
-    FlagOS.flush();<br>
-    if (Flag[0] == GV->getParent()->getDataLayout<wbr>().getGlobalPrefix())<br>
-      OS << Flag.substr(1);<br>
-    else<br>
-      OS << Flag;<br>
-  } else {<br>
-    getMangler().getNameWithPrefix<wbr>(OS, GV, false);<br>
-  }<br>
-<br>
-  if (!GV->getValueType()->isFuncti<wbr>onTy()) {<br>
-    if (TT.isKnownWindowsMSVCEnvironm<wbr>ent())<br>
-      OS << ",DATA";<br>
-    else<br>
-      OS << ",data";<br>
-  }<br>
+  emitLinkerFlagsForGlobalCOFF(O<wbr>S, GV, getTargetTriple(), getMangler());<br>
 }<br>
<br>
Modified: llvm/trunk/lib/LTO/LTO.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/LTO/LTO.cpp?rev=293950&r1=293949&r2=293950&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/lib/LTO/LTO.<wbr>cpp?rev=293950&r1=293949&r2=<wbr>293950&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/LTO/LTO.cpp (original)<br>
+++ llvm/trunk/lib/LTO/LTO.cpp Thu Feb  2 17:00:49 2017<br>
@@ -17,12 +17,16 @@<br>
 #include "llvm/Bitcode/BitcodeReader.h"<br>
 #include "llvm/Bitcode/BitcodeWriter.h"<br>
 #include "llvm/CodeGen/Analysis.h"<br>
+#include "llvm/CodeGen/TargetLoweringOb<wbr>jectFileImpl.h"<br>
 #include "llvm/IR/AutoUpgrade.h"<br>
 #include "llvm/IR/DiagnosticPrinter.h"<br>
 #include "llvm/IR/LegacyPassManager.h"<br>
+#include "llvm/IR/Mangler.h"<br>
+#include "llvm/IR/Metadata.h"<br>
 #include "llvm/LTO/LTOBackend.h"<br>
 #include "llvm/Linker/IRMover.h"<br>
 #include "llvm/Object/ModuleSummaryInde<wbr>xObjectFile.h"<br>
+#include "llvm/Support/Error.h"<br>
 #include "llvm/Support/ManagedStatic.h"<br>
 #include "llvm/Support/MemoryBuffer.h"<br>
 #include "llvm/Support/Path.h"<br>
@@ -291,6 +295,32 @@ Expected<int> InputFile::Symbol::getComd<br>
   return -1;<br>
 }<br>
<br>
+Expected<std::string> InputFile::getLinkerOpts() {<br>
+  std::string LinkerOpts;<br>
+  raw_string_ostream LOS(LinkerOpts);<br>
+  // Extract linker options from module metadata.<br>
+  for (InputModule &Mod : Mods) {<br>
+    std::unique_ptr<Module> &M = Mod.Mod;<br>
+    if (auto E = M->materializeMetadata())<br>
+      return std::move(E);<br>
+    if (Metadata *Val = M->getModuleFlag("Linker Options")) {<br>
+      MDNode *LinkerOptions = cast<MDNode>(Val);<br>
+      for (const MDOperand &MDOptions : LinkerOptions->operands())<br>
+        for (const MDOperand &MDOption : cast<MDNode>(MDOptions)->opera<wbr>nds())<br>
+          LOS << " " << cast<MDString>(MDOption)->getS<wbr>tring();<br>
+    }<br>
+  }<br>
+<br>
+  // Synthesize export flags for symbols with dllexport storage.<br>
+  const Triple TT(Mods[0].Mod->getTargetTripl<wbr>e());<br>
+  Mangler M;<br>
+  for (const ModuleSymbolTable::Symbol &Sym : SymTab.symbols())<br>
+    if (auto *GV = Sym.dyn_cast<GlobalValue*>())<br>
+      emitLinkerFlagsForGlobalCOFF(L<wbr>OS, GV, TT, M);<br>
+  LOS.flush();<br>
+  return LinkerOpts;<br>
+}<br>
+<br>
 StringRef InputFile::getName() const {<br>
   return Mods[0].BM.getModuleIdentifier<wbr>();<br>
 }<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div>