diff --git a/llvm/docs/AMDGPUDwarfExtensionAllowLocationDescriptionOnTheDwarfExpressionStack/AMDGPUDwarfExtensionAllowLocationDescriptionOnTheDwarfExpressionStack.md b/llvm/docs/AMDGPUDwarfExtensionAllowLocationDescriptionOnTheDwarfExpressionStack/AMDGPUDwarfExtensionAllowLocationDescriptionOnTheDwarfExpressionStack.md
--- a/llvm/docs/AMDGPUDwarfExtensionAllowLocationDescriptionOnTheDwarfExpressionStack/AMDGPUDwarfExtensionAllowLocationDescriptionOnTheDwarfExpressionStack.md
+++ b/llvm/docs/AMDGPUDwarfExtensionAllowLocationDescriptionOnTheDwarfExpressionStack/AMDGPUDwarfExtensionAllowLocationDescriptionOnTheDwarfExpressionStack.md
@@ -1912,6 +1912,9 @@
the stack becomes the third stack entry, the second entry becomes the top of
the stack, and the third entry becomes the second entry.
+Examples illustrating many of these stack operations are found in Appendix
+D.1.2 on page 289.
+
##### A.2.5.4.2 Control Flow Operations
> NOTE: This section replaces DWARF Version 5 section 2.5.1.5.
@@ -2821,7 +2824,7 @@
`DW_OP_stack_value` pops one stack entry that must be a value V.
An implicit location storage LS is created with the literal value V using
- the size, encoding, and enianity specified by V's base type.
+ the size, encoding, and endianity specified by V's base type.
It pushes a location description L with one implicit location description SL
on the stack. SL specifies LS with a bit offset of 0.
@@ -2835,9 +2838,9 @@
implicit pointer values produced by dereferencing implicit location
descriptions created by the `DW_OP_implicit_pointer` operation.
- > NOTE: Since location descriptions are allowed on the stack, the
- > `DW_OP_stack_value` operation no longer terminates the DWARF operation
- > expression execution as in DWARF Version 5.
+ Note: Since location descriptions are allowed on the stack, the
+ `DW_OP_stack_value` operation no longer terminates the DWARF operation
+ expression execution as in DWARF Version 5.
3. `DW_OP_implicit_pointer`
@@ -3372,9 +3375,17 @@
### A.4.1 Data Object Entries
-1. Any debugging information entry describing a data object (which includes
- variables and parameters) or common blocks may have a `DW_AT_location`
- attribute, whose value is a DWARF expression E.
+Program variables, formal parameters and constants are represented by debugging
+information entries with the tags `DW_TAG_variable`, `DW_TAG_formal_parameter`
+and `DW_TAG_constant`, respectively.
+
+*The tag `DW_TAG_constant` is used for languages that have true named constants.*
+
+The debugging information entry for a program variable, formal parameter or
+constant may have the following attributes:
+
+1. A `DW_AT_location` attribute, whose value is a DWARF expression E that
+ describes the location of a variable or parameter at run-time.
The result of the attribute is obtained by evaluating E with a context that
has a result kind of a location description, an unspecified object, the
@@ -3412,6 +3423,18 @@
> the location description of any variable regardless of how it is
> optimized.
+### A.4.2 Common Block Entries
+
+A common block entry also has a DW_AT_location attribute whose value is a DWARF
+expression E that describes the location of the common block at run-time. The
+result of the attribute is obtained by evaluating E with a context that has a
+result kind of a location description, an unspecified object, the compilation
+unit that contains E, an empty initial stack, and other context elements
+corresponding to the source language thread of execution upon which the user is
+focused, if any. The result of the evaluation is the location description of the
+base of the common block. See 2.5.4.2 Control Flow Operations for special
+evaluation rules used by the DW_OP_call* operations.
+
## A.5 Type Entries
> NOTE: This section provides changes to existing debugger information entry
@@ -3641,8 +3664,9 @@
7. val_expression(E)
- The previous value of this register is the value produced by evaluating the
- DWARF operation expression E (see [2.5.4 DWARF Operation
+ The previous value of this register is located at the implicit location
+ description created from the value produced by evaluating the DWARF
+ operation expression E (see [2.5.4 DWARF Operation
Expressions](#dwarf-operation-expressions)).
E is evaluated with the current context, except the result kind is a value,
@@ -3829,17 +3853,17 @@
The `DW_CFA_def_cfa` instruction takes two unsigned LEB128 operands
representing a register number R and a (non-factored) byte displacement B.
- The required action is to define the current CFA rule to be the result of
- evaluating the DWARF operation expression `DW_OP_bregx R, B` as a location
- description.
+ The required action is to define the current CFA rule to be equivalent to
+ the result of evaluating the DWARF operation expression `DW_OP_bregx R, B`
+ as a location description.
2. `DW_CFA_def_cfa_sf`
The `DW_CFA_def_cfa_sf` instruction takes two operands: an unsigned LEB128
value representing a register number R and a signed LEB128 factored byte
displacement B. The required action is to define the current CFA rule to be
- the result of evaluating the DWARF operation expression `DW_OP_bregx R, B *
- data_alignment_factor` as a location description.
+ equivalent to the result of evaluating the DWARF operation expression
+ `DW_OP_bregx R, B * data_alignment_factor` as a location description.
The action is the same as `DW_CFA_def_cfa`, except that the second
operand is signed and factored.
@@ -3848,9 +3872,9 @@
The `DW_CFA_def_cfa_register` instruction takes a single unsigned LEB128
operand representing a register number R. The required action is to define
- the current CFA rule to be the result of evaluating the DWARF operation
- expression `DW_OP_bregx R, B` as a location description. B is the old CFA
- byte displacement.
+ the current CFA rule to be equivalent to the result of evaluating the DWARF
+ operation expression `DW_OP_bregx R, B` as a location description. B is the
+ old CFA byte displacement.
If the subprogram has no current CFA rule, or the rule was defined by a
`DW_CFA_def_cfa_expression` instruction, then the DWARF is ill-formed.
@@ -3859,9 +3883,9 @@
The `DW_CFA_def_cfa_offset` instruction takes a single unsigned LEB128
operand representing a (non-factored) byte displacement B. The required
- action is to define the current CFA rule to be the result of evaluating the
- DWARF operation expression `DW_OP_bregx R, B` as a location description. R
- is the old CFA register number.
+ action is to define the current CFA rule to be equivalent to the result of
+ evaluating the DWARF operation expression `DW_OP_bregx R, B` as a location
+ description. R is the old CFA register number.
If the subprogram has no current CFA rule, or the rule was defined by a
`DW_CFA_def_cfa_expression` instruction, then the DWARF is ill-formed.
@@ -3870,8 +3894,8 @@
The `DW_CFA_def_cfa_offset_sf` instruction takes a signed LEB128 operand
representing a factored byte displacement B. The required action is to
- define the current CFA rule to be the result of evaluating the DWARF
- operation expression `DW_OP_bregx R, B * data_alignment_factor` as a
+ define the current CFA rule to be equivalent to the result of evaluating the
+ DWARF operation expression `DW_OP_bregx R, B * data_alignment_factor` as a
location description. R is the old CFA register number.
If the subprogram has no current CFA rule, or the rule was defined by a
@@ -3884,10 +3908,10 @@
The `DW_CFA_def_cfa_expression` instruction takes a single operand encoded
as a `DW_FORM_exprloc` value representing a DWARF operation expression E.
- The required action is to define the current CFA rule to be the result of
- evaluating E with the current context, except the result kind is a location
- description, the compilation unit is unspecified, the object is unspecified,
- and an empty initial stack.
+ The required action is to define the current CFA rule to be equivalent to
+ the result of evaluating E with the current context, except the result kind
+ is a location description, the compilation unit is unspecified, the object
+ is unspecified, and an empty initial stack.
See [6.4.2 Call Frame Instructions](#call-frame-instructions) regarding
restrictions on the DWARF expression operations that can be used in E.
diff --git a/llvm/docs/AMDGPUDwarfExtensionsForHeterogeneousDebugging.rst b/llvm/docs/AMDGPUDwarfExtensionsForHeterogeneousDebugging.rst
--- a/llvm/docs/AMDGPUDwarfExtensionsForHeterogeneousDebugging.rst
+++ b/llvm/docs/AMDGPUDwarfExtensionsForHeterogeneousDebugging.rst
@@ -54,7 +54,7 @@
textual changes for the extensions relative to the DWARF Version 5 standard.
There are a number of notes included that raise open questions, or provide
alternative approaches that may be worth considering. Then appendix
-:ref:`amdgpu-dwarf-examples` links to the AMD GPU specific usage of the
+:ref:`amdgpu-dwarf-further-examples` links to the AMD GPU specific usage of the
extensions that includes an example. Finally, appendix
:ref:`amdgpu-dwarf-references` provides references to further information.
@@ -448,7 +448,7 @@
location description that is a vector on another location description is needed.
An example that uses these operations is referenced in the
-:ref:`amdgpu-dwarf-examples` appendix.
+:ref:`amdgpu-dwarf-further-examples` appendix.
See ``DW_OP_LLVM_select_bit_piece`` and ``DW_OP_LLVM_extend`` in
:ref:`amdgpu-dwarf-composite-location-description-operations`.
@@ -509,23 +509,22 @@
mask register or to a saved mask when in whole wavefront execution mode.
An example that uses these attributes is referenced in the
-:ref:`amdgpu-dwarf-examples` appendix.
+:ref:`amdgpu-dwarf-further-examples` appendix.
See ``DW_AT_LLVM_lane_pc`` and ``DW_AT_LLVM_active_lane`` in
:ref:`amdgpu-dwarf-composite-location-description-operations`.
-2.14 Define Source Language Address Classes
+2.14 Define Source Language Memory Classes
-------------------------------------------
AMDGPU supports languages, such as OpenCL [:ref:`OpenCL `],
-that define source language address classes. Support is added to define language
-specific address classes so they can be used in a consistent way by consumers.
+that define source language memory classes. Support is added to define language
+specific memory spaces so they can be used in a consistent way by consumers.
-It would also be desirable to add support for using address classes in defining
-source language types. DWARF Version 5 only supports using target architecture
-specific address spaces.
+Support for using memory spaces in defining source language types and data
+object allocation is also added.
-See :ref:`amdgpu-dwarf-segment_addresses`.
+See :ref:`amdgpu-dwarf-memory-spaces`.
2.15 Define Augmentation Strings to Support Multiple Extensions
---------------------------------------------------------------
@@ -730,16 +729,19 @@
.. table:: Attribute names
:name: amdgpu-dwarf-attribute-names-table
- =========================== ====================================
- Attribute Usage
- =========================== ====================================
- ``DW_AT_LLVM_active_lane`` SIMT active lanes (see :ref:`amdgpu-dwarf-low-level-information`)
- ``DW_AT_LLVM_augmentation`` Compilation unit augmentation string (see :ref:`amdgpu-dwarf-full-and-partial-compilation-unit-entries`)
- ``DW_AT_LLVM_lane_pc`` SIMT lane program location (see :ref:`amdgpu-dwarf-low-level-information`)
- ``DW_AT_LLVM_lanes`` SIMT lane count (see :ref:`amdgpu-dwarf-low-level-information`)
- ``DW_AT_LLVM_iterations`` Concurrent iteration count (see :ref:`amdgpu-dwarf-low-level-information`)
- ``DW_AT_LLVM_vector_size`` Base type vector size (see :ref:`amdgpu-dwarf-base-type-entries`)
- =========================== ====================================
+ ============================ ====================================
+ Attribute Usage
+ ============================ ====================================
+ ``DW_AT_LLVM_active_lane`` SIMT active lanes (see :ref:`amdgpu-dwarf-low-level-information`)
+ ``DW_AT_LLVM_augmentation`` Compilation unit augmentation string (see :ref:`amdgpu-dwarf-full-and-partial-compilation-unit-entries`)
+ ``DW_AT_LLVM_lane_pc`` SIMT lane program location (see :ref:`amdgpu-dwarf-low-level-information`)
+ ``DW_AT_LLVM_lanes`` SIMT lane count (see :ref:`amdgpu-dwarf-low-level-information`)
+ ``DW_AT_LLVM_iterations`` Concurrent iteration count (see :ref:`amdgpu-dwarf-low-level-information`)
+ ``DW_AT_LLVM_vector_size`` Base type vector size (see :ref:`amdgpu-dwarf-base-type-entries`)
+ ``DW_AT_LLVM_address_space`` Architecture specific address space (see :ref:`amdgpu-dwarf-address-spaces`)
+ ``DW_AT_LLVM_memory_space`` Pointer or reference types (see 5.3 "Type Modifier Entries")
+ Data objects (see 4.1 "Data Object Entries")
+ ============================ ====================================
.. _amdgpu-dwarf-expressions:
@@ -803,7 +805,7 @@
+++++++++++++++++++++++++++++++++++++++++++
A DWARF expression is evaluated in a context that can include a number of
-context elements. If multiple context elements are specified then they must be
+context elements. If multiple context elements are specified then they must be
self consistent or the result of the evaluation is undefined. The context
elements that can be specified are:
@@ -1017,9 +1019,9 @@
without such context. If the expression evaluates with an error then it may
indicate the variable has been optimized and so requires more context.*
-*The DWARF expression for call frame information (see
-:ref:`amdgpu-dwarf-call-frame-information`) operations are restricted to those
-that do not require the compilation unit context to be specified.*
+*The DWARF expression for call frame information (see*
+:ref:`amdgpu-dwarf-call-frame-information`\ *) operations are restricted to
+those that do not require the compilation unit context to be specified.*
The DWARF is ill-formed if all the ``address_size`` fields in the headers of all
the entries in the ``.debug_info``, ``.debug_addr``, ``.debug_line``,
@@ -1361,6 +1363,9 @@
the stack becomes the third stack entry, the second entry becomes the top of
the stack, and the third entry becomes the second entry.
+*Examples illustrating many of these stack operations are found in Appendix
+D.1.2 on page 289.*
+
.. _amdgpu-dwarf-control-flow-operations:
A.2.5.4.2 Control Flow Operations
@@ -2170,8 +2175,8 @@
has a byte address equal to A and an address space equal to AS of the
corresponding SL.
-``DW_ASPACE_none`` is defined as the target architecture default address space.
-See :ref:`amdgpu-dwarf-segment_addresses`.
+``DW_ASPACE_LLVM_none`` is defined as the target architecture default address
+space. See :ref:`amdgpu-dwarf-address-spaces`.
If a stack entry is required to be a location description, but it is a value V
with the generic type, then it is implicitly converted to a location description
@@ -2281,7 +2286,7 @@
with the current context of the access operation.*
The DWARF expression is ill-formed if AS is not one of the values defined by
- the target architecture specific ``DW_ASPACE_*`` values.
+ the target architecture specific ``DW_ASPACE_LLVM_*`` values.
See :ref:`amdgpu-dwarf-implicit-location-description-operations` for special
rules concerning implicit pointer values produced by dereferencing implicit
@@ -2396,7 +2401,7 @@
the address space identifier.
The DWARF expression is ill-formed if AS is not one of the values defined by
- the target architecture specific ``DW_ASPACE_*`` values.
+ the target architecture specific ``DW_ASPACE_LLVM_*`` values.
.. note::
@@ -2495,7 +2500,7 @@
``DW_OP_stack_value`` pops one stack entry that must be a value V.
An implicit location storage LS is created with the literal value V using
- the size, encoding, and enianity specified by V's base type.
+ the size, encoding, and endianity specified by V's base type.
It pushes a location description L with one implicit location description SL
on the stack. SL specifies LS with a bit offset of 0.
@@ -2510,11 +2515,9 @@
descriptions created by the ``DW_OP_implicit_pointer`` and
``DW_OP_LLVM_aspace_implicit_pointer`` operations.
- .. note::
-
- Since location descriptions are allowed on the stack, the
- ``DW_OP_stack_value`` operation no longer terminates the DWARF operation
- expression execution as in DWARF Version 5.
+ Note: Since location descriptions are allowed on the stack, the
+ ``DW_OP_stack_value`` operation no longer terminates the DWARF operation
+ expression execution as in DWARF Version 5.
3. ``DW_OP_implicit_pointer``
@@ -2635,7 +2638,7 @@
AS.
The DWARF expression is ill-formed if AS is not one of the values defined by
- the target architecture specific ``DW_ASPACE_*`` values.
+ the target architecture specific ``DW_ASPACE_LLVM_*`` values.
.. note::
@@ -2884,6 +2887,13 @@
The DWARF expression is ill-formed if S or C are 0, or if the bit size of M
is less than C.
+ .. note::
+
+ Should the count operand for DW_OP_extend and DW_OP_select_bit_piece be
+ changed to get the count value off the stack? This would allow support for
+ architectures that have variable length vector instructions such as ARM
+ and RISC-V.
+
6. ``DW_OP_LLVM_overlay`` *New*
``DW_OP_LLVM_overlay`` pops four stack entries. The first must be an
@@ -3054,47 +3064,14 @@
The rest of this section is the same as DWARF Version 5 section 2.6.2.
-.. _amdgpu-dwarf-segment_addresses:
+.. _amdgpu-dwarf-address-spaces:
-A.2.12 Segmented Addresses
-~~~~~~~~~~~~~~~~~~~~~~~~~~
+A.2.13 Address Spaces
+~~~~~~~~~~~~~~~~~~~~~
.. note::
- This augments DWARF Version 5 section 2.12.
-
-DWARF address classes are used for source languages that have the concept of
-memory spaces. They are used in the ``DW_AT_address_class`` attribute for
-pointer type, reference type, subprogram, and subprogram type debugger
-information entries.
-
-Each DWARF address class is conceptually a separate source language memory space
-with its own lifetime and aliasing rules. DWARF address classes are used to
-specify the source language memory spaces that pointer type and reference type
-values refer, and to specify the source language memory space in which variables
-are allocated.
-
-The set of currently defined source language DWARF address classes, together
-with source language mappings, is given in
-:ref:`amdgpu-dwarf-address-class-table`.
-
-Vendor defined source language address classes may be defined using codes in the
-range ``DW_ADDR_LLVM_lo_user`` to ``DW_ADDR_LLVM_hi_user``.
-
-.. table:: Address class
- :name: amdgpu-dwarf-address-class-table
-
- ========================= ============ ========= ========= =========
- Address Class Name Meaning C/C++ OpenCL CUDA/HIP
- ========================= ============ ========= ========= =========
- ``DW_ADDR_none`` generic *default* generic *default*
- ``DW_ADDR_LLVM_global`` global global
- ``DW_ADDR_LLVM_constant`` constant constant constant
- ``DW_ADDR_LLVM_group`` thread-group local shared
- ``DW_ADDR_LLVM_private`` thread private
- ``DW_ADDR_LLVM_lo_user``
- ``DW_ADDR_LLVM_hi_user``
- ========================= ============ ========= ========= =========
+ This is a new section after DWARF Version 5 section 2.12 Segmented Addresses.
DWARF address spaces correspond to target architecture specific linear
addressable memory areas. They are used in DWARF expression location
@@ -3110,153 +3087,104 @@
part of the unified global virtual address space accessible by all threads.*
*It is target architecture specific whether multiple DWARF address spaces are
-supported and how source language DWARF address classes map to target
-architecture specific DWARF address spaces. A target architecture may map
-multiple source language DWARF address classes to the same target architecture
-specific DWARF address class. Optimization may determine that variable lifetime
-and access pattern allows them to be allocated in faster scratchpad memory
-represented by a different DWARF address space.*
+supported and how source language memory spaces map to target architecture
+specific DWARF address spaces. A target architecture may map multiple source
+language memory spaces to the same target architecture specific DWARF address
+class. Optimization may determine that variable lifetime and access pattern
+allows them to be allocated in faster scratchpad memory represented by a
+different DWARF address space than the default for the source language memory
+space.*
Although DWARF address space identifiers are target architecture specific,
-``DW_ASPACE_none`` is a common address space supported by all target
-architectures.
+``DW_ASPACE_LLVM_none`` is a common address space supported by all target
+architectures, and defined as the target architecture default address space.
DWARF address space identifiers are used by:
-* The DWARF expression operations: ``DW_OP_LLVM_aspace_bregx``,
- ``DW_OP_LLVM_form_aspace_address``, ``DW_OP_LLVM_aspace_implicit_pointer``,
- and ``DW_OP_xderef*``.
+* The ``DW_AT_LLVM_address_space`` attribute.
+
+* The DWARF expression operations: ``DW_OP_aspace_bregx``,
+ ``DW_OP_form_aspace_address``, ``DW_OP_aspace_implicit_pointer``, and
+ ``DW_OP_xderef*``.
-* The CFI instructions: ``DW_CFA_LLVM_def_aspace_cfa`` and
- ``DW_CFA_LLVM_def_aspace_cfa_sf``.
+* The CFI instructions: ``DW_CFA_def_aspace_cfa`` and
+ ``DW_CFA_def_aspace_cfa_sf``.
.. note::
- With the definition of DWARF address classes and DWARF address spaces in these
- extensions, DWARF Version 5 table 2.7 needs to be updated. It seems it is an
- example of DWARF address spaces and not DWARF address classes.
+ Currently, DWARF defines address class values as being target architecture
+ specific, and defines a DW_AT_address_class attribute. With the removal of
+ DW_AT_segment in DWARF 6, it is unclear how the address class is intended to
+ be used as the term is not used elsewhere. Should these be replaced by this
+ proposal's more complete address space? Or are they intended to represent
+ source language memory spaces such as in OpenCL?
+
+.. _amdgpu-dwarf-memory-spaces:
+
+A.2.14 Memory Spaces
+~~~~~~~~~~~~~~~~~~~~
.. note::
- With the expanded support for DWARF address spaces in these extensions, it may
- be worth examining if DWARF segments can be eliminated and DWARF address
- spaces used instead.
+ This is a new section after DWARF Version 5 section 2.12 Segmented Addresses.
- That may involve extending DWARF address spaces to also be used to specify
- code locations. In target architectures that use different memory areas for
- code and data this would seem a natural use for DWARF address spaces. This
- would allow DWARF expression location descriptions to be used to describe the
- location of subprograms and entry points that are used in expressions
- involving subprogram pointer type values.
+DWARF memory spaces are used for source languages that have the concept of
+memory spaces. They are used in the ``DW_AT_LLVM_memory_space`` attribute for
+pointer type, reference type, variable, formal parameter, and constant debugger
+information entries.
- Currently, DWARF expressions assume data and code resides in the same default
- DWARF address space, and only the address ranges in DWARF location list
- entries and in the ``.debug_aranges`` section for accelerated access for
- addresses allow DWARF segments to be used to distinguish.
+Each DWARF memory space is conceptually a separate source language memory space
+with its own lifetime and aliasing rules. DWARF memory spaces are used to
+specify the source language memory spaces that pointer type and reference type
+values refer, and to specify the source language memory space in which variables
+are allocated.
-.. note::
+Although DWARF memory space identifiers are source language specific,
+``DW_MSPACE_LLVM_none`` is a common memory space supported by all source
+languages, and defined as the source language default memory space.
- Currently, DWARF defines address class values as being target architecture
- specific. It is unclear how language specific memory spaces are intended to be
- represented in DWARF using these.
-
- For example, OpenCL defines memory spaces (called address spaces in OpenCL)
- for ``global``, ``local``, ``constant``, and ``private``. These are part of
- the type system and are modifiers to pointer types. In addition, OpenCL
- defines ``generic`` pointers that can reference either the ``global``,
- ``local``, or ``private`` memory spaces. To support the OpenCL language the
- debugger would want to support casting pointers between the ``generic`` and
- other memory spaces, querying what memory space a ``generic`` pointer value is
- currently referencing, and possibly using pointer casting to form an address
- for a specific memory space out of an integral value.
-
- The method to use to dereference a pointer type or reference type value is
- defined in DWARF expressions using ``DW_OP_xderef*`` which uses a target
- architecture specific address space.
-
- DWARF defines the ``DW_AT_address_class`` attribute on pointer type and
- reference type debugger information entries. It specifies the method to use to
- dereference them. Why is the value of this not the same as the address space
- value used in ``DW_OP_xderef*``? In both cases it is target architecture
- specific and the architecture presumably will use the same set of methods to
- dereference pointers in both cases.
-
- Since ``DW_AT_address_class`` uses a target architecture specific value, it
- cannot in general capture the source language memory space type modifier
- concept. On some architectures all source language memory space modifiers may
- actually use the same method for dereferencing pointers.
-
- One possibility is for DWARF to add an ``DW_TAG_LLVM_address_class_type``
- debugger information entry type modifier that can be applied to a pointer type
- and reference type. The ``DW_AT_address_class`` attribute could be re-defined
- to not be target architecture specific and instead define generalized language
- values (as presented above for DWARF address classes in the table
- :ref:`amdgpu-dwarf-address-class-table`) that will support OpenCL and other
- languages using memory spaces. The ``DW_AT_address_class`` attribute could be
- defined to not be applied to pointer types or reference types, but instead
- only to the new ``DW_TAG_LLVM_address_class_type`` type modifier debugger
- information entry.
-
- If a pointer type or reference type is not modified by
- ``DW_TAG_LLVM_address_class_type`` or if ``DW_TAG_LLVM_address_class_type``
- has no ``DW_AT_address_class`` attribute, then the pointer type or reference
- type would be defined to use the ``DW_ADDR_none`` address class as currently.
- Since modifiers can be chained, it would need to be defined if multiple
- ``DW_TAG_LLVM_address_class_type`` modifiers were legal, and if so if the
- outermost one is the one that takes precedence.
-
- A target architecture implementation that supports multiple address spaces
- would need to map ``DW_ADDR_none`` appropriately to support CUDA-like
- languages that have no address classes in the type system but do support
- variable allocation in address classes. Such variable allocation would result
- in the variable's location description needing an address space.
-
- The approach presented in :ref:`amdgpu-dwarf-address-class-table` is to define
- the default ``DW_ADDR_none`` to be the generic address class and not the
- global address class. This matches how CLANG and LLVM have added support for
- CUDA-like languages on top of existing C++ language support. This allows all
- addresses to be generic by default which matches CUDA-like languages.
+The set of currently defined DWARF memory spaces, together with source language
+mappings, is given in :ref:`amdgpu-dwarf-source-language-memory-spaces-table`.
- An alternative approach is to define ``DW_ADDR_none`` as being the global
- address class and then change ``DW_ADDR_LLVM_global`` to
- ``DW_ADDR_LLVM_generic``. This would match the reality that languages that do
- not support multiple memory spaces only have one default global memory space.
- Generally, in these languages if they expose that the target architecture
- supports multiple address spaces, the default one is still the global memory
- space. Then a language that does support multiple memory spaces has to
- explicitly indicate which pointers have the added ability to reference more
- than the global memory space. However, compilers generating DWARF for
- CUDA-like languages would then have to define every CUDA-like language pointer
- type or reference type using ``DW_TAG_LLVM_address_class_type`` with a
- ``DW_AT_address_class`` attribute of ``DW_ADDR_LLVM_generic`` to match the
- language semantics.
+Vendor defined source language memory spaces may be defined using codes in the
+range ``DW_MSPACE_LLVM_lo_user`` to ``DW_MSPACE_LLVM_hi_user``.
- A new ``DW_AT_LLVM_address_space`` attribute could be defined that can be
- applied to pointer type, reference type, subprogram, and subprogram type to
- describe how objects having the given type are dereferenced or called (the
- role that ``DW_AT_address_class`` currently provides). The values of
- ``DW_AT_LLVM_address_space`` would be target architecture specific and the
- same as used in ``DW_OP_xderef*``.
+.. table:: Source language memory spaces
+ :name: amdgpu-dwarf-source-language-memory-spaces-table
-.. note::
+ =========================== ============ ============== ============== ==============
+ Memory Space Name Meaning C/C++ OpenCL CUDA/HIP
+ =========================== ============ ============== ============== ==============
+ ``DW_MSPACE_LLVM_none`` generic *default* generic *default*
+ ``DW_MSPACE_LLVM_global`` global global
+ ``DW_MSPACE_LLVM_constant`` constant constant constant
+ ``DW_MSPACE_LLVM_group`` thread-group local shared
+ ``DW_MSPACE_LLVM_private`` thread private
+ ``DW_MSPACE_LLVM_lo_user``
+ ``DW_MSPACE_LLVM_hi_user``
+ =========================== ============ ============== ============== ==============
- Some additional changes will be made to support languages such as OpenCL/SyCL
- that allow address class pointer casting and queries.
+.. note::
- This requires the compiler to provide the mapping from address space to
- address class which may be runtime and not target architecture dependent. Some
- implementations may have a one-to-one mapping from source language address
- class to target architecture address space, and some may have a many-to-one
- mapping which requires knowledge of the address class when determining if
- pointer address class casts are allowed.
+ The approach presented in
+ :ref:`amdgpu-dwarf-source-language-memory-spaces-table` is to define the
+ default ``DW_MSPACE_LLVM_none`` to be the generic address class and not the
+ global address class. This matches how CLANG and LLVM have added support for
+ CUDA-like languages on top of existing C++ language support. This allows all
+ addresses to be generic by default which matches CUDA-like languages.
- The changes will likely add an attribute that has an expression provided by
- the compiler to map from address class to address space. The
- ``DW_OP_implicit_pointer`` and ``DW_OP_LLVM_aspace_implicit_pointer``
- operations may be changed as the current IPV definition may not provide enough
- information when used to cast between address classes. Other attributes and
- operations may be needed. The legal casts between address classes may need to
- be defined on a per language address class basis.
+ An alternative approach is to define ``DW_MSPACE_LLVM_none`` as being the
+ global memory space and then change ``DW_MSPACE_LLVM_global`` to
+ ``DW_MSPACE_LLVM_generic``. This would match the reality that languages that
+ do not support multiple memory spaces only have one default global memory
+ space. Generally, in these languages if they expose that the target
+ architecture supports multiple memory spaces, the default one is still the
+ global memory space. Then a language that does support multiple memory spaces
+ has to explicitly indicate which pointers have the added ability to reference
+ more than the global memory space. However, compilers generating DWARF for
+ CUDA-like languages would then have to define every CUDA-like language pointer
+ type or reference type with a ``DW_AT_LLVM_memory_space`` attribute of
+ ``DW_MSPACE_LLVM_generic`` to match the language semantics.
A.3 Program Scope Entries
-------------------------
@@ -3394,6 +3322,23 @@
*Typically, E will use the* ``DW_OP_call_frame_cfa`` *operation or be a
stack pointer register plus or minus some offset.*
+ *The frame base for a subprogram is typically an address relative to the
+ first unit of storage allocated for the subprogram's stack frame. The*
+ ``DW_AT_frame_base`` *attribute can be used in several ways:*
+
+ 1. *In subprograms that need location lists to locate local variables, the*
+ ``DW_AT_frame_base`` *can hold the needed location list, while all
+ variables' location descriptions can be simpler ones involving the frame
+ base.*
+
+ 2. *It can be used in resolving "up-level" addressing within
+ nested routines. (See also* ``DW_AT_static_link``\ *, below)*
+
+ *Some languages support nested subroutines. In such languages, it is
+ possible to reference the local variables of an outer subroutine from within
+ an inner subroutine. The* ``DW_AT_static_link`` *and* ``DW_AT_frame_base``
+ *attributes allow debuggers to support this same kind of referencing.*
+
3. If a ``DW_TAG_subprogram`` or ``DW_TAG_entry_point`` debugger information
entry is lexically nested, it may have a ``DW_AT_static_link`` attribute,
whose value is a DWARF expression E.
@@ -3411,6 +3356,23 @@
The DWARF is ill-formed if L is not comprised of one memory location
description for one of the target architecture specific address spaces.
+ In the context of supporting nested subroutines, the DW_AT_frame_base
+ attribute value obeys the following constraints:
+
+ 1. It computes a value that does not change during the life of the
+ subprogram, and
+
+ 2. The computed value is unique among instances of the same subroutine.
+
+ *For typical DW_AT_frame_base use, this means that a recursive subroutine's
+ stack frame must have non-zero size.*
+
+ *If a debugger is attempting to resolve an up-level reference to a variable,
+ it uses the nesting structure of DWARF to determine which subroutine is the
+ lexical parent and the* ``DW_AT_static_link`` *value to identify the
+ appropriate active frame of the parent. It can then attempt to find the
+ reference within the context of the parent.*
+
.. note::
The following new attributes are added.
@@ -3532,7 +3494,15 @@
A.3.4.2 Call Site Parameters
++++++++++++++++++++++++++++
-1. A ``DW_TAG_call_site_parameter`` debugger information entry may have a
+1. The call site entry may own ``DW_TAG_call_site_parameter`` debugging
+ information entries representing the parameters passed to the call. Call
+ site parameter entries occur in the same order as the corresponding
+ parameters in the source. Each such entry has a ``DW_AT_location`` attribute
+ which is a location description. This location description describes where
+ the parameter is passed (usually either some register, or a memory location
+ expressible as the contents of the stack register plus some offset).
+
+2. A ``DW_TAG_call_site_parameter`` debugger information entry may have a
``DW_AT_call_value`` attribute, whose value is a DWARF operation expression
E\ :sub:`1`\ .
@@ -3563,10 +3533,10 @@
.. note::
- The DWARF Version 5 implies that `DW_OP_push_object_address` may be used
+ The DWARF Version 5 implies that ``DW_OP_push_object_address`` may be used
but does not state what object must be specified in the context. Either
- `DW_OP_push_object_address` cannot be used, or the object to be passed in
- the context must be defined.
+ ``DW_OP_push_object_address`` cannot be used, or the object to be passed
+ in the context must be defined.
The value of the ``DW_AT_call_data_value`` attribute is obtained by
evaluating E\ :sub:`3` with a context that has a result kind of a value, an
@@ -3601,6 +3571,14 @@
registers that have been clobbered, and clobbered memory will no longer have
the value at the time of the call.*
+3. Each call site parameter entry may also have a ``DW_AT_call_parameter``
+ attribute which contains a reference to a ``DW_TAG_formal_parameter`` entry,
+ ``DW_AT_type attribute`` referencing the type of the parameter or
+ ``DW_AT_name`` attribute describing the parameter's name.
+
+*Examples using call site entries and related attributes are found in Appendix
+D.15.*
+
.. _amdgpu-dwarf-lexical-block-entries:
A.3.5 Lexical Block Entries
@@ -3622,9 +3600,17 @@
A.4.1 Data Object Entries
~~~~~~~~~~~~~~~~~~~~~~~~~
-1. Any debugging information entry describing a data object (which includes
- variables and parameters) or common blocks may have a ``DW_AT_location``
- attribute, whose value is a DWARF expression E.
+Program variables, formal parameters and constants are represented by debugging
+information entries with the tags ``DW_TAG_variable``,
+``DW_TAG_formal_parameter`` and ``DW_TAG_constant``, respectively.
+
+*The tag DW_TAG_constant is used for languages that have true named constants.*
+
+The debugging information entry for a program variable, formal parameter or
+constant may have the following attributes:
+
+1. A ``DW_AT_location`` attribute, whose value is a DWARF expression E that
+ describes the location of a variable or parameter at run-time.
The result of the attribute is obtained by evaluating E with a context that
has a result kind of a location description, an unspecified object, the
@@ -3669,6 +3655,19 @@
to be used to push the location description of any variable regardless of
how it is optimized.
+A.4.2 Common Block Entries
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+A common block entry also has a ``DW_AT_location`` attribute whose value is a
+DWARF expression E that describes the location of the common block at run-time.
+The result of the attribute is obtained by evaluating E with a context that has
+a result kind of a location description, an unspecified object, the compilation
+unit that contains E, an empty initial stack, and other context elements
+corresponding to the source language thread of execution upon which the user is
+focused, if any. The result of the evaluation is the location description of the
+base of the common block. See :ref:`amdgpu-dwarf-control-flow-operations` for
+special evaluation rules used by the ``DW_OP_call*`` operations.
+
A.5 Type Entries
----------------
@@ -3708,6 +3707,56 @@
would not be suitable as the type of a stack value entry. But perhaps that
could be replaced by using this attribute.
+ .. note::
+
+ Compare this with the ``DW_AT_GNU_vector`` extension supported by GNU. Is
+ it better to add an attribute to the existing ``DW_TAG_base_type`` debug
+ entry, or allow some forms of ``DW_TAG_array_type`` (those that have the
+ ``DW_AT_GNU_vector`` attribute) to be used as stack entry value types?
+
+A.5.3 Type Modifier Entries
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. note::
+
+ This section augments DWARF Version 5 section 5.3.
+
+A modified type entry describing a pointer or reference type (using
+``DW_TAG_pointer_type``, ``DW_TAG_reference_type`` or
+``DW_TAG_rvalue_reference_type``\ ) may have a ``DW_AT_LLVM_memory_space``
+attribute with a constant value representing a source language specific DWARF
+memory space (see :ref:`amdgpu-dwarf-memory-spaces`). If omitted, defaults to
+DW_MSPACE_LLVM_none.
+
+A modified type entry describing a pointer or reference type (using
+``DW_TAG_pointer_type``, ``DW_TAG_reference_type`` or
+``DW_TAG_rvalue_reference_type``\ ) may have a ``DW_AT_LLVM_address_space``
+attribute with a constant value AS representing an architecture specific DWARF
+address space (see :ref:`amdgpu-dwarf-address-spaces`). If omitted, defaults to
+``DW_ASPACE_LLVM_none``. DR is the offset of a hypothetical debug information
+entry D in the current compilation unit for an integral base type matching the
+address size of AS. An object P having the given pointer or reference type are
+dereferenced as if the ``DW_OP_push_object_address; DW_OP_deref_type DR;
+DW_OP_constu AS; DW_OP_form_aspace_address`` operation expression was evaluated
+with the current context except: the result kind is location description; the
+initial stack is empty; and the object is the location description of P.
+
+.. note::
+
+ What if the current context does not have a current target architecture
+ defined?
+
+.. note::
+
+ With the expanded support for DWARF address spaces, it may be worth examining
+ if they can be used for what was formerly supported by DWARF 5 segments. That
+ would include specifying the address space of all code addresses (compilation
+ units, subprograms, subprogram entries, labels, subprogram types, etc.).
+ Either the code address attributes could be extended to allow a exprloc form
+ (so that ``DW_OP_form_aspace_address`` can be used) or the
+ ``DW_AT_LLVM_address_space`` attribute be allowed on all DIEs that allow
+ ``DW_AT_segment``.
+
A.5.7 Structure, Union, Class and Interface Type Entries
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -3721,7 +3770,7 @@
The result of the attribute is obtained by evaluating a
``DW_OP_LLVM_offset B`` operation with an initial stack comprising the
- location description of the beginning of the containing entity. The
+ location description of the beginning of the containing entity. The
result of the evaluation is the location description of the base of the
member entry.
@@ -3795,6 +3844,10 @@
A.5.18.1 Data Location
++++++++++++++++++++++
+*Some languages may represent objects using descriptors to hold information,
+including a location and/or run-time parameters, about the data that represents
+the value for that object.*
+
1. The ``DW_AT_data_location`` attribute may be used with any type that
provides one or more levels of hidden indirection and/or run-time parameters
in its representation. Its value is a DWARF operation expression E which
@@ -4072,8 +4125,9 @@
(see :ref:`amdgpu-dwarf-operation-expressions`).
*val_expression(E)*
- The previous value of this register is the value produced by evaluating the
- DWARF operation expression E (see :ref:`amdgpu-dwarf-operation-expressions`).
+ The previous value of this register is located at the implicit location
+ description created from the value produced by evaluating the DWARF operation
+ expression E (see :ref:`amdgpu-dwarf-operation-expressions`).
E is evaluated with the current context, except the result kind is a value,
the compilation unit is unspecified, the object is unspecified, and an initial
@@ -4095,6 +4149,20 @@
*architectural*
The rule is defined externally to this specification by the augmenter.
+*This table would be extremely large if actually constructed as described. Most
+of the entries at any point in the table are identical to the ones above them.
+The whole table can be represented quite compactly by recording just the
+differences starting at the beginning address of each subroutine in the
+program.*
+
+The virtual unwind information is encoded in a self-contained section called
+``.debug_frame``. Entries in a ``.debug_frame`` section are aligned on a
+multiple of the address size relative to the start of the section and come in
+two forms: a Common Information Entry (CIE) and a Frame Description Entry (FDE).
+
+*If the range of code addresses for a function is not contiguous, there may be
+multiple CIEs and FDEs corresponding to the parts of that function.*
+
A Common Information Entry (CIE) holds information that is shared among many
Frame Description Entries (FDE). There is at least one CIE in every non-empty
``.debug_frame`` section. A CIE contains the following fields, in order:
@@ -4102,9 +4170,9 @@
1. ``length`` (initial length)
A constant that gives the number of bytes of the CIE structure, not
- including the length field itself. The size of the length field plus the
- value of length must be an integral multiple of the address size specified
- in the ``address_size`` field.
+ including the length field itself (see Section 7.2.2 Initial Length Values).
+ The size of the length field plus the value of length must be an integral
+ multiple of the address size specified in the ``address_size`` field.
2. ``CIE_id`` (4 or 8 bytes, see
:ref:`amdgpu-dwarf-32-bit-and-64-bit-dwarf-formats`)
@@ -4116,8 +4184,9 @@
3. ``version`` (ubyte)
- A version number. This number is specific to the call frame information and
- is independent of the DWARF version number.
+ A version number (see Section 7.24 Call Frame Information). This number is
+ specific to the call frame information and is independent of the DWARF
+ version number.
The value of the CIE version number is 4.
@@ -4216,9 +4285,9 @@
1. ``length`` (initial length)
A constant that gives the number of bytes of the header and instruction
- stream for this subprogram, not including the length field itself. The size
- of the length field plus the value of length must be an integral multiple of
- the address size.
+ stream for this subprogram, not including the length field itself (see
+ Section 7.2.2 Initial Length Values). The size of the length field plus the
+ value of length must be an integral multiple of the address size.
2. ``CIE_pointer`` (4 or 8 bytes, see
:ref:`amdgpu-dwarf-32-bit-and-64-bit-dwarf-formats`)
@@ -4251,6 +4320,11 @@
A.6.4.2 Call Frame Instructions
+++++++++++++++++++++++++++++++
+Each call frame instruction is defined to take 0 or more operands. Some of the
+operands may be encoded as part of the opcode (see
+:ref:`amdgpu-dwarf-call-frame-information-encoding`). The instructions are
+defined in the following sections.
+
Some call frame instructions have operands that are encoded as DWARF operation
expressions E (see :ref:`amdgpu-dwarf-operation-expressions`). The DWARF
operations that can be used in E have the following restrictions:
@@ -4304,8 +4378,8 @@
The ``DW_CFA_def_cfa`` instruction takes two unsigned LEB128 operands
representing a register number R and a (non-factored) byte displacement B.
AS is set to the target architecture default address space identifier. The
- required action is to define the current CFA rule to be the result of
- evaluating the DWARF operation expression ``DW_OP_constu AS;
+ required action is to define the current CFA rule to be equivalent to the
+ result of evaluating the DWARF operation expression ``DW_OP_constu AS;
DW_OP_LLVM_aspace_bregx R, B`` as a location description.
2. ``DW_CFA_def_cfa_sf``
@@ -4313,10 +4387,10 @@
The ``DW_CFA_def_cfa_sf`` instruction takes two operands: an unsigned LEB128
value representing a register number R and a signed LEB128 factored byte
displacement B. AS is set to the target architecture default address space
- identifier. The required action is to define the current CFA rule to be the
- result of evaluating the DWARF operation expression ``DW_OP_constu AS;
- DW_OP_LLVM_aspace_bregx R, B * data_alignment_factor`` as a location
- description.
+ identifier. The required action is to define the current CFA rule to be
+ equivalent to the result of evaluating the DWARF operation expression
+ ``DW_OP_constu AS; DW_OP_LLVM_aspace_bregx R, B * data_alignment_factor`` as
+ a location description.
*The action is the same as* ``DW_CFA_def_cfa``\ *, except that the second
operand is signed and factored.*
@@ -4326,12 +4400,12 @@
The ``DW_CFA_LLVM_def_aspace_cfa`` instruction takes three unsigned LEB128
operands representing a register number R, a (non-factored) byte
displacement B, and a target architecture specific address space identifier
- AS. The required action is to define the current CFA rule to be the result
- of evaluating the DWARF operation expression ``DW_OP_constu AS;
- DW_OP_LLVM_aspace_bregx R, B`` as a location description.
+ AS. The required action is to define the current CFA rule to be equivalent
+ to the result of evaluating the DWARF operation expression ``DW_OP_constu
+ AS; DW_OP_LLVM_aspace_bregx R, B`` as a location description.
If AS is not one of the values defined by the target architecture specific
- ``DW_ASPACE_*`` values then the DWARF expression is ill-formed.
+ ``DW_ASPACE_LLVM_*`` values then the DWARF expression is ill-formed.
4. ``DW_CFA_LLVM_def_aspace_cfa_sf`` *New*
@@ -4339,12 +4413,13 @@
unsigned LEB128 value representing a register number R, a signed LEB128
factored byte displacement B, and an unsigned LEB128 value representing a
target architecture specific address space identifier AS. The required
- action is to define the current CFA rule to be the result of evaluating the
- DWARF operation expression ``DW_OP_constu AS; DW_OP_LLVM_aspace_bregx R, B *
- data_alignment_factor`` as a location description.
+ action is to define the current CFA rule to be equivalent to the result of
+ evaluating the DWARF operation expression ``DW_OP_constu AS;
+ DW_OP_LLVM_aspace_bregx R, B * data_alignment_factor`` as a location
+ description.
If AS is not one of the values defined by the target architecture specific
- ``DW_ASPACE_*`` values, then the DWARF expression is ill-formed.
+ ``DW_ASPACE_LLVM_*`` values, then the DWARF expression is ill-formed.
*The action is the same as* ``DW_CFA_aspace_def_cfa``\ *, except that the
second operand is signed and factored.*
@@ -4353,10 +4428,10 @@
The ``DW_CFA_def_cfa_register`` instruction takes a single unsigned LEB128
operand representing a register number R. The required action is to define
- the current CFA rule to be the result of evaluating the DWARF operation
- expression ``DW_OP_constu AS; DW_OP_LLVM_aspace_bregx R, B`` as a location
- description. B and AS are the old CFA byte displacement and address space
- respectively.
+ the current CFA rule to be equivalent to the result of evaluating the DWARF
+ operation expression ``DW_OP_constu AS; DW_OP_LLVM_aspace_bregx R, B`` as a
+ location description. B and AS are the old CFA byte displacement and address
+ space respectively.
If the subprogram has no current CFA rule, or the rule was defined by a
``DW_CFA_def_cfa_expression`` instruction, then the DWARF is ill-formed.
@@ -4365,10 +4440,10 @@
The ``DW_CFA_def_cfa_offset`` instruction takes a single unsigned LEB128
operand representing a (non-factored) byte displacement B. The required
- action is to define the current CFA rule to be the result of evaluating the
- DWARF operation expression ``DW_OP_constu AS; DW_OP_LLVM_aspace_bregx R, B``
- as a location description. R and AS are the old CFA register number and
- address space respectively.
+ action is to define the current CFA rule to be equivalent to the result of
+ evaluating the DWARF operation expression ``DW_OP_constu AS;
+ DW_OP_LLVM_aspace_bregx R, B`` as a location description. R and AS are the
+ old CFA register number and address space respectively.
If the subprogram has no current CFA rule, or the rule was defined by a
``DW_CFA_def_cfa_expression`` instruction, then the DWARF is ill-formed.
@@ -4377,8 +4452,8 @@
The ``DW_CFA_def_cfa_offset_sf`` instruction takes a signed LEB128 operand
representing a factored byte displacement B. The required action is to
- define the current CFA rule to be the result of evaluating the DWARF
- operation expression ``DW_OP_constu AS; DW_OP_LLVM_aspace_bregx R, B *
+ define the current CFA rule to be equivalent to the result of evaluating the
+ DWARF operation expression ``DW_OP_constu AS; DW_OP_LLVM_aspace_bregx R, B *
data_alignment_factor`` as a location description. R and AS are the old CFA
register number and address space respectively.
@@ -4392,10 +4467,10 @@
The ``DW_CFA_def_cfa_expression`` instruction takes a single operand encoded
as a ``DW_FORM_exprloc`` value representing a DWARF operation expression E.
- The required action is to define the current CFA rule to be the result of
- evaluating E with the current context, except the result kind is a location
- description, the compilation unit is unspecified, the object is unspecified,
- and an empty initial stack.
+ The required action is to define the current CFA rule to be equivalent to
+ the result of evaluating E with the current context, except the result kind
+ is a location description, the compilation unit is unspecified, the object
+ is unspecified, and an empty initial stack.
*See* :ref:`amdgpu-dwarf-call-frame-instructions` *regarding restrictions on
the DWARF expression operations that can be used in E.*
@@ -4602,12 +4677,14 @@
================================== ====== ===================================
Attribute Name Value Classes
================================== ====== ===================================
- DW_AT_LLVM_active_lane 0x3e08 exprloc, loclist
- DW_AT_LLVM_augmentation 0x3e09 string
- DW_AT_LLVM_lanes 0x3e0a constant
- DW_AT_LLVM_lane_pc 0x3e0b exprloc, loclist
- DW_AT_LLVM_vector_size 0x3e0c constant
- DW_AT_LLVM_iterations 0x3e0a constant, exprloc, loclist
+ ``DW_AT_LLVM_active_lane`` 0x3e08 exprloc, loclist
+ ``DW_AT_LLVM_augmentation`` 0x3e09 string
+ ``DW_AT_LLVM_lanes`` 0x3e0a constant
+ ``DW_AT_LLVM_lane_pc`` 0x3e0b exprloc, loclist
+ ``DW_AT_LLVM_vector_size`` 0x3e0c constant
+ ``DW_AT_LLVM_iterations`` 0x3e0a constant, exprloc, loclist
+ ``DW_AT_LLVM_address_space`` TBA constant
+ ``DW_AT_LLVM_memory_space`` TBA constant
================================== ====== ===================================
.. _amdgpu-dwarf-classes-and-forms:
@@ -4617,7 +4694,36 @@
.. note::
- The same as in DWARF Version 5 section 7.5.5.
+ The following modifies the matching text in DWARF Version 5 section 7.5.5.
+
+* reference
+ There are four types of reference.
+
+ - The first type of reference...
+
+ - The second type of reference can identify any debugging information
+ entry within a .debug_info section; in particular, it may refer to an
+ entry in a different compilation unit from the unit containing the
+ reference, and may refer to an entry in a different shared object file.
+ This type of reference (DW_FORM_ref_addr) is an offset from the
+ beginning of the .debug_info section of the target executable or shared
+ object file, or, for references within a supplementary object file, an
+ offset from the beginning of the local .debug_info section; it is
+ relocatable in a relocatable object file and frequently relocated in an
+ executable or shared object file. In the 32-bit DWARF format, this
+ offset is a 4-byte unsigned value; in the 64-bit DWARF format, it is an
+ 8-byte unsigned value (see
+ :ref:`amdgpu-dwarf-32-bit-and-64-bit-dwarf-formats`).
+
+ *A debugging information entry that may be referenced by another
+ compilation unit using DW_FORM_ref_addr must have a global symbolic
+ name.*
+
+ *For a reference from one executable or shared object file to another,
+ the reference is resolved by the debugger to identify the executable or
+ shared object file and the offset into that file's* ``.debug_info``
+ *section in the same fashion as the run time loader, either when the
+ debug information is first read, or when the reference is used.*
A.7.7 DWARF Expressions
~~~~~~~~~~~~~~~~~~~~~~~
@@ -4637,37 +4743,40 @@
This augments DWARF Version 5 section 7.7.1 and Table 7.9.
-The following table gives the encoding of the additional DWARF expression
-operations.
+A DWARF operation expression is stored in a block of contiguous bytes. The bytes
+form a sequence of operations. Each operation is a 1-byte code that identifies
+that operation, followed by zero or more bytes of additional data. The encodings
+for the operations are described in
+:ref:`amdgpu-dwarf-operation-encodings-table`.
.. table:: DWARF Operation Encodings
:name: amdgpu-dwarf-operation-encodings-table
- ================================== ===== ======== ===============================
- Operation Code Number Notes
- of
- Operands
- ================================== ===== ======== ===============================
- DW_OP_LLVM_form_aspace_address 0xe1 0
- DW_OP_LLVM_push_lane 0xe2 0
- DW_OP_LLVM_offset 0xe3 0
- DW_OP_LLVM_offset_uconst 0xe4 1 ULEB128 byte displacement
- DW_OP_LLVM_bit_offset 0xe5 0
- DW_OP_LLVM_call_frame_entry_reg 0xe6 1 ULEB128 register number
- DW_OP_LLVM_undefined 0xe7 0
- DW_OP_LLVM_aspace_bregx 0xe8 2 ULEB128 register number,
- ULEB128 byte displacement
- DW_OP_LLVM_aspace_implicit_pointer 0xe9 2 4-byte or 8-byte offset of DIE,
- SLEB128 byte displacement
- DW_OP_LLVM_piece_end 0xea 0
- DW_OP_LLVM_extend 0xeb 2 ULEB128 bit size,
- ULEB128 count
- DW_OP_LLVM_select_bit_piece 0xec 2 ULEB128 bit size,
- ULEB128 count
- DW_OP_LLVM_push_iteration TBA 0
- DW_OP_LLVM_overlay TBA 0
- DW_OP_LLVM_bit_overlay TBA 0
- ================================== ===== ======== ===============================
+ ====================================== ===== ======== ===============================
+ Operation Code Number Notes
+ of
+ Operands
+ ====================================== ===== ======== ===============================
+ ``DW_OP_LLVM_form_aspace_address`` 0xe1 0
+ ``DW_OP_LLVM_push_lane`` 0xe2 0
+ ``DW_OP_LLVM_offset`` 0xe3 0
+ ``DW_OP_LLVM_offset_uconst`` 0xe4 1 ULEB128 byte displacement
+ ``DW_OP_LLVM_bit_offset`` 0xe5 0
+ ``DW_OP_LLVM_call_frame_entry_reg`` 0xe6 1 ULEB128 register number
+ ``DW_OP_LLVM_undefined`` 0xe7 0
+ ``DW_OP_LLVM_aspace_bregx`` 0xe8 2 ULEB128 register number,
+ ULEB128 byte displacement
+ ``DW_OP_LLVM_aspace_implicit_pointer`` 0xe9 2 4-byte or 8-byte offset of DIE,
+ SLEB128 byte displacement
+ ``DW_OP_LLVM_piece_end`` 0xea 0
+ ``DW_OP_LLVM_extend`` 0xeb 2 ULEB128 bit size,
+ ULEB128 count
+ ``DW_OP_LLVM_select_bit_piece`` 0xec 2 ULEB128 bit size,
+ ULEB128 count
+ ``DW_OP_LLVM_push_iteration`` TBA 0
+ ``DW_OP_LLVM_overlay`` TBA 0
+ ``DW_OP_LLVM_bit_overlay`` TBA 0
+ ====================================== ===== ======== ===============================
A.7.7.3 Location List Expressions
+++++++++++++++++++++++++++++++++
@@ -4695,30 +4804,41 @@
``DW_LANG_LLVM_HIP`` 0x8100 0
==================== ====== ===================
-A.7.13 Address Class and Address Space Encodings
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+A.7.14 Address Space Encodings
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. note::
+
+ This is a new section after DWARF Version 5 section 7.13 "Address Class and
+ Address Space Encodings".
+
+The value of the common address space encoding ``DW_ASPACE_LLVM_none`` is 0.
+
+A.7.15 Memory Space Encodings
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. note::
- This replaces DWARF Version 5 section 7.13.
+ This is a new section after DWARF Version 5 section 7.13 "Address Class and
+ Address Space Encodings".
-The encodings of the constants used for the currently defined address classes
-are given in :ref:`amdgpu-dwarf-address-class-encodings-table`.
+The encodings of the constants used for the currently defined memory spaces
+are given in :ref:`amdgpu-dwarf-memory-space-encodings-table`.
-.. table:: Address class encodings
- :name: amdgpu-dwarf-address-class-encodings-table
+.. table:: Memory space encodings
+ :name: amdgpu-dwarf-memory-space-encodings-table
- ========================== ======
- Address Class Name Value
- ========================== ======
- ``DW_ADDR_none`` 0x0000
- ``DW_ADDR_LLVM_global`` 0x0001
- ``DW_ADDR_LLVM_constant`` 0x0002
- ``DW_ADDR_LLVM_group`` 0x0003
- ``DW_ADDR_LLVM_private`` 0x0004
- ``DW_ADDR_LLVM_lo_user`` 0x8000
- ``DW_ADDR_LLVM_hi_user`` 0xffff
- ========================== ======
+ =========================== ======
+ Memory Space Name Value
+ =========================== ======
+ ``DW_MSPACE_LLVM_none`` 0x0000
+ ``DW_MSPACE_LLVM_global`` 0x0001
+ ``DW_MSPACE_LLVM_constant`` 0x0002
+ ``DW_MSPACE_LLVM_group`` 0x0003
+ ``DW_MSPACE_LLVM_private`` 0x0004
+ ``DW_MSPACE_LLVM_lo_user`` 0x8000
+ ``DW_MSPACE_LLVM_hi_user`` 0xffff
+ =========================== ======
A.7.22 Line Number Information
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -4740,6 +4860,8 @@
``DW_LNCT_LLVM_is_MD5`` 0x2002
==================================== ====================
+.. _amdgpu-dwarf-call-frame-information-encoding:
+
A.7.24 Call Frame Information
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -4753,13 +4875,30 @@
.. table:: Call frame instruction encodings
:name: amdgpu-dwarf-call-frame-instruction-encodings-table
- ============================= ====== ====== ================ ================ =====================
- Instruction High 2 Low 6 Operand 1 Operand 2 Operand 3
- Bits Bits
- ============================= ====== ====== ================ ================ =====================
- DW_CFA_LLVM_def_aspace_cfa 0 0x30 ULEB128 register ULEB128 offset ULEB128 address space
- DW_CFA_LLVM_def_aspace_cfa_sf 0 0x31 ULEB128 register SLEB128 offset ULEB128 address space
- ============================= ====== ====== ================ ================ =====================
+ ================================= ====== ====== ================ ================ =====================
+ Instruction High 2 Low 6 Operand 1 Operand 2 Operand 3
+ Bits Bits
+ ================================= ====== ====== ================ ================ =====================
+ ``DW_CFA_LLVM_def_aspace_cfa`` 0 0x30 ULEB128 register ULEB128 offset ULEB128 address space
+ ``DW_CFA_LLVM_def_aspace_cfa_sf`` 0 0x31 ULEB128 register SLEB128 offset ULEB128 address space
+ ================================= ====== ====== ================ ================ =====================
+
+A.7.32 Type Signature Computation
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. note::
+
+ This augments (in alphebetical order) DWARF Version 5 section 7.32, Table
+ 7.32.
+
+.. table:: Attributes used in type signature computation
+ :name: amdgpu-dwarf-attributes-used-in-type-signature-computation-table
+
+ ================================== =======
+ ``DW_AT_LLVM_address_space``
+ ``DW_AT_LLVM_memory_space``
+ ``DW_AT_LLVM_vector_size``
+ ================================== =======
A. Attributes by Tag Value (Informative)
----------------------------------------
@@ -4774,29 +4913,279 @@
.. table:: Attributes by tag value
:name: amdgpu-dwarf-attributes-by-tag-value-table
- ============================= =============================
- Tag Name Applicable Attributes
- ============================= =============================
- ``DW_TAG_base_type`` * ``DW_AT_LLVM_vector_size``
- ``DW_TAG_compile_unit`` * ``DW_AT_LLVM_augmentation``
- ``DW_TAG_entry_point`` * ``DW_AT_LLVM_active_lane``
- * ``DW_AT_LLVM_lane_pc``
- * ``DW_AT_LLVM_lanes``
- * ``DW_AT_LLVM_iterations``
- ``DW_TAG_inlined_subroutine`` * ``DW_AT_LLVM_active_lane``
- * ``DW_AT_LLVM_lane_pc``
- * ``DW_AT_LLVM_lanes``
- * ``DW_AT_LLVM_iterations``
- ``DW_TAG_subprogram`` * ``DW_AT_LLVM_active_lane``
- * ``DW_AT_LLVM_lane_pc``
- * ``DW_AT_LLVM_lanes``
- * ``DW_AT_LLVM_iterations``
- ============================= =============================
-
-.. _amdgpu-dwarf-examples:
-
-B. Examples
-===========
+ ================================== =============================
+ Tag Name Applicable Attributes
+ ================================== =============================
+ ``DW_TAG_base_type`` * ``DW_AT_LLVM_vector_size``
+ ``DW_TAG_pointer_type`` * ``DW_AT_LLVM_address_space``
+ * ``DW_AT_LLVM_memory_space``
+ ``DW_TAG_reference_type`` * ``DW_AT_LLVM_address_space``
+ * ``DW_AT_LLVM_memory_space``
+ ``DW_TAG_rvalue_reference_type`` * ``DW_AT_LLVM_address_space``
+ * ``DW_AT_LLVM_memory_space``
+ ``DW_TAG_variable`` * ``DW_AT_LLVM_memory_space``
+ ``DW_TAG_formal_parameter`` * ``DW_AT_LLVM_memory_space``
+ ``DW_TAG_constant`` * ``DW_AT_LLVM_memory_space``
+ ``DW_TAG_compile_unit`` * ``DW_AT_LLVM_augmentation``
+ ``DW_TAG_entry_point`` * ``DW_AT_LLVM_active_lane``
+ * ``DW_AT_LLVM_lane_pc``
+ * ``DW_AT_LLVM_lanes``
+ * ``DW_AT_LLVM_iterations``
+ ``DW_TAG_inlined_subroutine`` * ``DW_AT_LLVM_active_lane``
+ * ``DW_AT_LLVM_lane_pc``
+ * ``DW_AT_LLVM_lanes``
+ * ``DW_AT_LLVM_iterations``
+ ``DW_TAG_subprogram`` * ``DW_AT_LLVM_active_lane``
+ * ``DW_AT_LLVM_lane_pc``
+ * ``DW_AT_LLVM_lanes``
+ * ``DW_AT_LLVM_iterations``
+ ================================== =============================
+
+D. Examples (Informative)
+-------------------------
+
+.. note::
+
+ This modifies the corresponding DWARF Version 5 Appendix D examples.
+
+D.1 General Description Examples
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+D.1.3 DWARF Location Description Examples
++++++++++++++++++++++++++++++++++++++++++
+
+``DW_OP_offset_uconst 4``
+ A structure member is four bytes from the start of the structure instance. The
+ location description of the base of the structure instance is assumed to be
+ already on the stack.
+
+``DW_OP_entry_value 1 DW_OP_reg5 DW_OP_offset_uconst 16``
+ The address of the memory location is calculated by adding 16 to the value
+ contained in register 5 upon entering the current subprogram.
+
+D.2 Aggregate Examples
+~~~~~~~~~~~~~~~~~~~~~~
+
+D.2.1 Fortran Simple Array Example
+++++++++++++++++++++++++++++++++++
+
+Figure D.4: Fortran array example: DWARF description
+
+.. code::
+ :number-lines:
+
+ -------------------------------------------------------------------------------
+ ! Description for type of 'ap'
+ !
+ 1$: DW_TAG_array_type
+ ! No name, default (Fortran) ordering, default stride
+ DW_AT_type(reference to REAL)
+ DW_AT_associated(expression= ! Test 'ptr_assoc' flag
+ DW_OP_push_object_address
+ DW_OP_lit ! where n == offset(ptr_assoc)
+ DW_OP_offset
+ DW_OP_deref
+ DW_OP_lit1 ! mask for 'ptr_assoc' flag
+ DW_OP_and)
+ DW_AT_data_location(expression= ! Get raw data address
+ DW_OP_push_object_address
+ DW_OP_lit ! where n == offset(base)
+ DW_OP_offset
+ DW_OP_deref) ! Type of index of array 'ap'
+ 2$: DW_TAG_subrange_type
+ ! No name, default stride
+ DW_AT_type(reference to INTEGER)
+ DW_AT_lower_bound(expression=
+ DW_OP_push_object_address
+ DW_OP_lit ! where n ==
+ ! offset(desc, dims) +
+ ! offset(dims_str, lower_bound)
+ DW_OP_offset
+ DW_OP_deref)
+ DW_AT_upper_bound(expression=
+ DW_OP_push_object_address
+ DW_OP_lit ! where n ==
+ ! offset(desc, dims) +
+ ! offset(dims_str, upper_bound)
+ DW_OP_offset
+ DW_OP_deref)
+ ! Note: for the m'th dimension, the second operator becomes
+ ! DW_OP_lit where
+ ! n == offset(desc, dims) +
+ ! (m-1)*sizeof(dims_str) +
+ ! offset(dims_str, [lower|upper]_bound)
+ ! That is, the expression does not get longer for each successive
+ ! dimension (other than to express the larger offsets involved).
+ 3$: DW_TAG_structure_type
+ DW_AT_name("array_ptr")
+ DW_AT_byte_size(constant sizeof(REAL) + sizeof(desc<1>))
+ 4$: DW_TAG_member
+ DW_AT_name("myvar")
+ DW_AT_type(reference to REAL)
+ DW_AT_data_member_location(constant 0)
+ 5$: DW_TAG_member
+ DW_AT_name("ap");
+ DW_AT_type(reference to 1$)
+ DW_AT_data_member_location(constant sizeof(REAL))
+ 6$: DW_TAG_array_type
+ ! No name, default (Fortran) ordering, default stride
+ DW_AT_type(reference to 3$)
+ DW_AT_allocated(expression= ! Test 'ptr_alloc' flag
+ DW_OP_push_object_address
+ DW_OP_lit ! where n == offset(ptr_alloc)
+ DW_OP_offset
+ DW_OP_deref
+ DW_OP_lit2 ! Mask for 'ptr_alloc' flag
+ DW_OP_and)
+ DW_AT_data_location(expression= ! Get raw data address
+ DW_OP_push_object_address
+ DW_OP_lit ! where n == offset(base)
+ DW_OP_offset
+ DW_OP_deref)
+ 7$: DW_TAG_subrange_type
+ ! No name, default stride
+ DW_AT_type(reference to INTEGER)
+ DW_AT_lower_bound(expression=
+ DW_OP_push_object_address
+ DW_OP_lit ! where n == ...
+ DW_OP_offset
+ DW_OP_deref)
+ DW_AT_upper_bound(expression=
+ DW_OP_push_object_address
+ DW_OP_lit ! where n == ...
+ DW_OP_offset
+ DW_OP_deref)
+ 8$: DW_TAG_variable
+ DW_AT_name("arrayvar")
+ DW_AT_type(reference to 6$)
+ DW_AT_location(expression=
+ ...as appropriate...) ! Assume static allocation
+ -------------------------------------------------------------------------------
+
+D.2.3 Fortran 2008 Assumed-rank Array Example
++++++++++++++++++++++++++++++++++++++++++++++
+
+Figure D.13: Sample DWARF for the array descriptor in Figure D.12
+
+.. code::
+ :number-lines:
+
+ ----------------------------------------------------------------------------
+ 10$: DW_TAG_array_type
+ DW_AT_type(reference to real)
+ DW_AT_rank(expression=
+ DW_OP_push_object_address
+ DW_OP_lit
+ DW_OP_offset
+ DW_OP_deref)
+ DW_AT_data_location(expression=
+ DW_OP_push_object_address
+ DW_OP_lit
+ DW_OP_offset
+ DW_OP_deref)
+ 11$: DW_TAG_generic_subrange
+ DW_AT_type(reference to integer)
+ ! offset of rank in descriptor
+ ! offset of data in descriptor
+ DW_AT_lower_bound(expression=
+ ! Looks up the lower bound of dimension i.
+ ! Operation ! Stack effect
+ ! (implicit) ! i
+ DW_OP_lit ! i sizeof(dim)
+ DW_OP_mul ! dim[i]
+ DW_OP_lit ! dim[i] offsetof(dim)
+ DW_OP_plus ! dim[i]+offset
+ DW_OP_push_object_address ! dim[i]+offsetof(dim) objptr
+ DW_OP_swap ! objptr dim[i]+offsetof(dim)
+ DW_OP_offset ! objptr.dim[i]
+ DW_OP_lit ! objptr.dim[i] offsetof(lb)
+ DW_OP_offset ! objptr.dim[i].lowerbound
+ DW_OP_deref) ! *objptr.dim[i].lowerbound
+ DW_AT_upper_bound(expression=
+ ! Looks up the upper bound of dimension i.
+ DW_OP_lit ! sizeof(dim)
+ DW_OP_mul
+ DW_OP_lit ! offsetof(dim)
+ DW_OP_plus
+ DW_OP_push_object_address
+ DW_OP_swap
+ DW_OP_offset
+ DW_OP_lit ! offset of upperbound in dim
+ DW_OP_offset
+ DW_OP_deref)
+ DW_AT_byte_stride(expression=
+ ! Looks up the byte stride of dimension i.
+ ...
+ ! (analogous to DW_AT_upper_bound)
+ )
+ ----------------------------------------------------------------------------
+
+.. note::
+
+ This example suggests that ``DW_AT_lower_bound`` and ``DW_AT_upper_bound``
+ evaluate an exprloc with an initial stack containing the rank value. The
+ attribute definition should be updated to state this.
+
+D.2.6 Ada Example
++++++++++++++++++
+
+Figure D.20: Ada example: DWARF description
+
+.. code::
+ :number-lines:
+
+ ----------------------------------------------------------------------------
+ 11$: DW_TAG_variable
+ DW_AT_name("M")
+ DW_AT_type(reference to INTEGER)
+ 12$: DW_TAG_array_type
+ ! No name, default (Ada) order, default stride
+ DW_AT_type(reference to INTEGER)
+ 13$: DW_TAG_subrange_type
+ DW_AT_type(reference to INTEGER)
+ DW_AT_lower_bound(constant 1)
+ DW_AT_upper_bound(reference to variable M at 11$)
+ 14$: DW_TAG_variable
+ DW_AT_name("VEC1")
+ DW_AT_type(reference to array type at 12$)
+ ...
+ 21$: DW_TAG_subrange_type
+ DW_AT_name("TEENY")
+ DW_AT_type(reference to INTEGER)
+ DW_AT_lower_bound(constant 1)
+ DW_AT_upper_bound(constant 100)
+ ...
+ 26$: DW_TAG_structure_type
+ DW_AT_name("REC2")
+ 27$: DW_TAG_member
+ DW_AT_name("N")
+ DW_AT_type(reference to subtype TEENY at 21$)
+ DW_AT_data_member_location(constant 0)
+ 28$: DW_TAG_array_type
+ ! No name, default (Ada) order, default stride
+ ! Default data location
+ DW_AT_type(reference to INTEGER)
+ 29$: DW_TAG_subrange_type
+ DW_AT_type(reference to subrange TEENY at 21$)
+ DW_AT_lower_bound(constant 1)
+ DW_AT_upper_bound(reference to member N at 27$)
+ 30$: DW_TAG_member
+ DW_AT_name("VEC2")
+ DW_AT_type(reference to array "subtype" at 28$)
+ DW_AT_data_member_location(machine=
+ DW_OP_lit ! where n == offset(REC2, VEC2)
+ DW_OP_offset)
+ ...
+ 41$: DW_TAG_variable
+ DW_AT_name("OBJ2B")
+ DW_AT_type(reference to REC2 at 26$)
+ DW_AT_location(...as appropriate...)
+ ----------------------------------------------------------------------------
+
+.. _amdgpu-dwarf-further-examples:
+
+C. Further Examples
+===================
The AMD GPU specific usage of the features in these extensions, including
examples, is available at *User Guide for AMDGPU Backend* section
@@ -4811,7 +5200,7 @@
.. _amdgpu-dwarf-references:
-C. References
+D. References
=============
.. _amdgpu-dwarf-AMD:
diff --git a/llvm/docs/AMDGPUUsage.rst b/llvm/docs/AMDGPUUsage.rst
--- a/llvm/docs/AMDGPUUsage.rst
+++ b/llvm/docs/AMDGPUUsage.rst
@@ -1897,46 +1897,46 @@
space register definitions are used. The ``amdgcn`` target only supports the
64-bit process address space.
-.. _amdgpu-dwarf-address-class-identifier:
+.. _amdgpu-dwarf-memory-space-identifier:
-Address Class Identifier
-------------------------
+Memory Space Identifier
+-----------------------
-The DWARF address class represents the source language memory space. See DWARF
+The DWARF memory space represents the source language memory space. See DWARF
Version 5 section 2.12 which is updated by the *DWARF Extensions For
-Heterogeneous Debugging* section :ref:`amdgpu-dwarf-segment_addresses`.
-
-The DWARF address class mapping used for AMDGPU is defined in
-:ref:`amdgpu-dwarf-address-class-mapping-table`.
-
-.. table:: AMDGPU DWARF Address Class Mapping
- :name: amdgpu-dwarf-address-class-mapping-table
-
- ========================= ====== =================
- DWARF AMDGPU
- -------------------------------- -----------------
- Address Class Name Value Address Space
- ========================= ====== =================
- ``DW_ADDR_none`` 0x0000 Generic (Flat)
- ``DW_ADDR_LLVM_global`` 0x0001 Global
- ``DW_ADDR_LLVM_constant`` 0x0002 Global
- ``DW_ADDR_LLVM_group`` 0x0003 Local (group/LDS)
- ``DW_ADDR_LLVM_private`` 0x0004 Private (Scratch)
- ``DW_ADDR_AMDGPU_region`` 0x8000 Region (GDS)
- ========================= ====== =================
-
-The DWARF address class values defined in the *DWARF Extensions For
-Heterogeneous Debugging* section :ref:`amdgpu-dwarf-segment_addresses` are used.
+Heterogeneous Debugging* section :ref:`amdgpu-dwarf-memory-spaces`.
+
+The DWARF memory space mapping used for AMDGPU is defined in
+:ref:`amdgpu-dwarf-memory-space-mapping-table`.
+
+.. table:: AMDGPU DWARF Memory Space Mapping
+ :name: amdgpu-dwarf-memory-space-mapping-table
+
+ =========================== ====== =================
+ DWARF AMDGPU
+ ---------------------------------- -----------------
+ Memory Space Name Value Memory Space
+ =========================== ====== =================
+ ``DW_MSPACE_LLVM_none`` 0x0000 Generic (Flat)
+ ``DW_MSPACE_LLVM_global`` 0x0001 Global
+ ``DW_MSPACE_LLVM_constant`` 0x0002 Global
+ ``DW_MSPACE_LLVM_group`` 0x0003 Local (group/LDS)
+ ``DW_MSPACE_LLVM_private`` 0x0004 Private (Scratch)
+ ``DW_MSPACE_AMDGPU_region`` 0x8000 Region (GDS)
+ =========================== ====== =================
+
+The DWARF memory space values defined in the *DWARF Extensions For Heterogeneous
+Debugging* section :ref:`amdgpu-dwarf-memory-spaces` are used.
In addition, ``DW_ADDR_AMDGPU_region`` is encoded as a vendor extension. This is
available for use for the AMD extension for access to the hardware GDS memory
which is scratchpad memory allocated per device.
-For AMDGPU if no ``DW_AT_address_class`` attribute is present, then the default
-address class of ``DW_ADDR_none`` is used.
+For AMDGPU if no ``DW_AT_LLVM_memory_space`` attribute is present, then the
+default memory space of ``DW_MSPACE_LLVM_none`` is used.
See :ref:`amdgpu-dwarf-address-space-identifier` for information on the AMDGPU
-mapping of DWARF address classes to DWARF address spaces, including address size
+mapping of DWARF memory spaces to DWARF address spaces, including address size
and NULL value.
.. _amdgpu-dwarf-address-space-identifier:
@@ -1946,7 +1946,7 @@
DWARF address spaces correspond to target architecture specific linear
addressable memory areas. See DWARF Version 5 section 2.12 and *DWARF Extensions
-For Heterogeneous Debugging* section :ref:`amdgpu-dwarf-segment_addresses`.
+For Heterogeneous Debugging* section :ref:`amdgpu-dwarf-address-spaces`.
The DWARF address space mapping used for AMDGPU is defined in
:ref:`amdgpu-dwarf-address-space-mapping-table`.
@@ -1954,30 +1954,30 @@
.. table:: AMDGPU DWARF Address Space Mapping
:name: amdgpu-dwarf-address-space-mapping-table
- ======================================= ===== ======= ======== ================= =======================
- DWARF AMDGPU Notes
- --------------------------------------- ----- ---------------- ----------------- -----------------------
- Address Space Name Value Address Bit Size Address Space
- --------------------------------------- ----- ------- -------- ----------------- -----------------------
+ ======================================= ===== ======= ======== ===================== =======================
+ DWARF AMDGPU Notes
+ --------------------------------------- ----- ---------------- --------------------- -----------------------
+ Address Space Name Value Address Bit Size LLVM IR Address Space
+ --------------------------------------- ----- ------- -------- --------------------- -----------------------
.. 64-bit 32-bit
process process
address address
space space
- ======================================= ===== ======= ======== ================= =======================
- ``DW_ASPACE_none`` 0x00 64 32 Global *default address space*
+ ======================================= ===== ======= ======== ===================== =======================
+ ``DW_ASPACE_LLVM_none`` 0x00 64 32 Global *default address space*
``DW_ASPACE_AMDGPU_generic`` 0x01 64 32 Generic (Flat)
``DW_ASPACE_AMDGPU_region`` 0x02 32 32 Region (GDS)
``DW_ASPACE_AMDGPU_local`` 0x03 32 32 Local (group/LDS)
*Reserved* 0x04
- ``DW_ASPACE_AMDGPU_private_lane`` 0x05 32 32 Private (Scratch) *focused lane*
- ``DW_ASPACE_AMDGPU_private_wave`` 0x06 32 32 Private (Scratch) *unswizzled wavefront*
- ======================================= ===== ======= ======== ================= =======================
+ ``DW_ASPACE_AMDGPU_private_lane`` 0x05 32 32 Private (Scratch) *focused lane*
+ ``DW_ASPACE_AMDGPU_private_wave`` 0x06 32 32 Private (Scratch) *unswizzled wavefront*
+ ======================================= ===== ======= ======== ===================== =======================
-See :ref:`amdgpu-address-spaces` for information on the AMDGPU address spaces
-including address size and NULL value.
+See :ref:`amdgpu-address-spaces` for information on the AMDGPU LLVM IR address
+spaces including address size and NULL value.
-The ``DW_ASPACE_none`` address space is the default target architecture address
-space used in DWARF operations that do not specify an address space. It
+The ``DW_ASPACE_LLVM_none`` address space is the default target architecture
+address space used in DWARF operations that do not specify an address space. It
therefore has to map to the global address space so that the ``DW_OP_addr*`` and
related operations can refer to addresses in the program code.