On Mon, 10 Jun 2013 09:02:24 -0700
Cesar Philippidis <ce...@codesourcery.com> wrote:

> On 6/10/13 8:32 AM, Richard Earnshaw wrote:
> > On 07/06/13 17:50, Cesar Philippidis wrote:
> >> On 6/6/13 9:00 AM, Richard Earnshaw wrote:
> >>> The pipeline offset is 4 for Thumb2 as well.  So at the very
> >>> least you need to explain why your change doesn't apply then as
> >>> well.
> >>
> >> Yes some context is lost in that comment.  Thunks are usually
> >> emitted in ARM mode, except for Thumb-only targets.  Is the new
> >> comment OK?  If so, please check it in since I do not have SVN
> >> write access.
> >>
> > 
> > So what about ARMv7-M, which is thumb2 but no ARM state?
> 
> Thumb2 is handled differently. This patch is inside an if
> (TARGET_THUMB1) block.

To expand, with examples (from g++.old-deja/g++.jason/thunk2.C):

-O2 -S -march=armv4t -fPIC -mthumb:

        .code 32
        .type   _ZThn4_N8CExample9MixinFuncEi1A, %function
_ZThn4_N8CExample9MixinFuncEi1A:
        .fnstart
.LFB19:
        ldr     r12, .LTHUMBFUNC0
.LTHUNKPC0:
        add     r12, pc, r12
        sub     r1, r1, #4
        bx      r12
        .align  2
.LTHUMBFUNC0:
        .word   .LTHUNK0-(.LTHUNKPC0+7)

(Thumb-1 mode, but thunk is in ARM mode, PC offset is 8.)

-O2 -S -march=armv6-m -fPIC -mthumb:

        .code   16
        .thumb_func
        .type   _ZThn4_N8CExample9MixinFuncEi1A, %function
_ZThn4_N8CExample9MixinFuncEi1A:
        .fnstart
.LFB19:
        push {r3}
        ldr     r3, .LTHUMBFUNC0
.LTHUNKPC0:
        add     r3, pc, r3
        mov r12, r3
        sub     r1, r1, #4
        pop     {r3}
        bx      r12
        .align  2
.LTHUMBFUNC0:
        .word   .LTHUNK0-(.LTHUNKPC0+7)

(Current *wrong* behaviour: Thumb mode thunk, but the pipeline offset is
still 8.)

-O2 -S -march=armv7-m -fPIC -mthumb:

        .thumb
        .thumb_func
        .type   _ZThn4_N8CExample9MixinFuncEi1A, %function
_ZThn4_N8CExample9MixinFuncEi1A:
        .fnstart
.LFB19:
        @ args = 0, pretend = 0, frame = 0
        @ frame_needed = 0, uses_anonymous_args = 0
        sub     r1, r1, #4
        b       .LTHUNK0(PLT)

(IIUC, wide branches are available, so there's no need for a synthesised
long PC-relative branch[-exchange]. Similar code is generated for ARM
mode on other architecture versions.)

Ahh -- so actually, maybe the right thing to do is use this last style
of thunk for v6-m, the same as v7-m -- is there any reason that
wouldn't work? (I wrote this patch to start with, but I don't remember
if I considered that possibility at the time...)

HTH,

Julian

Reply via email to