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 [email protected] https://lists.sourceforge.net/lists/listinfo/open64-devel
