On Mon, Jan 22, 2018 at 4:21 AM, Florian Weimer <fwei...@redhat.com> wrote: > I tried this: > > struct C { > virtual ~C(); > virtual void f(); > }; > > void > f (C *p) > { > p->f(); > p->f(); > } > > with r256939 and -mindirect-branch=thunk -O2 on x86-64 GNU/Linux, and got > this: > > _Z1fP1C: > .LFB0: > .cfi_startproc > pushq %rbx > .cfi_def_cfa_offset 16 > .cfi_offset 3, -16 > movq (%rdi), %rax > movq %rdi, %rbx > jmp .LIND1 > .LIND0: > pushq 16(%rax) > jmp __x86_indirect_thunk > .LIND1: > call .LIND0 > movq (%rbx), %rax > movq %rbx, %rdi > popq %rbx > .cfi_def_cfa_offset 8 > movq 16(%rax), %rax > jmp __x86_indirect_thunk_rax > .cfi_endproc > > This doesn't look quite right. x86-64 is supposed to have asynchronous > unwind tables by default, but there is nothing that reflects the change in > the (relative) frame address after .LIND0. I think that region really has > to be moved outside of the .cfi_startproc/.cfi_endproc bracket.
I'd like to remove __x86_indirect_thunk since it can't be made compatible with CET: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83970 That means -mindirect-branch=thunk should imply -mindirect-branch-register. When -fno-plt is used with __x86_indirect_thunk_reg, linker can convert call via GOT to direct branch if function is locally defined: https://groups.google.com/forum/#!topic/x86-64-abi/eED5lzn3_Mg H.J.