fn build_enum_variant_member_di_node<'ll, 'tcx>(
    cx: &CodegenCx<'ll, 'tcx>,
    enum_type_and_layout: TyAndLayout<'tcx>,
    variant_part_di_node: &'ll DIType,
    variant_member_info: &VariantMemberInfo<'_, 'll>
) -> &'ll DIType
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().