[Bug c++/56715] New: Explicit Reg Vars are being ignored for consts when using g++

goswin-v-b at web dot de gcc-bugzilla@gcc.gnu.org
Sun Mar 24 23:25:00 GMT 2013


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

             Bug #: 56715
           Summary: Explicit Reg Vars are being ignored for consts when
                    using g++
    Classification: Unclassified
           Product: gcc
           Version: 4.7.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned@gcc.gnu.org
        ReportedBy: goswin-v-b@web.de


Created attachment 29714
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=29714
example source that experiences the bug

I'm trying to pass a value to an `asm' operand using a specific register for
arm with a freestanding compiler. Following the example from the info pages I
have the following code:

void foo() {
    register const int r4 asm("r4") = 0x1000;
    asm volatile("swi #1" : : "r"(r4));
}

void bar() {
    register int r4 asm("r4") = 0x1000;
    asm volatile("swi #1" : : "r"(r4));
}

Both foo() and bar() compile correct when using gcc. But when using g++ the
foo() function suddenly uses the "r3" register instead of "r4". The bar()
function remains correct.

% arm-none-eabi-g++ -v 
Using built-in specs.
COLLECT_GCC=arm-none-eabi-g++
COLLECT_LTO_WRAPPER=/usr/local/cross/libexec/gcc/arm-none-eabi/4.7.2/lto-wrapper
Target: arm-none-eabi
Configured with: ../gcc-4.7.2/configure --target=arm-none-eabi
--prefix=/usr/local/cross --disable-nls --enable-languages=c,c++
--without-headers
Thread model: single
gcc version 4.7.2 (GCC) 

% arm-none-eabi-gcc -O2 -save-temps -S bug.c         good code
% arm-none-eabi-g++ -O2 -save-temps -S bug.c         bad code

------------------------------------------------------------------
_Z3foov:
        .fnstart
.LFB0:
        @ Function supports interworking.
        @ args = 0, pretend = 0, frame = 0
        @ frame_needed = 0, uses_anonymous_args = 0
        @ link register save eliminated.
        mov     r3, #4096
@ 3 "bug.c" 1
        swi #1
@ 0 "" 2
        bx      lr
------------------------------------------------------------------
The source explicitly asked for "r4" but g++ uses r3 instead.



More information about the Gcc-bugs mailing list