On 02/19/2015 03:09 PM, Jakub Jelinek wrote:

If you have hw where NULL is mapped and you know your code violates the
C/C++ standards by placing objects at that address, simply do use
the option that is designed for that purpose.

As I pointed out earlier, though, that won't help you if your program (perhaps implicitly) uses library code that's been built without the magic option.

I thought that declaring an object explicitly placed at address 0 as "volatile" ought to be sufficient to prevent writes to it from being optimized away and replaced with traps, but alas, that is not the case. Also, a structure copy to such a volatile object is implicitly invoking the regular memcpy function without complaining about casting away volatile-ness, as an explicit call would do. I've attached a couple quick test cases and .s output from arm-none-eabi-gcc -O2, using a mainline build from last night.

-Sandra
static int * const x0 = (int *) 0x00000000;
static volatile int * const xv = (int *) 0x00000000;
static int * const xn = (int *) 0x10000000;

void f0 (int *data)
{
  *x0 = *data;
}

void fv (int *data)
{
  *xv = *data;
}

void fn (int *data)
{
  *xn = *data;
}
        .cpu arm7tdmi
        .fpu softvfp
        .eabi_attribute 20, 1
        .eabi_attribute 21, 1
        .eabi_attribute 23, 3
        .eabi_attribute 24, 1
        .eabi_attribute 25, 1
        .eabi_attribute 26, 1
        .eabi_attribute 30, 2
        .eabi_attribute 34, 0
        .eabi_attribute 18, 4
        .arm
        .syntax divided
        .file   "test.c"
        .text
        .align  2
        .global f0
        .type   f0, %function
f0:
        @ Function supports interworking.
        @ Volatile: function does not return.
        @ args = 0, pretend = 0, frame = 0
        @ frame_needed = 0, uses_anonymous_args = 0
        @ link register save eliminated.
        mov     r3, #0
        str     r3, [r3]
        .inst   0xe7f000f0
        .size   f0, .-f0
        .align  2
        .global fv
        .type   fv, %function
fv:
        @ Function supports interworking.
        @ Volatile: function does not return.
        @ args = 0, pretend = 0, frame = 0
        @ frame_needed = 0, uses_anonymous_args = 0
        @ link register save eliminated.
        mov     r3, #0
        str     r3, [r3]
        .inst   0xe7f000f0
        .size   fv, .-fv
        .align  2
        .global fn
        .type   fn, %function
fn:
        @ Function supports interworking.
        @ args = 0, pretend = 0, frame = 0
        @ frame_needed = 0, uses_anonymous_args = 0
        @ link register save eliminated.
        mov     r3, #268435456
        ldr     r2, [r0]
        str     r2, [r3]
        bx      lr
        .size   fn, .-fn
        .ident  "GCC: (GNU) 5.0.0 20150219 (experimental)"
struct big {
  int a, b;
  char c [100];
};

static struct big * const x0 = (struct big *) 0x00000000;
static volatile struct big * const xv = (struct big *) 0x00000000;
static struct big * const xn = (struct big *) 0x10000000;

void f0 (struct big *data)
{
  *x0 = *data;
}

void fv (struct big *data)
{
  *xv = *data;
}

void fn (struct big *data)
{
  *xn = *data;
}

        .cpu arm7tdmi
        .fpu softvfp
        .eabi_attribute 20, 1
        .eabi_attribute 21, 1
        .eabi_attribute 23, 3
        .eabi_attribute 24, 1
        .eabi_attribute 25, 1
        .eabi_attribute 26, 1
        .eabi_attribute 30, 2
        .eabi_attribute 34, 0
        .eabi_attribute 18, 4
        .arm
        .syntax divided
        .file   "test2.c"
        .text
        .align  2
        .global f0
        .type   f0, %function
f0:
        @ Function supports interworking.
        @ Volatile: function does not return.
        @ args = 0, pretend = 0, frame = 0
        @ frame_needed = 0, uses_anonymous_args = 0
        mov     r1, r0
        stmfd   sp!, {r4, lr}
        mov     r2, #108
        mov     r0, #0
        bl      memcpy
        .inst   0xe7f000f0
        .size   f0, .-f0
        .align  2
        .global fv
        .type   fv, %function
fv:
        @ Function supports interworking.
        @ Volatile: function does not return.
        @ args = 0, pretend = 0, frame = 0
        @ frame_needed = 0, uses_anonymous_args = 0
        mov     r1, r0
        stmfd   sp!, {r4, lr}
        mov     r2, #108
        mov     r0, #0
        bl      memcpy
        .inst   0xe7f000f0
        .size   fv, .-fv
        .align  2
        .global fn
        .type   fn, %function
fn:
        @ Function supports interworking.
        @ args = 0, pretend = 0, frame = 0
        @ frame_needed = 0, uses_anonymous_args = 0
        stmfd   sp!, {r4, lr}
        mov     r1, r0
        mov     r2, #108
        mov     r0, #268435456
        bl      memcpy
        ldmfd   sp!, {r4, lr}
        bx      lr
        .size   fn, .-fn
        .ident  "GCC: (GNU) 5.0.0 20150219 (experimental)"

Reply via email to