[llvm] r207926 - X86: repair export compatibility with MinGW/cygwin

Reid Kleckner rnk at google.com
Tue May 6 11:14:26 PDT 2014


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.


On Sat, May 3, 2014 at 5:03 PM, Saleem Abdulrasool <compnerd at compnerd.org>wrote:

> Author: compnerd
> Date: Sat May  3 19:03:48 2014
> New Revision: 207926
>
> URL: http://llvm.org/viewvc/llvm-project?rev=207926&view=rev
> Log:
> X86: repair export compatibility with MinGW/cygwin
>
> Both MinGW and cygwin (i686) construct export directives without the global
> leader prefix.  This is mostly due to the fact that they use GNU ld which
> does
> not correctly handle the export directive.  This apparently has been been
> broken
> for a while.  However, this was recently reported as being broken by
> mingwandroid and diorcety of the msys2 project.
>
> Remove the global leader prefix if targeting MinGW or cygwin, otherwise,
> retain
> the global leader prefix.  Add an explicit test for cygwin's behaviour of
> export
> directives.
>
> Modified:
>     llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp
>     llvm/trunk/test/CodeGen/X86/dllexport.ll
>
> Modified: llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp?rev=207926&r1=207925&r2=207926&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp Sat May  3 19:03:48 2014
> @@ -553,13 +553,18 @@ emitNonLazySymbolPointer(MCStreamer &Out
>  void X86AsmPrinter::GenerateExportDirective(const MCSymbol *Sym, bool
> IsData) {
>    SmallString<128> Directive;
>    raw_svector_ostream OS(Directive);
> +  StringRef Name = Sym->getName();
>
>    if (Subtarget->isTargetKnownWindowsMSVC())
>      OS << " /EXPORT:";
>    else
>      OS << " -export:";
>
> -  OS << Sym->getName();
> +  if ((Subtarget->isTargetWindowsGNU() ||
> Subtarget->isTargetWindowsCygwin()) &&
> +      (Name[0] == getDataLayout().getGlobalPrefix()))
> +    Name = Name.drop_front();
> +
> +  OS << Name;
>
>    if (IsData) {
>      if (Subtarget->isTargetKnownWindowsMSVC())
>
> Modified: llvm/trunk/test/CodeGen/X86/dllexport.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/dllexport.ll?rev=207926&r1=207925&r2=207926&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/dllexport.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/dllexport.ll Sat May  3 19:03:48 2014
> @@ -1,5 +1,9 @@
> -; RUN: llc -mtriple i386-pc-win32 < %s | FileCheck -check-prefix=CHECK
> -check-prefix=WIN32 %s
> -; RUN: llc -mtriple i386-pc-mingw32 < %s | FileCheck -check-prefix=CHECK
> -check-prefix=MINGW %s
> +; RUN: llc -mtriple i386-pc-win32 < %s \
> +; RUN:    | FileCheck -check-prefix CHECK -check-prefix CHECK-CL %s
> +; RUN: llc -mtriple i386-pc-mingw32 < %s \
> +; RUN:    | FileCheck -check-prefix CHECK -check-prefix CHECK-GCC %s
> +; RUN: llc -mtriple i686-pc-cygwin %s -o - \
> +; RUN:    | FileCheck -check-prefix CHECK -check-prefix CHECK-GCC %s
>
>  ; CHECK: .text
>
> @@ -89,37 +93,38 @@ define weak_odr dllexport void @weak1()
>
>
>  ; CHECK: .section .drectve
> -; WIN32: /EXPORT:_Var1,DATA
> -; WIN32: /EXPORT:_Var2,DATA
> -; WIN32: /EXPORT:_Var3,DATA
> -; WIN32: /EXPORT:_WeakVar1,DATA
> -; WIN32: /EXPORT:_WeakVar2,DATA
> -; WIN32: /EXPORT:_f1
> -; WIN32: /EXPORT:_f2
> -; WIN32: /EXPORT:_stdfun at 0
> -; WIN32: /EXPORT:@fastfun at 0
> -; WIN32: /EXPORT:_thisfun
> -; WIN32: /EXPORT:_lnk1
> -; WIN32: /EXPORT:_lnk2
> -; WIN32: /EXPORT:_weak1
> -; WIN32: /EXPORT:_alias
> -; WIN32: /EXPORT:_alias2
> -; WIN32: /EXPORT:_alias3
> -; WIN32: /EXPORT:_weak_alias
> -; MINGW: -export:_Var1,data
> -; MINGW: -export:_Var2,data
> -; MINGW: -export:_Var3,data
> -; MINGW: -export:_WeakVar1,data
> -; MINGW: -export:_WeakVar2,data
> -; MINGW: -export:_f1
> -; MINGW: -export:_f2
> -; MINGW: -export:_stdfun at 0
> -; MINGW: -export:@fastfun at 0
> -; MINGW: -export:_thisfun
> -; MINGW: -export:_lnk1
> -; MINGW: -export:_lnk2
> -; MINGW: -export:_weak1
> -; MINGW: -export:_alias
> -; MINGW: -export:_alias2
> -; MINGW: -export:_alias3
> -; MINGW: -export:_weak_alias
> +; CHECK-CL: /EXPORT:_Var1,DATA
> +; CHECK-CL: /EXPORT:_Var2,DATA
> +; CHECK-CL: /EXPORT:_Var3,DATA
> +; CHECK-CL: /EXPORT:_WeakVar1,DATA
> +; CHECK-CL: /EXPORT:_WeakVar2,DATA
> +; CHECK-CL: /EXPORT:_f1
> +; CHECK-CL: /EXPORT:_f2
> +; CHECK-CL: /EXPORT:_stdfun at 0
> +; CHECK-CL: /EXPORT:@fastfun at 0
> +; CHECK-CL: /EXPORT:_thisfun
> +; CHECK-CL: /EXPORT:_lnk1
> +; CHECK-CL: /EXPORT:_lnk2
> +; CHECK-CL: /EXPORT:_weak1
> +; CHECK-CL: /EXPORT:_alias
> +; CHECK-CL: /EXPORT:_alias2
> +; CHECK-CL: /EXPORT:_alias3
> +; CHECK-CL: /EXPORT:_weak_alias
> +; CHECK-GCC: -export:Var1,data
> +; CHECK-GCC: -export:Var2,data
> +; CHECK-GCC: -export:Var3,data
> +; CHECK-GCC: -export:WeakVar1,data
> +; CHECK-GCC: -export:WeakVar2,data
> +; CHECK-GCC: -export:f1
> +; CHECK-GCC: -export:f2
> +; CHECK-GCC: -export:stdfun at 0
> +; CHECK-GCC: -export:@fastfun at 0
> +; CHECK-GCC: -export:thisfun
> +; CHECK-GCC: -export:lnk1
> +; CHECK-GCC: -export:lnk2
> +; CHECK-GCC: -export:weak1
> +; CHECK-GCC: -export:alias
> +; CHECK-GCC: -export:alias2
> +; CHECK-GCC: -export:alias3
> +; CHECK-GCC: -export:weak_alias
> +
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140506/e3d9a1f0/attachment.html>


More information about the llvm-commits mailing list