39#define DEBUG_TYPE "dwarfdebug"
45void DIEDwarfExpression::emitOp(
uint8_t Op,
const char* Comment) {
46 CU.addUInt(getActiveDIE(), dwarf::DW_FORM_data1,
Op);
49void DIEDwarfExpression::emitSigned(int64_t
Value) {
50 CU.addSInt(getActiveDIE(), dwarf::DW_FORM_sdata,
Value);
54 CU.addUInt(getActiveDIE(), dwarf::DW_FORM_udata,
Value);
57void DIEDwarfExpression::emitData1(uint8_t
Value) {
58 CU.addUInt(getActiveDIE(), dwarf::DW_FORM_data1,
Value);
61void DIEDwarfExpression::emitBaseTypeRef(
uint64_t Idx) {
62 CU.addBaseTypeRef(getActiveDIE(), Idx);
65void DIEDwarfExpression::emitRelocatedAddress(
const MCSymbol *Sym) {
66 CU.addLabel(getActiveDIE(), dwarf::DW_FORM_addr, Sym);
70 assert(!IsBuffering &&
"Already buffering?");
77 return TmpDIE.computeSize(AP.getDwarfFormParams());
84 return MachineReg ==
TRI.getFrameRegister(*AP.MF);
97 CU(
CU), SplitLineTable(SplitLineTable) {}
106int64_t DwarfUnit::getDefaultLowerBound()
const {
112 case dwarf::DW_LANG_C:
113 case dwarf::DW_LANG_C89:
114 case dwarf::DW_LANG_C_plus_plus:
117 case dwarf::DW_LANG_Fortran77:
118 case dwarf::DW_LANG_Fortran90:
122 case dwarf::DW_LANG_C99:
123 case dwarf::DW_LANG_ObjC:
124 case dwarf::DW_LANG_ObjC_plus_plus:
129 case dwarf::DW_LANG_Fortran95:
135 case dwarf::DW_LANG_D:
136 case dwarf::DW_LANG_Java:
137 case dwarf::DW_LANG_Python:
138 case dwarf::DW_LANG_UPC:
143 case dwarf::DW_LANG_Ada83:
144 case dwarf::DW_LANG_Ada95:
145 case dwarf::DW_LANG_Cobol74:
146 case dwarf::DW_LANG_Cobol85:
147 case dwarf::DW_LANG_Modula2:
148 case dwarf::DW_LANG_Pascal83:
149 case dwarf::DW_LANG_PLI:
155 case dwarf::DW_LANG_BLISS:
156 case dwarf::DW_LANG_C11:
157 case dwarf::DW_LANG_C_plus_plus_03:
158 case dwarf::DW_LANG_C_plus_plus_11:
159 case dwarf::DW_LANG_C_plus_plus_14:
160 case dwarf::DW_LANG_Dylan:
161 case dwarf::DW_LANG_Go:
162 case dwarf::DW_LANG_Haskell:
163 case dwarf::DW_LANG_OCaml:
164 case dwarf::DW_LANG_OpenCL:
165 case dwarf::DW_LANG_RenderScript:
166 case dwarf::DW_LANG_Rust:
167 case dwarf::DW_LANG_Swift:
172 case dwarf::DW_LANG_Fortran03:
173 case dwarf::DW_LANG_Fortran08:
174 case dwarf::DW_LANG_Julia:
175 case dwarf::DW_LANG_Modula3:
198 if (
DD->getDwarfVersion() == 2)
200 if (isDwoUnit() && !
DD->shareAcrossDWOCUs())
204 !
DD->generateTypeUnits();
209 return DU->getDIE(
D);
226 if (
DD->getDwarfVersion() >= 4)
233 std::optional<dwarf::Form> Form, uint64_t
Integer) {
236 assert(Form != dwarf::DW_FORM_implicit_const &&
237 "DW_FORM_implicit_const is used only for signed integers");
254 for (
int i = 0; i < NumBytes; i++) {
257 c = Ptr64[i / 8] >> (8 * (i & 7));
259 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
273 std::optional<dwarf::Form>
Form;
274 std::optional<APInt> Widened;
276 if (NumBytes > 16 ||
DD->getDwarfVersion() < 5) {
283 Widened = Val.
zext(128);
285 Widened = Val.
sext(128);
288 Form = dwarf::DW_FORM_data16;
291 addIntToBlock(*
Block, Widened ? *Widened : Val);
292 Block->computeSize(
Asm->getDwarfFormParams());
294 if (!
Form.has_value()) {
301 bool Unsigned, std::optional<dwarf::Form> Form) {
303 if (CIBitWidth <= 64) {
315 std::optional<dwarf::Form> Form, int64_t
Integer) {
328 if (
CUNode->isDebugDirectivesOnly())
331 if (
DD->useInlineStrings()) {
338 isDwoUnit() ? dwarf::DW_FORM_GNU_str_index : dwarf::DW_FORM_strp;
340 auto StringPoolEntry =
342 ?
DU->getStringPool().getIndexedEntry(*
Asm,
String)
347 IxForm = dwarf::DW_FORM_strx1;
348 unsigned Index = StringPoolEntry.getIndex();
349 if (Index > 0xffffff)
350 IxForm = dwarf::DW_FORM_strx4;
351 else if (Index > 0xffff)
352 IxForm = dwarf::DW_FORM_strx3;
353 else if (Index > 0xff)
354 IxForm = dwarf::DW_FORM_strx2;
373unsigned DwarfTypeUnit::getOrCreateSourceID(
const DIFile *File) {
376 if (!UsedLineTable) {
377 UsedLineTable =
true;
381 return SplitLineTable->
getFile(
387 bool UseAddrOffsetFormOrExpressions =
388 DD->useAddrOffsetForm() ||
DD->useAddrOffsetExpressions();
391 if (Label->isInSection() && UseAddrOffsetFormOrExpressions)
392 Base =
DD->getSectionLabel(&Label->getSection());
396 if (
DD->getDwarfVersion() >= 5) {
397 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_addrx);
398 addUInt(Die, dwarf::DW_FORM_addrx, Index);
400 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
401 addUInt(Die, dwarf::DW_FORM_GNU_addr_index, Index);
405 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_const4u);
407 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
412 if (
DD->getDwarfVersion() >= 5) {
417 if (
DD->useSplitDwarf()) {
422 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
423 addLabel(Die, dwarf::DW_FORM_addr, Sym);
441 addFlag(Die, dwarf::DW_AT_declaration);
443 addAttribute(Die, dwarf::DW_AT_signature, dwarf::DW_FORM_ref_sig8,
450 const DIEUnit *EntryCU = Entry.getEntry().getUnit();
456 assert(EntryCU ==
CU || !
DD->useSplitDwarf() ||
DD->shareAcrossDWOCUs() ||
459 EntryCU ==
CU ? dwarf::DW_FORM_ref4 : dwarf::DW_FORM_ref_addr,
471 Loc->computeSize(
Asm->getDwarfFormParams());
478 Block->computeSize(
Asm->getDwarfFormParams());
503 addUInt(Die, dwarf::DW_AT_decl_file, std::nullopt, FileID);
504 addUInt(Die, dwarf::DW_AT_decl_line, std::nullopt, Line);
507 addUInt(Die, dwarf::DW_AT_decl_column, std::nullopt, Column);
531 addSourceLine(Die, L->getLine(), L->getColumn(), L->getFile());
569 addUInt(Die, dwarf::DW_AT_const_value,
570 Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata, Val);
579 if (CIBitWidth <= 64) {
585 addIntAsBlock(Die, dwarf::DW_AT_const_value, Val,
Unsigned);
591 DD->getDwarfVersion() >= 4 ? dwarf::DW_AT_linkage_name
592 : dwarf::DW_AT_MIPS_linkage_name,
598 for (
const auto *Element : TParams) {
600 constructTemplateTypeParameterDIE(Buffer, TTP);
602 constructTemplateValueParameterDIE(Buffer, TVP);
608 for (
const auto *Ty : ThrownTypes) {
616 addUInt(Die, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
619 addUInt(Die, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
622 addUInt(Die, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
641 auto *Context = Ty->getScope();
661 auto construct = [&](
const auto *Ty) {
667 if (
DD->generateTypeUnits() && !Ty->isForwardDecl() &&
668 (Ty->getRawName() || CTy->getRawIdentifier())) {
670 if (
MDString *TypeId = CTy->getRawIdentifier()) {
672 DD->addDwarfTypeUnitType(
getCU(), TypeId->getString(), TyDIE, CTy);
675 finishNonUnitTypeDIE(TyDIE, CTy);
689 constructSubrangeDIE(TyDIE, SRTy);
703 if (Ty->getTag() == dwarf::DW_TAG_restrict_type &&
DD->getDwarfVersion() <= 2)
707 if (Ty->getTag() == dwarf::DW_TAG_atomic_type &&
DD->getDwarfVersion() < 5)
712 auto *Context = Ty->getScope();
720 ->createTypeDIE(Context, *ContextDIE, Ty);
725 if (Ty->getName().empty())
727 if (Ty->isForwardDecl())
736 if (CT->getRuntimeLang() == 0 || CT->isObjcClassComplete())
740 DD->addAccelType(*
this,
CUNode->getNameTableKind(), Ty->getName(), TyDIE,
744 if (Ty->getName() != CT->getIdentifier() &&
745 CT->getRuntimeLang() == dwarf::DW_LANG_Swift)
746 DD->addAccelType(*
this,
CUNode->getNameTableKind(), CT->getIdentifier(),
761 assert(Ty &&
"Trying to add a type that doesn't exist?");
767 const auto &Lang = getLanguage();
769 if (!Lang.hasVersionedName())
789 Parents.push_back(Context);
803 Name =
"(anonymous namespace)";
817 addString(Buffer, dwarf::DW_AT_name, Name);
820 if (BTy->
getTag() == dwarf::DW_TAG_unspecified_type)
823 if (BTy->
getTag() != dwarf::DW_TAG_string_type)
824 addUInt(Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
828 addUInt(Buffer, dwarf::DW_AT_byte_size, std::nullopt, SizeInBytes);
829 if (BTy->
getTag() == dwarf::Tag::DW_TAG_base_type) {
837 DataSizeInBits && DataSizeInBits != SizeInBytes * 8)
838 addUInt(Buffer, dwarf::DW_AT_bit_size, std::nullopt, DataSizeInBits);
842 addUInt(Buffer, dwarf::DW_AT_endianity, std::nullopt, dwarf::DW_END_big);
844 addUInt(Buffer, dwarf::DW_AT_endianity, std::nullopt, dwarf::DW_END_little);
847 addUInt(Buffer, dwarf::DW_AT_LLVM_num_extra_inhabitants, std::nullopt,
848 NumExtraInhabitants);
856 addSInt(Buffer, dwarf::DW_AT_binary_scale, dwarf::DW_FORM_sdata,
859 addSInt(Buffer, dwarf::DW_AT_decimal_scale, dwarf::DW_FORM_sdata,
880 addString(Buffer, dwarf::DW_AT_name, Name);
882 if (DIVariable *Var = STy->getStringLength()) {
883 if (
auto *VarDIE =
getDIE(Var))
884 addDIEEntry(Buffer, dwarf::DW_AT_string_length, *VarDIE);
885 }
else if (DIExpression *Expr = STy->getStringLengthExp()) {
886 addBlock(Buffer, dwarf::DW_AT_string_length, Expr);
889 addUInt(Buffer, dwarf::DW_AT_byte_size, std::nullopt,
Size);
892 if (DIExpression *Expr = STy->getStringLocationExp()) {
893 addBlock(Buffer, dwarf::DW_AT_data_location, Expr);
896 if (STy->getEncoding()) {
898 addUInt(Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
902 if (STy->getCharType())
903 addType(Buffer, STy->getCharType());
913 const DIType *FromTy = DTy->getBaseType();
919 addString(Buffer, dwarf::DW_AT_name, Name);
925 if (
Tag == dwarf::DW_TAG_typedef &&
DD->getDwarfVersion() >= 5) {
927 if (AlignInBytes > 0)
928 addUInt(Buffer, dwarf::DW_AT_alignment, dwarf::DW_FORM_udata,
933 if (
Size &&
Tag != dwarf::DW_TAG_pointer_type
934 &&
Tag != dwarf::DW_TAG_ptr_to_member_type
935 &&
Tag != dwarf::DW_TAG_reference_type
936 &&
Tag != dwarf::DW_TAG_rvalue_reference_type)
937 addUInt(Buffer, dwarf::DW_AT_byte_size, std::nullopt,
Size);
939 if (
Tag == dwarf::DW_TAG_ptr_to_member_type)
952 if (std::optional<unsigned> AS = DTy->getDWARFAddressSpace())
953 addUInt(Buffer,
Asm->getTypeAddressSpaceAttribute(), dwarf::DW_FORM_data4,
957 if (
Tag == dwarf::DW_TAG_template_alias)
960 if (
auto PtrAuthData = DTy->getPtrAuthData()) {
961 addUInt(Buffer, dwarf::DW_AT_LLVM_ptrauth_key, dwarf::DW_FORM_data1,
963 if (PtrAuthData->isAddressDiscriminated())
964 addFlag(Buffer, dwarf::DW_AT_LLVM_ptrauth_address_discriminated);
965 addUInt(Buffer, dwarf::DW_AT_LLVM_ptrauth_extra_discriminator,
966 dwarf::DW_FORM_data2, PtrAuthData->extraDiscriminator());
967 if (PtrAuthData->isaPointer())
968 addFlag(Buffer, dwarf::DW_AT_LLVM_ptrauth_isa_pointer);
969 if (PtrAuthData->authenticatesNullValues())
970 addFlag(Buffer, dwarf::DW_AT_LLVM_ptrauth_authenticates_null_values);
974std::optional<unsigned>
977 std::optional<unsigned> ObjectPointerIndex;
978 for (
unsigned i = 1,
N = Args.size(); i <
N; ++i) {
979 const DIType *Ty = Args[i];
981 assert(i ==
N-1 &&
"Unspecified parameter must be the last argument");
986 if (Ty->isArtificial())
987 addFlag(Arg, dwarf::DW_AT_artificial);
989 if (Ty->isObjectPointer()) {
990 assert(!ObjectPointerIndex &&
991 "Can't have more than one object pointer");
992 ObjectPointerIndex = i;
997 return ObjectPointerIndex;
1003 if (Elements.size())
1004 if (
auto RTy = Elements[0])
1007 bool isPrototyped =
true;
1008 if (Elements.size() == 2 && !Elements[1])
1009 isPrototyped =
false;
1016 addFlag(Buffer, dwarf::DW_AT_prototyped);
1019 if (CTy->
getCC() && CTy->
getCC() != dwarf::DW_CC_normal)
1020 addUInt(Buffer, dwarf::DW_AT_calling_convention, dwarf::DW_FORM_data1,
1024 addFlag(Buffer, dwarf::DW_AT_reference);
1027 addFlag(Buffer, dwarf::DW_AT_rvalue_reference);
1040 addString(AnnotationDie, dwarf::DW_AT_name, Name->getString());
1042 addString(AnnotationDie, dwarf::DW_AT_const_value,
Data->getString());
1047 assert(
false &&
"Unsupported annotation value type");
1051void DwarfUnit::addDiscriminant(
DIE &Variant,
Constant *Discriminant,
1054 addInt(Variant, dwarf::DW_AT_discr_value, CI->getValue(), IsUnsigned);
1055 }
else if (
const auto *CA =
1058 unsigned NElems = CA->getNumElements();
1059 if (NElems % 2 != 0) {
1065 auto AddInt = [&](
const APInt &Val) {
1072 for (
unsigned I = 0;
I < NElems;
I += 2) {
1073 APInt LV = CA->getElementAsAPInt(
I);
1074 APInt HV = CA->getElementAsAPInt(
I + 1);
1095 case dwarf::DW_TAG_array_type:
1096 constructArrayTypeDIE(Buffer, CTy);
1098 case dwarf::DW_TAG_enumeration_type:
1099 constructEnumTypeDIE(Buffer, CTy);
1101 case dwarf::DW_TAG_variant_part:
1102 case dwarf::DW_TAG_variant:
1103 case dwarf::DW_TAG_structure_type:
1104 case dwarf::DW_TAG_union_type:
1105 case dwarf::DW_TAG_class_type:
1106 case dwarf::DW_TAG_namelist: {
1109 if (
Tag == dwarf::DW_TAG_variant_part) {
1111 if (Discriminator) {
1123 if (DiscDIE ==
nullptr) {
1124 DiscDIE = &constructMemberDIE(Buffer, Discriminator);
1126 addDIEEntry(Buffer, dwarf::DW_AT_discr, *DiscDIE);
1131 if (
Tag == dwarf::DW_TAG_class_type ||
1132 Tag == dwarf::DW_TAG_structure_type ||
1133 Tag == dwarf::DW_TAG_union_type) {
1134 if (!(
DD->useSplitDwarf() && !
getCU().getSkeleton()) ||
1141 for (
const auto *Element : Elements) {
1147 if (DDTy->getTag() == dwarf::DW_TAG_friend) {
1149 addType(ElemDie, DDTy->getBaseType(), dwarf::DW_AT_friend);
1150 }
else if (DDTy->isStaticMember()) {
1152 }
else if (
Tag == dwarf::DW_TAG_variant_part) {
1156 if (
Constant *CI = DDTy->getDiscriminantValue()) {
1157 addDiscriminant(Variant, CI,
1158 DD->isUnsignedDIType(Discriminator->getBaseType()));
1163 if (
auto *Composite =
1165 Composite !=
nullptr &&
1166 Composite->getTag() == dwarf::DW_TAG_variant) {
1169 constructMemberDIE(Variant, DDTy);
1172 constructMemberDIE(Buffer, DDTy);
1176 StringRef PropertyName = Property->getName();
1177 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
1178 if (Property->getType())
1179 addType(ElemDie, Property->getType());
1181 StringRef GetterName = Property->getGetterName();
1182 if (!GetterName.
empty())
1183 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1184 StringRef SetterName = Property->getSetterName();
1185 if (!SetterName.
empty())
1186 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1187 if (
unsigned PropertyAttributes = Property->getAttributes())
1188 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, std::nullopt,
1189 PropertyAttributes);
1191 constructPropertyDIE(Buffer, Property);
1193 if (Composite->getTag() == dwarf::DW_TAG_variant_part) {
1197 }
else if (
Tag == dwarf::DW_TAG_namelist) {
1198 auto *VarDIE =
getDIE(Element);
1201 addDIEEntry(ItemDie, dwarf::DW_AT_namelist_item, *VarDIE);
1207 addFlag(Buffer, dwarf::DW_AT_APPLE_block);
1210 addFlag(Buffer, dwarf::DW_AT_export_symbols);
1221 addFlag(Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
1225 if (!
Asm->TM.Options.DebugStrictDwarf ||
DD->getDwarfVersion() >= 5) {
1228 CC = dwarf::DW_CC_pass_by_value;
1230 CC = dwarf::DW_CC_pass_by_reference;
1232 addUInt(Buffer, dwarf::DW_AT_calling_convention, dwarf::DW_FORM_data1,
1248 addString(Buffer, dwarf::DW_AT_name, Name);
1256 if (
Tag == dwarf::DW_TAG_enumeration_type ||
1257 Tag == dwarf::DW_TAG_class_type ||
Tag == dwarf::DW_TAG_structure_type ||
1258 Tag == dwarf::DW_TAG_union_type) {
1260 if (
auto *VarDIE =
getDIE(Var))
1261 addDIEEntry(Buffer, dwarf::DW_AT_bit_size, *VarDIE);
1262 }
else if (
auto *Exp =
1264 addBlock(Buffer, dwarf::DW_AT_bit_size, Exp);
1272 addUInt(Buffer, dwarf::DW_AT_byte_size, std::nullopt,
Size);
1275 addUInt(Buffer, dwarf::DW_AT_byte_size, std::nullopt, 0);
1280 addFlag(Buffer, dwarf::DW_AT_declaration);
1292 addUInt(Buffer, dwarf::DW_AT_APPLE_runtime_class, dwarf::DW_FORM_data1,
1297 addUInt(Buffer, dwarf::DW_AT_alignment, dwarf::DW_FORM_udata,
1301 addUInt(Buffer, dwarf::DW_AT_LLVM_num_extra_inhabitants, std::nullopt,
1302 NumExtraInhabitants);
1306void DwarfUnit::constructTemplateTypeParameterDIE(
1315 if (TP->
isDefault() && isCompatibleWithVersion(5))
1316 addFlag(ParamDIE, dwarf::DW_AT_default_value);
1319void DwarfUnit::constructTemplateValueParameterDIE(
1325 if (VP->
getTag() == dwarf::DW_TAG_template_value_parameter)
1329 if (VP->
isDefault() && isCompatibleWithVersion(5))
1330 addFlag(ParamDIE, dwarf::DW_AT_default_value);
1339 if (!GV->hasDLLImportStorageClass()) {
1346 addUInt(*
Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
1349 }
else if (VP->
getTag() == dwarf::DW_TAG_GNU_template_template_param) {
1351 addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1353 }
else if (VP->
getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
1372 Name =
"(anonymous namespace)";
1373 DD->addAccelNamespace(*
this,
CUNode->getNameTableKind(), Name, NDie);
1376 addFlag(NDie, dwarf::DW_AT_export_symbols);
1389 if (!M->getName().empty()) {
1390 addString(MDie, dwarf::DW_AT_name, M->getName());
1393 if (!M->getConfigurationMacros().empty())
1394 addString(MDie, dwarf::DW_AT_LLVM_config_macros,
1395 M->getConfigurationMacros());
1396 if (!M->getIncludePath().empty())
1397 addString(MDie, dwarf::DW_AT_LLVM_include_path, M->getIncludePath());
1398 if (!M->getAPINotesFile().empty())
1399 addString(MDie, dwarf::DW_AT_LLVM_apinotes, M->getAPINotesFile());
1401 addUInt(MDie, dwarf::DW_AT_decl_file, std::nullopt,
1404 addUInt(MDie, dwarf::DW_AT_decl_line, std::nullopt, M->getLineNo());
1406 addFlag(MDie, dwarf::DW_AT_declaration);
1412 const Function *FnHint,
bool Minimal) {
1422 if (
auto *SPDecl = SP->getDeclaration()) {
1441 if (SP->isDefinition())
1445 ->applySubprogramAttributes(SP, SPDie);
1450 DIE &SPDie,
bool Minimal) {
1451 DIE *DeclDie =
nullptr;
1453 if (
auto *SPDecl = SP->getDeclaration()) {
1455 DITypeArray DeclArgs, DefinitionArgs;
1456 DeclArgs = SPDecl->getType()->getTypeArray();
1457 DefinitionArgs = SP->getType()->getTypeArray();
1459 if (DeclArgs.size() && DefinitionArgs.size())
1460 if (DefinitionArgs[0] !=
nullptr && DeclArgs[0] != DefinitionArgs[0])
1461 addType(SPDie, DefinitionArgs[0]);
1463 DeclDie =
getDIE(SPDecl);
1464 assert(DeclDie &&
"This DIE should've already been constructed when the "
1465 "definition DIE was created in "
1466 "getOrCreateSubprogramDIE");
1468 if (
DD->useAllLinkageNames())
1469 DeclLinkageName = SPDecl->getLinkageName();
1472 if (DeclID != DefID)
1473 addUInt(SPDie, dwarf::DW_AT_decl_file, std::nullopt, DefID);
1475 if (SP->getLine() != SPDecl->getLine())
1476 addUInt(SPDie, dwarf::DW_AT_decl_line, std::nullopt, SP->getLine());
1481 if (!Minimal || SP->isNameSimplified())
1488 (
DD->useAllLinkageNames() ||
DU->getAbstractScopeDIEs().lookup(SP)))
1496 addDIEEntry(SPDie, dwarf::DW_AT_specification, *DeclDie);
1501 bool SkipSPAttributes) {
1504 bool SkipSPSourceLocation = SkipSPAttributes &&
1505 !
CUNode->getDebugInfoForProfiling();
1506 if (!SkipSPSourceLocation)
1511 if (!SP->getName().empty())
1512 addString(SPDie, dwarf::DW_AT_name, SP->getName());
1516 if (!SkipSPSourceLocation)
1520 if (SkipSPAttributes)
1526 addFlag(SPDie, dwarf::DW_AT_prototyped);
1528 if (SP->isObjCDirect())
1529 addFlag(SPDie, dwarf::DW_AT_APPLE_objc_direct);
1534 Args = SPTy->getTypeArray();
1539 if (CC && CC != dwarf::DW_CC_normal)
1540 addUInt(SPDie, dwarf::DW_AT_calling_convention, dwarf::DW_FORM_data1, CC);
1545 if (
auto Ty = Args[0])
1548 unsigned VK = SP->getVirtuality();
1550 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
1551 if (SP->getVirtualIndex() != -1u) {
1553 addUInt(*
Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1554 addUInt(*
Block, dwarf::DW_FORM_udata, SP->getVirtualIndex());
1560 if (!SP->isDefinition()) {
1561 addFlag(SPDie, dwarf::DW_AT_declaration);
1568 if (std::optional<unsigned> ObjectPointerIndex =
1574 assert(*ObjectPointerIndex > 0);
1575 addSInt(SPDie, dwarf::DW_AT_object_pointer,
1576 dwarf::DW_FORM_implicit_const, *ObjectPointerIndex - 1);
1583 if (SP->isArtificial())
1584 addFlag(SPDie, dwarf::DW_AT_artificial);
1586 if (!SP->isLocalToUnit())
1587 addFlag(SPDie, dwarf::DW_AT_external);
1589 if (SP->isOptimized())
1590 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
1592 if (
DD->useAppleExtensionAttributes())
1593 if (
unsigned isa =
Asm->getISAEncoding())
1594 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag,
isa);
1596 if (SP->isLValueReference())
1597 addFlag(SPDie, dwarf::DW_AT_reference);
1599 if (SP->isRValueReference())
1600 addFlag(SPDie, dwarf::DW_AT_rvalue_reference);
1602 if (SP->isNoReturn())
1603 addFlag(SPDie, dwarf::DW_AT_noreturn);
1607 if (SP->isExplicit())
1608 addFlag(SPDie, dwarf::DW_AT_explicit);
1610 if (SP->isMainSubprogram())
1611 addFlag(SPDie, dwarf::DW_AT_main_subprogram);
1613 addFlag(SPDie, dwarf::DW_AT_pure);
1614 if (SP->isElemental())
1615 addFlag(SPDie, dwarf::DW_AT_elemental);
1616 if (SP->isRecursive())
1617 addFlag(SPDie, dwarf::DW_AT_recursive);
1619 if (!SP->getTargetFuncName().empty())
1620 addString(SPDie, dwarf::DW_AT_trampoline, SP->getTargetFuncName());
1622 if (
DD->getDwarfVersion() >= 5 && SP->isDeleted())
1623 addFlag(SPDie, dwarf::DW_AT_deleted);
1630 addString(DW_Subrange, dwarf::DW_AT_name, Name);
1632 bool IsUnsigned =
false;
1641 addUInt(DW_Subrange, dwarf::DW_AT_byte_size, std::nullopt,
Size >> 3);
1643 addUInt(DW_Subrange, dwarf::DW_AT_alignment, dwarf::DW_FORM_udata,
1647 addUInt(DW_Subrange, dwarf::DW_AT_endianity, std::nullopt,
1650 addUInt(DW_Subrange, dwarf::DW_AT_endianity, std::nullopt,
1651 dwarf::DW_END_little);
1655 int64_t DefaultLowerBound = getDefaultLowerBound();
1656 dwarf::Form Form = IsUnsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata;
1661 if (
auto *VarDIE =
getDIE(BV))
1664 if (
auto *DTDIE =
getDIE(DT))
1669 const APInt &
Value = BI->getValue();
1670 if (Attr == dwarf::DW_AT_GNU_bias) {
1672 addInt(DW_Subrange, Attr,
Value, IsUnsigned, Form);
1673 }
else if (Attr != dwarf::DW_AT_lower_bound || DefaultLowerBound == -1 ||
1674 Value != DefaultLowerBound || !ForArray)
1675 addInt(DW_Subrange, Attr,
Value, IsUnsigned, Form);
1679 AddBoundTypeEntry(dwarf::DW_AT_lower_bound, SR->
getLowerBound());
1681 AddBoundTypeEntry(dwarf::DW_AT_upper_bound, SR->
getUpperBound());
1683 AddBoundTypeEntry(dwarf::DW_AT_bit_stride, SR->
getStride());
1685 AddBoundTypeEntry(dwarf::DW_AT_GNU_bias, SR->
getBias());
1688void DwarfUnit::constructSubrangeDIE(
DIE &Buffer,
const DISubrange *SR) {
1689 DIE &DW_Subrange =
createAndAddDIE(dwarf::DW_TAG_subrange_type, Buffer);
1691 DIE *IdxTy = getIndexTyDie();
1692 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, *IdxTy);
1698 int64_t DefaultLowerBound = getDefaultLowerBound();
1701 DISubrange::BoundType Bound) ->
void {
1703 if (
auto *VarDIE =
getDIE(BV))
1708 if (Attr == dwarf::DW_AT_count) {
1709 if (BI->getSExtValue() != -1)
1710 addUInt(DW_Subrange, Attr, std::nullopt, BI->getSExtValue());
1711 }
else if (Attr != dwarf::DW_AT_lower_bound || DefaultLowerBound == -1 ||
1712 BI->getSExtValue() != DefaultLowerBound)
1713 addSInt(DW_Subrange, Attr, dwarf::DW_FORM_sdata, BI->getSExtValue());
1717 AddBoundTypeEntry(dwarf::DW_AT_lower_bound, SR->
getLowerBound());
1719 AddBoundTypeEntry(dwarf::DW_AT_count, SR->
getCount());
1721 AddBoundTypeEntry(dwarf::DW_AT_upper_bound, SR->
getUpperBound());
1723 AddBoundTypeEntry(dwarf::DW_AT_byte_stride, SR->
getStride());
1726void DwarfUnit::constructGenericSubrangeDIE(
DIE &Buffer,
1728 DIE &DwGenericSubrange =
1733 DIE *IdxTy = getIndexTyDie();
1734 addDIEEntry(DwGenericSubrange, dwarf::DW_AT_type, *IdxTy);
1736 int64_t DefaultLowerBound = getDefaultLowerBound();
1741 if (
auto *VarDIE =
getDIE(BV))
1744 if (BE->isConstant() &&
1746 *BE->isConstant()) {
1747 if (Attr != dwarf::DW_AT_lower_bound || DefaultLowerBound == -1 ||
1748 static_cast<int64_t
>(BE->getElement(1)) != DefaultLowerBound)
1749 addSInt(DwGenericSubrange, Attr, dwarf::DW_FORM_sdata,
1752 addBlock(DwGenericSubrange, Attr, BE);
1757 AddBoundTypeEntry(dwarf::DW_AT_lower_bound, GSR->
getLowerBound());
1758 AddBoundTypeEntry(dwarf::DW_AT_count, GSR->
getCount());
1759 AddBoundTypeEntry(dwarf::DW_AT_upper_bound, GSR->
getUpperBound());
1760 AddBoundTypeEntry(dwarf::DW_AT_byte_stride, GSR->
getStride());
1763DIE *DwarfUnit::getIndexTyDie() {
1768 StringRef
Name =
"__ARRAY_SIZE_TYPE__";
1782 assert(CTy && CTy->
isVector() &&
"Composite type is not a vector");
1787 assert(BaseTy &&
"Unknown vector element type.");
1792 assert(Elements.size() == 1 &&
1793 Elements[0]->getTag() == dwarf::DW_TAG_subrange_type &&
1794 "Invalid vector element array, expected one element of type subrange");
1796 const auto NumVecElements =
1797 Subrange->getCount()
1803 assert(ActualSize >= (NumVecElements * ElementSize) &&
"Invalid vector size");
1804 return ActualSize != (NumVecElements * ElementSize);
1809 addFlag(Buffer, dwarf::DW_AT_GNU_vector);
1811 addUInt(Buffer, dwarf::DW_AT_byte_size, std::nullopt,
1816 if (
auto *VarDIE =
getDIE(Var))
1817 addDIEEntry(Buffer, dwarf::DW_AT_data_location, *VarDIE);
1819 addBlock(Buffer, dwarf::DW_AT_data_location, Expr);
1823 if (
auto *VarDIE =
getDIE(Var))
1824 addDIEEntry(Buffer, dwarf::DW_AT_associated, *VarDIE);
1826 addBlock(Buffer, dwarf::DW_AT_associated, Expr);
1830 if (
auto *VarDIE =
getDIE(Var))
1831 addDIEEntry(Buffer, dwarf::DW_AT_allocated, *VarDIE);
1833 addBlock(Buffer, dwarf::DW_AT_allocated, Expr);
1837 addSInt(Buffer, dwarf::DW_AT_rank, dwarf::DW_FORM_sdata,
1838 RankConst->getSExtValue());
1839 }
else if (
auto *RankExpr = CTy->
getRankExp()) {
1840 addBlock(Buffer, dwarf::DW_AT_rank, RankExpr);
1844 addUInt(Buffer, dwarf::DW_AT_bit_stride, {}, BitStride->getZExtValue());
1852 for (DINode *
E : Elements) {
1855 constructSubrangeDIE(TyDIE, Element,
true);
1857 constructSubrangeDIE(Buffer, Element);
1859 constructGenericSubrangeDIE(Buffer, Element);
1865 bool IsUnsigned = DTy &&
DD->isUnsignedDIType(DTy);
1867 if (!
Asm->TM.Options.DebugStrictDwarf ||
DD->getDwarfVersion() >= 3)
1869 if (
DD->getDwarfVersion() >= 4 && (CTy->
getFlags() & DINode::FlagEnumClass))
1870 addFlag(Buffer, dwarf::DW_AT_enum_class);
1874 addUInt(Buffer, dwarf::DW_AT_APPLE_enum_kind, dwarf::DW_FORM_data1, *Kind);
1882 for (
const DINode *
E : Elements) {
1889 if (IndexEnumerators)
1897 DIE &SPDie = *
P.first;
1904 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, *NDie);
1912 addString(MemberDie, dwarf::DW_AT_name, Name);
1916 if (
DIType *Resolved = DT->getBaseType())
1928 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1929 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1930 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1932 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1933 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1934 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1936 addBlock(MemberDie, dwarf::DW_AT_data_member_location, VBaseLocationDie);
1947 if (
auto *VarDIE =
getDIE(Var))
1948 addDIEEntry(MemberDie, dwarf::DW_AT_bit_size, *VarDIE);
1950 addBlock(MemberDie, dwarf::DW_AT_bit_size, Exp);
1953 FieldSize =
DD->getBaseTypeSize(DT);
1956 if (
DD->useDWARF2Bitfields())
1957 addUInt(MemberDie, dwarf::DW_AT_byte_size, std::nullopt,
1959 addUInt(MemberDie, dwarf::DW_AT_bit_size, std::nullopt,
Size);
1967 if (!
Asm->TM.Options.DebugStrictDwarf ||
DD->getDwarfVersion() >= 6) {
1968 if (
auto *VarDIE =
getDIE(Var))
1969 addDIEEntry(MemberDie, dwarf::DW_AT_data_bit_offset, *VarDIE);
1971 }
else if (
auto *Expr =
1973 if (!
Asm->TM.Options.DebugStrictDwarf ||
DD->getDwarfVersion() >= 6) {
1974 addBlock(MemberDie, dwarf::DW_AT_data_bit_offset, Expr);
1982 (
uint64_t)std::numeric_limits<int64_t>::max());
1987 uint32_t AlignInBits = FieldSize;
1988 uint32_t AlignMask = ~(AlignInBits - 1);
1991 uint64_t StartBitOffset = Offset - (Offset & AlignMask);
1994 OffsetInBytes = (Offset - StartBitOffset) / 8;
1996 if (
DD->useDWARF2Bitfields()) {
1997 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1998 uint64_t FieldOffset = (HiMark - FieldSize);
1999 Offset -= FieldOffset;
2002 if (
Asm->getDataLayout().isLittleEndian())
2003 Offset = FieldSize - (Offset +
Size);
2006 addSInt(MemberDie, dwarf::DW_AT_bit_offset, dwarf::DW_FORM_sdata,
2009 addUInt(MemberDie, dwarf::DW_AT_bit_offset, std::nullopt,
2011 OffsetInBytes = FieldOffset >> 3;
2013 addUInt(MemberDie, dwarf::DW_AT_data_bit_offset, std::nullopt,
2020 addUInt(MemberDie, dwarf::DW_AT_alignment, dwarf::DW_FORM_udata,
2024 if (
DD->getDwarfVersion() <= 2) {
2026 addUInt(*MemLocationDie, dwarf::DW_FORM_data1,
2027 dwarf::DW_OP_plus_uconst);
2028 addUInt(*MemLocationDie, dwarf::DW_FORM_udata, OffsetInBytes);
2029 addBlock(MemberDie, dwarf::DW_AT_data_member_location, MemLocationDie);
2030 }
else if (!IsBitfield ||
DD->useDWARF2Bitfields()) {
2035 if (
DD->getDwarfVersion() == 3)
2036 addUInt(MemberDie, dwarf::DW_AT_data_member_location,
2037 dwarf::DW_FORM_udata, OffsetInBytes);
2039 addUInt(MemberDie, dwarf::DW_AT_data_member_location, std::nullopt,
2048 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
2049 dwarf::DW_VIRTUALITY_virtual);
2053 if (DIE *PDie =
getDIE(PNode))
2055 dwarf::DW_FORM_ref4, DIEEntry(*PDie));
2058 addFlag(MemberDie, dwarf::DW_AT_artificial);
2063void DwarfUnit::constructPropertyDIE(
DIE &Buffer,
const DIProperty *
P) {
2065 addString(PropertyDie, dwarf::DW_AT_name,
P->getName());
2066 if (DIType *Ty =
P->getType())
2070 if (DINode *BackingStorage =
P->getBackingStorage()) {
2079 DIE &GetterDie = *
P.first;
2086 addDIEEntry(GetterDie, dwarf::DW_AT_property_forward, *TargetDie);
2098 "Static member should belong to a type.");
2101 return StaticMemberDIE;
2106 const DIType *Ty = DT->getBaseType();
2111 addFlag(StaticMemberDIE, dwarf::DW_AT_external);
2112 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
2116 addFlag(StaticMemberDIE, dwarf::DW_AT_artificial);
2127 else if (
auto *CDS =
2129 assert(CDS->getElementType()->isIntegerTy() &&
2130 "Non-integer arrays not supported.");
2132 for (
unsigned I = 0;
I != CDS->getNumElements(); ++
I)
2133 addIntToBlock(*
Block, CDS->getElementAsAPInt(
I));
2134 Block->computeSize(
Asm->getDwarfFormParams());
2135 addBlock(StaticMemberDIE, dwarf::DW_AT_const_value,
Block->BestForm(),
2140 addUInt(StaticMemberDIE, dwarf::DW_AT_alignment, dwarf::DW_FORM_udata,
2143 return &StaticMemberDIE;
2148 if (!
DD->useSectionsAsReferences())
2150 isDwoUnit() ?
"debug_info_dwo" :
"debug_info",
"Length of Unit");
2155 Asm->OutStreamer->AddComment(
"DWARF version number");
2156 unsigned Version =
DD->getDwarfVersion();
2161 Asm->OutStreamer->AddComment(
"DWARF Unit Type");
2163 Asm->OutStreamer->AddComment(
"Address Size (in bytes)");
2164 Asm->emitInt8(
Asm->MAI.getCodePointerSize());
2170 Asm->OutStreamer->AddComment(
"Offset Into Abbrev. Section");
2173 Asm->emitDwarfLengthOrOffset(0);
2175 Asm->emitDwarfSymbolReference(
2179 Asm->OutStreamer->AddComment(
"Address Size (in bytes)");
2180 Asm->emitInt8(
Asm->MAI.getCodePointerSize());
2185 if (!
DD->useSplitDwarf()) {
2190 DD->useSplitDwarf() ? dwarf::DW_UT_split_type
2191 : dwarf::DW_UT_type);
2192 Asm->OutStreamer->AddComment(
"Type Signature");
2193 Asm->OutStreamer->emitIntValue(TypeSignature,
sizeof(TypeSignature));
2194 Asm->OutStreamer->AddComment(
"Type DIE Offset");
2196 Asm->emitDwarfLengthOrOffset(Ty ? Ty->getOffset() : 0);
2209 if (
Asm->doesDwarfUseRelocationsAcrossSections() && !isDwoUnit())
2212 addSectionDelta(Die,
Attribute, Label, Sec);
2215bool DwarfTypeUnit::isDwoUnit()
const {
2242 DU->getStringOffsetsStartSym(),
2247 assert(
DD->getDwarfVersion() >= 5 &&
2248 "DW_AT_rnglists_base requires DWARF version 5 or later");
2251 DU->getRnglistsTableBaseSym(),
2259bool DwarfUnit::isCompatibleWithVersion(
uint16_t Version)
const {
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static unsigned getDwarfVersion(const MachineFunction &MF)
Resolve the DWARF version the way DwarfDebug does.
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static bool hasVectorBeenPadded(const DICompositeType *CTy)
Returns true if the vector's size differs from the sum of sizes of elements the user specified.
Register const TargetRegisterInfo * TRI
static enum BaseType getBaseType(const Value *Val)
Return the baseType for Val which states whether Val is exclusively derived from constant/null,...
static unsigned getSize(unsigned Kind)
APInt bitcastToAPInt() const
Class for arbitrary precision integers.
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
uint64_t getZExtValue() const
Get zero extended value.
unsigned getActiveBits() const
Compute the number of active bits in the value.
unsigned getBitWidth() const
Return the number of bits in the APInt.
LLVM_ABI APInt sext(unsigned width) const
Sign extend to a new width.
const uint64_t * getRawData() const
This function returns a pointer to the internal storage of the APInt.
int64_t getSExtValue() const
Get sign extended value.
void resetUsedFlag(bool HasBeenUsed=false)
Annotations lets you mark points and ranges inside source code, for tests:
This class is intended to be used as a driving class for all asm writers.
MCSymbol * getSymbol(const GlobalValue *GV) const
TargetMachine & TM
Target machine description.
MCContext & OutContext
This is the context for the output file that we are streaming.
const DataLayout & getDataLayout() const
Return information about data layout.
bool doesDwarfUseRelocationsAcrossSections() const
Functions, function parameters, and return types can have attributes to indicate how they should be t...
ConstantFP - Floating Point Values [float, double].
const APFloat & getValueAPF() const
This is the shared class of boolean and integer constants.
const APInt & getValue() const
Return the constant as an APInt value reference.
This is an important base class in LLVM.
Basic type, like 'int' or 'float'.
uint32_t getDataSizeInBits() const
unsigned getEncoding() const
DIExpression * getRankExp() const
DIExpression * getAssociatedExp() const
DIVariable * getAllocated() const
DIExpression * getDataLocationExp() const
DIVariable * getAssociated() const
DIDerivedType * getDiscriminator() const
DIVariable * getDataLocation() const
unsigned getRuntimeLang() const
DIType * getSpecification() const
StringRef getIdentifier() const
DINodeArray getElements() const
DITemplateParameterArray getTemplateParams() const
bool isNameSimplified() const
DIExpression * getAllocatedExp() const
ConstantInt * getBitStrideConst() const
std::optional< uint32_t > getEnumKind() const
DIType * getVTableHolder() const
DINodeArray getAnnotations() const
ConstantInt * getRankConst() const
MDString * getRawIdentifier() const
DIType * getBaseType() const
DINodeArray getAnnotations() const
Get annotations associated with this derived type.
DITemplateParameterArray getTemplateParams() const
Get the template parameters from a template alias.
DIObjCProperty * getObjCProperty() const
LLVM_ABI Constant * getConstant() const
DIEBlock - Represents a block of values.
A simple label difference DIE.
DwarfExpression implementation for singular DW_AT_location.
DIEDwarfExpression(const AsmPrinter &AP, DwarfCompileUnit &CU, DIELoc &DIE)
A pointer to another debug information entry.
A container for inline string values.
static dwarf::Form BestForm(bool IsSigned, uint64_t Int)
Choose the best form for integer.
DIELoc - Represents an expression location.
A container for string pool string values.
virtual const MCSymbol * getCrossSectionRelativeBaseAddress() const
LLVM_ABI DIEUnit(dwarf::Tag UnitTag)
MCSection * getSection() const
Return the section that this DIEUnit will be emitted into.
A structured debug information entry.
DIE & addChild(DIE *Child)
Add a child to the DIE.
static DIE * get(BumpPtrAllocator &Alloc, dwarf::Tag Tag)
LLVM_ABI DIEUnit * getUnit() const
Climb up the parent chain to get the unit that this DIE belongs to.
dwarf::Tag getTag() const
const APInt & getDenominator() const
LLVM_ABI bool isSigned() const
const APInt & getNumerator() const
LLVM_ABI BoundType getLowerBound() const
LLVM_ABI BoundType getCount() const
LLVM_ABI BoundType getUpperBound() const
PointerUnion< DIVariable *, DIExpression * > BoundType
LLVM_ABI BoundType getStride() const
Represents a module in the programming language, for example, a Clang module, or a Fortran module.
DIScope * getScope() const
StringRef getName() const
bool getExportSymbols() const
Tagged DWARF-like metadata node.
LLVM_ABI dwarf::Tag getTag() const
A property of a class or structure.
Base class for scope-like contexts.
LLVM_ABI DIScope * getScope() const
String type, Fortran CHARACTER(n)
Subprogram description. Uses SubclassData1.
BoundType getLowerBound() const
BoundType getBias() const
PointerUnion< ConstantInt *, DIVariable *, DIExpression *, DIDerivedType * > BoundType
BoundType getUpperBound() const
DIType * getBaseType() const
Get the base type this is derived from.
BoundType getStride() const
LLVM_ABI BoundType getUpperBound() const
LLVM_ABI BoundType getStride() const
LLVM_ABI BoundType getLowerBound() const
LLVM_ABI BoundType getCount() const
Type array for a subprogram.
StringRef getName() const
Metadata * getValue() const
bool isLittleEndian() const
uint32_t getNumExtraInhabitants() const
bool isLValueReference() const
bool isObjcClassComplete() const
bool isAppleBlockExtension() const
uint64_t getOffsetInBits() const
StringRef getName() const
bool isForwardDecl() const
bool isTypePassByValue() const
uint64_t getSizeInBits() const
uint32_t getAlignInBytes() const
Metadata * getRawSizeInBits() const
bool isRValueReference() const
bool isArtificial() const
bool getExportSymbols() const
DIScope * getScope() const
bool isTypePassByReference() const
Metadata * getRawOffsetInBits() const
bool isLittleEndian() const
Layout endianness...
static bool isUnsignedDIType(const DIType *Ty)
Return true if type encoding is unsigned.
void addGlobalNameForTypeUnit(StringRef Name, const DIScope *Context)
Add a new global name present in a type unit to this compile unit.
unsigned getOrCreateSourceID(const DIFile *File) override
Look up the source ID for the given file.
void addGlobalTypeUnitType(const DIType *Ty, const DIScope *Context)
Add a new global type present in a type unit to this compile unit.
Collects and handles dwarf debug information.
std::optional< MD5::MD5Result > getMD5AsBytes(const DIFile *File) const
If the File has an MD5 checksum, return it as an MD5Result allocated in the MCContext.
uint16_t getDwarfVersion() const
Returns the Dwarf Version.
dwarf::Form getDwarfSectionOffsetForm() const
Returns a suitable DWARF form to represent a section offset, i.e.
AddressPool & getAddressPool()
bool useSplitDwarf() const
Returns whether or not to change the current debug info for split DWARF.
virtual void disableTemporaryBuffer()=0
Disable emission to the temporary buffer.
virtual unsigned getTemporaryBufferSize()=0
Return the emitted size, in number of bytes, for the data stored in the temporary buffer.
void setMemoryLocationKind()
Lock this down to become a memory location description.
bool addExpression(DIExpressionCursor &&Expr)
Emit all remaining operations in the DIExpressionCursor.
virtual void commitTemporaryBuffer()=0
Commit the data stored in the temporary buffer to the main output.
DwarfExpression(unsigned DwarfVersion, DwarfCompileUnit &CU)
virtual void enableTemporaryBuffer()=0
Start emitting data to the temporary buffer.
DwarfTypeUnit(DwarfCompileUnit &CU, AsmPrinter *A, DwarfDebug *DW, DwarfFile *DWU, unsigned UniqueID, MCDwarfDwoLineTable *SplitLineTable=nullptr)
void addGlobalTypeImpl(const DIType *Ty, const DIE &Die, const DIScope *Context) override
Add a new global type to the compile unit.
DwarfCompileUnit & getCU() override
void emitHeader(bool UseOffsets) override
Emit the header for this unit, not including the initial length field.
void addGlobalName(StringRef Name, const DIE &Die, const DIScope *Context) override
Add a new global name to the compile unit.
virtual DIE * getOrCreateTypeDIE(const MDNode *TyNode)
Find existing DIE or create new DIE for the given type.
DwarfDebug & getDwarfDebug() const
void addThrownTypes(DIE &Die, DINodeArray ThrownTypes)
Add thrown types.
void addStringOffsetsStart()
Add the DW_AT_str_offsets_base attribute to the unit DIE.
void addAnnotation(DIE &Buffer, DINodeArray Annotations)
Add DW_TAG_LLVM_annotation.
std::vector< DIEBlock * > DIEBlocks
A list of all the DIEBlocks in use.
std::vector< DIELoc * > DIELocs
A list of all the DIELocs in use.
void addBlock(DIE &Die, dwarf::Attribute Attribute, DIELoc *Loc)
Add block data.
void addTemplateParams(DIE &Buffer, DINodeArray TParams)
Add template parameters in buffer.
virtual DIE * getOrCreateContextDIE(const DIScope *Context)
Get context owner's DIE.
bool useSegmentedStringOffsetsTable() const
bool applySubprogramDefinitionAttributes(const DISubprogram *SP, DIE &SPDie, bool Minimal)
DIELoc * getDIELoc()
Returns a fresh newly allocated DIELoc.
void updateAcceleratorTables(const DIScope *Context, const DIType *Ty, const DIE &TyDIE)
If this is a named finished type then include it in the list of types for the accelerator tables.
void addAttribute(DIEValueList &Die, dwarf::Attribute Attribute, dwarf::Form Form, T &&Value)
void addOpAddress(DIELoc &Die, const MCSymbol *Sym)
Add a dwarf op address data and value using the form given and an op of either DW_FORM_addr or DW_FOR...
void addUInt(DIEValueList &Die, dwarf::Attribute Attribute, std::optional< dwarf::Form > Form, uint64_t Integer)
Add an unsigned integer attribute data and value.
void addString(DIE &Die, dwarf::Attribute Attribute, StringRef Str)
Add a string attribute data and value.
void addConstantValue(DIE &Die, const ConstantInt *CI, const DIType *Ty)
Add constant value entry in variable DIE.
DIE * getOrCreateNameSpace(const DINamespace *NS)
void insertDIE(const DINode *Desc, DIE *D)
Insert DIE into the map.
void addAccess(DIE &Die, DINode::DIFlags Flags)
Add the accessibility attribute.
void addGlobalType(const DIType *Ty, const DIE &Die, const DIScope *Context)
DIE * createTypeDIE(const DIScope *Context, DIE &ContextDIE, const DIType *Ty)
Creates type DIE with specific context.
bool shouldPlaceInUnitDIE(const DISubprogram *SP, bool Minimal)
DenseMap< DIE *, const DINode * > ContainingTypeMap
This map is used to keep track of subprogram DIEs that need DW_AT_containing_type attribute.
const DICompileUnit * CUNode
MDNode for the compile unit.
virtual unsigned getOrCreateSourceID(const DIFile *File)=0
Look up the source ID for the given file.
virtual DIE * getOrCreateSubprogramDIE(const DISubprogram *SP, const Function *FnHint, bool Minimal=false)
DIE * getOrCreateSubprogramContextDIE(const DISubprogram *SP, bool IgnoreScope)
virtual void addGlobalTypeImpl(const DIType *Ty, const DIE &Die, const DIScope *Context)=0
Add a new global type to the compile unit.
void addDIETypeSignature(DIE &Die, uint64_t Signature)
Add a type's DW_AT_signature and set the declaration flag.
virtual DwarfCompileUnit & getCU()=0
DIE * getDIE(const DINode *D) const
Returns the DIE map slot for the specified debug variable.
void constructPropertyForwardDIEs()
virtual unsigned getHeaderSize() const
Compute the size of a header for this unit, not including the initial length field.
MCSymbol * LabelBegin
The start of the unit within its section.
void addSInt(DIEValueList &Die, dwarf::Attribute Attribute, std::optional< dwarf::Form > Form, int64_t Integer)
Add an signed integer attribute data and value.
DwarfUnit(dwarf::Tag, const DICompileUnit *Node, AsmPrinter *A, DwarfDebug *DW, DwarfFile *DWU, unsigned UniqueID=0)
void addLabelDelta(DIEValueList &Die, dwarf::Attribute Attribute, const MCSymbol *Hi, const MCSymbol *Lo)
Add a label delta attribute data and value.
void addLinkageName(DIE &Die, StringRef LinkageName)
Add a linkage name, if it isn't empty.
std::string getParentContextString(const DIScope *Context) const
Get string containing language specific context for a global name.
void addSourceLine(DIE &Die, unsigned Line, unsigned Column, const DIFile *File)
Add location information to specified debug information entry.
void emitCommonHeader(bool UseOffsets, dwarf::UnitType UT)
Emit the common part of the header for this unit.
BumpPtrAllocator DIEValueAllocator
DIE * IndexTyDie
An anonymous type for index type. Owned by DIEUnit.
void addRnglistsBase()
Add the DW_AT_rnglists_base attribute to the unit DIE.
DIE * getOrCreateModule(const DIModule *M)
const DICompileUnit * getCUNode() const
DIE & createAndAddDIE(dwarf::Tag Tag, DIE &Parent, const DINode *N=nullptr)
Create a DIE with the given Tag, add the DIE to its parent, and call insertDIE if MD is not null.
std::optional< unsigned > constructSubprogramArguments(DIE &Buffer, DITypeArray Args)
Construct function argument DIEs.
void addSectionOffset(DIE &Die, dwarf::Attribute Attribute, uint64_t Integer)
Add an offset into a section attribute data and value.
void addInt(DIE &Die, dwarf::Attribute Attribute, const APInt &Integer, bool Unsigned, std::optional< dwarf::Form > Form=std::nullopt)
Add an integer attribute data and value; value may be any width.
DIE * getOrCreateStaticMemberDIE(const DIDerivedType *DT)
Create new static data member DIE.
void addLabel(DIEValueList &Die, dwarf::Attribute Attribute, dwarf::Form Form, const MCSymbol *Label)
Add a Dwarf label attribute data and value.
void addConstantFPValue(DIE &Die, const ConstantFP *CFP)
Add constant value entry in variable DIE.
void constructContainingTypeDIEs()
Construct DIEs for types that contain vtables.
unsigned UniqueID
A numeric ID unique among all CUs in the module.
void addSectionLabel(DIE &Die, dwarf::Attribute Attribute, const MCSymbol *Label, const MCSymbol *Sec)
Add a Dwarf section label attribute data and value.
bool isShareableAcrossCUs(const DINode *D) const
Check whether the DIE for this MDNode can be shared across CUs.
DenseMap< DIE *, const DINode * > PropertyForwardMap
llvm::dwarf::SourceLanguage getSourceLanguage() const
void addPoolOpAddress(DIEValueList &Die, const MCSymbol *Label)
DenseMap< const MDNode *, DIE * > MDNodeToDieMap
Tracks the mapping of unit level debug information variables to debug information entries.
void constructTypeDIE(DIE &Buffer, const DICompositeType *CTy)
virtual void addGlobalName(StringRef Name, const DIE &Die, const DIScope *Context)=0
Add a new global name to the compile unit.
MCSymbol * EndLabel
Emitted at the end of the CU and used to compute the CU Length field.
void addFlag(DIE &Die, dwarf::Attribute Attribute)
Add a flag that is true to the DIE.
AsmPrinter * Asm
Target of Dwarf emission.
void addType(DIE &Entity, const DIType *Ty, dwarf::Attribute Attribute=dwarf::DW_AT_type)
Add a new type attribute to the specified entity.
void applySubprogramAttributes(const DISubprogram *SP, DIE &SPDie, bool SkipSPAttributes=false)
void addDIEEntry(DIE &Die, dwarf::Attribute Attribute, DIE &Entry)
Add a DIE attribute data and value.
static StringRef dropLLVMManglingEscape(StringRef Name)
If the given string begins with the GlobalValue name mangling escape character '\1',...
uint16_t getDwarfVersion() const
unsigned getFile(StringRef Directory, StringRef FileName, std::optional< MD5::MD5Result > Checksum, uint16_t DwarfVersion, std::optional< StringRef > Source)
MCSection * getDwarfStrOffSection() const
MCSection * getDwarfRnglistsSection() const
MCSection * getDwarfAbbrevSection() const
MCSymbol * getBeginSymbol()
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
const MDOperand & getOperand(unsigned I) const
Wrapper class representing virtual and physical registers.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
constexpr bool empty() const
Check if the string is empty.
unsigned DebugStrictDwarf
When set to true, don't use DWARF extensions in later DWARF versions.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
Target - Wrapper for Target specific information.
LLVM Value Representation.
Calculates the starting offsets for various sections within the .debug_names section.
UnitType
Constants for unit types in DWARF v5.
std::optional< SourceLanguage > toDW_LANG(SourceLanguageName name, uint32_t version)
Convert a DWARF 6 pair of language name and version to a DWARF 5 DW_LANG.
bool isCPlusPlus(SourceLanguage S)
TypeKind getArrayIndexTypeEncoding(SourceLanguage S)
@ DW_FLAG_type_implementation
bool isC(SourceLanguage S)
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > dyn_extract(Y &&MD)
Extract a Value from Metadata, if any.
This is an optimization pass for GlobalISel generic memory operations.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
auto dyn_cast_if_present(const Y &Val)
dyn_cast_if_present<X> - Functionally identical to dyn_cast, except that a null (or none in the case ...
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
auto dyn_cast_or_null(const Y &Val)
auto reverse(ContainerTy &&C)
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
constexpr T divideCeil(U Numerator, V Denominator)
Returns the integer ceil(Numerator / Denominator).
DWARFExpression::Operation Op
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
static LLVM_ABI bool mayHaveLocationExpr(dwarf::Attribute Attr)
Identifies DWARF attributes that may contain a reference to a DWARF expression.