http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54721



             Bug #: 54721

           Summary: Generate arm/thumb interwork veneers at compile time?

    Classification: Unclassified

           Product: gcc

           Version: 4.7.2

            Status: UNCONFIRMED

          Severity: enhancement

          Priority: P3

         Component: target

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: li...@horizon.com





When using -mthumb-interwork, the linker generates calling veneers named

__foo_from_arm and __bar_from_thumb on demand.  These look like



    .arm

__foo_from_arm

    ldr    ip, [pc]    ; <__foo_from_arm+0x8>

    bx    ip

    .word    foo



    .thumb_func

__bar_from_thumb:

    bx    pc

    nop

    b    bar



It would be possible to shrink each of these by 4 bytes and some cycles if they

were located before the beginning of the relevant function.



I've tried the following in a .s file and the linker appears to DTRT with it:



    .arm

    .global    foo

    .type    foo, %function

__foo_from_arm:

    adr    ip, foo+1

    bx    ip

    .thumb_func

foo:

    add    r0, r0, #1

    bx    lr

    .size    foo, .-foo



    .global    bar

    .type    bar, %function

__bar_from_thumb:

    bx    pc

    nop

    .arm

bar:

    add    r0, r0, #2

    bx    lr

    .size    bar, .-bar



It would be nice if there were a function attribute to declare that a function

is likely to be called from both ARM and thumb code, and so should generate the

veneers in line.



(It seems like a pretty ovvious feature, so my apologies if this exists

already; my RTFM and google-fu has not managed to locate it.)

Reply via email to