[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