[lld] r342401 - lld-link: Also demangle undefined dllimported symbols.

Nico Weber via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 17 09:31:20 PDT 2018


Author: nico
Date: Mon Sep 17 09:31:20 2018
New Revision: 342401

URL: http://llvm.org/viewvc/llvm-project?rev=342401&view=rev
Log:
lld-link: Also demangle undefined dllimported symbols.

dllimported symbols go through an import stub that's called __imp_ followed by
the name the stub points to. Make that work.

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

Modified:
    lld/trunk/Common/Strings.cpp
    lld/trunk/test/COFF/undefined-symbol.s

Modified: lld/trunk/Common/Strings.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/Common/Strings.cpp?rev=342401&r1=342400&r2=342401&view=diff
==============================================================================
--- lld/trunk/Common/Strings.cpp (original)
+++ lld/trunk/Common/Strings.cpp Mon Sep 17 09:31:20 2018
@@ -38,14 +38,20 @@ Optional<std::string> lld::demangleItani
 }
 
 Optional<std::string> lld::demangleMSVC(StringRef Name) {
+  std::string Prefix;
+  if (Name.consume_front("__imp_"))
+    Prefix = "__declspec(dllimport) ";
+
+  // Demangle only C++ names.
   if (!Name.startswith("?"))
     return None;
+
   char *Buf = microsoftDemangle(Name.str().c_str(), nullptr, nullptr, nullptr);
   if (!Buf)
     return None;
   std::string S(Buf);
   free(Buf);
-  return S;
+  return Prefix + S;
 }
 
 StringMatcher::StringMatcher(ArrayRef<StringRef> Pat) {

Modified: lld/trunk/test/COFF/undefined-symbol.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/undefined-symbol.s?rev=342401&r1=342400&r2=342401&view=diff
==============================================================================
--- lld/trunk/test/COFF/undefined-symbol.s (original)
+++ lld/trunk/test/COFF/undefined-symbol.s Mon Sep 17 09:31:20 2018
@@ -10,7 +10,7 @@
 # CHECK-NEXT: >>> referenced by {{.*}}.obj:(main)
 # CHECK-NEXT: >>> referenced by {{.*}}.obj:(f1)
 # CHECK-EMPTY:
-# CHECK-NEXT: error: undefined symbol: "int __cdecl baz(void)" (?baz@@YAHXZ)
+# CHECK-NEXT: error: undefined symbol: "__declspec(dllimport) int __cdecl baz(void)" (__imp_?baz@@YAHXZ)
 # CHECK-NEXT: >>> referenced by {{.*}}.obj:(f2)
 
         .section        .text,"xr",one_only,main
@@ -27,4 +27,4 @@ f1:
         .section        .text,"xr",one_only,f2
 .globl f2
 f2:
-	call	"?baz@@YAHXZ"
+	callq	*"__imp_?baz@@YAHXZ"(%rip)




More information about the llvm-commits mailing list