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

Attachment: bug848_2.patch
Description: Binary data

Attachment: 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

Reply via email to