// This DIE has the following attributes: DW_AT_comp_dir, DW_AT_dwo_name,
// DW_AT_addr_base.
DwarfTypeUnit *DwarfDebug::constructSkeletonTU(DwarfTypeUnit *TU) {
+ DwarfCompileUnit &CU = static_cast<DwarfCompileUnit &>(
+ *SkeletonHolder.getUnits()[TU->getCU().getUniqueID()]);
DIE *Die = new DIE(dwarf::DW_TAG_type_unit);
- DwarfTypeUnit *NewTU = new DwarfTypeUnit(TU->getUniqueID(), Die, TU->getCU(),
- Asm, this, &SkeletonHolder);
+ DwarfTypeUnit *NewTU =
+ new DwarfTypeUnit(TU->getUniqueID(), Die, CU, Asm, this, &SkeletonHolder);
NewTU->setTypeSignature(TU->getTypeSignature());
NewTU->setType(NULL);
NewTU->initSection(
Asm->getObjFileLowering().getDwarfTypesSection(TU->getTypeSignature()));
+ CU.applyStmtList(*Die);
initSkeletonUnit(TU, Die, NewTU);
return NewTU;
NewTU->setTypeSignature(Signature);
if (useSplitDwarf())
NewTU->setSkeleton(constructSkeletonTU(NewTU));
+ else
+ CU.applyStmtList(*UnitDie);
NewTU->setType(NewTU->createTypeDIE(CTy));
bool UseTheFirstCU =
Asm->OutStreamer.hasRawTextSupport() || (getUniqueID() == 0);
+ stmtListIndex = UnitDie->getValues().size();
+
// DW_AT_stmt_list is a offset of line number information for this
// compile unit in debug_line section. For split dwarf this is
// left in the skeleton CU and so not included.
DwarfLineSectionSym);
}
+void DwarfCompileUnit::applyStmtList(DIE &D) {
+ D.addValue(dwarf::DW_AT_stmt_list,
+ UnitDie->getAbbrev().getData()[stmtListIndex].getForm(),
+ UnitDie->getValues()[stmtListIndex]);
+}
+
void DwarfTypeUnit::emitHeader(const MCSection *ASection,
const MCSymbol *ASectionSym) const {
DwarfUnit::emitHeader(ASection, ASectionSym);
};
class DwarfCompileUnit : public DwarfUnit {
+ /// The attribute index of DW_AT_stmt_list in the compile unit DIE, avoiding
+ /// the need to search for it in applyStmtList.
+ unsigned stmtListIndex;
+
public:
DwarfCompileUnit(unsigned UID, DIE *D, DICompileUnit Node, AsmPrinter *A,
DwarfDebug *DW, DwarfFile *DWU);
void initStmtList(MCSymbol *DwarfLineSectionSym);
+ /// Apply the DW_AT_stmt_list from this compile unit to the specified DIE.
+ void applyStmtList(DIE &D);
+
/// createGlobalVariableDIE - create global variable DIE.
void createGlobalVariableDIE(DIGlobalVariable GV);
; FISSION-NOT: type_signature
; FISSION-LABEL: type_signature = 0x1d02f3be30cc5688
; FISSION: DW_TAG_type_unit
+; FISSION: DW_AT_stmt_list [DW_FORM_sec_offset] (0x00000000)
; FISSION: DW_AT_GNU_dwo_name{{.*}}"bar.dwo"
; FISSION: DW_AT_comp_dir{{.*}}"/tmp/dbginfo"
; FISSION-NOT: type_signature
; CHECK-NOT: type_signature
; CHECK-LABEL: type_signature = 0xe94f6d3843e62d6b
; CHECK: DW_TAG_type_unit
+; SINGLE: DW_AT_stmt_list [DW_FORM_sec_offset] (0x00000000)
+; FISSION-NOT: DW_AT_stmt_list
; CHECK-NOT: NULL
; CHECK-NOT: DW_AT_GNU_odr_signature
; CHECK: DW_TAG_structure_type
; CHECK-NEXT: Offset Name
; CHECK-NEXT: "walrus"
; Type unit for 'bar'
-; SINGLE-NEXT: unit_size = 0x00000023
-; FISSION-NEXT: unit_size = 0x00000024
+; SINGLE-NEXT: unit_size = 0x00000027
+; FISSION-NEXT: unit_size = 0x00000028
; CHECK-NEXT: Offset Name
; CHECK-NEXT: "bar"
-; SINGLE-NEXT: unit_size = 0x0000005d
-; FISSION-NEXT: unit_size = 0x00000024
+; SINGLE-NEXT: unit_size = 0x00000061
+; FISSION-NEXT: unit_size = 0x00000028
; CHECK-NEXT: Offset Name
; CHECK-NEXT: "int"
; CHECK-NEXT: "echidna::capybara::mongoose::fluffy"
-; SINGLE-NEXT: unit_size = 0x0000003a
-; FISSION-NEXT: unit_size = 0x00000024
+; SINGLE-NEXT: unit_size = 0x0000003e
+; FISSION-NEXT: unit_size = 0x00000028
; CHECK-NEXT: Offset Name
; CHECK-NEXT: "wombat"
-; SINGLE-NEXT: unit_size = 0x0000004b
-; FISSION-NEXT: unit_size = 0x00000024
+; SINGLE-NEXT: unit_size = 0x0000004f
+; FISSION-NEXT: unit_size = 0x00000028
; CHECK-NEXT: Offset Name
; CHECK-NEXT: "int"