Issue 070619.1: Identify main function

Author: Chris Quenelle/Michael Eager
Champion: Michael Eager
Date submitted: 2007-06-19
Date revised:
Date closed:
Type: Extension
Status: Accepted with modifications
DWARF Version: 4
Background:

It may be difficult for a debugger to determine which function
is the logical start of a program.  In Standard C, this is 'main()',
but non-standard C, such as in embedded systems or Windows programs,
may start at different locations, such as 'winmain()'.  Fortran
notably allows the programmer to identify a subroutine with the
keyword 'PROGRAM'.  Some languages like Ada have the starting
function defined outside of the compilation system.

The most common reason to want the main function's name is to set
a breakpoint in it to begin debugging.  But it's also very useful to know
what name was given to that function by the user, so that the name can
be used when printing messages and other output.

There are a variety of implementation specific ways that are mostly
reliable for using the ELF symbol table or other information to figure out
the name (and location) of the main function.  But it's better to record
the information in a portable and reliable way in DWARF.

Proposal:

Define a new attribute, DW_AT_main_subprogram, which may be used
with in a DW_TAG_compilation_unit or DW_TAG_subprogram DIE, to 
identify that the CU contains the starting "main" function of 
a program and the specified subprogram is the "main" function.

In Figure 2, Attribute Names, (page 11), add an entry for 
DW_AT_main_subprogram, with references to "Compilation unit 
contains main subprogram" and "Subroutine is main subprogram".

In Section 3.1.1, Normal and Partial Compilation Unit Entries
(page 41) add the following:

  11. DW_AT_main_subprogram attribute, whose value is a flag, which
  indicates that the compilation unit contains a subprogram which 
  has been identified as the starting function of the program.  If 
  more than one compilation unit contains this flag, any one may be
  the starting function of the program.

  *Fortran has a PROGRAM statement which is used to specify and 
  provide a user-supplied name for the main function in a program.*

In Section 3.3.1, General Subroutine and Entry Point Information
(page 47) add the following:

  A subprogram entry may have the DW_AT_main_subprogram attribute
  whose value is a flag, which indicates that the subprogram has 
  been identified as the starting function of the program.  If 
  more than one subprogram contains this flag, any one may be 
  the starting function of the program.  

  *Fortran has a PROGRAM statement which is used to specify and 
  provide a user-supplied name for the main function in a program.*

-------------------------------

Accepted with change to add "may contain" instead of "contains" 
in description of Compilation Unit.