<div dir="ltr">On Tue, May 6, 2014 at 11:14 AM, Reid Kleckner <span dir="ltr"><<a href="mailto:rnk@google.com" target="_blank">rnk@google.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div dir="ltr">Is there a binutils bug for this?  It's fine if they close wontfix, but at least then we'd have some record of communication about this issue.</div></blockquote><div><br></div><div>I spoke with Kai Tietz about this over IRC.  It seems that they agree that this is broken (I think that this can even result in incorrect exports in contrived cases), but he maintained that the compatibility was important.  I can file a bug if you like.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class=""><div class="h5"><div class="gmail_extra">
<div class="gmail_quote">
On Sat, May 3, 2014 at 5:03 PM, Saleem Abdulrasool <span dir="ltr"><<a href="mailto:compnerd@compnerd.org" target="_blank">compnerd@compnerd.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

Author: compnerd<br>
Date: Sat May  3 19:03:48 2014<br>
New Revision: 207926<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=207926&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=207926&view=rev</a><br>
Log:<br>
X86: repair export compatibility with MinGW/cygwin<br>
<br>
Both MinGW and cygwin (i686) construct export directives without the global<br>
leader prefix.  This is mostly due to the fact that they use GNU ld which does<br>
not correctly handle the export directive.  This apparently has been been broken<br>
for a while.  However, this was recently reported as being broken by<br>
mingwandroid and diorcety of the msys2 project.<br>
<br>
Remove the global leader prefix if targeting MinGW or cygwin, otherwise, retain<br>
the global leader prefix.  Add an explicit test for cygwin's behaviour of export<br>
directives.<br>
<br>
Modified:<br>
    llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp<br>
    llvm/trunk/test/CodeGen/X86/dllexport.ll<br>
<br>
Modified: llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp?rev=207926&r1=207925&r2=207926&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp?rev=207926&r1=207925&r2=207926&view=diff</a><br>


