[PATCH] D24359: Win64: Don't use REX prefix for direct tail calls
Hans Wennborg via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 8 13:45:12 PDT 2016
hans added a comment.
In https://reviews.llvm.org/D24359#537575, @majnemer wrote:
> Hmm, looks like we are over REXing there too:
>
> void __declspec(dllimport) h();
> void f() {
> h();
> }
>
>
> turns into:
>
> f: # @f
> .Ltmp0:
> .seh_proc f
> # BB#0: # %entry
> .Ltmp1:
> .seh_endprologue
> rex64 jmpq *__imp_h(%rip) # TAILCALL
> # encoding: [0x48,0xff,0x25,A,A,A,A]
> # fixup A - offset: 3, value: __imp_h-4, kind: reloc_riprel_4byte
> .seh_handlerdata
> .text
> .Ltmp2:
> .seh_endproc
>
>
> My reading indicates that the unwinder will consider this as a tail call. If anything, our REX prefix is probably confusing it.
>
> I imagine that MSVC omits it here?
No, they emit it:
d:\src\tmp>type a.cc
void __declspec(dllimport) h();
void f() {
h();
}
d:\src\tmp>cl /c /Ox a.cc && dumpbin /disasm a.obj
Microsoft (R) C/C++ Optimizing Compiler Version 18.00.31101 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
a.cc
Microsoft (R) COFF/PE Dumper Version 12.00.31101.0
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file a.obj
File Type: COFF OBJECT
?f@@YAXXZ (void __cdecl f(void)):
0000000000000000: 48 FF 25 00 00 00 jmp qword ptr [__imp_?h@@YAXXZ]
00
Summary
64 .debug$S
2F .drectve
7 .text$mn
In https://reviews.llvm.org/D24359#537543, @majnemer wrote:
> It seems that not all indirect jumps should be REX prefixed: https://github.com/dotnet/coreclr/blob/master/src/unwinder/amd64/unwinder_amd64.cpp#L1378
Hmm, it seems for this specific one they can handle both with and without REX prefix.
> Does TAILJMPm64_REX emit something that would match https://github.com/dotnet/coreclr/blob/master/src/unwinder/amd64/unwinder_amd64.cpp#L1389 ?
Yes, I believe TAILJMPm64_REX is what we use in your dllimport example, and it seems that matches both if-statements here.
Perhaps the unwinder used to be stricter but then they had to change it to accept more non-rexed versions?
https://reviews.llvm.org/D24359
More information about the llvm-commits
mailing list