Hi all, Can gatekeeper help review for a fix for bug848? https://bugs.open64.net/show_bug.cgi?id=848
Case: $cat timer.c #include <stdio.h> extern unsigned long long __attribute__((section(".data"))) jiffies_64; extern unsigned long volatile __attribute__((section(".data"))) jiffies; unsigned long volatile __attribute__((section(".data"))) jiffies=100; unsigned long long jiffies_64 __attribute__((__aligned__((1 << (6))))) = ((unsigned long)(unsigned int) (-300*1000)); void do_timer(unsigned long ticks) { jiffies_64 += ticks; } int main() { do_timer(1); printf("%d\n", jiffies_64); printf("%d\n", jiffies); } $cat a.lds: iffies_64 = jiffies; The problem is when link with "a.lds", the output of open64 is wrong. The output of jiffies_64 and jiffies should be the same according to the linker script. opencc a.lds timer.c -O0 -keep ./a.out -299999 100 when compile with gcc ./a.out 101 101 The root reason is in open64, the preemitable symbol is addressed through base and offset. the output of timer.s: # 3 extern unsigned long volatile __attribute__((section(".data"))) jiffies; # 4 unsigned long volatile __attribute__((section(".data"))) jiffies=100; # 5 unsigned long long jiffies_64 __attribute__((__aligned__((1 << (6))))) = ((unsigned long)(unsigned int) (-300*1000)); # 6 void do_timer(unsigned long ticks) # 7 { .LBB1_do_timer: pushq %rbp # movq %rsp,%rbp # addq $-32,%rsp # movq %rdi,-16(%rbp) # ticks .loc 1 8 0 # 8 jiffies_64 += ticks; movq -16(%rbp),%rdi # ticks movq .data(%rip),%rax # addq %rdi,%rax # movq %rax,.data(%rip) # leave # ret # .LDWend_do_timer: .size do_timer, .LDWend_do_timer-do_timer symbol jiffies_64 is represent through .data(%rip), but not jiffies_64(%rip), so when in the linker script reset the address of jiffies_64 does not work. The patch attached at bug848_1.patch. There is a regression caused by bug848_1.patch, the case is: extern void abort (void); volatile int out = 1; volatile int a = 2; volatile int b = 4; volatile int c = 8; volatile int d = 16; volatile int e = 32; volatile int f = 64; int main () { asm volatile ("xorl %%eax, %%eax \n\t" "xorl %%esi, %%esi \n\t" "addl %1, %0 \n\t" "addl %2, %0 \n\t" "addl %3, %0 \n\t" "addl %4, %0 \n\t" "addl %5, %0 \n\t" "addl %6, %0" : "+r" (out) : "r" (a), "r" (b), "r" (c), "g" (d), "g" (e), "g" (f) : "%eax", "%esi"); if (out != 127) abort (); return 0; } The cause is that for asm string, there is following code in fun "Modify_Asm_String": ST* st = TN_var(tn); Base_Symbol_And_Offset( st, &base_st, &base_ofst ); Base_Symbol_And_Offset does not consider whether shoud use base-offset or not. So I change the call to "Base_Symbol_And_Offset_For_Addressing". see bug848_2.patch Thanks zhuqing
bug848_2.patch
Description: Binary data
bug848_1.patch
Description: Binary data
------------------------------------------------------------------------------ RSA(R) Conference 2012 Save $700 by Nov 18 Register now http://p.sf.net/sfu/rsa-sfdev2dev1
_______________________________________________ Open64-devel mailing list Open64-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/open64-devel