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::enableTemporaryBuffer() {
66 assert(!IsBuffering &&
"Already buffering?");
70void DIEDwarfExpression::disableTemporaryBuffer() { IsBuffering =
false; }
72unsigned DIEDwarfExpression::getTemporaryBufferSize() {
76void DIEDwarfExpression::commitTemporaryBuffer() { OutDIE.
takeValues(TmpDIE); }
80 return MachineReg ==
TRI.getFrameRegister(*AP.
MF);
86 :
DIEUnit(UnitTag), UniqueID(UniqueID), CUNode(Node), Asm(
A), DD(DW),
92 :
DwarfUnit(dwarf::DW_TAG_type_unit,
CU.getCUNode(),
A, DW, DWU, UniqueID),
93 CU(
CU), SplitLineTable(SplitLineTable) {}
102int64_t DwarfUnit::getDefaultLowerBound()
const {
108 case dwarf::DW_LANG_C:
109 case dwarf::DW_LANG_C89:
110 case dwarf::DW_LANG_C_plus_plus:
113 case dwarf::DW_LANG_Fortran77:
114 case dwarf::DW_LANG_Fortran90:
118 case dwarf::DW_LANG_C99:
119 case dwarf::DW_LANG_ObjC:
120 case dwarf::DW_LANG_ObjC_plus_plus:
125 case dwarf::DW_LANG_Fortran95:
131 case dwarf::DW_LANG_D:
132 case dwarf::DW_LANG_Java:
133 case dwarf::DW_LANG_Python:
134 case dwarf::DW_LANG_UPC:
139 case dwarf::DW_LANG_Ada83:
140 case dwarf::DW_LANG_Ada95:
141 case dwarf::DW_LANG_Cobol74:
142 case dwarf::DW_LANG_Cobol85:
143 case dwarf::DW_LANG_Modula2:
144 case dwarf::DW_LANG_Pascal83:
145 case dwarf::DW_LANG_PLI:
151 case dwarf::DW_LANG_BLISS:
152 case dwarf::DW_LANG_C11:
153 case dwarf::DW_LANG_C_plus_plus_03:
154 case dwarf::DW_LANG_C_plus_plus_11:
155 case dwarf::DW_LANG_C_plus_plus_14:
156 case dwarf::DW_LANG_Dylan:
157 case dwarf::DW_LANG_Go:
158 case dwarf::DW_LANG_Haskell:
159 case dwarf::DW_LANG_OCaml:
160 case dwarf::DW_LANG_OpenCL:
161 case dwarf::DW_LANG_RenderScript:
162 case dwarf::DW_LANG_Rust:
163 case dwarf::DW_LANG_Swift:
168 case dwarf::DW_LANG_Fortran03:
169 case dwarf::DW_LANG_Fortran08:
170 case dwarf::DW_LANG_Julia:
171 case dwarf::DW_LANG_Modula3:
191 return (isa<DIType>(
D) ||
192 (isa<DISubprogram>(
D) && !cast<DISubprogram>(
D)->isDefinition())) &&
225 assert(
Form != dwarf::DW_FORM_implicit_const &&
226 "DW_FORM_implicit_const is used only for signed integers");
236 std::optional<dwarf::Form>
Form, int64_t
Integer) {
259 isDwoUnit() ? dwarf::DW_FORM_GNU_str_index : dwarf::DW_FORM_strp;
261 auto StringPoolEntry =
268 IxForm = dwarf::DW_FORM_strx1;
270 if (
Index > 0xffffff)
271 IxForm = dwarf::DW_FORM_strx4;
272 else if (
Index > 0xffff)
273 IxForm = dwarf::DW_FORM_strx3;
274 else if (
Index > 0xff)
275 IxForm = dwarf::DW_FORM_strx2;
294unsigned DwarfTypeUnit::getOrCreateSourceID(
const DIFile *File) {
297 if (!UsedLineTable) {
298 UsedLineTable =
true;
302 return SplitLineTable->
getFile(
308 bool UseAddrOffsetFormOrExpressions =
312 if (Label->isInSection() && UseAddrOffsetFormOrExpressions)
318 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_addrx);
321 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
326 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_const4u);
328 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
343 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
362 addFlag(Die, dwarf::DW_AT_declaration);
364 addAttribute(Die, dwarf::DW_AT_signature, dwarf::DW_FORM_ref_sig8,
371 const DIEUnit *EntryCU = Entry.getEntry().getUnit();
380 EntryCU ==
CU ? dwarf::DW_FORM_ref4 : dwarf::DW_FORM_ref_addr,
414 addUInt(Die, dwarf::DW_AT_decl_file, std::nullopt, FileID);
415 addUInt(Die, dwarf::DW_AT_decl_line, std::nullopt, Line);
471 addUInt(Die, dwarf::DW_AT_const_value,
472 Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata, Val);
481 if (CIBitWidth <= 64) {
496 for (
int i = 0; i < NumBytes; i++) {
499 c = Ptr64[i / 8] >> (8 * (i & 7));
501 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
512 : dwarf::DW_AT_MIPS_linkage_name,
518 for (
const auto *Element : TParams) {
519 if (
auto *TTP = dyn_cast<DITemplateTypeParameter>(Element))
520 constructTemplateTypeParameterDIE(Buffer, TTP);
521 else if (
auto *TVP = dyn_cast<DITemplateValueParameter>(Element))
522 constructTemplateValueParameterDIE(Buffer, TVP);
528 for (
const auto *Ty : ThrownTypes) {
536 addUInt(Die, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
539 addUInt(Die, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
542 addUInt(Die, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
547 if (!Context || isa<DIFile>(Context) || isa<DICompileUnit>(Context))
549 if (
auto *
T = dyn_cast<DIType>(Context))
551 if (
auto *NS = dyn_cast<DINamespace>(Context))
553 if (
auto *SP = dyn_cast<DISubprogram>(Context))
555 if (
auto *M = dyn_cast<DIModule>(Context))
572 updateAcceleratorTables(Context, Ty, TyDIE);
581 auto construct = [&](
const auto *Ty) {
582 updateAcceleratorTables(Context, Ty, TyDIE);
586 if (
auto *CTy = dyn_cast<DICompositeType>(Ty)) {
588 (Ty->
getRawName() || CTy->getRawIdentifier())) {
590 if (
MDString *TypeId = CTy->getRawIdentifier()) {
594 updateAcceleratorTables(Context, Ty, TyDIE);
595 finishNonUnitTypeDIE(TyDIE, CTy);
600 }
else if (
auto *
BT = dyn_cast<DIBasicType>(Ty))
602 else if (
auto *ST = dyn_cast<DIStringType>(Ty))
604 else if (
auto *STy = dyn_cast<DISubroutineType>(Ty))
607 construct(cast<DIDerivedType>(Ty));
616 auto *Ty = cast<DIType>(TyNode);
628 auto *Context = Ty->getScope();
639void DwarfUnit::updateAcceleratorTables(
const DIScope *Context,
648 bool IsImplementation =
false;
649 if (
auto *CT = dyn_cast<DICompositeType>(Ty)) {
652 IsImplementation = CT->getRuntimeLang() == 0 || CT->isObjcClassComplete();
663 if (!Context || isa<DICompileUnit>(Context) || isa<DIFile>(Context) ||
664 isa<DINamespace>(Context) || isa<DICommonBlock>(Context))
670 assert(Ty &&
"Trying to add a type that doesn't exist?");
684 while (!isa<DICompileUnit>(Context)) {
685 Parents.push_back(Context);
698 if (
Name.empty() && isa<DINamespace>(Ctx))
699 Name =
"(anonymous namespace)";
716 if (BTy->
getTag() == dwarf::DW_TAG_unspecified_type)
719 if (BTy->
getTag() != dwarf::DW_TAG_string_type)
720 addUInt(Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
724 addUInt(Buffer, dwarf::DW_AT_byte_size, std::nullopt,
Size);
727 addUInt(Buffer, dwarf::DW_AT_endianity, std::nullopt, dwarf::DW_END_big);
729 addUInt(Buffer, dwarf::DW_AT_endianity, std::nullopt, dwarf::DW_END_little);
740 if (
auto *VarDIE =
getDIE(Var))
741 addDIEEntry(Buffer, dwarf::DW_AT_string_length, *VarDIE);
748 DwarfExpr.setMemoryLocationKind();
749 DwarfExpr.addExpression(Expr);
750 addBlock(Buffer, dwarf::DW_AT_string_length, DwarfExpr.finalize());
753 addUInt(Buffer, dwarf::DW_AT_byte_size, std::nullopt,
Size);
761 DwarfExpr.setMemoryLocationKind();
762 DwarfExpr.addExpression(Expr);
763 addBlock(Buffer, dwarf::DW_AT_data_location, DwarfExpr.finalize());
768 addUInt(Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
780 const DIType *FromTy = DTy->getBaseType();
794 if (AlignInBytes > 0)
795 addUInt(Buffer, dwarf::DW_AT_alignment, dwarf::DW_FORM_udata,
800 if (
Size &&
Tag != dwarf::DW_TAG_pointer_type
801 &&
Tag != dwarf::DW_TAG_ptr_to_member_type
802 &&
Tag != dwarf::DW_TAG_reference_type
803 &&
Tag != dwarf::DW_TAG_rvalue_reference_type)
804 addUInt(Buffer, dwarf::DW_AT_byte_size, std::nullopt,
Size);
806 if (
Tag == dwarf::DW_TAG_ptr_to_member_type)
819 if (DTy->getDWARFAddressSpace())
820 addUInt(Buffer, dwarf::DW_AT_address_class, dwarf::DW_FORM_data4,
821 *DTy->getDWARFAddressSpace());
824 if (
Tag == dwarf::DW_TAG_template_alias)
827 if (
auto PtrAuthData = DTy->getPtrAuthData()) {
828 addUInt(Buffer, dwarf::DW_AT_LLVM_ptrauth_key, dwarf::DW_FORM_data1,
830 if (PtrAuthData->isAddressDiscriminated())
831 addFlag(Buffer, dwarf::DW_AT_LLVM_ptrauth_address_discriminated);
832 addUInt(Buffer, dwarf::DW_AT_LLVM_ptrauth_extra_discriminator,
833 dwarf::DW_FORM_data2, PtrAuthData->extraDiscriminator());
834 if (PtrAuthData->isaPointer())
835 addFlag(Buffer, dwarf::DW_AT_LLVM_ptrauth_isa_pointer);
836 if (PtrAuthData->authenticatesNullValues())
837 addFlag(Buffer, dwarf::DW_AT_LLVM_ptrauth_authenticates_null_values);
842 for (
unsigned i = 1,
N = Args.size(); i <
N; ++i) {
843 const DIType *Ty = Args[i];
845 assert(i ==
N-1 &&
"Unspecified parameter must be the last argument");
851 addFlag(Arg, dwarf::DW_AT_artificial);
858 auto Elements = cast<DISubroutineType>(CTy)->getTypeArray();
860 if (
auto RTy = Elements[0])
863 bool isPrototyped =
true;
864 if (Elements.size() == 2 && !Elements[1])
865 isPrototyped =
false;
872 addFlag(Buffer, dwarf::DW_AT_prototyped);
875 if (CTy->
getCC() && CTy->
getCC() != dwarf::DW_CC_normal)
876 addUInt(Buffer, dwarf::DW_AT_calling_convention, dwarf::DW_FORM_data1,
880 addFlag(Buffer, dwarf::DW_AT_reference);
883 addFlag(Buffer, dwarf::DW_AT_rvalue_reference);
891 const MDNode *MD = cast<MDNode>(Annotation);
896 addString(AnnotationDie, dwarf::DW_AT_name,
Name->getString());
897 if (
const auto *
Data = dyn_cast<MDString>(
Value))
898 addString(AnnotationDie, dwarf::DW_AT_const_value,
Data->getString());
899 else if (
const auto *
Data = dyn_cast<ConstantAsMetadata>(
Value))
903 assert(
false &&
"Unsupported annotation value type");
915 case dwarf::DW_TAG_array_type:
916 constructArrayTypeDIE(Buffer, CTy);
918 case dwarf::DW_TAG_enumeration_type:
919 constructEnumTypeDIE(Buffer, CTy);
921 case dwarf::DW_TAG_variant_part:
922 case dwarf::DW_TAG_structure_type:
923 case dwarf::DW_TAG_union_type:
924 case dwarf::DW_TAG_class_type:
925 case dwarf::DW_TAG_namelist: {
928 if (
Tag == dwarf::DW_TAG_variant_part) {
935 DIE &DiscMember = constructMemberDIE(Buffer, Discriminator);
936 addDIEEntry(Buffer, dwarf::DW_AT_discr, DiscMember);
941 if (
Tag == dwarf::DW_TAG_class_type ||
942 Tag == dwarf::DW_TAG_structure_type ||
Tag == dwarf::DW_TAG_union_type)
947 for (
const auto *Element : Elements) {
950 if (
auto *SP = dyn_cast<DISubprogram>(Element))
952 else if (
auto *DDTy = dyn_cast<DIDerivedType>(Element)) {
953 if (DDTy->getTag() == dwarf::DW_TAG_friend) {
955 addType(ElemDie, DDTy->getBaseType(), dwarf::DW_AT_friend);
956 }
else if (DDTy->isStaticMember()) {
958 }
else if (
Tag == dwarf::DW_TAG_variant_part) {
963 dyn_cast_or_null<ConstantInt>(DDTy->getDiscriminantValue())) {
965 addUInt(Variant, dwarf::DW_AT_discr_value, std::nullopt,
968 addSInt(Variant, dwarf::DW_AT_discr_value, std::nullopt,
971 constructMemberDIE(Variant, DDTy);
973 constructMemberDIE(Buffer, DDTy);
975 }
else if (
auto *Property = dyn_cast<DIObjCProperty>(Element)) {
977 StringRef PropertyName = Property->getName();
978 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
979 if (Property->getType())
980 addType(ElemDie, Property->getType());
982 StringRef GetterName = Property->getGetterName();
983 if (!GetterName.
empty())
984 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
985 StringRef SetterName = Property->getSetterName();
986 if (!SetterName.
empty())
987 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
988 if (
unsigned PropertyAttributes = Property->getAttributes())
989 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, std::nullopt,
991 }
else if (
auto *Composite = dyn_cast<DICompositeType>(Element)) {
992 if (Composite->getTag() == dwarf::DW_TAG_variant_part) {
996 }
else if (
Tag == dwarf::DW_TAG_namelist) {
997 auto *Var = dyn_cast<DINode>(Element);
998 auto *VarDIE =
getDIE(Var);
1001 addDIEEntry(ItemDie, dwarf::DW_AT_namelist_item, *VarDIE);
1007 addFlag(Buffer, dwarf::DW_AT_APPLE_block);
1010 addFlag(Buffer, dwarf::DW_AT_export_symbols);
1021 addFlag(Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
1028 CC = dwarf::DW_CC_pass_by_value;
1030 CC = dwarf::DW_CC_pass_by_reference;
1032 addUInt(Buffer, dwarf::DW_AT_calling_convention, dwarf::DW_FORM_data1,
1047 if (
Tag == dwarf::DW_TAG_enumeration_type ||
1048 Tag == dwarf::DW_TAG_class_type ||
Tag == dwarf::DW_TAG_structure_type ||
1049 Tag == dwarf::DW_TAG_union_type) {
1055 addUInt(Buffer, dwarf::DW_AT_byte_size, std::nullopt,
Size);
1058 addUInt(Buffer, dwarf::DW_AT_byte_size, std::nullopt, 0);
1062 addFlag(Buffer, dwarf::DW_AT_declaration);
1074 addUInt(Buffer, dwarf::DW_AT_APPLE_runtime_class, dwarf::DW_FORM_data1,
1079 addUInt(Buffer, dwarf::DW_AT_alignment, dwarf::DW_FORM_udata,
1084void DwarfUnit::constructTemplateTypeParameterDIE(
1093 if (TP->
isDefault() && isCompatibleWithVersion(5))
1094 addFlag(ParamDIE, dwarf::DW_AT_default_value);
1097void DwarfUnit::constructTemplateValueParameterDIE(
1103 if (VP->
getTag() == dwarf::DW_TAG_template_value_parameter)
1107 if (VP->
isDefault() && isCompatibleWithVersion(5))
1108 addFlag(ParamDIE, dwarf::DW_AT_default_value);
1110 if (
ConstantInt *CI = mdconst::dyn_extract<ConstantInt>(Val))
1112 else if (
GlobalValue *GV = mdconst::dyn_extract<GlobalValue>(Val)) {
1115 if (!GV->hasDLLImportStorageClass()) {
1122 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
1123 addBlock(ParamDIE, dwarf::DW_AT_location, Loc);
1125 }
else if (VP->
getTag() == dwarf::DW_TAG_GNU_template_template_param) {
1126 assert(isa<MDString>(Val));
1127 addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1128 cast<MDString>(Val)->getString());
1129 }
else if (VP->
getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
1148 Name =
"(anonymous namespace)";
1152 addFlag(NDie, dwarf::DW_AT_export_symbols);
1165 if (!M->getName().empty()) {
1166 addString(MDie, dwarf::DW_AT_name, M->getName());
1169 if (!M->getConfigurationMacros().empty())
1170 addString(MDie, dwarf::DW_AT_LLVM_config_macros,
1171 M->getConfigurationMacros());
1172 if (!M->getIncludePath().empty())
1173 addString(MDie, dwarf::DW_AT_LLVM_include_path, M->getIncludePath());
1174 if (!M->getAPINotesFile().empty())
1175 addString(MDie, dwarf::DW_AT_LLVM_apinotes, M->getAPINotesFile());
1177 addUInt(MDie, dwarf::DW_AT_decl_file, std::nullopt,
1180 addUInt(MDie, dwarf::DW_AT_decl_line, std::nullopt, M->getLineNo());
1182 addFlag(MDie, dwarf::DW_AT_declaration);
1197 if (
auto *SPDecl = SP->getDeclaration()) {
1211 if (SP->isDefinition())
1220 DIE &SPDie,
bool Minimal) {
1221 DIE *DeclDie =
nullptr;
1223 if (
auto *SPDecl = SP->getDeclaration()) {
1226 DeclArgs = SPDecl->getType()->getTypeArray();
1227 DefinitionArgs = SP->getType()->getTypeArray();
1229 if (DeclArgs.
size() && DefinitionArgs.
size())
1230 if (DefinitionArgs[0] !=
nullptr && DeclArgs[0] != DefinitionArgs[0])
1231 addType(SPDie, DefinitionArgs[0]);
1233 DeclDie =
getDIE(SPDecl);
1234 assert(DeclDie &&
"This DIE should've already been constructed when the "
1235 "definition DIE was created in "
1236 "getOrCreateSubprogramDIE");
1239 DeclLinkageName = SPDecl->getLinkageName();
1242 if (DeclID != DefID)
1243 addUInt(SPDie, dwarf::DW_AT_decl_file, std::nullopt, DefID);
1245 if (SP->getLine() != SPDecl->getLine())
1246 addUInt(SPDie, dwarf::DW_AT_decl_line, std::nullopt, SP->getLine());
1257 "decl has a linkage name and it is different");
1258 if (DeclLinkageName.
empty() &&
1268 addDIEEntry(SPDie, dwarf::DW_AT_specification, *DeclDie);
1273 bool SkipSPAttributes) {
1276 bool SkipSPSourceLocation = SkipSPAttributes &&
1278 if (!SkipSPSourceLocation)
1288 if (!SkipSPSourceLocation)
1292 if (SkipSPAttributes)
1298 addFlag(SPDie, dwarf::DW_AT_prototyped);
1300 if (SP->isObjCDirect())
1301 addFlag(SPDie, dwarf::DW_AT_APPLE_objc_direct);
1306 Args = SPTy->getTypeArray();
1311 if (
CC &&
CC != dwarf::DW_CC_normal)
1312 addUInt(SPDie, dwarf::DW_AT_calling_convention, dwarf::DW_FORM_data1,
CC);
1317 if (
auto Ty = Args[0])
1320 unsigned VK = SP->getVirtuality();
1322 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
1323 if (SP->getVirtualIndex() != -1u) {
1325 addUInt(*
Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1326 addUInt(*
Block, dwarf::DW_FORM_udata, SP->getVirtualIndex());
1332 if (!SP->isDefinition()) {
1333 addFlag(SPDie, dwarf::DW_AT_declaration);
1342 if (SP->isArtificial())
1343 addFlag(SPDie, dwarf::DW_AT_artificial);
1345 if (!SP->isLocalToUnit())
1346 addFlag(SPDie, dwarf::DW_AT_external);
1349 if (SP->isOptimized())
1350 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
1353 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag,
isa);
1356 if (SP->isLValueReference())
1357 addFlag(SPDie, dwarf::DW_AT_reference);
1359 if (SP->isRValueReference())
1360 addFlag(SPDie, dwarf::DW_AT_rvalue_reference);
1362 if (SP->isNoReturn())
1363 addFlag(SPDie, dwarf::DW_AT_noreturn);
1367 if (SP->isExplicit())
1368 addFlag(SPDie, dwarf::DW_AT_explicit);
1370 if (SP->isMainSubprogram())
1371 addFlag(SPDie, dwarf::DW_AT_main_subprogram);
1373 addFlag(SPDie, dwarf::DW_AT_pure);
1374 if (SP->isElemental())
1375 addFlag(SPDie, dwarf::DW_AT_elemental);
1376 if (SP->isRecursive())
1377 addFlag(SPDie, dwarf::DW_AT_recursive);
1379 if (!SP->getTargetFuncName().empty())
1380 addString(SPDie, dwarf::DW_AT_trampoline, SP->getTargetFuncName());
1383 addFlag(SPDie, dwarf::DW_AT_deleted);
1386void DwarfUnit::constructSubrangeDIE(
DIE &Buffer,
const DISubrange *SR,
1389 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, *IndexTy);
1395 int64_t DefaultLowerBound = getDefaultLowerBound();
1398 DISubrange::BoundType Bound) ->
void {
1399 if (
auto *BV = dyn_cast_if_present<DIVariable *>(Bound)) {
1400 if (
auto *VarDIE =
getDIE(BV))
1402 }
else if (
auto *BE = dyn_cast_if_present<DIExpression *>(Bound)) {
1405 DwarfExpr.setMemoryLocationKind();
1406 DwarfExpr.addExpression(BE);
1407 addBlock(DW_Subrange, Attr, DwarfExpr.finalize());
1408 }
else if (
auto *BI = dyn_cast_if_present<ConstantInt *>(Bound)) {
1409 if (Attr == dwarf::DW_AT_count) {
1410 if (BI->getSExtValue() != -1)
1411 addUInt(DW_Subrange, Attr, std::nullopt, BI->getSExtValue());
1412 }
else if (Attr != dwarf::DW_AT_lower_bound || DefaultLowerBound == -1 ||
1413 BI->getSExtValue() != DefaultLowerBound)
1414 addSInt(DW_Subrange, Attr, dwarf::DW_FORM_sdata, BI->getSExtValue());
1418 AddBoundTypeEntry(dwarf::DW_AT_lower_bound, SR->
getLowerBound());
1420 AddBoundTypeEntry(dwarf::DW_AT_count, SR->
getCount());
1422 AddBoundTypeEntry(dwarf::DW_AT_upper_bound, SR->
getUpperBound());
1424 AddBoundTypeEntry(dwarf::DW_AT_byte_stride, SR->
getStride());
1427void DwarfUnit::constructGenericSubrangeDIE(
DIE &Buffer,
1430 DIE &DwGenericSubrange =
1432 addDIEEntry(DwGenericSubrange, dwarf::DW_AT_type, *IndexTy);
1434 int64_t DefaultLowerBound = getDefaultLowerBound();
1438 if (
auto *BV = dyn_cast_if_present<DIVariable *>(Bound)) {
1439 if (
auto *VarDIE =
getDIE(BV))
1441 }
else if (
auto *BE = dyn_cast_if_present<DIExpression *>(Bound)) {
1442 if (BE->isConstant() &&
1444 *BE->isConstant()) {
1445 if (Attr != dwarf::DW_AT_lower_bound || DefaultLowerBound == -1 ||
1446 static_cast<int64_t
>(BE->getElement(1)) != DefaultLowerBound)
1447 addSInt(DwGenericSubrange, Attr, dwarf::DW_FORM_sdata,
1452 DwarfExpr.setMemoryLocationKind();
1453 DwarfExpr.addExpression(BE);
1454 addBlock(DwGenericSubrange, Attr, DwarfExpr.finalize());
1459 AddBoundTypeEntry(dwarf::DW_AT_lower_bound, GSR->
getLowerBound());
1460 AddBoundTypeEntry(dwarf::DW_AT_count, GSR->
getCount());
1461 AddBoundTypeEntry(dwarf::DW_AT_upper_bound, GSR->
getUpperBound());
1462 AddBoundTypeEntry(dwarf::DW_AT_byte_stride, GSR->
getStride());
1465DIE *DwarfUnit::getIndexTyDie() {
1485 assert(CTy && CTy->
isVector() &&
"Composite type is not a vector");
1495 assert(Elements.size() == 1 &&
1496 Elements[0]->getTag() == dwarf::DW_TAG_subrange_type &&
1497 "Invalid vector element array, expected one element of type subrange");
1498 const auto Subrange = cast<DISubrange>(Elements[0]);
1499 const auto NumVecElements =
1500 Subrange->getCount()
1501 ? cast<ConstantInt *>(Subrange->getCount())->getSExtValue()
1506 assert(ActualSize >= (NumVecElements * ElementSize) &&
"Invalid vector size");
1507 return ActualSize != (NumVecElements * ElementSize);
1512 addFlag(Buffer, dwarf::DW_AT_GNU_vector);
1514 addUInt(Buffer, dwarf::DW_AT_byte_size, std::nullopt,
1519 if (
auto *VarDIE =
getDIE(Var))
1520 addDIEEntry(Buffer, dwarf::DW_AT_data_location, *VarDIE);
1524 DwarfExpr.setMemoryLocationKind();
1525 DwarfExpr.addExpression(Expr);
1526 addBlock(Buffer, dwarf::DW_AT_data_location, DwarfExpr.finalize());
1530 if (
auto *VarDIE =
getDIE(Var))
1531 addDIEEntry(Buffer, dwarf::DW_AT_associated, *VarDIE);
1535 DwarfExpr.setMemoryLocationKind();
1536 DwarfExpr.addExpression(Expr);
1537 addBlock(Buffer, dwarf::DW_AT_associated, DwarfExpr.finalize());
1541 if (
auto *VarDIE =
getDIE(Var))
1542 addDIEEntry(Buffer, dwarf::DW_AT_allocated, *VarDIE);
1546 DwarfExpr.setMemoryLocationKind();
1547 DwarfExpr.addExpression(Expr);
1548 addBlock(Buffer, dwarf::DW_AT_allocated, DwarfExpr.finalize());
1552 addSInt(Buffer, dwarf::DW_AT_rank, dwarf::DW_FORM_sdata,
1553 RankConst->getSExtValue());
1554 }
else if (
auto *RankExpr = CTy->
getRankExp()) {
1557 DwarfExpr.setMemoryLocationKind();
1558 DwarfExpr.addExpression(RankExpr);
1559 addBlock(Buffer, dwarf::DW_AT_rank, DwarfExpr.finalize());
1568 DIE *IdxTy = getIndexTyDie();
1572 for (
DINode *E : Elements) {
1574 if (
auto *Element = dyn_cast_or_null<DINode>(E)) {
1575 if (Element->getTag() == dwarf::DW_TAG_subrange_type)
1576 constructSubrangeDIE(Buffer, cast<DISubrange>(Element), IdxTy);
1577 else if (Element->getTag() == dwarf::DW_TAG_generic_subrange)
1578 constructGenericSubrangeDIE(Buffer, cast<DIGenericSubrange>(Element),
1591 addFlag(Buffer, dwarf::DW_AT_enum_class);
1595 bool IndexEnumerators = !Context || isa<DICompileUnit>(Context) || isa<DIFile>(Context) ||
1596 isa<DINamespace>(Context) || isa<DICommonBlock>(Context);
1600 for (
const DINode *E : Elements) {
1601 auto *
Enum = dyn_cast_or_null<DIEnumerator>(E);
1607 if (IndexEnumerators)
1615 DIE &SPDie = *
P.first;
1622 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, *NDie);
1634 if (
DIType *Resolved = DT->getBaseType())
1646 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1647 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1648 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1650 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1651 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1652 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1654 addBlock(MemberDie, dwarf::DW_AT_data_member_location, VBaseLocationDie);
1665 addUInt(MemberDie, dwarf::DW_AT_byte_size, std::nullopt, FieldSize / 8);
1666 addUInt(MemberDie, dwarf::DW_AT_bit_size, std::nullopt,
Size);
1669 (
uint64_t)std::numeric_limits<int64_t>::max());
1675 uint32_t AlignMask = ~(AlignInBits - 1);
1677 uint64_t StartBitOffset = Offset - (Offset & AlignMask);
1679 OffsetInBytes = (Offset - StartBitOffset) / 8;
1682 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1683 uint64_t FieldOffset = (HiMark - FieldSize);
1684 Offset -= FieldOffset;
1688 Offset = FieldSize - (Offset +
Size);
1691 addSInt(MemberDie, dwarf::DW_AT_bit_offset, dwarf::DW_FORM_sdata,
1694 addUInt(MemberDie, dwarf::DW_AT_bit_offset, std::nullopt,
1696 OffsetInBytes = FieldOffset >> 3;
1698 addUInt(MemberDie, dwarf::DW_AT_data_bit_offset, std::nullopt, Offset);
1704 addUInt(MemberDie, dwarf::DW_AT_alignment, dwarf::DW_FORM_udata,
1710 addUInt(*MemLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1711 addUInt(*MemLocationDie, dwarf::DW_FORM_udata, OffsetInBytes);
1712 addBlock(MemberDie, dwarf::DW_AT_data_member_location, MemLocationDie);
1719 addUInt(MemberDie, dwarf::DW_AT_data_member_location,
1720 dwarf::DW_FORM_udata, OffsetInBytes);
1722 addUInt(MemberDie, dwarf::DW_AT_data_member_location, std::nullopt,
1730 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
1731 dwarf::DW_VIRTUALITY_virtual);
1737 dwarf::DW_FORM_ref4,
DIEEntry(*PDie));
1740 addFlag(MemberDie, dwarf::DW_AT_artificial);
1753 "Static member should belong to a type.");
1756 return StaticMemberDIE;
1760 const DIType *Ty = DT->getBaseType();
1765 addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1766 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1778 addUInt(StaticMemberDIE, dwarf::DW_AT_alignment, dwarf::DW_FORM_udata,
1781 return &StaticMemberDIE;
1788 isDwoUnit() ?
"debug_info_dwo" :
"debug_info",
"Length of Unit");
1829 : dwarf::DW_UT_type);
1831 Asm->
OutStreamer->emitIntValue(TypeSignature,
sizeof(TypeSignature));
1851bool DwarfTypeUnit::isDwoUnit()
const {
1867const MCSymbol *DwarfUnit::getCrossSectionRelativeBaseAddress()
const {
1884 "DW_AT_rnglists_base requires DWARF version 5 or later");
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< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
static bool hasVectorBeenPadded(const DICompositeType *CTy)
Returns true if the vector's size differs from the sum of sizes of elements the user specified.
unsigned const TargetRegisterInfo * TRI
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
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.
uint64_t getZExtValue() const
Get zero extended value.
unsigned getBitWidth() const
Return the number of bits in the APInt.
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.
unsigned getIndex(const MCSymbol *Sym, bool TLS=false)
Returns the index into the address pool with the given label/symbol.
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.
const TargetLoweringObjectFile & getObjFileLowering() const
Return information about object file lowering.
MCSymbol * getSymbol(const GlobalValue *GV) const
void emitDwarfSymbolReference(const MCSymbol *Label, bool ForceOffset=false) const
Emit a reference to a symbol for use in dwarf.
void emitDwarfLengthOrOffset(uint64_t Value) const
Emit 32- or 64-bit value depending on the DWARF format.
TargetMachine & TM
Target machine description.
const MCAsmInfo * MAI
Target Asm Printer information.
MachineFunction * MF
The current machine function.
void emitInt8(int Value) const
Emit a byte directive and value.
void emitDwarfUnitLength(uint64_t Length, const Twine &Comment) const
Emit a unit length field.
MCContext & OutContext
This is the context for the output file that we are streaming.
MCSymbol * createTempSymbol(const Twine &Name) const
std::unique_ptr< MCStreamer > OutStreamer
This is the MCStreamer object for the file we are generating.
virtual unsigned getISAEncoding()
Get the value for DW_AT_APPLE_isa. Zero if no isa encoding specified.
void emitInt16(int Value) const
Emit a short directive and value.
const DataLayout & getDataLayout() const
Return information about data layout.
dwarf::FormParams getDwarfFormParams() const
Returns information about the byte size of DW_FORM values.
bool doesDwarfUseRelocationsAcrossSections() const
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.
Basic type, like 'int' or 'float'.
unsigned getEncoding() const
bool getDebugInfoForProfiling() const
bool isDebugDirectivesOnly() const
static std::optional< DebugNameTableKind > getNameTableKind(StringRef Str)
DIExpression * getRankExp() const
DIExpression * getAssociatedExp() const
DIVariable * getAllocated() const
DIExpression * getDataLocationExp() const
DIVariable * getAssociated() const
DIDerivedType * getDiscriminator() const
DIVariable * getDataLocation() const
unsigned getRuntimeLang() const
DINodeArray getElements() const
DITemplateParameterArray getTemplateParams() const
DIExpression * getAllocatedExp() const
DIType * getVTableHolder() const
DINodeArray getAnnotations() const
ConstantInt * getRankConst() 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
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.
unsigned computeSize(const dwarf::FormParams &FormParams) const
Calculate the size of the location expression.
dwarf::Form BestForm(unsigned DwarfVersion) const
BestForm - Choose the best form for data.
A container for string pool string values.
Represents a compile or type unit.
MCSection * getSection() const
Return the section that this DIEUnit will be emitted into.
void takeValues(DIEValueList &Other)
Take ownership of the nodes in Other, and append them to the back of the list.
A structured debug information entry.
DIE & addChild(DIE *Child)
Add a child to the DIE.
static DIE * get(BumpPtrAllocator &Alloc, dwarf::Tag Tag)
DIEUnit * getUnit() const
Climb up the parent chain to get the compile unit or type unit that this DIE belongs to.
dwarf::Tag getTag() const
BoundType getLowerBound() const
BoundType getCount() const
BoundType getUpperBound() const
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.
dwarf::Tag getTag() const
Base class for scope-like contexts.
StringRef getName() const
DIScope * getScope() const
String type, Fortran CHARACTER(n)
unsigned getEncoding() const
DIExpression * getStringLengthExp() const
DIVariable * getStringLength() const
DIExpression * getStringLocationExp() const
BoundType getUpperBound() const
BoundType getStride() const
BoundType getLowerBound() const
BoundType getCount() const
Type array for a subprogram.
StringRef getName() const
Metadata * getValue() const
bool isLittleEndian() const
bool isLValueReference() const
bool isObjcClassComplete() const
MDString * getRawName() 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
bool isRValueReference() const
bool isArtificial() const
bool getExportSymbols() const
DIScope * getScope() const
bool isTypePassByReference() const
Base class for variables.
This class represents an Operation in the Expression.
bool isLittleEndian() const
Layout endianness...
static bool isUnsignedDIType(const DIType *Ty)
Return true if type encoding is unsigned.
static uint64_t getBaseTypeSize(const DIType *Ty)
If this type is derived from a base type then return base type size.
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.
bool useAddrOffsetForm() const
uint16_t getDwarfVersion() const
Returns the Dwarf Version.
void addAccelNamespace(const DwarfUnit &Unit, const DICompileUnit::DebugNameTableKind NameTableKind, StringRef Name, const DIE &Die)
bool useAllLinkageNames() const
Returns whether we should emit all DW_AT_[MIPS_]linkage_name.
dwarf::Form getDwarfSectionOffsetForm() const
Returns a suitable DWARF form to represent a section offset, i.e.
bool useAppleExtensionAttributes() const
bool useInlineStrings() const
Returns whether to use inline strings.
bool generateTypeUnits() const
Returns whether to generate DWARF v4 type units.
AddressPool & getAddressPool()
bool useSectionsAsReferences() const
Returns whether to use sections as labels rather than temp symbols.
bool shareAcrossDWOCUs() const
const MCSymbol * getSectionLabel(const MCSection *S)
bool useSplitDwarf() const
Returns whether or not to change the current debug info for the split dwarf proposal support.
bool useDWARF2Bitfields() const
Returns whether to use the DWARF2 format for bitfields instyead of the DWARF4 format.
bool useAddrOffsetExpressions() const
void addDwarfTypeUnitType(DwarfCompileUnit &CU, StringRef Identifier, DIE &Die, const DICompositeType *CTy)
Add a DIE to the set of types that we're going to pull into type units.
void addAccelType(const DwarfUnit &Unit, const DICompileUnit::DebugNameTableKind NameTableKind, StringRef Name, const DIE &Die, char Flags)
Base class containing the logic for constructing DWARF expressions independently of whether they are ...
MCSymbol * getStringOffsetsStartSym() const
MCSymbol * getRnglistsTableBaseSym() const
DwarfStringPool & getStringPool()
Returns the string pool.
DenseMap< const DILocalScope *, DIE * > & getAbstractScopeDIEs()
void insertDIE(const MDNode *TypeMD, DIE *Die)
DIE * getDIE(const MDNode *TypeMD)
unsigned getIndex() const
EntryRef getEntry(AsmPrinter &Asm, StringRef Str)
Get a reference to an entry in the string pool.
EntryRef getIndexedEntry(AsmPrinter &Asm, StringRef Str)
Same as getEntry, except that you can use EntryRef::getIndex to obtain a unique ID of this entry (e....
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.
This dwarf writer support class manages information associated with a source file.
virtual DIE * getOrCreateTypeDIE(const MDNode *TyNode)
Find existing DIE or create new DIE for the given type.
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.
uint16_t getLanguage() const
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 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 addSectionDelta(DIE &Die, dwarf::Attribute Attribute, const MCSymbol *Hi, const MCSymbol *Lo)
addSectionDelta - Add a label delta attribute data and value.
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.
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 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.
virtual unsigned getHeaderSize() const
Compute the size of a header for this unit, not including the initial length field.
void constructSubprogramArguments(DIE &Buffer, DITypeRefArray Args)
Construct function argument DIEs.
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, 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)
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.
void addSectionOffset(DIE &Die, dwarf::Attribute Attribute, uint64_t Integer)
Add an offset into a section attribute data and value.
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.
DIE * getOrCreateSubprogramDIE(const DISubprogram *SP, bool Minimal=false)
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.
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',...
unsigned getCodePointerSize() const
Get the code pointer size in bytes.
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
A discriminated union of two or more pointer types, with the discriminator in the low bit of the poin...
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.
StringRef - Represent a constant reference to a string, i.e.
constexpr bool empty() const
empty - 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...
LLVM Value Representation.
UnitType
Constants for unit types in DWARF v5.
bool isCPlusPlus(SourceLanguage S)
TypeKind getArrayIndexTypeEncoding(SourceLanguage S)
@ DW_FLAG_type_implementation
bool isC(SourceLanguage S)
This is an optimization pass for GlobalISel generic memory operations.
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...
Description of the encoding of one expression Op.