==============================================================================<br>
--- llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp (original)<br>
+++ llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp Sat May  3 19:03:48 2014<br>
@@ -553,13 +553,18 @@ emitNonLazySymbolPointer(MCStreamer &Out<br>
 void X86AsmPrinter::GenerateExportDirective(const MCSymbol *Sym, bool IsData) {<br>
   SmallString<128> Directive;<br>
   raw_svector_ostream OS(Directive);<br>
+  StringRef Name = Sym->getName();<br>
<br>
   if (Subtarget->isTargetKnownWindowsMSVC())<br>
     OS << " /EXPORT:";<br>
   else<br>
     OS << " -export:";<br>
<br>
-  OS << Sym->getName();<br>
+  if ((Subtarget->isTargetWindowsGNU() || Subtarget->isTargetWindowsCygwin()) &&<br>
+      (Name[0] == getDataLayout().getGlobalPrefix()))<br>
+    Name = Name.drop_front();<br>
+<br>
+  OS << Name;<br>
<br>
   if (IsData) {<br>
     if (Subtarget->isTargetKnownWindowsMSVC())<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/dllexport.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/dllexport.ll?rev=207926&r1=207925&r2=207926&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/dllexport.ll?rev=207926&r1=207925&r2=207926&view=diff</a><br>


==============================================================================<br>
--- llvm/trunk/test/CodeGen/X86/dllexport.ll (original)<br>
+++ llvm/trunk/test/CodeGen/X86/dllexport.ll Sat May  3 19:03:48 2014<br>
@@ -1,5 +1,9 @@<br>
-; RUN: llc -mtriple i386-pc-win32 < %s | FileCheck -check-prefix=CHECK -check-prefix=WIN32 %s<br>
-; RUN: llc -mtriple i386-pc-mingw32 < %s | FileCheck -check-prefix=CHECK -check-prefix=MINGW %s<br>
+; RUN: llc -mtriple i386-pc-win32 < %s \<br>
+; RUN:    | FileCheck -check-prefix CHECK -check-prefix CHECK-CL %s<br>
+; RUN: llc -mtriple i386-pc-mingw32 < %s \<br>
+; RUN:    | FileCheck -check-prefix CHECK -check-prefix CHECK-GCC %s<br>
+; RUN: llc -mtriple i686-pc-cygwin %s -o - \<br>
+; RUN:    | FileCheck -check-prefix CHECK -check-prefix CHECK-GCC %s<br>
<br>
 ; CHECK: .text<br>
<br>
@@ -89,37 +93,38 @@ define weak_odr dllexport void @weak1()<br>
<br>
<br>
 ; CHECK: .section .drectve<br>
-; WIN32: /EXPORT:_Var1,DATA<br>
-; WIN32: /EXPORT:_Var2,DATA<br>
-; WIN32: /EXPORT:_Var3,DATA<br>
-; WIN32: /EXPORT:_WeakVar1,DATA<br>
-; WIN32: /EXPORT:_WeakVar2,DATA<br>
-; WIN32: /EXPORT:_f1<br>
-; WIN32: /EXPORT:_f2<br>
-; WIN32: /EXPORT:_stdfun@0<br>
-; WIN32: /EXPORT:@fastfun@0<br>
-; WIN32: /EXPORT:_thisfun<br>
-; WIN32: /EXPORT:_lnk1<br>
-; WIN32: /EXPORT:_lnk2<br>
-; WIN32: /EXPORT:_weak1<br>
-; WIN32: /EXPORT:_alias<br>
-; WIN32: /EXPORT:_alias2<br>
-; WIN32: /EXPORT:_alias3<br>
-; WIN32: /EXPORT:_weak_alias<br>
-; MINGW: -export:_Var1,data<br>
-; MINGW: -export:_Var2,data<br>
-; MINGW: -export:_Var3,data<br>
-; MINGW: -export:_WeakVar1,data<br>
-; MINGW: -export:_WeakVar2,data<br>
-; MINGW: -export:_f1<br>
-; MINGW: -export:_f2<br>
-; MINGW: -export:_stdfun@0<br>
-; MINGW: -export:@fastfun@0<br>
-; MINGW: -export:_thisfun<br>
-; MINGW: -export:_lnk1<br>
-; MINGW: -export:_lnk2<br>
-; MINGW: -export:_weak1<br>
-; MINGW: -export:_alias<br>
-; MINGW: -export:_alias2<br>
-; MINGW: -export:_alias3<br>
-; MINGW: -export:_weak_alias<br>
+; CHECK-CL: /EXPORT:_Var1,DATA<br>
+; CHECK-CL: /EXPORT:_Var2,DATA<br>
+; CHECK-CL: /EXPORT:_Var3,DATA<br>
+; CHECK-CL: /EXPORT:_WeakVar1,DATA<br>
+; CHECK-CL: /EXPORT:_WeakVar2,DATA<br>
+; CHECK-CL: /EXPORT:_f1<br>
+; CHECK-CL: /EXPORT:_f2<br>
+; CHECK-CL: /EXPORT:_stdfun@0<br>
+; CHECK-CL: /EXPORT:@fastfun@0<br>
+; CHECK-CL: /EXPORT:_thisfun<br>
+; CHECK-CL: /EXPORT:_lnk1<br>
+; CHECK-CL: /EXPORT:_lnk2<br>
+; CHECK-CL: /EXPORT:_weak1<br>
+; CHECK-CL: /EXPORT:_alias<br>
+; CHECK-CL: /EXPORT:_alias2<br>
+; CHECK-CL: /EXPORT:_alias3<br>
+; CHECK-CL: /EXPORT:_weak_alias<br>
+; CHECK-GCC: -export:Var1,data<br>
+; CHECK-GCC: -export:Var2,data<br>
+; CHECK-GCC: -export:Var3,data<br>
+; CHECK-GCC: -export:WeakVar1,data<br>
+; CHECK-GCC: -export:WeakVar2,data<br>
+; CHECK-GCC: -export:f1<br>
+; CHECK-GCC: -export:f2<br>
+; CHECK-GCC: -export:stdfun@0<br>
+; CHECK-GCC: -export:@fastfun@0<br>
+; CHECK-GCC: -export:thisfun<br>
+; CHECK-GCC: -export:lnk1<br>
+; CHECK-GCC: -export:lnk2<br>
+; CHECK-GCC: -export:weak1<br>
+; CHECK-GCC: -export:alias<br>
+; CHECK-GCC: -export:alias2<br>
+; CHECK-GCC: -export:alias3<br>
+; CHECK-GCC: -export:weak_alias<br>
+<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">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></div></blockquote></div><br><br clear="all"><div><br></div>-- <br>Saleem Abdulrasool<br>compnerd (at) compnerd (dot) org
</div></div>