This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

FDEs for virtual thunks


Is there a reason that g++ generates FDEs for virtual thunks?
It doesn't seem to generate them for non-virtual thunks. If
those FDEs are really necessary, then that's that. If they
aren't, however, then it would be nice to get rid of them to
save space.

--Matt


An example of what I'm talking about:

------------------- source -------------------

int does_throw = 0;

struct VB {
virtual ~VB();
virtual void foo();
};

struct D : public virtual VB {
virtual void foo();
};

VB::~VB() { }
void VB::foo() { }

void D::foo() { if (does_throw) throw 137; }

------------------- assembly -------------------
(gcc3.1 on Red Hat Linux/i386 2.4.x)

$ /usr/local/gcc-3.1/bin/c++filt < matt2.s > matt2.filt.s

...
.section .gnu.linkonce.t._ZTv0_n16_N1D3fooEv,"ax",@progbits
.align 2
.p2align 4,,15
.weak virtual thunk [v:0,-16] to D::foo()
.type virtual thunk [v:0,-16] to D::foo(),@function
virtual thunk [v:0,-16] to D::foo():
.LFB6:
pushl %ebp
.LCFI14:
movl %esp, %ebp
.LCFI15:
subl $8, %esp
.LCFI16:
movl 8(%ebp), %eax
movl (%eax), %edx
movl -16(%edx), %ecx
addl %ecx, %eax
movl %eax, 8(%ebp)
movl %ebp, %esp
popl %ebp
jmp D::foo()
.LFE6:
.Lfe6:
.size virtual thunk [v:0,-16] to D::foo(),.Lfe6-virtual thunk [v:0,-16] to D::foo()
.weak VTT for D

...

.LSFDE11:
.long .LEFDE11-.LASFDE11
.LASFDE11:
.long .LASFDE11-.Lframe1
.long .LFB6
.long .LFE6-.LFB6
.uleb128 0x0
.byte 0x4
.long .LCFI14-.LFB6
.byte 0xe
.uleb128 0x8
.byte 0x85
.uleb128 0x2
.byte 0x4
.long .LCFI15-.LCFI14
.byte 0xd
.uleb128 0x5
.align 4
.LEFDE11:
.ident "GCC: (GNU) 3.1"



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]