[lld] r370654 - [LLD] [COFF] Demangle itanium symbols in mingw mode

Martin Storsjo via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 2 06:25:46 PDT 2019


Author: mstorsjo
Date: Mon Sep  2 06:25:46 2019
New Revision: 370654

URL: http://llvm.org/viewvc/llvm-project?rev=370654&view=rev
Log:
[LLD] [COFF] Demangle itanium symbols in mingw mode

Differential Revision: https://reviews.llvm.org/D67051

Added:
    lld/trunk/test/COFF/undefined-symbol-itanium-i386.s
    lld/trunk/test/COFF/undefined-symbol-itanium.s
Modified:
    lld/trunk/COFF/Symbols.cpp

Modified: lld/trunk/COFF/Symbols.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Symbols.cpp?rev=370654&r1=370653&r2=370654&view=diff
==============================================================================
--- lld/trunk/COFF/Symbols.cpp (original)
+++ lld/trunk/COFF/Symbols.cpp Mon Sep  2 06:25:46 2019
@@ -27,9 +27,20 @@ static_assert(sizeof(SymbolUnion) <= 48,
 
 // Returns a symbol name for an error message.
 static std::string demangle(StringRef symName) {
-  if (config->demangle)
+  if (config->demangle) {
     if (Optional<std::string> s = demangleMSVC(symName))
       return *s;
+    if (config->mingw) {
+      StringRef demangleInput = symName;
+      std::string prefix;
+      if (demangleInput.consume_front("__imp_"))
+        prefix = "__declspec(dllimport) ";
+      if (config->machine == I386)
+        demangleInput.consume_front("_");
+      if (Optional<std::string> s = demangleItanium(demangleInput))
+        return prefix + *s;
+    }
+  }
   return symName;
 }
 std::string toString(coff::Symbol &b) { return demangle(b.getName()); }

Added: lld/trunk/test/COFF/undefined-symbol-itanium-i386.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/undefined-symbol-itanium-i386.s?rev=370654&view=auto
==============================================================================
--- lld/trunk/test/COFF/undefined-symbol-itanium-i386.s (added)
+++ lld/trunk/test/COFF/undefined-symbol-itanium-i386.s Mon Sep  2 06:25:46 2019
@@ -0,0 +1,36 @@
+# REQUIRES: x86
+# RUN: llvm-mc -triple=i386-windows-gnu -filetype=obj -o %t.o %s
+# RUN: not lld-link /lldmingw /out:%t.exe %t.o 2>&1 | FileCheck %s
+# RUN: not lld-link /lldmingw /out:%t.exe /demangle %t.o 2>&1 | FileCheck %s
+# RUN: not lld-link /lldmingw /out:%t.exe /demangle:no %t.o 2>&1 | FileCheck --check-prefix=NODEMANGLE %s
+
+# NODEMANGLE: error: undefined symbol: __Z3fooi
+# NODEMANGLE: error: undefined symbol: __Z3barPKc
+# NODEMANGLE: error: undefined symbol: __imp___Z3bazv
+
+# CHECK: error: undefined symbol: foo(int)
+# CHECK-NEXT: >>> referenced by {{.*}}.o:(_main)
+# CHECK-NEXT: >>> referenced by {{.*}}.o:(_main)
+# CHECK-EMPTY:
+# CHECK-NEXT: error: undefined symbol: bar(char const*)
+# CHECK-NEXT: >>> referenced by {{.*}}.o:(_main)
+# CHECK-NEXT: >>> referenced by {{.*}}.o:(_f1)
+# CHECK-EMPTY:
+# CHECK-NEXT: error: undefined symbol: __declspec(dllimport) baz()
+# CHECK-NEXT: >>> referenced by {{.*}}.o:(_f2)
+
+        .section        .text,"xr",one_only,_main
+.globl _main
+_main:
+	call	__Z3fooi
+	call	__Z3fooi
+	call	__Z3barPKc
+
+_f1:
+	call	__Z3barPKc
+.Lfunc_end1:
+
+        .section        .text,"xr",one_only,_f2
+.globl _f2
+_f2:
+	call	*__imp___Z3bazv

Added: lld/trunk/test/COFF/undefined-symbol-itanium.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/undefined-symbol-itanium.s?rev=370654&view=auto
==============================================================================
--- lld/trunk/test/COFF/undefined-symbol-itanium.s (added)
+++ lld/trunk/test/COFF/undefined-symbol-itanium.s Mon Sep  2 06:25:46 2019
@@ -0,0 +1,36 @@
+# REQUIRES: x86
+# RUN: llvm-mc -triple=x86_64-windows-gnu -filetype=obj -o %t.o %s
+# RUN: not lld-link /lldmingw /out:%t.exe %t.o 2>&1 | FileCheck %s
+# RUN: not lld-link /lldmingw /out:%t.exe /demangle %t.o 2>&1 | FileCheck %s
+# RUN: not lld-link /lldmingw /out:%t.exe /demangle:no %t.o 2>&1 | FileCheck --check-prefix=NODEMANGLE %s
+
+# NODEMANGLE: error: undefined symbol: _Z3fooi
+# NODEMANGLE: error: undefined symbol: _Z3barPKc
+# NODEMANGLE: error: undefined symbol: __imp__Z3bazv
+
+# CHECK: error: undefined symbol: foo(int)
+# CHECK-NEXT: >>> referenced by {{.*}}.o:(main)
+# CHECK-NEXT: >>> referenced by {{.*}}.o:(main)
+# CHECK-EMPTY:
+# CHECK-NEXT: error: undefined symbol: bar(char const*)
+# CHECK-NEXT: >>> referenced by {{.*}}.o:(main)
+# CHECK-NEXT: >>> referenced by {{.*}}.o:(f1)
+# CHECK-EMPTY:
+# CHECK-NEXT: error: undefined symbol: __declspec(dllimport) baz()
+# CHECK-NEXT: >>> referenced by {{.*}}.o:(f2)
+
+        .section        .text,"xr",one_only,main
+.globl main
+main:
+	call	_Z3fooi
+	call	_Z3fooi
+	call	_Z3barPKc
+
+f1:
+	call	_Z3barPKc
+.Lfunc_end1:
+
+        .section        .text,"xr",one_only,f2
+.globl f2
+f2:
+	callq	*__imp__Z3bazv(%rip)




More information about the llvm-commits mailing list