010301.1 A T. Allen Ada Out-of-line package initialization

PURPOSE:

In Ada, frequently packages have associated "elaboration" code, to initialize
objects, to evaluate dynamic expressions in subtype or array bounds in order
to freeze them, to set elaborated flags when needed, etc. We use
DW_TAG_module to describe packages, because they are so similar to Modula's
modules. But we did ignore 3.2.1 with regard to the initialization code.
Instead, we describe it as a separate routine with a DW_AT_artificial
attribute whose value is true.

This allows us to describe the logical nesting relationship of the package,
and the possibly quite distinct nesting relationship of its elaboration
routine, which may be an out-of-line procedure (e.g. for a library package,
or a separate package, among others), or performed in-line as part of another
procedure (e.g. for a simple nested package). In the case where the
procedure was out-of-line, it allowed us to use the preexisting mechanisms
for describing the stack frame, the static link, etc. In the case where the
procedure was in-line, we split its elaboration routine description into
abstract and concrete pieces.

Note that we made no effort to identify the elaboration procedure of a
module, other than to mark it with DW_AT_artificial (which doesn't uniquely
identify it if there are any other artificial routines existing for any other
purposes), and to give it an appropriate name like "foo elaboration routine",
so that it was identified usefully if a user stepped into it or stopped
within it. We considered making a closer association, but threw out the idea
when we couldn't identify any use for that information.

I propose loosening the language in 3.2.1 to allow for this.

WORDING CHANGES:

3.2.1

| If the module contains initialization code, the code may be described in
| one of two ways:
|
|     * The module entry has either a DW_AT_low_pc and DW_AT_high_pc pair of
         attributes or a DW_AT_ranges attribute whose values encode the
         contiguous or non-contiguous address ranges, respectively, of the
         machine instructions generated for the whole module initialization
         code (see Section 2.16). It may also have a DW_AT_entry_pc attribute
         whose value is the address of the first executable instruction of that
         initialization code.
|     * The module entry has a child DW_TAG_subprogram entry that describes
|       an initialization subroutine (see Section 3.3). The DW_TAG_subprogram
|       should contain a DW_AT_artificial attribute whose value is the flag
|       true. This form must be used if the initialization code is an
|       out-of-line subroutine or if it is an in-line subroutine nested within
|       a scope other than the module entry, but is allowed in any case. Note
|       that, if the code is in-line and within the the module entry, then the
|       module entry also will contain a child DW_TAG_inlined_subroutine (see
|       3.3.8.2).


After discussion, it was decided that substantially the same effect could be obtained by changing the wording of section 3.2.1, paragraph 4, to say that a TAG_module may have AT_low_pc and AT_high_pc attributes or AT_ranges, rather than that it must have one of these specified.  This change was adopted.