[cfe-dev] Should -g1 mean -gline-tables-only?

Hal Finkel hfinkel at anl.gov
Fri Oct 17 12:00:48 PDT 2014


----- Original Message -----
> From: "David Blaikie" <dblaikie at gmail.com>
> To: "Hal Finkel" <hfinkel at anl.gov>
> Cc: "cfe-dev at cs.uiuc.edu Developers" <cfe-dev at cs.uiuc.edu>, "Eric Christopher" <echristo at google.com>
> Sent: Friday, October 17, 2014 1:39:15 PM
> Subject: Re: Should -g1 mean -gline-tables-only?
>
> 
> On Fri, Oct 17, 2014 at 11:32 AM, Hal Finkel < hfinkel at anl.gov >
> wrote:
> 
> ----- Original Message -----
> > From: "David Blaikie" < dblaikie at gmail.com >
> > To: "Hal Finkel" < hfinkel at anl.gov >
> > Cc: " cfe-dev at cs.uiuc.edu Developers" < cfe-dev at cs.uiuc.edu >,
> > "Eric Christopher" < echristo at google.com >
> > Sent: Friday, October 17, 2014 12:49:09 PM
> > Subject: Re: Should -g1 mean -gline-tables-only?
> > 
> > On Fri, Oct 17, 2014 at 10:37 AM, Hal Finkel < hfinkel at anl.gov >
> > wrote:
> > 
> > 
> > Hi,
> > 
> > Debugging flags are not my area of expertise, but GCC's manual says
> > about -g1:
> > 
> > [from GCC's man page]
> > Level 1 produces minimal information, enough for making backtraces
> > in
> > parts of the program that you don't plan to debug.
> > This includes descriptions of functions and external variables, but
> > no information about local variables and no line numbers.
> > 
> > 
> > 
> > Sounds similar, apart from the "and external variables" part.
> > 
> > It'd be interesting to actually look at the output - I Suspect it
> > might be a bit more verbose than Clang's (or GCC's) -gmlt, maybe
> > including namespaces, mangled function names, whatever else.
> > 
> > I think maybe Google's GCC branch has -gmlt, but maybe it's not in
> > GCC proper? I don't really know/understand.
> > 
> > 
> > [end from GCC's man page]
> > 
> > and IBM's manual for xlc says about -g1:
> > 
> > [from IBM's man page]
> > Generates minimal read-only debugging information about line
> > numbers
> > and source file names. No program state is preserved.
> > 
> > 
> > Sounds about right. Be interesting to know if that's just the line
> > table itself, or the inlining info that Clang's
> > -gmlt/-gline-tables-only produces as well (yeah, -gline-tables-only
> > is a bit of a half truth).
> 
> How could I tell? (I believe we have some kind of dwarf-dumping
> utility, but I don't know for what to look).
> 
> 
> llvm-dwarfdump is a utility for dumping DWARF debug information.
> Running it on an object file built with xlc's -g1 and see if there
> are many DW_TAGs in the debug_info section (ones describing each
> function, etc). If the only thing of note is the line table
> (debug_line section) then it's probably not producing the inlining
> info that we do in -gmlt. *shrug*
> 
> Anyway, it sounds like xlc's -g1 might be a bit less than Clang's
> -gmlt and GCC's -g1 might be a bit more than Clang's -gmlt. So if
> those are both valid interpretations of -g1, Clang's -gmlt should
> fit right in ;)
> 

I tried your example using xlc:

$ cat /tmp/t1.c 
void f1() { } void __attribute__((always_inline)) f2() { f1(); } void f3() { f2(); }
$ bgxlc -g1 -o /tmp/t1.o /tmp/t1.c -c
$ llvm-dwarfdump /tmp/t1.o 
/tmp/t1.o:	file format ELF64-ppc64

.debug_abbrev contents:
Abbrev table for offset: 0x00000000
[1] DW_TAG_compile_unit	DW_CHILDREN_no
	DW_AT_name	DW_FORM_string
	DW_AT_stmt_list	DW_FORM_data8
	DW_AT_low_pc	DW_FORM_addr
	DW_AT_high_pc	DW_FORM_addr
	DW_AT_language	DW_FORM_data1
	DW_AT_comp_dir	DW_FORM_string
	DW_AT_producer	DW_FORM_string


.debug_abbrev.dwo contents:
< EMPTY >

.debug_info contents:

.debug_loc contents:

.debug_loc.dwo contents:

.debug_frame contents:

00000000 0000000c ffffffff CIE
  Version:               1
  Augmentation:          ""
  Code alignment factor: 4
  Data alignment factor: -8
  Return address column: 65

  DW_CFA_def_cfa:

00000010 00000024 00000000 FDE cie=00000000 pc=00000000...0000001c
  DW_CFA_advance_loc:
  DW_CFA_offset:
  DW_CFA_advance_loc:
  DW_CFA_def_cfa_offset:
  DW_CFA_advance_loc:
  DW_CFA_def_cfa_register:
  DW_CFA_advance_loc:
  DW_CFA_remember_state:
  DW_CFA_advance_loc:
  DW_CFA_restore:
  DW_CFA_advance_loc:
  DW_CFA_restore_state:

00000038 0000002c 00000000 FDE cie=00000000 pc=00000000...00000034
  DW_CFA_advance_loc:
  DW_CFA_offset:
  DW_CFA_advance_loc:
  DW_CFA_offset_extended_sf:
  DW_CFA_advance_loc:
  DW_CFA_def_cfa_offset:
  DW_CFA_advance_loc:
  DW_CFA_def_cfa_register:
  DW_CFA_advance_loc:
  DW_CFA_remember_state:
  DW_CFA_advance_loc:
  DW_CFA_restore:
  DW_CFA_advance_loc:
  DW_CFA_restore_state:
  DW_CFA_nop:
  DW_CFA_nop:
  DW_CFA_nop:
  DW_CFA_nop:

00000068 0000002c 00000000 FDE cie=00000000 pc=00000000...00000034
  DW_CFA_advance_loc:
  DW_CFA_offset:
  DW_CFA_advance_loc:
  DW_CFA_offset_extended_sf:
  DW_CFA_advance_loc:
  DW_CFA_def_cfa_offset:
  DW_CFA_advance_loc:
  DW_CFA_def_cfa_register:
  DW_CFA_advance_loc:
  DW_CFA_remember_state:
  DW_CFA_advance_loc:
  DW_CFA_restore:
  DW_CFA_advance_loc:
  DW_CFA_restore_state:
  DW_CFA_nop:
  DW_CFA_nop:
  DW_CFA_nop:
  DW_CFA_nop:


.debug_aranges contents:
Address Range Header: length = 0x0000002c, version = 0x0002, cu_offset = 0x00000000, addr_size = 0x08, seg_size = 0x00
[0x0000000000000000 - 0x00000000000000dc)

.debug_line contents:

.debug_line.dwo contents:

.debug_str contents:

.debug_ranges contents:

.debug_pubnames contents:
length = 0xffffffff version = 0x0000 unit_offset = 0x00000000 unit_size = 0x001a0002
Offset     Name
length = 0x00000000 version = 0x0000 unit_offset = 0x00000000 unit_size = 0x00970000
Offset     Name
length = 0x00000000 version = 0x0000 unit_offset = 0x00000000 unit_size = 0x00000000
Offset     Name

.debug_pubtypes contents:
length = 0xffffffff version = 0x0000 unit_offset = 0x00000000 unit_size = 0x001a0002
Offset     Name
length = 0x00000000 version = 0x0000 unit_offset = 0x00000000 unit_size = 0x00970000
Offset     Name
length = 0x00000000 version = 0x0000 unit_offset = 0x00000000 unit_size = 0x00000000
Offset     Name

.debug_gnu_pubnames contents:

.debug_gnu_pubtypes contents:

This seems to contain even less information than doing the same thing with gcc (which has a bunch of DW_TAG_subprogram sections too).

Thanks again,
Hal

> - David
> 
> 
> 
> Thanks again,
> Hal
> 
> 
> 
> > 
> > 
> > [end from IBM's man page]
> > 
> > this sounds to me a lot like what -gline-tables-only does. Is there
> > a
> > reason we don't alias -g1 to -gline-tables-only? Currently, the
> > code
> > in Clang::ConstructJob treats it just like -g.
> > 
> > Thanks again,
> > Hal
> > 
> > --
> > Hal Finkel
> > Assistant Computational Scientist
> > Leadership Computing Facility
> > Argonne National Laboratory
> > 
> > 
> 
> --
> Hal Finkel
> Assistant Computational Scientist
> Leadership Computing Facility
> Argonne National Laboratory
> 
> 

-- 
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory



More information about the cfe-dev mailing list