User account creation filtered due to spam.

Bug 16439 - gcj generates wrong line number for static function breakpoint
Summary: gcj generates wrong line number for static function breakpoint
Status: NEW
Alias: None
Product: gcc
Classification: Unclassified
Component: java (show other bugs)
Version: 4.0.0
: P2 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2004-07-08 18:11 UTC by Jeff Johnston
Modified: 2006-02-20 18:45 UTC (History)
2 users (show)

See Also:
Host: i686-pc-linux-gnu
Target: i686-pc-linux-gnu
Build: i686-pc-linux-gnu
Known to work:
Known to fail:
Last reconfirmed: 2006-02-20 18:45:06


Attachments
jmain.java (82 bytes, text/plain)
2004-07-08 18:14 UTC, Jeff Johnston
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Jeff Johnston 2004-07-08 18:11:26 UTC
For the following test case in the gdb testsuite: jmain.java

public class jmain
{
  public static void main (String[] args)
    {
        return;
    }
}

The breakpoint for main ends up being line 4 (the open brace) instead of line 5.
 This does not match the C/C++ behavior which is to point to the first statement
of the member function.  Gdb gets the line number info from the compiler which
is the following tailed output from readelf -wl

 Line Number Statements:
  Extended opcode 2: set Address to 0x8048868
  Special opcode 8: advance Address by 0 to 0x8048868 and Line by 3 to 4
  Special opcode 89: advance Address by 6 to 0x804886e and Line by 0 to 4
  Special opcode 175: advance Address by 12 to 0x804887a and Line by 2 to 6
  Special opcode 28: advance Address by 2 to 0x804887c and Line by -5 to 1
  Special opcode 89: advance Address by 6 to 0x8048882 and Line by 0 to 1
  Advance PC by 14 to 8048890
  Extended opcode 1: End of Sequence
Comment 1 Jeff Johnston 2004-07-08 18:14:34 UTC
Created attachment 6712 [details]
jmain.java
Comment 2 Bryce McKinlay 2004-07-23 02:07:31 UTC
This occurs for "static" and maybe "synchronized" methods. What happens is gcj
inserts some prologue code to check the class initialization status (in the case
of a static method), or in the case of a synchronized method, to aquire the
lock. The line number it uses for the inserted prologue code is that of the
current parser context when starting the method, which points to the method's
opening brace ("{").

It could be changed to instead look for the first non-synthetic code in the
method and use the line number from that.
Comment 3 Andrew Pinski 2005-11-23 04:14:24 UTC
Reconfirm (it is a little easlier to see with the tree dumps):
jmain.main(java.lang.String[]) (args)
{
  [jmain.java : 4] _Jv_InitClass (&jmain.class);
  [jmain.java : 4] {
    [jmain.java : 5] return;
  }
}