| /* APPLE LOCAL begin radar 4187164 */ |
| /* { dg-do run { target powerpc*-*-darwin* } } */ |
| /* { dg-options "-fasm-blocks" } */ |
| |
| #include <stdio.h> |
| extern void abort(); |
| |
| int myGlobal = 12; |
| |
| int GetMyGlobal(void) __attribute((noinline)); |
| asm int GetMyGlobal(void) |
| { |
| nofralloc |
| |
| mflr r0 |
| // save the old LR |
| bcl 20, 31, @1 |
| // get the address of @1 into the LR |
| @1: mflr r2 |
| // move the address of @1 from the LR to r2 |
| // picbase r2, @1 |
| // define r2 and @1 as the base addr for accessing globals |
| mtlr r0 |
| // restore the old LR |
| |
| addis r3, r2, ha16(myGlobal-@1) |
| // compute hi-16 bits of addr of myGlobal and shift |
| la r3, lo16(myGlobal-@1)(r3) |
| // add lo-16 bits of addr and add to existing hi-16 |
| lwz r3, 0(r3) |
| // dereference the addr to get the value in myGlobal |
| blr |
| // and return that value |
| } |
| |
| int main() |
| { |
| if (GetMyGlobal() != 12) |
| abort(); |
| |
| myGlobal = 123; |
| if (GetMyGlobal() != 123) |
| abort(); |
| |
| return 0; |
| } |
| /* APPLE LOCAL end radar 4187164 */ |