Fix fastcall mangling of dllimported symbols

fastcall requires @ as global prefix instead of _ but getNameWithPrefix
wrongly assumes the OutName buffer is empty and replaces at index 0.
For imported functions this buffer is pre-filled with "__imp_" resulting
in broken "@_imp_foo@0" mangling.

Instead replace at the proper index. We also never have to prepend the
@-prefix because this fastcall mangling is only used on 32-bit Windows
targets which have _ has global prefix.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@199203 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Nico Rieck 2014-01-14 11:53:26 +00:00
parent d13b9da1b6
commit 1b1321f080

View File

@ -81,7 +81,9 @@ void Mangler::getNameWithPrefix(SmallVectorImpl<char> &OutName,
PrefixTy = Mangler::Private;
else if (GV->hasLinkerPrivateLinkage() || GV->hasLinkerPrivateWeakLinkage())
PrefixTy = Mangler::LinkerPrivate;
size_t NameBegin = OutName.size();
// If this global has a name, handle it simply.
if (GV->hasName()) {
StringRef Name = GV->getName();
@ -106,13 +108,10 @@ void Mangler::getNameWithPrefix(SmallVectorImpl<char> &OutName,
if (const Function *F = dyn_cast<Function>(GV)) {
CallingConv::ID CC = F->getCallingConv();
// fastcall functions need to start with @.
// FIXME: This logic seems unlikely to be right.
// fastcall functions need to start with @ instead of _.
if (CC == CallingConv::X86_FastCall) {
if (OutName[0] == '_')
OutName[0] = '@';
else
OutName.insert(OutName.begin(), '@');
assert(OutName[NameBegin] == '_' && DL->getGlobalPrefix() == '_');
OutName[NameBegin] = '@';
}
// fastcall and stdcall functions usually need @42 at the end to specify