[Bug go/52583] Several new go testsuite failues on Solaris

ubizjak at gmail dot com gcc-bugzilla@gcc.gnu.org
Thu Mar 15 23:46:00 GMT 2012


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52583

--- Comment #5 from Uros Bizjak <ubizjak at gmail dot com> 2012-03-15 22:01:51 UTC ---
(In reply to comment #4)
> If you look at the test (libgo/go/log/log_test.go), you'll see that it simply
> does
> 
>     if useFormat {
>         Printf("hello %d world", 23)
>     } else {
>         Println("hello", 23, "world")
>     }
> 
> This is calling log.Printf or log.Println.  Those both wind up calling
> log.Output, which uses runtime.Caller to get a stack backtrace to their caller.

Right, the problem is triggered in line.go, line 111:

...
    for _, ln := range u.lines {
>>>		if pc < ln.addrs[0].pc || pc > ln.addrs[len(ln.addrs)-1].pc {
            continue
        }
...

The function is enter with pc:

(gdb) p/x *pc
$94 = 0x120005147

But ln.addrs ranges are set to:

(gdb) p ln.addrs
$95 = {__values = 0xf840002c00, __count = 17, __capacity = 32}
(gdb) p/x ln.addrs.__values[0].pc
$96 = 0x120004ca0
(gdb) p/x ln.addrs.__values[16].pc
$97 = 0x120004df4

However, the function is located at:

#8  0x0000000120005148 in log.testPrint (t=0xf840416d90, flag=<optimized out>,
prefix=..., pattern=..., useFormat=false) at log_test.go:45
45                      Println("hello", 23, "world")
(gdb) disass
Dump of assembler code for function log.testPrint:

   0x0000000120004ca0 <+0>:     ldah    gp,2(t12)
   0x0000000120004ca4 <+4>:     lda     gp,-1912(gp)
   0x0000000120004ca8 <+8>:     ldq     t12,-32456(gp)
   0x0000000120004cac <+12>:    lda     sp,-432(sp)
   ...
   0x0000000120005144 <+1188>:  bsr     ra,0x1200071c8
<libgo_log.log.Println+8>
=> 0x0000000120005148 <+1192>:  unop
   0x000000012000514c <+1196>:  unop
   0x0000000120005150 <+1200>:  br      0x120004dd8 <log.testPrint+312>
   0x0000000120005154 <+1204>:  ldq     t12,-32744(gp)
   0x0000000120005158 <+1208>:  lda     a0,5
   0x000000012000515c <+1212>:  jsr     ra,(t12),0x120005160
<log.testPrint+1216>

(line numbers are slightly changed due to my changes to log_test.go source for
debug purposes).

It looks that ln.addrs ranges are not correctly set. For some reason, line
numbers are truncated at line 48:

(gdb) p ln.addrs.__values[0].line
$100 = 37
(gdb) p ln.addrs.__values[16].line
$101 = 48

But the function in fact ends at line 58 in my case.

It just happens that the call to libgo_log.log.Printf lies inside (truncated)
ln.addrs[].pc ranges:

   0x0000000120004dc8 <+296>:   unop
   0x0000000120004dcc <+300>:   bsr     ra,0x120007148 <libgo_log.log.Printf+8>
   0x0000000120004dd0 <+304>:   unop
   0x0000000120004dd4 <+308>:   unop

Any further help where to look for how ln.addrs ranges are determined?



More information about the Gcc-bugs mailing list