Message ID | 52D7A05F.6070304@linaro.org |
---|---|
State | New |
Headers | show |
On 16 January 2014 09:03, Omair Javaid <omair.javaid@linaro.org> wrote: > On Mon 11 Nov 2013 02:36:40 PM PKT, Yao Qi wrote: >> [Sorry for being late] >> >> On 09/19/2013 11:30 PM, Omair Javaid wrote: >>> (gdb) break func >>> warning: Breakpoint address adjusted from 0x000083bd to 0x000083bc. >>> Breakpoint 1 at 0x83bc (2 locations) >> >> 'break func' should insert a breakpoint at an address A after the first >> several instructions of function func, due to the effect of skip >> prologue. Address A should be an address of a thumb instruction, so it >> should be 2-byte aligned. In this case, the address should be >> 0x000083bc. I'd like to check why 0x000083bd is generated, and >> probably we should use gdbarch_addr_bits_remove somewhere. >> > > There seemed no problem with how breakpoint addresses were being adjusted. > This test requires to build dwarf info by hand in dw2-ifort-parameter-debug.S > using compile time addresses so in case of arm (thumb mode) the least > significant bits of compile time address are set to 1. For that reason > 0x000083bd was being used as a breakpoint address func. This test was using > that compile time address to insert breakpoint and that breakpoint was being > adjusted to an instruction before the actual intended breakpoint instruction. > I have just added a simple stepi test to make sure that we are in correct > scope when we test for a fortran constant param. This works fine for both > arm and x86. > > gdb/testsuite/ChangeLog: > > 2014-01-16 Omair Javaid <Omair.Javaid@linaro.org> > > * gdb.dwarf2/dw2-ifort-parameter.exp: Adds a new stepi test. > > --- > gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.exp | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.exp b/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.exp > index 35fb0fa..8f49eea 100644 > --- a/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.exp > +++ b/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.exp > @@ -33,4 +33,6 @@ if ![runto func] { > return -1 > } > > +gdb_test "stepi" ".*" > + I guess this could use a comment to explain why it is there.
On 01/16/2014 02:48 PM, Pedro Alves wrote: > On 01/16/2014 09:03 AM, Omair Javaid wrote: > >> There seemed no problem with how breakpoint addresses were being adjusted. >> This test requires to build dwarf info by hand in dw2-ifort-parameter-debug.S >> using compile time addresses so in case of arm (thumb mode) the least >> significant bits of compile time address are set to 1. For that reason >> 0x000083bd was being used as a breakpoint address func. > > OOC, what does the compiler debug info usually do instead to avoid this? > Here is what compiler generates when there are thumb functions to handle: .thumb_func .type func, %function func: .LFB0: func is marked as thumb function and thus this func pointer will have the lower bit set. While .LFB0: non thumb label will be used to mark function start address. Like this: .4byte .LFB0 @ DW_AT_low_pc
On Thu 16 Jan 2014 05:35:46 PM PKT, Pedro Alves wrote: > On 01/16/2014 10:26 AM, Omair Javaid wrote: >> >> >> On 01/16/2014 02:48 PM, Pedro Alves wrote: >>> On 01/16/2014 09:03 AM, Omair Javaid wrote: >>> >>>> There seemed no problem with how breakpoint addresses were being adjusted. >>>> This test requires to build dwarf info by hand in dw2-ifort-parameter-debug.S >>>> using compile time addresses so in case of arm (thumb mode) the least >>>> significant bits of compile time address are set to 1. For that reason >>>> 0x000083bd was being used as a breakpoint address func. >>> >>> OOC, what does the compiler debug info usually do instead to avoid this? >>> >> >> Here is what compiler generates when there are thumb functions to handle: >> .thumb_func >> .type func, %function >> func: >> .LFB0: >> >> func is marked as thumb function and thus this func pointer will have the >> lower bit set. While .LFB0: non thumb label will be used to mark function >> start address. Like this: .4byte .LFB0 @ DW_AT_low_pc > > Ah. I wonder if this works for you (and everyone). > > --- > gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter-debug.S | 4 ++-- > gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.c | 6 ++++++ > 2 files changed, 8 insertions(+), 2 deletions(-) > > diff --git a/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter-debug.S b/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter-debug.S > index c7dd9be..6b08cb2 100644 > --- a/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter-debug.S > +++ b/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter-debug.S > @@ -35,8 +35,8 @@ > .uleb128 2 /* Abbrev: DW_TAG_subprogram */ > .byte 1 /* DW_AT_external */ > .ascii "func\0" /* DW_AT_name */ > - .4byte func /* DW_AT_low_pc */ > - .4byte main /* DW_AT_high_pc */ > + .4byte func_addr /* DW_AT_low_pc */ > + .4byte main_addr /* DW_AT_high_pc */ > > .uleb128 3 /* Abbrev: DW_TAG_formal_parameter */ > .ascii "param\0" /* DW_AT_name */ > diff --git a/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.c b/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.c > index 361c44d..c866b0f 100644 > --- a/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.c > +++ b/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.c > @@ -29,3 +29,9 @@ main (void) > func (); > return 0; > } > + > +/* Addresses represented as data symbols, thus without Thumb (etc.) > + mode bits. The dw2-ifort-parameter-debug.S file uses this as > + func's low_pc/high_pc. */ > +extern void *func_addr __attribute__ ((alias ("func"))); > +extern void *main_addr __attribute__ ((alias ("main"))); Patch doesnt fix the issue and builds after making changes to alias definition like: extern void func_addr() __attribute__ ((alias ("func"))); extern void main_addr() __attribute__ ((alias ("main"))); I have actually tried similar stuff before by adding: asm(".globl func_addr"); asm(".4byte func_addr"); but issues remains the same. Heres the output with your patch: warning: Breakpoint address adjusted from 0x000083c5 to 0x000083c4. Breakpoint 1 at 0x83c4 (2 locations) (gdb) run Starting program: /home/omair/gdb_dev/gdb/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter warning: Breakpoint address adjusted from 0x000083c5 to 0x000083c4. warning: Breakpoint address adjusted from 0x000083c5 to 0x000083c4. warning: Breakpoint address adjusted from 0x000083c5 to 0x000083c4. warning: Breakpoint 1 address previously adjusted from 0x000083c5 to 0x000083c4. Breakpoint 1, 0x000083c4 in func_addr () (gdb) p/x param No symbol "param" in current context. (gdb) FAIL: gdb.dwarf2/dw2-ifort-parameter.exp: p/x param testcase ./gdb.dwarf2/dw2-ifort-parameter.exp completed in 1 seconds
On Thu 16 Jan 2014 07:00:37 PM PKT, Pedro Alves wrote: > On 01/16/2014 01:55 PM, Omair Javaid wrote: >>>> diff --git a/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.c b/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.c >>>> index 361c44d..c866b0f 100644 >>>> --- a/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.c >>>> +++ b/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.c >>>> @@ -29,3 +29,9 @@ main (void) >>>> func (); >>>> return 0; >>>> } >>>> + >>>> +/* Addresses represented as data symbols, thus without Thumb (etc.) >>>> + mode bits. The dw2-ifort-parameter-debug.S file uses this as >>>> + func's low_pc/high_pc. */ >>>> +extern void *func_addr __attribute__ ((alias ("func"))); >>>> +extern void *main_addr __attribute__ ((alias ("main"))); >> Patch doesnt fix the issue and builds after making changes to alias definition like: > > Odd. Are you saying the patch didn't build for you? It did for > me, in Thumb mode, and the debug info I saw looked right (no > thumb bit). > >> extern void func_addr() __attribute__ ((alias ("func"))); >> extern void main_addr() __attribute__ ((alias ("main"))); > > ... >> but issues remains the same. > > That's expected, as the whole point was making a data symbol > (void *), but that change makes it a function again (thus > ends up with the thumb bit set again). > I am using gcc version 4.8.1 (Ubuntu/Linaro 4.8.1-10ubuntu9) Patch fails to build with following error: gdb compile failed, ./gdb.dwarf2/dw2-ifort-parameter.c:37:15: error: 'func_addr' alias in between function and variable is not supported extern void * func_addr __attribute__ ((alias ("func"))); ^ ./gdb.dwarf2/dw2-ifort-parameter.c:23:1: warning: 'func' aliased declaration [enabled by default] func (void) ^ ./gdb.dwarf2/dw2-ifort-parameter.c:38:15: error: 'main_addr' alias in between function and variable is not supported extern void * main_addr __attribute__ ((alias ("main"))); ^ ./gdb.dwarf2/dw2-ifort-parameter.c:28:1: warning: 'main' aliased declaration [enabled by default] main (void) ^
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.exp b/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.exp index 35fb0fa..8f49eea 100644 --- a/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.exp +++ b/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.exp @@ -33,4 +33,6 @@ if ![runto func] { return -1 } +gdb_test "stepi" ".*" + gdb_test "p/x param" " = 0xdeadf00d"