There are two forms for label debug information in DWARF format.
- Labels in a non-inlined function:
DW_TAG_label
DW_AT_name DW_AT_decl_file DW_AT_decl_line DW_AT_low_pc
- Labels in an inlined function:
DW_TAG_label
DW_AT_abstract_origin DW_AT_low_pc
We will collect label information from DBG_LABEL. Before every DBG_LABEL,
we will generate a temporary symbol to denote the location of the label.
The symbol could be used to get DW_AT_low_pc afterwards. So, we create a
mapping between 'inlined label' and DBG_LABEL MachineInstr in DebugHandlerBase.
The DBG_LABEL in the mapping is used to query the symbol before it.
The AbstractLabels in DwarfCompileUnit is used to process labels in inlined
functions.
We also keep a mapping between scope and labels in DwarfFile to help to
generate correct tree structure of DIEs.
Often it's better for readability to just define a struct with named members so we can access .label and .loc instead of .first and .second.