build_enum_variant_member_di_node in rustc_codegen_llvm::debuginfo::metadata::enums::native - Rust
Description: Build the debuginfo node for `DW_TAG_variant`:

Skip to main content

## build_enum_variant_member_di_node

# Function build_enum_variant_member_di_node

Source

    fn build_enum_variant_member_di_node<'ll, 'tcx>(
        cx: &GenericCx<'ll, FullCx<'ll, 'tcx>>,
        enum_type_and_layout: TyAndLayout<'tcx>,
        variant_part_di_node: &'ll Metadata,
        variant_member_info: &VariantMemberInfo<'_, 'll>,
    ) -> &'ll Metadata

Expand description

Build the debuginfo node for `DW_TAG_variant`:

          DW_TAG_structure_type              (top-level type for enum)
            DW_TAG_variant_part              (variant part)
              DW_AT_discr                    (reference to discriminant DW_TAG_member)
              DW_TAG_member                  (discriminant member)
     --->     DW_TAG_variant                 (variant 1)
     --->     DW_TAG_variant                 (variant 2)
     --->     DW_TAG_variant                 (variant 3)
            DW_TAG_structure_type            (type of variant 1)
            DW_TAG_structure_type            (type of variant 2)
            DW_TAG_structure_type            (type of variant 3)

This node looks like:

    DW_TAG_variant
      DW_AT_discr_value           0
      DW_TAG_member
        DW_AT_name                  None
        DW_AT_type                  <0x000002a1>
        DW_AT_alignment             0x00000002
        DW_AT_data_member_location  0

The DW_AT_discr_value is optional, and is omitted if

- This is the only variant of a univariant enum (i.e. their is no discriminant)
- This is the “untagged” variant of a niche-layout enum (where only the other variants are identified by a single value)

There is only ever a single member, the type of which is a struct that describes the fields of the variant (excluding the discriminant). The name of the member is the name of the variant as given in the source code. The DW_AT_data_member_location is always zero.

Note that the LLVM DIBuilder API is a bit unintuitive here. The DW_TAG_variant subtree (including the DW_TAG_member) is built by a single call to `LLVMRustDIBuilderCreateVariantMemberType()`.