summaryrefslogtreecommitdiffstats
path: root/lld/COFF/SymbolTable.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lld/COFF/SymbolTable.cpp')
-rw-r--r--lld/COFF/SymbolTable.cpp14
1 files changed, 12 insertions, 2 deletions
diff --git a/lld/COFF/SymbolTable.cpp b/lld/COFF/SymbolTable.cpp
index 40fbea91cdc..3b3004c6897 100644
--- a/lld/COFF/SymbolTable.cpp
+++ b/lld/COFF/SymbolTable.cpp
@@ -351,10 +351,18 @@ StringRef SymbolTable::findMangle(StringRef Name) {
return findByPrefix(("?" + Name + "@@Y").str());
if (!Name.startswith("_"))
return "";
- // Search for x86 C function.
+ // Search for x86 stdcall function.
StringRef S = findByPrefix((Name + "@").str());
if (!S.empty())
return S;
+ // Search for x86 fastcall function.
+ S = findByPrefix(("@" + Name.substr(1) + "@").str());
+ if (!S.empty())
+ return S;
+ // Search for x86 vectorcall function.
+ S = findByPrefix((Name.substr(1) + "@@").str());
+ if (!S.empty())
+ return S;
// Search for x86 C++ non-member function.
return findByPrefix(("?" + Name.substr(1) + "@@Y").str());
}
@@ -364,8 +372,10 @@ void SymbolTable::mangleMaybe(SymbolBody *B) {
if (!U || U->WeakAlias)
return;
StringRef Alias = findMangle(U->getName());
- if (!Alias.empty())
+ if (!Alias.empty()) {
+ log(U->getName() + " aliased to " + Alias);
U->WeakAlias = addUndefined(Alias);
+ }
}
SymbolBody *SymbolTable::addUndefined(StringRef Name) {
OpenPOWER on IntegriCloud