[llvm] r199203 - Fix fastcall mangling of dllimported symbols

Rafael EspĂ­ndola rafael.espindola at gmail.com
Mon Jan 20 17:12:15 PST 2014


testcase?

On 14 January 2014 03:53, Nico Rieck <nico.rieck at gmail.com> wrote:
> Author: nrieck
> Date: Tue Jan 14 05:53:26 2014
> New Revision: 199203
>
> URL: http://llvm.org/viewvc/llvm-project?rev=199203&view=rev
> Log:
> 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 at 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.
>
> Modified:
>     llvm/trunk/lib/IR/Mangler.cpp
>
> Modified: llvm/trunk/lib/IR/Mangler.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Mangler.cpp?rev=199203&r1=199202&r2=199203&view=diff
> ==============================================================================
> --- llvm/trunk/lib/IR/Mangler.cpp (original)
> +++ llvm/trunk/lib/IR/Mangler.cpp Tue Jan 14 05:53:26 2014
> @@ -81,7 +81,9 @@ void Mangler::getNameWithPrefix(SmallVec
>      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(SmallVec
>      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
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list