3rdparty/licenseReport: Add seperate LGPL checks
[haiku.git] / src / kits / debugger / dwarf / DebugInfoEntries.cpp
blob64c8eadd96e6f824750997a47e4bf89058d30b2b
1 /*
2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Copyright 2011-2014, Rene Gollent, rene@gollent.com.
4 * Distributed under the terms of the MIT License.
5 */
7 #include "DebugInfoEntries.h"
9 #include <new>
11 #include "AttributeValue.h"
12 #include "Dwarf.h"
13 #include "SourceLanguageInfo.h"
16 // #pragma mark - DIECompileUnitBase
19 DIECompileUnitBase::DIECompileUnitBase()
21 fName(NULL),
22 fCompilationDir(NULL),
23 fLowPC(0),
24 fHighPC(0),
25 fStatementListOffset(-1),
26 fMacroInfoOffset(-1),
27 fAddressRangesOffset(-1),
28 fBaseTypesUnit(NULL),
29 fLanguage(0),
30 fIdentifierCase(0),
31 fUseUTF8(true),
32 fContainsMainSubprogram(false)
37 DIECompileUnitBase::~DIECompileUnitBase()
42 status_t
43 DIECompileUnitBase::InitAfterAttributes(DebugInfoEntryInitInfo& info)
45 switch (fLanguage) {
46 case 0:
47 info.languageInfo = &kUnknownLanguageInfo;
48 return B_OK;
49 case DW_LANG_C89:
50 info.languageInfo = &kC89LanguageInfo;
51 return B_OK;
52 case DW_LANG_C:
53 info.languageInfo = &kCLanguageInfo;
54 return B_OK;
55 case DW_LANG_C_plus_plus:
56 info.languageInfo = &kCPlusPlusLanguageInfo;
57 return B_OK;
58 case DW_LANG_C99:
59 info.languageInfo = &kC99LanguageInfo;
60 return B_OK;
61 default:
62 info.languageInfo = &kUnsupportedLanguageInfo;
63 return B_OK;
68 const char*
69 DIECompileUnitBase::Name() const
71 return fName;
75 status_t
76 DIECompileUnitBase::AddChild(DebugInfoEntry* child)
78 if (child->IsType())
79 fTypes.Add(child);
80 else
81 fOtherChildren.Add(child);
82 return B_OK;
86 status_t
87 DIECompileUnitBase::AddAttribute_name(uint16 attributeName,
88 const AttributeValue& value)
90 fName = value.string;
91 return B_OK;
95 status_t
96 DIECompileUnitBase::AddAttribute_comp_dir(uint16 attributeName,
97 const AttributeValue& value)
99 fCompilationDir = value.string;
100 return B_OK;
104 status_t
105 DIECompileUnitBase::AddAttribute_low_pc(uint16 attributeName,
106 const AttributeValue& value)
108 fLowPC = value.address;
109 return B_OK;
113 status_t
114 DIECompileUnitBase::AddAttribute_high_pc(uint16 attributeName,
115 const AttributeValue& value)
117 fHighPC = value.address;
118 if (fLowPC != 0 && fHighPC < fLowPC)
119 fHighPC += fLowPC;
121 return B_OK;
125 status_t
126 DIECompileUnitBase::AddAttribute_producer(uint16 attributeName,
127 const AttributeValue& value)
129 // not interesting
130 return B_OK;
134 status_t
135 DIECompileUnitBase::AddAttribute_stmt_list(uint16 attributeName,
136 const AttributeValue& value)
138 fStatementListOffset = value.pointer;
139 return B_OK;
143 status_t
144 DIECompileUnitBase::AddAttribute_macro_info(uint16 attributeName,
145 const AttributeValue& value)
147 fMacroInfoOffset = value.pointer;
148 return B_OK;
152 status_t
153 DIECompileUnitBase::AddAttribute_base_types(uint16 attributeName,
154 const AttributeValue& value)
156 fBaseTypesUnit = dynamic_cast<DIECompileUnitBase*>(value.reference);
157 return fBaseTypesUnit != NULL ? B_OK : B_BAD_DATA;
161 status_t
162 DIECompileUnitBase::AddAttribute_language(uint16 attributeName,
163 const AttributeValue& value)
165 fLanguage = value.constant;
166 return B_OK;
170 status_t
171 DIECompileUnitBase::AddAttribute_identifier_case(uint16 attributeName,
172 const AttributeValue& value)
174 fIdentifierCase = value.constant;
175 return B_OK;
179 status_t
180 DIECompileUnitBase::AddAttribute_use_UTF8(uint16 attributeName,
181 const AttributeValue& value)
183 fUseUTF8 = value.flag;
184 return B_OK;
188 status_t
189 DIECompileUnitBase::AddAttribute_ranges(uint16 attributeName,
190 const AttributeValue& value)
192 fAddressRangesOffset = value.pointer;
193 return B_OK;
197 status_t
198 DIECompileUnitBase::AddAttribute_main_subprogram(uint16 attributeName,
199 const AttributeValue& value)
201 fContainsMainSubprogram = true;
202 return B_OK;
206 // #pragma mark - DIEType
209 DIEType::DIEType()
211 fName(NULL)
213 fAllocated.SetTo((uint64)0);
214 fAssociated.SetTo((uint64)0);
218 bool
219 DIEType::IsType() const
221 return true;
225 const char*
226 DIEType::Name() const
228 return fName;
232 bool
233 DIEType::IsDeclaration() const
235 return false;
239 const DynamicAttributeValue*
240 DIEType::ByteSize() const
242 return NULL;
246 status_t
247 DIEType::AddAttribute_name(uint16 attributeName,
248 const AttributeValue& value)
250 fName = value.string;
251 return B_OK;
255 status_t
256 DIEType::AddAttribute_allocated(uint16 attributeName,
257 const AttributeValue& value)
259 return SetDynamicAttributeValue(fAllocated, value);
263 status_t
264 DIEType::AddAttribute_associated(uint16 attributeName,
265 const AttributeValue& value)
267 return SetDynamicAttributeValue(fAssociated, value);
271 // #pragma mark - DIEModifiedType
274 DIEModifiedType::DIEModifiedType()
276 fType(NULL)
281 status_t
282 DIEModifiedType::AddAttribute_type(uint16 attributeName,
283 const AttributeValue& value)
285 fType = dynamic_cast<DIEType*>(value.reference);
286 return fType != NULL ? B_OK : B_BAD_DATA;
290 // #pragma mark - DIEAddressingType
293 DIEAddressingType::DIEAddressingType()
295 fAddressClass(0)
300 status_t
301 DIEAddressingType::AddAttribute_address_class(uint16 attributeName,
302 const AttributeValue& value)
304 // TODO: How is the address class handled?
305 fAddressClass = value.constant;
306 return B_OK;
310 // #pragma mark - DIEDeclaredType
313 DIEDeclaredType::DIEDeclaredType()
315 fDescription(NULL),
316 fAbstractOrigin(NULL),
317 fSignatureType(NULL),
318 fAccessibility(0),
319 fDeclaration(false)
324 const char*
325 DIEDeclaredType::Description() const
327 return fDescription;
331 DebugInfoEntry*
332 DIEDeclaredType::AbstractOrigin() const
334 return fAbstractOrigin;
338 DebugInfoEntry*
339 DIEDeclaredType::SignatureType() const
341 return fSignatureType;
345 bool
346 DIEDeclaredType::IsDeclaration() const
348 return fDeclaration;
352 status_t
353 DIEDeclaredType::AddAttribute_accessibility(uint16 attributeName,
354 const AttributeValue& value)
356 fAccessibility = value.constant;
357 return B_OK;
361 status_t
362 DIEDeclaredType::AddAttribute_declaration(uint16 attributeName,
363 const AttributeValue& value)
365 fDeclaration = value.flag;
366 return B_OK;
370 status_t
371 DIEDeclaredType::AddAttribute_description(uint16 attributeName,
372 const AttributeValue& value)
374 fDescription = value.string;
375 return B_OK;
379 status_t
380 DIEDeclaredType::AddAttribute_abstract_origin(uint16 attributeName,
381 const AttributeValue& value)
383 fAbstractOrigin = value.reference;
384 return B_OK;
388 status_t
389 DIEDeclaredType::AddAttribute_signature(uint16 attributeName,
390 const AttributeValue& value)
392 fSignatureType = value.reference;
393 return B_OK;
397 DeclarationLocation*
398 DIEDeclaredType::GetDeclarationLocation()
400 return &fDeclarationLocation;
404 // #pragma mark - DIEDerivedType
407 DIEDerivedType::DIEDerivedType()
409 fType(NULL)
414 status_t
415 DIEDerivedType::AddAttribute_type(uint16 attributeName,
416 const AttributeValue& value)
418 fType = dynamic_cast<DIEType*>(value.reference);
419 return fType != NULL ? B_OK : B_BAD_DATA;
425 // #pragma mark - DIECompoundType
428 DIECompoundType::DIECompoundType()
430 fSpecification(NULL)
435 bool
436 DIECompoundType::IsNamespace() const
438 return true;
442 DebugInfoEntry*
443 DIECompoundType::Specification() const
445 return fSpecification;
449 const DynamicAttributeValue*
450 DIECompoundType::ByteSize() const
452 return &fByteSize;
456 status_t
457 DIECompoundType::AddChild(DebugInfoEntry* child)
459 if (child->Tag() == DW_TAG_member) {
460 // TODO: Not for interfaces!
461 fDataMembers.Add(child);
462 return B_OK;
465 return DIEDeclaredType::AddChild(child);
469 status_t
470 DIECompoundType::AddAttribute_byte_size(uint16 attributeName,
471 const AttributeValue& value)
473 return SetDynamicAttributeValue(fByteSize, value);
477 status_t
478 DIECompoundType::AddAttribute_specification(uint16 attributeName,
479 const AttributeValue& value)
481 fSpecification = dynamic_cast<DIECompoundType*>(value.reference);
482 return fSpecification != NULL ? B_OK : B_BAD_DATA;
486 // #pragma mark - DIEClassBaseType
489 DIEClassBaseType::DIEClassBaseType()
494 status_t
495 DIEClassBaseType::AddChild(DebugInfoEntry* child)
497 switch (child->Tag()) {
498 case DW_TAG_inheritance:
499 fBaseTypes.Add(child);
500 return B_OK;
501 case DW_TAG_friend:
502 fFriends.Add(child);
503 return B_OK;
504 case DW_TAG_access_declaration:
505 fAccessDeclarations.Add(child);
506 return B_OK;
507 case DW_TAG_subprogram:
508 fMemberFunctions.Add(child);
509 return B_OK;
510 case DW_TAG_template_type_parameter:
511 case DW_TAG_template_value_parameter:
512 fTemplateParameters.Add(child);
513 return B_OK;
514 // TODO: Variants!
515 default:
517 if (child->IsType()) {
518 fInnerTypes.Add(child);
519 return B_OK;
522 return DIECompoundType::AddChild(child);
528 // #pragma mark - DIENamedBase
531 DIENamedBase::DIENamedBase()
533 fName(NULL),
534 fDescription(NULL)
539 const char*
540 DIENamedBase::Name() const
542 return fName;
546 const char*
547 DIENamedBase::Description() const
549 return fDescription;
553 status_t
554 DIENamedBase::AddAttribute_name(uint16 attributeName,
555 const AttributeValue& value)
557 fName = value.string;
558 return B_OK;
562 status_t
563 DIENamedBase::AddAttribute_description(uint16 attributeName,
564 const AttributeValue& value)
566 fDescription = value.string;
567 return B_OK;
571 // #pragma mark - DIEDeclaredBase
574 DIEDeclaredBase::DIEDeclaredBase()
579 DeclarationLocation*
580 DIEDeclaredBase::GetDeclarationLocation()
582 return &fDeclarationLocation;
586 // #pragma mark - DIEDeclaredNamedBase
589 DIEDeclaredNamedBase::DIEDeclaredNamedBase()
591 fName(NULL),
592 fDescription(NULL),
593 fAccessibility(0),
594 fVisibility(0),
595 fDeclaration(false)
600 const char*
601 DIEDeclaredNamedBase::Name() const
603 return fName;
607 const char*
608 DIEDeclaredNamedBase::Description() const
610 return fDescription;
614 bool
615 DIEDeclaredNamedBase::IsDeclaration() const
617 return fDeclaration;
621 status_t
622 DIEDeclaredNamedBase::AddAttribute_name(uint16 attributeName,
623 const AttributeValue& value)
625 fName = value.string;
626 return B_OK;
630 status_t
631 DIEDeclaredNamedBase::AddAttribute_description(uint16 attributeName,
632 const AttributeValue& value)
634 fDescription = value.string;
635 return B_OK;
639 status_t
640 DIEDeclaredNamedBase::AddAttribute_accessibility(uint16 attributeName,
641 const AttributeValue& value)
643 fAccessibility = value.constant;
644 return B_OK;
648 status_t
649 DIEDeclaredNamedBase::AddAttribute_declaration(uint16 attributeName,
650 const AttributeValue& value)
652 fDeclaration = value.flag;
653 return B_OK;
657 // #pragma mark - DIEArrayIndexType
660 DIEArrayIndexType::DIEArrayIndexType()
665 const DynamicAttributeValue*
666 DIEArrayIndexType::ByteSize() const
668 return &fByteSize;
672 status_t
673 DIEArrayIndexType::AddAttribute_bit_stride(uint16 attributeName,
674 const AttributeValue& value)
676 return SetDynamicAttributeValue(fBitStride, value);
680 status_t
681 DIEArrayIndexType::AddAttribute_byte_size(uint16 attributeName,
682 const AttributeValue& value)
684 return SetDynamicAttributeValue(fByteSize, value);
688 status_t
689 DIEArrayIndexType::AddAttribute_byte_stride(uint16 attributeName,
690 const AttributeValue& value)
692 return SetDynamicAttributeValue(fByteStride, value);
696 // #pragma mark - DIEArrayType
699 DIEArrayType::DIEArrayType()
701 fSpecification(NULL),
702 fOrdering(DW_ORD_row_major)
707 uint16
708 DIEArrayType::Tag() const
710 return DW_TAG_array_type;
714 status_t
715 DIEArrayType::InitAfterHierarchy(DebugInfoEntryInitInfo& info)
717 fOrdering = info.languageInfo->arrayOrdering;
718 return B_OK;
722 DebugInfoEntry*
723 DIEArrayType::Specification() const
725 return fSpecification;
729 const DynamicAttributeValue*
730 DIEArrayType::ByteSize() const
732 return &fByteSize;
736 status_t
737 DIEArrayType::AddChild(DebugInfoEntry* child)
739 // a dimension child must be of subrange or enumeration type
740 uint16 tag = child->Tag();
741 if (tag == DW_TAG_subrange_type || tag == DW_TAG_enumeration_type) {
742 fDimensions.Add(child);
743 return B_OK;
746 return DIEDerivedType::AddChild(child);
750 status_t
751 DIEArrayType::AddAttribute_ordering(uint16 attributeName,
752 const AttributeValue& value)
754 fOrdering = value.constant;
755 return B_OK;
759 status_t
760 DIEArrayType::AddAttribute_bit_stride(uint16 attributeName,
761 const AttributeValue& value)
763 return SetDynamicAttributeValue(fBitStride, value);
767 status_t
768 DIEArrayType::AddAttribute_stride_size(uint16 attributeName,
769 const AttributeValue& value)
771 return SetDynamicAttributeValue(fBitStride, value);
775 status_t
776 DIEArrayType::AddAttribute_byte_size(uint16 attributeName,
777 const AttributeValue& value)
779 return SetDynamicAttributeValue(fByteSize, value);
783 status_t
784 DIEArrayType::AddAttribute_specification(uint16 attributeName,
785 const AttributeValue& value)
787 fSpecification = dynamic_cast<DIEArrayType*>(value.reference);
788 return fSpecification != NULL ? B_OK : B_BAD_DATA;
792 // #pragma mark - DIEClassType
795 DIEClassType::DIEClassType()
800 uint16
801 DIEClassType::Tag() const
803 return DW_TAG_class_type;
807 // #pragma mark - DIEEntryPoint
810 DIEEntryPoint::DIEEntryPoint()
815 uint16
816 DIEEntryPoint::Tag() const
818 return DW_TAG_entry_point;
822 // #pragma mark - DIEEnumerationType
825 DIEEnumerationType::DIEEnumerationType()
827 fSpecification(NULL)
832 uint16
833 DIEEnumerationType::Tag() const
835 return DW_TAG_enumeration_type;
839 DebugInfoEntry*
840 DIEEnumerationType::Specification() const
842 return fSpecification;
846 status_t
847 DIEEnumerationType::AddChild(DebugInfoEntry* child)
849 if (child->Tag() == DW_TAG_enumerator) {
850 fEnumerators.Add(child);
851 return B_OK;
854 return DIEDerivedType::AddChild(child);
858 status_t
859 DIEEnumerationType::AddAttribute_specification(uint16 attributeName,
860 const AttributeValue& value)
862 fSpecification = dynamic_cast<DIEEnumerationType*>(value.reference);
863 return fSpecification != NULL ? B_OK : B_BAD_DATA;
867 // #pragma mark - DIEFormalParameter
870 DIEFormalParameter::DIEFormalParameter()
872 fAbstractOrigin(NULL),
873 fType(NULL),
874 fArtificial(false)
879 uint16
880 DIEFormalParameter::Tag() const
882 return DW_TAG_formal_parameter;
886 DebugInfoEntry*
887 DIEFormalParameter::AbstractOrigin() const
889 return fAbstractOrigin;
893 LocationDescription*
894 DIEFormalParameter::GetLocationDescription()
896 return &fLocationDescription;
900 status_t
901 DIEFormalParameter::AddAttribute_abstract_origin(uint16 attributeName,
902 const AttributeValue& value)
904 fAbstractOrigin = value.reference;
905 return B_OK;
909 status_t
910 DIEFormalParameter::AddAttribute_artificial(uint16 attributeName,
911 const AttributeValue& value)
913 fArtificial = value.flag;
914 return B_OK;
918 status_t
919 DIEFormalParameter::AddAttribute_const_value(uint16 attributeName,
920 const AttributeValue& value)
922 return SetConstantAttributeValue(fValue, value);
926 status_t
927 DIEFormalParameter::AddAttribute_type(uint16 attributeName,
928 const AttributeValue& value)
930 fType = dynamic_cast<DIEType*>(value.reference);
931 return fType != NULL ? B_OK : B_BAD_DATA;
935 // #pragma mark - DIEImportedDeclaration
938 DIEImportedDeclaration::DIEImportedDeclaration()
943 uint16
944 DIEImportedDeclaration::Tag() const
946 return DW_TAG_imported_declaration;
950 // #pragma mark - DIELabel
953 DIELabel::DIELabel()
958 uint16
959 DIELabel::Tag() const
961 return DW_TAG_label;
965 // #pragma mark - DIELexicalBlock
968 DIELexicalBlock::DIELexicalBlock()
970 fLowPC(0),
971 fHighPC(0),
972 fAddressRangesOffset(-1),
973 fAbstractOrigin(NULL)
978 uint16
979 DIELexicalBlock::Tag() const
981 return DW_TAG_lexical_block;
985 DebugInfoEntry*
986 DIELexicalBlock::AbstractOrigin() const
988 return fAbstractOrigin;
992 status_t
993 DIELexicalBlock::AddChild(DebugInfoEntry* child)
995 switch (child->Tag()) {
996 case DW_TAG_variable:
997 fVariables.Add(child);
998 return B_OK;
999 case DW_TAG_lexical_block:
1000 fBlocks.Add(child);
1001 return B_OK;
1002 default:
1003 return DIENamedBase::AddChild(child);
1008 status_t
1009 DIELexicalBlock::AddAttribute_low_pc(uint16 attributeName,
1010 const AttributeValue& value)
1012 fLowPC = value.address;
1013 return B_OK;
1017 status_t
1018 DIELexicalBlock::AddAttribute_high_pc(uint16 attributeName,
1019 const AttributeValue& value)
1021 fHighPC = value.address;
1022 if (fLowPC != 0 && fHighPC < fLowPC)
1023 fHighPC += fLowPC;
1025 return B_OK;
1029 status_t
1030 DIELexicalBlock::AddAttribute_ranges(uint16 attributeName,
1031 const AttributeValue& value)
1033 fAddressRangesOffset = value.pointer;
1034 return B_OK;
1038 status_t
1039 DIELexicalBlock::AddAttribute_abstract_origin(uint16 attributeName,
1040 const AttributeValue& value)
1042 fAbstractOrigin = dynamic_cast<DIELexicalBlock*>(value.reference);
1043 return fAbstractOrigin != NULL ? B_OK : B_BAD_DATA;
1047 // #pragma mark - DIEMember
1050 DIEMember::DIEMember()
1052 fType(NULL)
1057 uint16
1058 DIEMember::Tag() const
1060 return DW_TAG_member;
1064 status_t
1065 DIEMember::AddAttribute_type(uint16 attributeName,
1066 const AttributeValue& value)
1068 fType = dynamic_cast<DIEType*>(value.reference);
1069 return fType != NULL ? B_OK : B_BAD_DATA;
1073 status_t
1074 DIEMember::AddAttribute_byte_size(uint16 attributeName,
1075 const AttributeValue& value)
1077 return SetDynamicAttributeValue(fByteSize, value);
1081 status_t
1082 DIEMember::AddAttribute_bit_size(uint16 attributeName,
1083 const AttributeValue& value)
1085 return SetDynamicAttributeValue(fBitSize, value);
1089 status_t
1090 DIEMember::AddAttribute_data_member_location(uint16 attributeName,
1091 const AttributeValue& value)
1093 return SetMemberLocation(fLocation, value);
1097 status_t
1098 DIEMember::AddAttribute_bit_offset(uint16 attributeName,
1099 const AttributeValue& value)
1101 return SetDynamicAttributeValue(fBitOffset, value);
1105 status_t
1106 DIEMember::AddAttribute_data_bit_offset(uint16 attributeName,
1107 const AttributeValue& value)
1109 return SetDynamicAttributeValue(fDataBitOffset, value);
1113 // #pragma mark - DIEPointerType
1116 DIEPointerType::DIEPointerType()
1118 fSpecification(NULL)
1123 uint16
1124 DIEPointerType::Tag() const
1126 return DW_TAG_pointer_type;
1130 DebugInfoEntry*
1131 DIEPointerType::Specification() const
1133 return fSpecification;
1137 status_t
1138 DIEPointerType::AddAttribute_specification(uint16 attributeName,
1139 const AttributeValue& value)
1141 fSpecification = dynamic_cast<DIEPointerType*>(value.reference);
1142 return fSpecification != NULL ? B_OK : B_BAD_DATA;
1146 // #pragma mark - DIEReferenceType
1149 DIEReferenceType::DIEReferenceType()
1154 uint16
1155 DIEReferenceType::Tag() const
1157 return DW_TAG_reference_type;
1161 // #pragma mark - DIECompileUnit
1164 DIECompileUnit::DIECompileUnit()
1169 uint16
1170 DIECompileUnit::Tag() const
1172 return DW_TAG_compile_unit;
1176 // #pragma mark - DIEStringType
1179 DIEStringType::DIEStringType()
1184 uint16
1185 DIEStringType::Tag() const
1187 return DW_TAG_string_type;
1191 const DynamicAttributeValue*
1192 DIEStringType::ByteSize() const
1194 return &fByteSize;
1198 status_t
1199 DIEStringType::AddAttribute_byte_size(uint16 attributeName,
1200 const AttributeValue& value)
1202 return SetDynamicAttributeValue(fByteSize, value);
1206 // #pragma mark - DIEStructureType
1209 DIEStructureType::DIEStructureType()
1214 uint16
1215 DIEStructureType::Tag() const
1217 return DW_TAG_structure_type;
1221 // #pragma mark - DIESubroutineType
1224 DIESubroutineType::DIESubroutineType()
1226 fReturnType(NULL),
1227 fAddressClass(0),
1228 fPrototyped(false)
1233 uint16
1234 DIESubroutineType::Tag() const
1236 return DW_TAG_subroutine_type;
1240 status_t
1241 DIESubroutineType::AddChild(DebugInfoEntry* child)
1243 switch (child->Tag()) {
1244 case DW_TAG_formal_parameter:
1245 case DW_TAG_unspecified_parameters:
1246 fParameters.Add(child);
1247 return B_OK;
1248 default:
1249 return DIEDeclaredType::AddChild(child);
1254 status_t
1255 DIESubroutineType::AddAttribute_address_class(uint16 attributeName,
1256 const AttributeValue& value)
1258 // TODO: How is the address class handled?
1259 fAddressClass = value.constant;
1260 return B_OK;
1264 status_t
1265 DIESubroutineType::AddAttribute_prototyped(uint16 attributeName,
1266 const AttributeValue& value)
1268 fPrototyped = value.flag;
1269 return B_OK;
1273 status_t
1274 DIESubroutineType::AddAttribute_type(uint16 attributeName,
1275 const AttributeValue& value)
1277 fReturnType = dynamic_cast<DIEType*>(value.reference);
1278 return fReturnType != NULL ? B_OK : B_BAD_DATA;
1282 // #pragma mark - DIETypedef
1285 DIETypedef::DIETypedef()
1290 uint16
1291 DIETypedef::Tag() const
1293 return DW_TAG_typedef;
1297 // #pragma mark - DIEUnionType
1300 DIEUnionType::DIEUnionType()
1305 uint16
1306 DIEUnionType::Tag() const
1308 return DW_TAG_union_type;
1312 // #pragma mark - DIEUnspecifiedParameters
1315 DIEUnspecifiedParameters::DIEUnspecifiedParameters()
1320 uint16
1321 DIEUnspecifiedParameters::Tag() const
1323 return DW_TAG_unspecified_parameters;
1327 // #pragma mark - DIEVariant
1330 DIEVariant::DIEVariant()
1335 uint16
1336 DIEVariant::Tag() const
1338 return DW_TAG_variant;
1342 // #pragma mark - DIECommonBlock
1345 DIECommonBlock::DIECommonBlock()
1350 uint16
1351 DIECommonBlock::Tag() const
1353 return DW_TAG_common_block;
1357 LocationDescription*
1358 DIECommonBlock::GetLocationDescription()
1360 return &fLocationDescription;
1364 // #pragma mark - DIECommonInclusion
1367 DIECommonInclusion::DIECommonInclusion()
1372 uint16
1373 DIECommonInclusion::Tag() const
1375 return DW_TAG_common_inclusion;
1379 // #pragma mark - DIEInheritance
1382 DIEInheritance::DIEInheritance()
1384 fType(NULL)
1389 uint16
1390 DIEInheritance::Tag() const
1392 return DW_TAG_inheritance;
1396 status_t
1397 DIEInheritance::AddAttribute_type(uint16 attributeName,
1398 const AttributeValue& value)
1400 fType = dynamic_cast<DIEType*>(value.reference);
1401 return fType != NULL ? B_OK : B_BAD_DATA;
1405 status_t
1406 DIEInheritance::AddAttribute_data_member_location(uint16 attributeName,
1407 const AttributeValue& value)
1409 return SetMemberLocation(fLocation, value);
1413 // #pragma mark - DIEInlinedSubroutine
1416 DIEInlinedSubroutine::DIEInlinedSubroutine()
1421 uint16
1422 DIEInlinedSubroutine::Tag() const
1424 return DW_TAG_inlined_subroutine;
1428 // #pragma mark - DIEModule
1431 DIEModule::DIEModule()
1436 uint16
1437 DIEModule::Tag() const
1439 return DW_TAG_module;
1443 // #pragma mark - DIEPointerToMemberType
1446 DIEPointerToMemberType::DIEPointerToMemberType()
1448 fContainingType(NULL),
1449 fAddressClass(0)
1454 uint16
1455 DIEPointerToMemberType::Tag() const
1457 return DW_TAG_ptr_to_member_type;
1461 status_t
1462 DIEPointerToMemberType::AddAttribute_address_class(uint16 attributeName,
1463 const AttributeValue& value)
1465 // TODO: How is the address class handled?
1466 fAddressClass = value.constant;
1467 return B_OK;
1471 status_t
1472 DIEPointerToMemberType::AddAttribute_containing_type(uint16 attributeName,
1473 const AttributeValue& value)
1475 DebugInfoEntry* type = value.reference;
1476 DIEModifiedType* modifiedType;
1477 while ((modifiedType = dynamic_cast<DIEModifiedType*>(type)) != NULL)
1478 type = modifiedType->GetType();
1480 fContainingType = dynamic_cast<DIECompoundType*>(type);
1481 return fContainingType != NULL ? B_OK : B_BAD_DATA;
1485 status_t
1486 DIEPointerToMemberType::AddAttribute_use_location(uint16 attributeName,
1487 const AttributeValue& value)
1489 if (value.attributeClass == ATTRIBUTE_CLASS_LOCLISTPTR) {
1490 fUseLocation.SetToLocationList(value.pointer);
1491 return B_OK;
1494 if (value.attributeClass == ATTRIBUTE_CLASS_BLOCK) {
1495 fUseLocation.SetToExpression(value.block.data, value.block.length);
1496 return B_OK;
1499 return B_BAD_DATA;
1503 // #pragma mark - DIESetType
1506 DIESetType::DIESetType()
1511 uint16
1512 DIESetType::Tag() const
1514 return DW_TAG_set_type;
1518 const DynamicAttributeValue*
1519 DIESetType::ByteSize() const
1521 return &fByteSize;
1525 status_t
1526 DIESetType::AddAttribute_byte_size(uint16 attributeName,
1527 const AttributeValue& value)
1529 return SetDynamicAttributeValue(fByteSize, value);
1533 // #pragma mark - DIESubrangeType
1536 DIESubrangeType::DIESubrangeType()
1538 fThreadsScaled(false)
1543 uint16
1544 DIESubrangeType::Tag() const
1546 return DW_TAG_subrange_type;
1550 status_t
1551 DIESubrangeType::AddAttribute_count(uint16 attributeName,
1552 const AttributeValue& value)
1554 return SetDynamicAttributeValue(fCount, value);
1558 status_t
1559 DIESubrangeType::AddAttribute_lower_bound(uint16 attributeName,
1560 const AttributeValue& value)
1562 return SetDynamicAttributeValue(fLowerBound, value);
1566 status_t
1567 DIESubrangeType::AddAttribute_upper_bound(uint16 attributeName,
1568 const AttributeValue& value)
1570 return SetDynamicAttributeValue(fUpperBound, value);
1574 status_t
1575 DIESubrangeType::AddAttribute_threads_scaled(uint16 attributeName,
1576 const AttributeValue& value)
1578 fThreadsScaled = value.flag;
1579 return B_OK;
1583 // #pragma mark - DIEWithStatement
1586 DIEWithStatement::DIEWithStatement()
1588 fType(NULL)
1593 uint16
1594 DIEWithStatement::Tag() const
1596 return DW_TAG_with_stmt;
1600 LocationDescription*
1601 DIEWithStatement::GetLocationDescription()
1603 return &fLocationDescription;
1607 status_t
1608 DIEWithStatement::AddAttribute_type(uint16 attributeName,
1609 const AttributeValue& value)
1611 fType = dynamic_cast<DIEType*>(value.reference);
1612 return fType != NULL ? B_OK : B_BAD_DATA;
1616 // #pragma mark - DIEAccessDeclaration
1619 DIEAccessDeclaration::DIEAccessDeclaration()
1624 uint16
1625 DIEAccessDeclaration::Tag() const
1627 return DW_TAG_access_declaration;
1631 // #pragma mark - DIEBaseType
1634 DIEBaseType::DIEBaseType()
1636 fEncoding(0),
1637 fEndianity(0)
1642 uint16
1643 DIEBaseType::Tag() const
1645 return DW_TAG_base_type;
1649 const DynamicAttributeValue*
1650 DIEBaseType::ByteSize() const
1652 return &fByteSize;
1656 status_t
1657 DIEBaseType::AddAttribute_encoding(uint16 attributeName,
1658 const AttributeValue& value)
1660 fEncoding = value.constant;
1661 return B_OK;
1665 status_t
1666 DIEBaseType::AddAttribute_byte_size(uint16 attributeName,
1667 const AttributeValue& value)
1669 return SetDynamicAttributeValue(fByteSize, value);
1673 status_t
1674 DIEBaseType::AddAttribute_bit_size(uint16 attributeName,
1675 const AttributeValue& value)
1677 return SetDynamicAttributeValue(fBitSize, value);
1681 status_t
1682 DIEBaseType::AddAttribute_bit_offset(uint16 attributeName,
1683 const AttributeValue& value)
1685 return SetDynamicAttributeValue(fBitOffset, value);
1689 status_t
1690 DIEBaseType::AddAttribute_data_bit_offset(uint16 attributeName,
1691 const AttributeValue& value)
1693 return SetDynamicAttributeValue(fDataBitOffset, value);
1697 status_t
1698 DIEBaseType::AddAttribute_endianity(uint16 attributeName,
1699 const AttributeValue& value)
1701 fEndianity = value.constant;
1702 return B_OK;
1706 // #pragma mark - DIECatchBlock
1709 DIECatchBlock::DIECatchBlock()
1714 uint16
1715 DIECatchBlock::Tag() const
1717 return DW_TAG_catch_block;
1721 // #pragma mark - DIEConstType
1724 DIEConstType::DIEConstType()
1729 uint16
1730 DIEConstType::Tag() const
1732 return DW_TAG_const_type;
1736 // #pragma mark - DIEConstant
1739 DIEConstant::DIEConstant()
1741 fType(NULL)
1746 uint16
1747 DIEConstant::Tag() const
1749 return DW_TAG_constant;
1753 status_t
1754 DIEConstant::AddAttribute_const_value(uint16 attributeName,
1755 const AttributeValue& value)
1757 return SetConstantAttributeValue(fValue, value);
1761 status_t
1762 DIEConstant::AddAttribute_type(uint16 attributeName,
1763 const AttributeValue& value)
1765 fType = dynamic_cast<DIEType*>(value.reference);
1766 return fType != NULL ? B_OK : B_BAD_DATA;
1770 // #pragma mark - DIEEnumerator
1773 DIEEnumerator::DIEEnumerator()
1778 uint16
1779 DIEEnumerator::Tag() const
1781 return DW_TAG_enumerator;
1785 status_t
1786 DIEEnumerator::AddAttribute_const_value(uint16 attributeName,
1787 const AttributeValue& value)
1789 return SetConstantAttributeValue(fValue, value);
1793 // #pragma mark - DIEFileType
1796 DIEFileType::DIEFileType()
1801 uint16
1802 DIEFileType::Tag() const
1804 return DW_TAG_file_type;
1808 const DynamicAttributeValue*
1809 DIEFileType::ByteSize() const
1811 return &fByteSize;
1815 status_t
1816 DIEFileType::AddAttribute_byte_size(uint16 attributeName,
1817 const AttributeValue& value)
1819 return SetDynamicAttributeValue(fByteSize, value);
1823 // #pragma mark - DIEFriend
1826 DIEFriend::DIEFriend()
1831 uint16
1832 DIEFriend::Tag() const
1834 return DW_TAG_friend;
1838 // #pragma mark - DIENameList
1841 DIENameList::DIENameList()
1846 uint16
1847 DIENameList::Tag() const
1849 return DW_TAG_namelist;
1853 // #pragma mark - DIENameListItem
1856 DIENameListItem::DIENameListItem()
1861 uint16
1862 DIENameListItem::Tag() const
1864 return DW_TAG_namelist_item;
1868 // #pragma mark - DIEPackedType
1871 DIEPackedType::DIEPackedType()
1876 uint16
1877 DIEPackedType::Tag() const
1879 return DW_TAG_packed_type;
1883 // #pragma mark - DIESubprogram
1886 DIESubprogram::DIESubprogram()
1888 fLowPC(0),
1889 fHighPC(0),
1890 fAddressRangesOffset(-1),
1891 fSpecification(NULL),
1892 fAbstractOrigin(NULL),
1893 fReturnType(NULL),
1894 fAddressClass(0),
1895 fPrototyped(false),
1896 fInline(DW_INL_not_inlined),
1897 fMain(false),
1898 fArtificial(false),
1899 fCallingConvention(DW_CC_normal)
1904 DIESubprogram::~DIESubprogram()
1909 uint16
1910 DIESubprogram::Tag() const
1912 return DW_TAG_subprogram;
1916 DebugInfoEntry*
1917 DIESubprogram::Specification() const
1919 return fSpecification;
1924 DebugInfoEntry*
1925 DIESubprogram::AbstractOrigin() const
1927 return fAbstractOrigin;
1931 status_t
1932 DIESubprogram::AddChild(DebugInfoEntry* child)
1934 switch (child->Tag()) {
1935 case DW_TAG_formal_parameter:
1936 case DW_TAG_unspecified_parameters:
1937 fParameters.Add(child);
1938 return B_OK;
1939 case DW_TAG_variable:
1940 fVariables.Add(child);
1941 return B_OK;
1942 case DW_TAG_lexical_block:
1943 fBlocks.Add(child);
1944 return B_OK;
1945 case DW_TAG_template_type_parameter:
1946 fTemplateTypeParameters.Add(child);
1947 return B_OK;
1948 case DW_TAG_template_value_parameter:
1949 fTemplateValueParameters.Add(child);
1950 return B_OK;
1951 case DW_TAG_GNU_call_site:
1952 fCallSites.Add(child);
1953 return B_OK;
1954 default:
1955 return DIEDeclaredNamedBase::AddChild(child);
1960 status_t
1961 DIESubprogram::AddAttribute_low_pc(uint16 attributeName,
1962 const AttributeValue& value)
1964 fLowPC = value.address;
1965 return B_OK;
1969 status_t
1970 DIESubprogram::AddAttribute_high_pc(uint16 attributeName,
1971 const AttributeValue& value)
1973 fHighPC = value.address;
1974 if (fLowPC != 0 && fHighPC < fLowPC)
1975 fHighPC += fLowPC;
1977 return B_OK;
1981 status_t
1982 DIESubprogram::AddAttribute_ranges(uint16 attributeName,
1983 const AttributeValue& value)
1985 fAddressRangesOffset = value.pointer;
1986 return B_OK;
1990 status_t
1991 DIESubprogram::AddAttribute_specification(uint16 attributeName,
1992 const AttributeValue& value)
1994 fSpecification = dynamic_cast<DIESubprogram*>(value.reference);
1995 return fSpecification != NULL ? B_OK : B_BAD_DATA;
1999 status_t
2000 DIESubprogram::AddAttribute_address_class(uint16 attributeName,
2001 const AttributeValue& value)
2003 // TODO: How is the address class handled?
2004 fAddressClass = value.constant;
2005 return B_OK;
2009 status_t
2010 DIESubprogram::AddAttribute_prototyped(uint16 attributeName,
2011 const AttributeValue& value)
2013 fPrototyped = value.flag;
2014 return B_OK;
2018 status_t
2019 DIESubprogram::AddAttribute_type(uint16 attributeName,
2020 const AttributeValue& value)
2022 fReturnType = dynamic_cast<DIEType*>(value.reference);
2023 return fReturnType != NULL ? B_OK : B_BAD_DATA;
2027 status_t
2028 DIESubprogram::AddAttribute_inline(uint16 attributeName,
2029 const AttributeValue& value)
2031 // TODO: How is the address class handled?
2032 fInline = value.constant;
2033 return B_OK;
2037 status_t
2038 DIESubprogram::AddAttribute_abstract_origin(uint16 attributeName,
2039 const AttributeValue& value)
2041 fAbstractOrigin = dynamic_cast<DIESubprogram*>(value.reference);
2042 return fAbstractOrigin != NULL ? B_OK : B_BAD_DATA;
2046 status_t
2047 DIESubprogram::AddAttribute_frame_base(uint16 attributeName,
2048 const AttributeValue& value)
2050 if (value.attributeClass == ATTRIBUTE_CLASS_LOCLISTPTR) {
2051 fFrameBase.SetToLocationList(value.pointer);
2052 return B_OK;
2055 if (value.attributeClass == ATTRIBUTE_CLASS_BLOCK) {
2056 fFrameBase.SetToExpression(value.block.data, value.block.length);
2057 return B_OK;
2060 return B_BAD_DATA;
2064 status_t
2065 DIESubprogram::AddAttribute_artificial(uint16 attributeName,
2066 const AttributeValue& value)
2068 fArtificial = value.flag;
2069 return B_OK;
2073 status_t
2074 DIESubprogram::AddAttribute_calling_convention(uint16 attributeName,
2075 const AttributeValue& value)
2077 fCallingConvention = value.constant;
2078 return B_OK;
2082 status_t
2083 DIESubprogram::AddAttribute_main_subprogram(uint16 attributeName,
2084 const AttributeValue& value)
2086 fMain = true;
2087 return B_OK;
2091 // #pragma mark - DIETemplateTypeParameter
2094 DIETemplateTypeParameter::DIETemplateTypeParameter()
2096 fType(NULL)
2101 uint16
2102 DIETemplateTypeParameter::Tag() const
2104 return DW_TAG_template_type_parameter;
2108 status_t
2109 DIETemplateTypeParameter::AddAttribute_type(uint16 attributeName,
2110 const AttributeValue& value)
2112 fType = dynamic_cast<DIEType*>(value.reference);
2113 return fType != NULL ? B_OK : B_BAD_DATA;
2117 // #pragma mark - DIETemplateValueParameter
2120 DIETemplateValueParameter::DIETemplateValueParameter()
2122 fType(NULL)
2127 uint16
2128 DIETemplateValueParameter::Tag() const
2130 return DW_TAG_template_value_parameter;
2134 status_t
2135 DIETemplateValueParameter::AddAttribute_const_value(uint16 attributeName,
2136 const AttributeValue& value)
2138 return SetConstantAttributeValue(fValue, value);
2142 status_t
2143 DIETemplateValueParameter::AddAttribute_type(uint16 attributeName,
2144 const AttributeValue& value)
2146 fType = dynamic_cast<DIEType*>(value.reference);
2147 return fType != NULL ? B_OK : B_BAD_DATA;
2151 // #pragma mark - DIEThrownType
2154 DIEThrownType::DIEThrownType()
2156 fType(NULL)
2161 uint16
2162 DIEThrownType::Tag() const
2164 return DW_TAG_thrown_type;
2168 status_t
2169 DIEThrownType::AddAttribute_type(uint16 attributeName,
2170 const AttributeValue& value)
2172 fType = dynamic_cast<DIEType*>(value.reference);
2173 return fType != NULL ? B_OK : B_BAD_DATA;
2177 // #pragma mark - DIETryBlock
2180 DIETryBlock::DIETryBlock()
2185 uint16
2186 DIETryBlock::Tag() const
2188 return DW_TAG_try_block;
2192 // #pragma mark - DIEVariantPart
2195 DIEVariantPart::DIEVariantPart()
2197 fType(NULL)
2202 uint16
2203 DIEVariantPart::Tag() const
2205 return DW_TAG_variant_part;
2209 status_t
2210 DIEVariantPart::AddAttribute_type(uint16 attributeName,
2211 const AttributeValue& value)
2213 fType = dynamic_cast<DIEType*>(value.reference);
2214 return fType != NULL ? B_OK : B_BAD_DATA;
2218 // #pragma mark - DIEVariable
2221 DIEVariable::DIEVariable()
2223 fType(NULL),
2224 fSpecification(NULL),
2225 fAbstractOrigin(NULL),
2226 fStartScope(0)
2231 uint16
2232 DIEVariable::Tag() const
2234 return DW_TAG_variable;
2238 DebugInfoEntry*
2239 DIEVariable::Specification() const
2241 return fSpecification;
2246 DebugInfoEntry*
2247 DIEVariable::AbstractOrigin() const
2249 return fAbstractOrigin;
2253 LocationDescription*
2254 DIEVariable::GetLocationDescription()
2256 return &fLocationDescription;
2260 status_t
2261 DIEVariable::AddAttribute_const_value(uint16 attributeName,
2262 const AttributeValue& value)
2264 return SetConstantAttributeValue(fValue, value);
2268 status_t
2269 DIEVariable::AddAttribute_type(uint16 attributeName,
2270 const AttributeValue& value)
2272 fType = dynamic_cast<DIEType*>(value.reference);
2273 return fType != NULL ? B_OK : B_BAD_DATA;
2277 status_t
2278 DIEVariable::AddAttribute_specification(uint16 attributeName,
2279 const AttributeValue& value)
2281 fSpecification = dynamic_cast<DIEVariable*>(value.reference);
2282 // in the case of static variables declared within a compound type,
2283 // the specification may point to a member entry rather than
2284 // a variable entry
2285 if (fSpecification == NULL)
2286 fSpecification = dynamic_cast<DIEMember*>(value.reference);
2288 return fSpecification != NULL ? B_OK : B_BAD_DATA;
2292 status_t
2293 DIEVariable::AddAttribute_abstract_origin(uint16 attributeName,
2294 const AttributeValue& value)
2296 fAbstractOrigin = dynamic_cast<DIEVariable*>(value.reference);
2297 return fAbstractOrigin != NULL ? B_OK : B_BAD_DATA;
2301 status_t
2302 DIEVariable::AddAttribute_start_scope(uint16 attributeName,
2303 const AttributeValue& value)
2305 fStartScope = value.constant;
2306 return B_OK;
2310 status_t
2311 DIEVariable::AddAttribute_external(uint16 attributeName,
2312 const AttributeValue& value)
2314 fIsExternal = value.flag;
2315 return B_OK;
2319 // #pragma mark - DIEVolatileType
2322 DIEVolatileType::DIEVolatileType()
2327 uint16
2328 DIEVolatileType::Tag() const
2330 return DW_TAG_volatile_type;
2334 status_t
2335 DIEVolatileType::AddAttribute_decl_file(uint16 attributeName,
2336 const AttributeValue& value)
2338 fDeclarationLocation.SetFile(value.constant);
2339 return B_OK;
2343 status_t
2344 DIEVolatileType::AddAttribute_decl_line(uint16 attributeName,
2345 const AttributeValue& value)
2347 fDeclarationLocation.SetLine(value.constant);
2348 return B_OK;
2352 status_t
2353 DIEVolatileType::AddAttribute_decl_column(uint16 attributeName,
2354 const AttributeValue& value)
2356 fDeclarationLocation.SetColumn(value.constant);
2357 return B_OK;
2361 // #pragma mark - DIEDwarfProcedure
2364 DIEDwarfProcedure::DIEDwarfProcedure()
2369 uint16
2370 DIEDwarfProcedure::Tag() const
2372 return DW_TAG_dwarf_procedure;
2376 LocationDescription*
2377 DIEDwarfProcedure::GetLocationDescription()
2379 return &fLocationDescription;
2383 // #pragma mark - DIERestrictType
2386 DIERestrictType::DIERestrictType()
2391 uint16
2392 DIERestrictType::Tag() const
2394 return DW_TAG_restrict_type;
2398 // #pragma mark - DIEInterfaceType
2401 DIEInterfaceType::DIEInterfaceType()
2406 uint16
2407 DIEInterfaceType::Tag() const
2409 return DW_TAG_interface_type;
2413 // #pragma mark - DIENamespace
2416 DIENamespace::DIENamespace()
2421 uint16
2422 DIENamespace::Tag() const
2424 return DW_TAG_namespace;
2428 bool
2429 DIENamespace::IsNamespace() const
2431 return true;
2435 status_t
2436 DIENamespace::AddChild(DebugInfoEntry* child)
2438 fChildren.Add(child);
2439 return B_OK;
2443 // #pragma mark - DIEImportedModule
2446 DIEImportedModule::DIEImportedModule()
2451 uint16
2452 DIEImportedModule::Tag() const
2454 return DW_TAG_imported_module;
2458 // #pragma mark - DIEUnspecifiedType
2461 DIEUnspecifiedType::DIEUnspecifiedType()
2466 uint16
2467 DIEUnspecifiedType::Tag() const
2469 return DW_TAG_unspecified_type;
2473 status_t
2474 DIEUnspecifiedType::AddAttribute_decl_file(uint16 attributeName,
2475 const AttributeValue& value)
2477 fDeclarationLocation.SetFile(value.constant);
2478 return B_OK;
2482 status_t
2483 DIEUnspecifiedType::AddAttribute_decl_line(uint16 attributeName,
2484 const AttributeValue& value)
2486 fDeclarationLocation.SetLine(value.constant);
2487 return B_OK;
2491 status_t
2492 DIEUnspecifiedType::AddAttribute_decl_column(uint16 attributeName,
2493 const AttributeValue& value)
2495 fDeclarationLocation.SetColumn(value.constant);
2496 return B_OK;
2500 // #pragma mark - DIEPartialUnit
2503 DIEPartialUnit::DIEPartialUnit()
2508 uint16
2509 DIEPartialUnit::Tag() const
2511 return DW_TAG_partial_unit;
2515 // #pragma mark - DIEImportedUnit
2518 DIEImportedUnit::DIEImportedUnit()
2523 uint16
2524 DIEImportedUnit::Tag() const
2526 return DW_TAG_imported_unit;
2530 // #pragma mark - DIECondition
2533 DIECondition::DIECondition()
2538 uint16
2539 DIECondition::Tag() const
2541 return DW_TAG_condition;
2545 // #pragma mark - DIESharedType
2548 DIESharedType::DIESharedType()
2550 fBlockSize.SetTo(~(uint64)0);
2554 uint16
2555 DIESharedType::Tag() const
2557 return DW_TAG_shared_type;
2561 status_t
2562 DIESharedType::AddAttribute_count(uint16 attributeName,
2563 const AttributeValue& value)
2565 return SetDynamicAttributeValue(fBlockSize, value);
2569 status_t
2570 DIESharedType::AddAttribute_decl_file(uint16 attributeName,
2571 const AttributeValue& value)
2573 fDeclarationLocation.SetFile(value.constant);
2574 return B_OK;
2578 status_t
2579 DIESharedType::AddAttribute_decl_line(uint16 attributeName,
2580 const AttributeValue& value)
2582 fDeclarationLocation.SetLine(value.constant);
2583 return B_OK;
2587 status_t
2588 DIESharedType::AddAttribute_decl_column(uint16 attributeName,
2589 const AttributeValue& value)
2591 fDeclarationLocation.SetColumn(value.constant);
2592 return B_OK;
2596 // #pragma mark - DIETypeUnit
2599 DIETypeUnit::DIETypeUnit()
2604 uint16
2605 DIETypeUnit::Tag() const
2607 return DW_TAG_type_unit;
2611 // #pragma mark - DIERValueReferenceType
2614 DIERValueReferenceType::DIERValueReferenceType()
2619 uint16
2620 DIERValueReferenceType::Tag() const
2622 return DW_TAG_rvalue_reference_type;
2626 // #pragma mark - DIETemplateTemplateParameter
2629 DIETemplateTemplateParameter::DIETemplateTemplateParameter()
2631 fName(NULL)
2636 uint16
2637 DIETemplateTemplateParameter::Tag() const
2639 return DW_TAG_GNU_template_template_param;
2643 const char*
2644 DIETemplateTemplateParameter::Name() const
2646 return fName;
2650 status_t
2651 DIETemplateTemplateParameter::AddAttribute_name(uint16 attributeName,
2652 const AttributeValue& value)
2654 fName = value.string;
2655 return B_OK;
2659 // #pragma mark - DIETemplateTypeParameterPack
2662 DIETemplateTypeParameterPack::DIETemplateTypeParameterPack()
2664 fName(NULL)
2669 uint16
2670 DIETemplateTypeParameterPack::Tag() const
2672 return DW_TAG_GNU_template_parameter_pack;
2676 const char*
2677 DIETemplateTypeParameterPack::Name() const
2679 return fName;
2683 status_t
2684 DIETemplateTypeParameterPack::AddAttribute_name(uint16 attributeName,
2685 const AttributeValue& value)
2687 fName = value.string;
2688 return B_OK;
2692 status_t
2693 DIETemplateTypeParameterPack::AddChild(DebugInfoEntry* child)
2695 if (child->Tag() == DW_TAG_template_type_parameter) {
2696 fChildren.Add(child);
2697 return B_OK;
2700 return DIEDeclaredBase::AddChild(child);
2704 // #pragma mark - DIETemplateValueParameterPack
2707 DIETemplateValueParameterPack::DIETemplateValueParameterPack()
2709 fName(NULL)
2714 uint16
2715 DIETemplateValueParameterPack::Tag() const
2717 return DW_TAG_GNU_formal_parameter_pack;
2721 const char*
2722 DIETemplateValueParameterPack::Name() const
2724 return fName;
2728 status_t
2729 DIETemplateValueParameterPack::AddAttribute_name(uint16 attributeName,
2730 const AttributeValue& value)
2732 fName = value.string;
2733 return B_OK;
2737 status_t
2738 DIETemplateValueParameterPack::AddChild(DebugInfoEntry* child)
2740 if (child->Tag() == DW_TAG_formal_parameter) {
2741 fChildren.Add(child);
2742 return B_OK;
2745 return DIEDeclaredBase::AddChild(child);
2749 // #pragma mark - DIECallSite
2752 DIECallSite::DIECallSite()
2754 fName(NULL)
2759 uint16
2760 DIECallSite::Tag() const
2762 return DW_TAG_GNU_call_site;
2766 const char*
2767 DIECallSite::Name() const
2769 return fName;
2773 status_t
2774 DIECallSite::AddAttribute_name(uint16 attributeName,
2775 const AttributeValue& value)
2777 fName = value.string;
2778 return B_OK;
2782 status_t
2783 DIECallSite::AddChild(DebugInfoEntry* child)
2785 if (child->Tag() == DW_TAG_GNU_call_site_parameter) {
2786 fChildren.Add(child);
2787 return B_OK;
2790 return DIEDeclaredBase::AddChild(child);
2794 // #pragma mark - DIECallSiteParameter
2797 DIECallSiteParameter::DIECallSiteParameter()
2799 fName(NULL)
2804 uint16
2805 DIECallSiteParameter::Tag() const
2807 return DW_TAG_GNU_call_site_parameter;
2811 const char*
2812 DIECallSiteParameter::Name() const
2814 return fName;
2818 status_t
2819 DIECallSiteParameter::AddAttribute_name(uint16 attributeName,
2820 const AttributeValue& value)
2822 fName = value.string;
2823 return B_OK;
2827 status_t
2828 DIECallSiteParameter::AddChild(DebugInfoEntry* child)
2830 return DIEDeclaredBase::AddChild(child);
2834 // #pragma mark - DebugInfoEntryFactory
2837 DebugInfoEntryFactory::DebugInfoEntryFactory()
2842 status_t
2843 DebugInfoEntryFactory::CreateDebugInfoEntry(uint16 tag, DebugInfoEntry*& _entry)
2845 DebugInfoEntry* entry = NULL;
2847 switch (tag) {
2848 case DW_TAG_array_type:
2849 entry = new(std::nothrow) DIEArrayType;
2850 break;
2851 case DW_TAG_class_type:
2852 entry = new(std::nothrow) DIEClassType;
2853 break;
2854 case DW_TAG_entry_point:
2855 entry = new(std::nothrow) DIEEntryPoint;
2856 break;
2857 case DW_TAG_enumeration_type:
2858 entry = new(std::nothrow) DIEEnumerationType;
2859 break;
2860 case DW_TAG_formal_parameter:
2861 entry = new(std::nothrow) DIEFormalParameter;
2862 break;
2863 case DW_TAG_imported_declaration:
2864 entry = new(std::nothrow) DIEImportedDeclaration;
2865 break;
2866 case DW_TAG_label:
2867 entry = new(std::nothrow) DIELabel;
2868 break;
2869 case DW_TAG_lexical_block:
2870 entry = new(std::nothrow) DIELexicalBlock;
2871 break;
2872 case DW_TAG_member:
2873 entry = new(std::nothrow) DIEMember;
2874 break;
2875 case DW_TAG_pointer_type:
2876 entry = new(std::nothrow) DIEPointerType;
2877 break;
2878 case DW_TAG_reference_type:
2879 entry = new(std::nothrow) DIEReferenceType;
2880 break;
2881 case DW_TAG_compile_unit:
2882 entry = new(std::nothrow) DIECompileUnit;
2883 break;
2884 case DW_TAG_string_type:
2885 entry = new(std::nothrow) DIEStringType;
2886 break;
2887 case DW_TAG_structure_type:
2888 entry = new(std::nothrow) DIEStructureType;
2889 break;
2890 case DW_TAG_subroutine_type:
2891 entry = new(std::nothrow) DIESubroutineType;
2892 break;
2893 case DW_TAG_typedef:
2894 entry = new(std::nothrow) DIETypedef;
2895 break;
2896 case DW_TAG_union_type:
2897 entry = new(std::nothrow) DIEUnionType;
2898 break;
2899 case DW_TAG_unspecified_parameters:
2900 entry = new(std::nothrow) DIEUnspecifiedParameters;
2901 break;
2902 case DW_TAG_variant:
2903 entry = new(std::nothrow) DIEVariant;
2904 break;
2905 case DW_TAG_common_block:
2906 entry = new(std::nothrow) DIECommonBlock;
2907 break;
2908 case DW_TAG_common_inclusion:
2909 entry = new(std::nothrow) DIECommonInclusion;
2910 break;
2911 case DW_TAG_inheritance:
2912 entry = new(std::nothrow) DIEInheritance;
2913 break;
2914 case DW_TAG_inlined_subroutine:
2915 entry = new(std::nothrow) DIEInlinedSubroutine;
2916 break;
2917 case DW_TAG_module:
2918 entry = new(std::nothrow) DIEModule;
2919 break;
2920 case DW_TAG_ptr_to_member_type:
2921 entry = new(std::nothrow) DIEPointerToMemberType;
2922 break;
2923 case DW_TAG_set_type:
2924 entry = new(std::nothrow) DIESetType;
2925 break;
2926 case DW_TAG_subrange_type:
2927 entry = new(std::nothrow) DIESubrangeType;
2928 break;
2929 case DW_TAG_with_stmt:
2930 entry = new(std::nothrow) DIEWithStatement;
2931 break;
2932 case DW_TAG_access_declaration:
2933 entry = new(std::nothrow) DIEAccessDeclaration;
2934 break;
2935 case DW_TAG_base_type:
2936 entry = new(std::nothrow) DIEBaseType;
2937 break;
2938 case DW_TAG_catch_block:
2939 entry = new(std::nothrow) DIECatchBlock;
2940 break;
2941 case DW_TAG_const_type:
2942 entry = new(std::nothrow) DIEConstType;
2943 break;
2944 case DW_TAG_constant:
2945 entry = new(std::nothrow) DIEConstant;
2946 break;
2947 case DW_TAG_enumerator:
2948 entry = new(std::nothrow) DIEEnumerator;
2949 break;
2950 case DW_TAG_file_type:
2951 entry = new(std::nothrow) DIEFileType;
2952 break;
2953 case DW_TAG_friend:
2954 entry = new(std::nothrow) DIEFriend;
2955 break;
2956 case DW_TAG_namelist:
2957 entry = new(std::nothrow) DIENameList;
2958 break;
2959 case DW_TAG_namelist_item:
2960 entry = new(std::nothrow) DIENameListItem;
2961 break;
2962 case DW_TAG_packed_type:
2963 entry = new(std::nothrow) DIEPackedType;
2964 break;
2965 case DW_TAG_subprogram:
2966 entry = new(std::nothrow) DIESubprogram;
2967 break;
2968 case DW_TAG_template_type_parameter:
2969 entry = new(std::nothrow) DIETemplateTypeParameter;
2970 break;
2971 case DW_TAG_template_value_parameter:
2972 entry = new(std::nothrow) DIETemplateValueParameter;
2973 break;
2974 case DW_TAG_thrown_type:
2975 entry = new(std::nothrow) DIEThrownType;
2976 break;
2977 case DW_TAG_try_block:
2978 entry = new(std::nothrow) DIETryBlock;
2979 break;
2980 case DW_TAG_variant_part:
2981 entry = new(std::nothrow) DIEVariantPart;
2982 break;
2983 case DW_TAG_variable:
2984 entry = new(std::nothrow) DIEVariable;
2985 break;
2986 case DW_TAG_volatile_type:
2987 entry = new(std::nothrow) DIEVolatileType;
2988 break;
2989 case DW_TAG_dwarf_procedure:
2990 entry = new(std::nothrow) DIEDwarfProcedure;
2991 break;
2992 case DW_TAG_restrict_type:
2993 entry = new(std::nothrow) DIERestrictType;
2994 break;
2995 case DW_TAG_interface_type:
2996 entry = new(std::nothrow) DIEInterfaceType;
2997 break;
2998 case DW_TAG_namespace:
2999 entry = new(std::nothrow) DIENamespace;
3000 break;
3001 case DW_TAG_imported_module:
3002 entry = new(std::nothrow) DIEImportedModule;
3003 break;
3004 case DW_TAG_unspecified_type:
3005 entry = new(std::nothrow) DIEUnspecifiedType;
3006 break;
3007 case DW_TAG_partial_unit:
3008 entry = new(std::nothrow) DIEPartialUnit;
3009 break;
3010 case DW_TAG_imported_unit:
3011 entry = new(std::nothrow) DIEImportedUnit;
3012 break;
3013 case DW_TAG_condition:
3014 entry = new(std::nothrow) DIECondition;
3015 break;
3016 case DW_TAG_shared_type:
3017 entry = new(std::nothrow) DIESharedType;
3018 break;
3019 case DW_TAG_type_unit:
3020 entry = new(std::nothrow) DIETypeUnit;
3021 break;
3022 case DW_TAG_rvalue_reference_type:
3023 entry = new(std::nothrow) DIERValueReferenceType;
3024 break;
3025 case DW_TAG_GNU_template_template_param:
3026 entry = new(std::nothrow) DIETemplateTemplateParameter;
3027 break;
3028 case DW_TAG_GNU_template_parameter_pack:
3029 entry = new(std::nothrow) DIETemplateTypeParameterPack;
3030 break;
3031 case DW_TAG_GNU_formal_parameter_pack:
3032 entry = new(std::nothrow) DIETemplateValueParameterPack;
3033 break;
3034 case DW_TAG_GNU_call_site:
3035 entry = new(std::nothrow) DIECallSite;
3036 break;
3037 case DW_TAG_GNU_call_site_parameter:
3038 entry = new(std::nothrow) DIECallSiteParameter;
3039 break;
3040 default:
3041 return B_ENTRY_NOT_FOUND;
3042 break;
3045 _entry = entry;
3046 return B_OK;