* More work on the type debug info entry classes.

* New base classes for other entries handling common attributes.
* Annotated all classes with their missing attributes.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31056 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold
2009-06-15 00:42:03 +00:00
parent 70e5aac875
commit d49c767c5e
5 changed files with 955 additions and 98 deletions
+39
View File
@@ -73,6 +73,45 @@ struct DynamicAttributeValue {
}; };
struct ConstantAttributeValue {
union {
uint64 constant;
const char* string;
struct {
const void* data;
dwarf_size_t length;
} block;
};
uint8 attributeClass;
ConstantAttributeValue()
:
attributeClass(ATTRIBUTE_CLASS_CONSTANT)
{
this->constant = 0;
}
void SetTo(uint64 constant)
{
this->constant = constant;
attributeClass = ATTRIBUTE_CLASS_CONSTANT;
}
void SetTo(const char* string)
{
this->string = string;
attributeClass = ATTRIBUTE_CLASS_STRING;
}
void SetTo(const void* data, dwarf_size_t length)
{
block.data = data;
block.length = length;
attributeClass = ATTRIBUTE_CLASS_BLOCK;
}
};
struct DeclarationLocation { struct DeclarationLocation {
uint32 file; uint32 file;
uint32 line; uint32 line;
+419 -25
View File
@@ -241,7 +241,7 @@ DIEModifiedType::AddAttribute_type(uint16 attributeName,
const AttributeValue& value) const AttributeValue& value)
{ {
fType = dynamic_cast<DIEType*>(value.reference); fType = dynamic_cast<DIEType*>(value.reference);
return B_OK; return fType != NULL ? B_OK : B_BAD_DATA;
} }
@@ -270,6 +270,7 @@ DIEAddressingType::AddAttribute_address_class(uint16 attributeName,
DIEDeclaredType::DIEDeclaredType() DIEDeclaredType::DIEDeclaredType()
: :
fDescription(NULL),
fAbstractOrigin(NULL), fAbstractOrigin(NULL),
fAccessibility(0), fAccessibility(0),
fDeclaration(false) fDeclaration(false)
@@ -277,30 +278,10 @@ DIEDeclaredType::DIEDeclaredType()
} }
status_t const char*
DIEDeclaredType::AddAttribute_decl_file(uint16 attributeName, DIEDeclaredType::Description() const
const AttributeValue& value)
{ {
fDeclarationLocation.SetFile(value.constant); return fDescription;
return B_OK;
}
status_t
DIEDeclaredType::AddAttribute_decl_line(uint16 attributeName,
const AttributeValue& value)
{
fDeclarationLocation.SetLine(value.constant);
return B_OK;
}
status_t
DIEDeclaredType::AddAttribute_decl_column(uint16 attributeName,
const AttributeValue& value)
{
fDeclarationLocation.SetColumn(value.constant);
return B_OK;
} }
@@ -322,6 +303,15 @@ DIEDeclaredType::AddAttribute_declaration(uint16 attributeName,
} }
status_t
DIEDeclaredType::AddAttribute_description(uint16 attributeName,
const AttributeValue& value)
{
fDescription = value.string;
return B_OK;
}
status_t status_t
DIEDeclaredType::AddAttribute_abstract_origin(uint16 attributeName, DIEDeclaredType::AddAttribute_abstract_origin(uint16 attributeName,
const AttributeValue& value) const AttributeValue& value)
@@ -331,6 +321,13 @@ DIEDeclaredType::AddAttribute_abstract_origin(uint16 attributeName,
} }
DeclarationLocation*
DIEDeclaredType::GetDeclarationLocation()
{
return &fDeclarationLocation;
}
// #pragma mark - DIEDerivedType // #pragma mark - DIEDerivedType
@@ -346,7 +343,7 @@ DIEDerivedType::AddAttribute_type(uint16 attributeName,
const AttributeValue& value) const AttributeValue& value)
{ {
fType = dynamic_cast<DIEType*>(value.reference); fType = dynamic_cast<DIEType*>(value.reference);
return B_OK; return fType != NULL ? B_OK : B_BAD_DATA;
} }
@@ -356,10 +353,25 @@ DIEDerivedType::AddAttribute_type(uint16 attributeName,
DIECompoundType::DIECompoundType() DIECompoundType::DIECompoundType()
:
fSpecification(NULL)
{ {
} }
status_t
DIECompoundType::AddChild(DebugInfoEntry* child)
{
if (child->Tag() == DW_TAG_member) {
// TODO: Not for interfaces!
fDataMembers.Add(child);
return B_OK;
}
return DIEDeclaredType::AddChild(child);
}
status_t status_t
DIECompoundType::AddAttribute_byte_size(uint16 attributeName, DIECompoundType::AddAttribute_byte_size(uint16 attributeName,
const AttributeValue& value) const AttributeValue& value)
@@ -368,6 +380,15 @@ DIECompoundType::AddAttribute_byte_size(uint16 attributeName,
} }
status_t
DIECompoundType::AddAttribute_specification(uint16 attributeName,
const AttributeValue& value)
{
fSpecification = dynamic_cast<DIECompoundType*>(value.reference);
return fSpecification != NULL ? B_OK : B_BAD_DATA;
}
// #pragma mark - DIEClassBaseType // #pragma mark - DIEClassBaseType
@@ -376,11 +397,158 @@ DIEClassBaseType::DIEClassBaseType()
} }
status_t
DIEClassBaseType::AddChild(DebugInfoEntry* child)
{
switch (child->Tag()) {
case DW_TAG_inheritance:
fDataMembers.Add(child);
return B_OK;
case DW_TAG_friend:
fFriends.Add(child);
return B_OK;
case DW_TAG_access_declaration:
fAccessDeclarations.Add(child);
return B_OK;
case DW_TAG_subprogram:
fMemberFunctions.Add(child);
return B_OK;
// TODO: Templates!
// TODO: Variants!
default:
return DIECompoundType::AddChild(child);
}
}
// #pragma mark - DIENamedBase
DIENamedBase::DIENamedBase()
:
fName(NULL),
fDescription(NULL)
{
}
const char*
DIENamedBase::Name() const
{
return fName;
}
const char*
DIENamedBase::Description() const
{
return fDescription;
}
status_t
DIENamedBase::AddAttribute_name(uint16 attributeName,
const AttributeValue& value)
{
fName = value.string;
return B_OK;
}
status_t
DIENamedBase::AddAttribute_description(uint16 attributeName,
const AttributeValue& value)
{
fDescription = value.string;
return B_OK;
}
// #pragma mark - DIEDeclaredBase
DIEDeclaredBase::DIEDeclaredBase()
{
}
DeclarationLocation*
DIEDeclaredBase::GetDeclarationLocation()
{
return &fDeclarationLocation;
}
// #pragma mark - DIEDeclaredNamedBase
DIEDeclaredNamedBase::DIEDeclaredNamedBase()
:
fName(NULL),
fDescription(NULL),
fAccessibility(0),
fVisibility(0),
fDeclaration(false)
{
}
const char*
DIEDeclaredNamedBase::Name() const
{
return fName;
}
const char*
DIEDeclaredNamedBase::Description() const
{
return fDescription;
}
status_t
DIEDeclaredNamedBase::AddAttribute_name(uint16 attributeName,
const AttributeValue& value)
{
fName = value.string;
return B_OK;
}
status_t
DIEDeclaredNamedBase::AddAttribute_description(uint16 attributeName,
const AttributeValue& value)
{
fDescription = value.string;
return B_OK;
}
status_t
DIEDeclaredNamedBase::AddAttribute_accessibility(uint16 attributeName,
const AttributeValue& value)
{
fAccessibility = value.constant;
return B_OK;
}
status_t
DIEDeclaredNamedBase::AddAttribute_declaration(uint16 attributeName,
const AttributeValue& value)
{
fDeclaration = value.flag;
return B_OK;
}
// #pragma mark - DIEArrayType // #pragma mark - DIEArrayType
DIEArrayType::DIEArrayType() DIEArrayType::DIEArrayType()
: :
fSpecification(NULL),
fOrdering(DW_ORD_row_major) fOrdering(DW_ORD_row_major)
{ {
} }
@@ -448,6 +616,15 @@ DIEArrayType::AddAttribute_byte_size(uint16 attributeName,
} }
status_t
DIEArrayType::AddAttribute_specification(uint16 attributeName,
const AttributeValue& value)
{
fSpecification = dynamic_cast<DIEArrayType*>(value.reference);
return fSpecification != NULL ? B_OK : B_BAD_DATA;
}
// #pragma mark - DIEClassType // #pragma mark - DIEClassType
@@ -482,6 +659,8 @@ DIEEntryPoint::Tag() const
DIEEnumerationType::DIEEnumerationType() DIEEnumerationType::DIEEnumerationType()
:
fSpecification(NULL)
{ {
} }
@@ -493,6 +672,51 @@ DIEEnumerationType::Tag() const
} }
status_t
DIEEnumerationType::AddChild(DebugInfoEntry* child)
{
if (child->Tag() == DW_TAG_enumerator) {
fEnumerators.Add(child);
return B_OK;
}
return DIEDerivedType::AddChild(child);
}
status_t
DIEEnumerationType::AddAttribute_bit_stride(uint16 attributeName,
const AttributeValue& value)
{
return SetDynamicAttributeValue(fBitStride, value);
}
status_t
DIEEnumerationType::AddAttribute_byte_size(uint16 attributeName,
const AttributeValue& value)
{
return SetDynamicAttributeValue(fByteSize, value);
}
status_t
DIEEnumerationType::AddAttribute_byte_stride(uint16 attributeName,
const AttributeValue& value)
{
return SetDynamicAttributeValue(fByteStride, value);
}
status_t
DIEEnumerationType::AddAttribute_specification(uint16 attributeName,
const AttributeValue& value)
{
fSpecification = dynamic_cast<DIEEnumerationType*>(value.reference);
return fSpecification != NULL ? B_OK : B_BAD_DATA;
}
// #pragma mark - DIEFormalParameter // #pragma mark - DIEFormalParameter
@@ -572,6 +796,8 @@ DIEMember::Tag() const
DIEPointerType::DIEPointerType() DIEPointerType::DIEPointerType()
:
fSpecification(NULL)
{ {
} }
@@ -583,6 +809,15 @@ DIEPointerType::Tag() const
} }
status_t
DIEPointerType::AddAttribute_specification(uint16 attributeName,
const AttributeValue& value)
{
fSpecification = dynamic_cast<DIEPointerType*>(value.reference);
return fSpecification != NULL ? B_OK : B_BAD_DATA;
}
// #pragma mark - DIEReferenceType // #pragma mark - DIEReferenceType
@@ -628,6 +863,14 @@ DIEStringType::Tag() const
} }
status_t
DIEStringType::AddAttribute_byte_size(uint16 attributeName,
const AttributeValue& value)
{
return SetDynamicAttributeValue(fByteSize, value);
}
// #pragma mark - DIEStructureType // #pragma mark - DIEStructureType
@@ -647,6 +890,10 @@ DIEStructureType::Tag() const
DIESubroutineType::DIESubroutineType() DIESubroutineType::DIESubroutineType()
:
fReturnType(NULL),
fAddressClass(0),
fPrototyped(false)
{ {
} }
@@ -658,6 +905,48 @@ DIESubroutineType::Tag() const
} }
status_t
DIESubroutineType::AddChild(DebugInfoEntry* child)
{
switch (child->Tag()) {
case DW_TAG_formal_parameter:
case DW_TAG_unspecified_parameters:
fParameters.Add(child);
return B_OK;
default:
return DIEDeclaredType::AddChild(child);
}
}
status_t
DIESubroutineType::AddAttribute_address_class(uint16 attributeName,
const AttributeValue& value)
{
// TODO: How is the address class handled?
fAddressClass = value.constant;
return B_OK;
}
status_t
DIESubroutineType::AddAttribute_prototyped(uint16 attributeName,
const AttributeValue& value)
{
fPrototyped = value.flag;
return B_OK;
}
status_t
DIESubroutineType::AddAttribute_type(uint16 attributeName,
const AttributeValue& value)
{
fReturnType = dynamic_cast<DIEType*>(value.reference);
return fReturnType != NULL ? B_OK : B_BAD_DATA;
}
// #pragma mark - DIETypedef // #pragma mark - DIETypedef
@@ -797,6 +1086,9 @@ DIEModule::Tag() const
DIEPointerToMemberType::DIEPointerToMemberType() DIEPointerToMemberType::DIEPointerToMemberType()
:
fContainingType(NULL),
fAddressClass(0)
{ {
} }
@@ -808,6 +1100,25 @@ DIEPointerToMemberType::Tag() const
} }
status_t
DIEPointerToMemberType::AddAttribute_address_class(uint16 attributeName,
const AttributeValue& value)
{
// TODO: How is the address class handled?
fAddressClass = value.constant;
return B_OK;
}
status_t
DIEPointerToMemberType::AddAttribute_containing_type(uint16 attributeName,
const AttributeValue& value)
{
fContainingType = dynamic_cast<DIECompoundType*>(value.reference);
return fContainingType != NULL ? B_OK : B_BAD_DATA;
}
// #pragma mark - DIESetType // #pragma mark - DIESetType
@@ -823,10 +1134,20 @@ DIESetType::Tag() const
} }
status_t
DIESetType::AddAttribute_byte_size(uint16 attributeName,
const AttributeValue& value)
{
return SetDynamicAttributeValue(fByteSize, value);
}
// #pragma mark - DIESubrangeType // #pragma mark - DIESubrangeType
DIESubrangeType::DIESubrangeType() DIESubrangeType::DIESubrangeType()
:
fThreadsScaled(false)
{ {
} }
@@ -838,6 +1159,63 @@ DIESubrangeType::Tag() const
} }
status_t
DIESubrangeType::AddAttribute_bit_stride(uint16 attributeName,
const AttributeValue& value)
{
return SetDynamicAttributeValue(fBitStride, value);
}
status_t
DIESubrangeType::AddAttribute_byte_size(uint16 attributeName,
const AttributeValue& value)
{
return SetDynamicAttributeValue(fByteSize, value);
}
status_t
DIESubrangeType::AddAttribute_byte_stride(uint16 attributeName,
const AttributeValue& value)
{
return SetDynamicAttributeValue(fByteStride, value);
}
status_t
DIESubrangeType::AddAttribute_count(uint16 attributeName,
const AttributeValue& value)
{
return SetDynamicAttributeValue(fCount, value);
}
status_t
DIESubrangeType::AddAttribute_lower_bound(uint16 attributeName,
const AttributeValue& value)
{
return SetDynamicAttributeValue(fLowerBound, value);
}
status_t
DIESubrangeType::AddAttribute_upper_bound(uint16 attributeName,
const AttributeValue& value)
{
return SetDynamicAttributeValue(fUpperBound, value);
}
status_t
DIESubrangeType::AddAttribute_threads_scaled(uint16 attributeName,
const AttributeValue& value)
{
fThreadsScaled = value.flag;
return B_OK;
}
// #pragma mark - DIEWithStatement // #pragma mark - DIEWithStatement
@@ -988,6 +1366,14 @@ DIEEnumerator::Tag() const
} }
status_t
DIEEnumerator::AddAttribute_const_value(uint16 attributeName,
const AttributeValue& value)
{
return SetConstantAttributeValue(fValue, value);
}
// #pragma mark - DIEFileType // #pragma mark - DIEFileType
@@ -1003,6 +1389,14 @@ DIEFileType::Tag() const
} }
status_t
DIEFileType::AddAttribute_byte_size(uint16 attributeName,
const AttributeValue& value)
{
return SetDynamicAttributeValue(fByteSize, value);
}
// #pragma mark - DIEFriend // #pragma mark - DIEFriend
+410 -67
View File
@@ -238,7 +238,7 @@ public:
const AttributeValue& value); const AttributeValue& value);
protected: protected:
uint64 fAddressClass; uint8 fAddressClass;
}; };
@@ -246,28 +246,30 @@ class DIEDeclaredType : public DIEType {
public: public:
DIEDeclaredType(); DIEDeclaredType();
virtual status_t AddAttribute_decl_file(uint16 attributeName, virtual const char* Description() const;
const AttributeValue& value);
virtual status_t AddAttribute_decl_line(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_decl_column(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_accessibility(uint16 attributeName, virtual status_t AddAttribute_accessibility(uint16 attributeName,
const AttributeValue& value); const AttributeValue& value);
// TODO: !file, !pointer to member // TODO: !file, !pointer to member
virtual status_t AddAttribute_declaration(uint16 attributeName, virtual status_t AddAttribute_declaration(uint16 attributeName,
const AttributeValue& value); const AttributeValue& value);
// TODO: !file // TODO: !file
virtual status_t AddAttribute_description(uint16 attributeName,
const AttributeValue& value);
// TODO: !interface
virtual status_t AddAttribute_abstract_origin( virtual status_t AddAttribute_abstract_origin(
uint16 attributeName, uint16 attributeName,
const AttributeValue& value); const AttributeValue& value);
// TODO: !interface // TODO: !interface
// TODO: // TODO:
// DW_AT_description // !interface
// DW_AT_visibility // !interface // DW_AT_visibility // !interface
protected: protected:
virtual DeclarationLocation* GetDeclarationLocation();
protected:
const char* fDescription;
DeclarationLocation fDeclarationLocation; DeclarationLocation fDeclarationLocation;
DebugInfoEntry* fAbstractOrigin; DebugInfoEntry* fAbstractOrigin;
uint8 fAccessibility; uint8 fAccessibility;
@@ -291,15 +293,19 @@ class DIECompoundType : public DIEDeclaredType {
public: public:
DIECompoundType(); DIECompoundType();
virtual status_t AddChild(DebugInfoEntry* child);
virtual status_t AddAttribute_byte_size(uint16 attributeName, virtual status_t AddAttribute_byte_size(uint16 attributeName,
const AttributeValue& value); const AttributeValue& value);
// TODO: !interface // TODO: !interface
virtual status_t AddAttribute_specification(uint16 attributeName,
// TODO: const AttributeValue& value);
// DW_AT_specification // !interface // TODO: !interface
protected: protected:
DynamicAttributeValue fByteSize; DynamicAttributeValue fByteSize;
DIECompoundType* fSpecification;
DebugInfoEntryList fDataMembers;
}; };
@@ -307,10 +313,70 @@ class DIEClassBaseType : public DIECompoundType {
public: public:
DIEClassBaseType(); DIEClassBaseType();
virtual status_t AddChild(DebugInfoEntry* child);
protected: protected:
DebugInfoEntryList fBaseTypes;
DebugInfoEntryList fFriends;
DebugInfoEntryList fAccessDeclarations;
DebugInfoEntryList fMemberFunctions;
}; };
class DIENamedBase : public DebugInfoEntry {
public:
DIENamedBase();
virtual const char* Name() const;
virtual const char* Description() const;
virtual status_t AddAttribute_name(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_description(uint16 attributeName,
const AttributeValue& value);
protected:
const char* fName;
const char* fDescription;
};
class DIEDeclaredBase : public DebugInfoEntry {
public:
DIEDeclaredBase();
protected:
virtual DeclarationLocation* GetDeclarationLocation();
protected:
DeclarationLocation fDeclarationLocation;
};
class DIEDeclaredNamedBase : public DIEDeclaredBase {
public:
DIEDeclaredNamedBase();
virtual const char* Name() const;
virtual const char* Description() const;
virtual status_t AddAttribute_name(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_description(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_accessibility(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_declaration(uint16 attributeName,
const AttributeValue& value);
protected:
const char* fName;
const char* fDescription;
uint8 fAccessibility;
uint8 fVisibility;
bool fDeclaration;
};
// #pragma mark - // #pragma mark -
@@ -334,14 +400,14 @@ public:
const AttributeValue& value); const AttributeValue& value);
virtual status_t AddAttribute_byte_size(uint16 attributeName, virtual status_t AddAttribute_byte_size(uint16 attributeName,
const AttributeValue& value); const AttributeValue& value);
virtual status_t AddAttribute_specification(uint16 attributeName,
// TODO: const AttributeValue& value);
// DW_AT_specification
private: private:
DynamicAttributeValue fBitStride; DynamicAttributeValue fBitStride;
DynamicAttributeValue fByteSize; DynamicAttributeValue fByteSize;
DebugInfoEntryList fDimensions; DebugInfoEntryList fDimensions;
DIEArrayType* fSpecification;
uint8 fOrdering; uint8 fOrdering;
}; };
@@ -359,6 +425,17 @@ public:
DIEEntryPoint(); DIEEntryPoint();
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO:
// DW_AT_address_class
// DW_AT_description
// DW_AT_frame_base
// DW_AT_low_pc
// DW_AT_name
// DW_AT_return_addr
// DW_AT_segment
// DW_AT_static_link
// DW_AT_type
}; };
@@ -368,51 +445,101 @@ public:
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO: virtual status_t AddChild(DebugInfoEntry* child);
// DW_AT_bit_stride
// DW_AT_byte_size virtual status_t AddAttribute_bit_stride(uint16 attributeName,
// DW_AT_byte_stride const AttributeValue& value);
// DW_AT_specification virtual status_t AddAttribute_byte_size(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_byte_stride(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_specification(uint16 attributeName,
const AttributeValue& value);
private:
DynamicAttributeValue fBitStride;
DynamicAttributeValue fByteSize;
DynamicAttributeValue fByteStride;
DIEEnumerationType* fSpecification;
DebugInfoEntryList fEnumerators;
}; };
class DIEFormalParameter : public DebugInfoEntry { class DIEFormalParameter : public DIEDeclaredNamedBase {
public: public:
DIEFormalParameter(); DIEFormalParameter();
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO:
// DW_AT_abstract_origin
// DW_AT_artificial
// DW_AT_const_value
// DW_AT_default_value
// DW_AT_endianity
// DW_AT_is_optional
// DW_AT_location
// DW_AT_segment
// DW_AT_type
// DW_AT_variable_parameter
}; };
class DIEImportedDeclaration : public DebugInfoEntry { class DIEImportedDeclaration : public DIEDeclaredNamedBase {
public: public:
DIEImportedDeclaration(); DIEImportedDeclaration();
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO:
// DW_AT_import
// DW_AT_start_scope
}; };
class DIELabel : public DebugInfoEntry { class DIELabel : public DIEDeclaredNamedBase {
public: public:
DIELabel(); DIELabel();
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO:
// DW_AT_abstract_origin
// DW_AT_low_pc
// DW_AT_segment
// DW_AT_start_scope
}; };
class DIELexicalBlock : public DebugInfoEntry { class DIELexicalBlock : public DIENamedBase {
public: public:
DIELexicalBlock(); DIELexicalBlock();
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO:
// DW_AT_abstract_origin
// DW_AT_high_pc
// DW_AT_low_pc
// DW_AT_ranges
// DW_AT_segment
}; };
class DIEMember : public DebugInfoEntry { class DIEMember : public DIEDeclaredNamedBase {
public: public:
DIEMember(); DIEMember();
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO:
// DW_AT_bit_offset
// DW_AT_bit_size
// DW_AT_byte_size
// DW_AT_data_member_location
// DW_AT_mutable
// DW_AT_type
}; };
@@ -422,8 +549,11 @@ public:
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO: virtual status_t AddAttribute_specification(uint16 attributeName,
// DW_AT_specification const AttributeValue& value);
private:
DIEPointerType* fSpecification;
}; };
@@ -449,8 +579,12 @@ public:
virtual uint16 Tag() const; virtual uint16 Tag() const;
virtual status_t AddAttribute_byte_size(uint16 attributeName,
const AttributeValue& value);
private:
DynamicAttributeValue fByteSize;
// TODO: // TODO:
// DW_AT_byte_size
// DW_AT_string_length // DW_AT_string_length
}; };
@@ -469,10 +603,20 @@ public:
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO: virtual status_t AddChild(DebugInfoEntry* child);
// DW_AT_address_class
// DW_AT_prototyped virtual status_t AddAttribute_address_class(uint16 attributeName,
// DW_AT_type const AttributeValue& value);
virtual status_t AddAttribute_prototyped(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_type(uint16 attributeName,
const AttributeValue& value);
protected:
DebugInfoEntryList fParameters;
DIEType* fReturnType;
uint8 fAddressClass;
bool fPrototyped;
}; };
@@ -492,43 +636,70 @@ public:
}; };
class DIEUnspecifiedParameters : public DebugInfoEntry { class DIEUnspecifiedParameters : public DIEDeclaredBase {
public: public:
DIEUnspecifiedParameters(); DIEUnspecifiedParameters();
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO:
// DW_AT_abstract_origin
// DW_AT_artificial
}; };
class DIEVariant : public DebugInfoEntry { class DIEVariant : public DIEDeclaredBase {
public: public:
DIEVariant(); DIEVariant();
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO:
// DW_AT_accessibility
// DW_AT_abstract_origin
// DW_AT_declaration
// DW_AT_discr_list
// DW_AT_discr_value
}; };
class DIECommonBlock : public DebugInfoEntry { class DIECommonBlock : public DIEDeclaredNamedBase {
public: public:
DIECommonBlock(); DIECommonBlock();
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO:
// DW_AT_location
// DW_AT_segment
}; };
class DIECommonInclusion : public DebugInfoEntry { class DIECommonInclusion : public DIEDeclaredBase {
public: public:
DIECommonInclusion(); DIECommonInclusion();
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO:
// DW_AT_common_reference
// DW_AT_declaration
// DW_AT_visibility
}; };
class DIEInheritance : public DebugInfoEntry { class DIEInheritance : public DIEDeclaredBase {
public: public:
DIEInheritance(); DIEInheritance();
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO:
// DW_AT_accessibility
// DW_AT_data_member_location
// DW_AT_type
// DW_AT_virtuality
}; };
@@ -537,14 +708,37 @@ public:
DIEInlinedSubroutine(); DIEInlinedSubroutine();
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO:
// DW_AT_abstract_origin
// DW_AT_call_column
// DW_AT_call_file
// DW_AT_call_line
// DW_AT_entry_pc
// DW_AT_high_pc
// DW_AT_low_pc
// DW_AT_ranges
// DW_AT_return_addr
// DW_AT_segment
// DW_AT_start_scope
// DW_AT_trampoline
}; };
class DIEModule : public DebugInfoEntry { class DIEModule : public DIEDeclaredNamedBase {
public: public:
DIEModule(); DIEModule();
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO:
// DW_AT_entry_pc
// DW_AT_high_pc
// DW_AT_low_pc
// DW_AT_priority
// DW_AT_ranges
// DW_AT_segment
// DW_AT_specification
}; };
@@ -554,9 +748,16 @@ public:
virtual uint16 Tag() const; virtual uint16 Tag() const;
virtual status_t AddAttribute_address_class(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_containing_type(
uint16 attributeName,
const AttributeValue& value);
protected:
DIECompoundType* fContainingType;
uint8 fAddressClass;
// TODO: // TODO:
// DW_AT_address_class
// DW_AT_containing_type
// DW_AT_use_location // DW_AT_use_location
}; };
@@ -567,8 +768,11 @@ public:
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO: virtual status_t AddAttribute_byte_size(uint16 attributeName,
// DW_AT_byte_size const AttributeValue& value);
private:
DynamicAttributeValue fByteSize;
}; };
@@ -578,14 +782,29 @@ public:
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO: virtual status_t AddAttribute_bit_stride(uint16 attributeName,
// DW_AT_bit_stride const AttributeValue& value);
// DW_AT_byte_size virtual status_t AddAttribute_byte_size(uint16 attributeName,
// DW_AT_byte_stride const AttributeValue& value);
// DW_AT_count virtual status_t AddAttribute_byte_stride(uint16 attributeName,
// DW_AT_lower_bound const AttributeValue& value);
// DW_AT_threads_scaled virtual status_t AddAttribute_count(uint16 attributeName,
// DW_AT_upper_bound const AttributeValue& value);
virtual status_t AddAttribute_lower_bound(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_upper_bound(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_threads_scaled(uint16 attributeName,
const AttributeValue& value);
private:
DynamicAttributeValue fBitStride;
DynamicAttributeValue fByteSize;
DynamicAttributeValue fByteStride;
DynamicAttributeValue fCount;
DynamicAttributeValue fLowerBound;
DynamicAttributeValue fUpperBound;
bool fThreadsScaled;
}; };
@@ -594,10 +813,22 @@ public:
DIEWithStatement(); DIEWithStatement();
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO:
// DW_AT_accessibility
// DW_AT_address_class
// DW_AT_declaration
// DW_AT_high_pc
// DW_AT_location
// DW_AT_low_pc
// DW_AT_ranges
// DW_AT_segment
// DW_AT_type
// DW_AT_visibility
}; };
class DIEAccessDeclaration : public DebugInfoEntry { class DIEAccessDeclaration : public DIEDeclaredNamedBase {
public: public:
DIEAccessDeclaration(); DIEAccessDeclaration();
@@ -645,6 +876,13 @@ public:
DIECatchBlock(); DIECatchBlock();
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO:
// DW_AT_abstract_origin
// DW_AT_high_pc
// DW_AT_low_pc
// DW_AT_ranges
// DW_AT_segment
}; };
@@ -656,19 +894,32 @@ public:
}; };
class DIEConstant : public DebugInfoEntry { class DIEConstant : public DIEDeclaredNamedBase {
public: public:
DIEConstant(); DIEConstant();
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO:
// DW_AT_const_value
// DW_AT_endianity
// DW_AT_external
// DW_AT_start_scope
// DW_AT_type
}; };
class DIEEnumerator : public DebugInfoEntry { class DIEEnumerator : public DIEDeclaredNamedBase {
public: public:
DIEEnumerator(); DIEEnumerator();
virtual uint16 Tag() const; virtual uint16 Tag() const;
virtual status_t AddAttribute_const_value(uint16 attributeName,
const AttributeValue& value);
private:
ConstantAttributeValue fValue;
}; };
@@ -678,32 +929,45 @@ public:
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO: virtual status_t AddAttribute_byte_size(uint16 attributeName,
// DW_AT_byte_size const AttributeValue& value);
private:
DynamicAttributeValue fByteSize;
}; };
class DIEFriend : public DebugInfoEntry { class DIEFriend : public DIEDeclaredBase {
public: public:
DIEFriend(); DIEFriend();
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO:
// DW_AT_abstract_origin
// DW_AT_friend
}; };
class DIENameList : public DebugInfoEntry { class DIENameList : public DIEDeclaredNamedBase {
public: public:
DIENameList(); DIENameList();
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO:
// DW_AT_abstract_origin
}; };
class DIENameListItem : public DebugInfoEntry { class DIENameListItem : public DIEDeclaredBase {
public: public:
DIENameListItem(); DIENameListItem();
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO:
// DW_AT_namelist_item
}; };
@@ -715,35 +979,76 @@ public:
}; };
class DIESubprogram : public DebugInfoEntry { class DIESubprogram : public DIEDeclaredNamedBase {
public: public:
DIESubprogram(); DIESubprogram();
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO:
// DW_AT_abstract_origin
// DW_AT_address_class
// DW_AT_artificial
// DW_AT_calling_convention
// DW_AT_elemental
// DW_AT_entry_pc
// DW_AT_explicit
// DW_AT_external
// DW_AT_frame_base
// DW_AT_high_pc
// DW_AT_inline
// DW_AT_low_pc
// DW_AT_object_pointer
// DW_AT_prototyped
// DW_AT_pure
// DW_AT_ranges
// DW_AT_recursive
// DW_AT_return_addr
// DW_AT_segment
// DW_AT_specification
// DW_AT_start_scope
// DW_AT_static_link
// DW_AT_trampoline
// DW_AT_type
// DW_AT_virtuality
// DW_AT_vtable_elem_location
}; };
class DIETemplateTypeParameter : public DebugInfoEntry { class DIETemplateTypeParameter : public DIEDeclaredNamedBase {
public: public:
DIETemplateTypeParameter(); DIETemplateTypeParameter();
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO:
// DW_AT_type
}; };
class DIETemplateValueParameter : public DebugInfoEntry { class DIETemplateValueParameter : public DIEDeclaredNamedBase {
public: public:
DIETemplateValueParameter(); DIETemplateValueParameter();
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO:
// DW_AT_const_value
// DW_AT_type
}; };
class DIEThrownType : public DebugInfoEntry { class DIEThrownType : public DIEDeclaredBase {
public: public:
DIEThrownType(); DIEThrownType();
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO:
// DW_AT_allocated
// DW_AT_associated
// DW_AT_data_location
// DW_AT_type
}; };
@@ -752,22 +1057,47 @@ public:
DIETryBlock(); DIETryBlock();
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO:
// DW_AT_abstract_origin
// DW_AT_high_pc
// DW_AT_low_pc
// DW_AT_ranges
// DW_AT_segment
}; };
class DIEVariantPart : public DebugInfoEntry { class DIEVariantPart : public DIEDeclaredBase {
public: public:
DIEVariantPart(); DIEVariantPart();
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO:
// DW_AT_abstract_origin
// DW_AT_accessibility
// DW_AT_declaration
// DW_AT_discr
// DW_AT_type
}; };
class DIEVariable : public DebugInfoEntry { class DIEVariable : public DIEDeclaredNamedBase {
public: public:
DIEVariable(); DIEVariable();
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO:
// DW_AT_abstract_origin
// DW_AT_const_value
// DW_AT_endianity
// DW_AT_external
// DW_AT_location
// DW_AT_segment
// DW_AT_specification
// DW_AT_start_scope
// DW_AT_type
}; };
@@ -794,6 +1124,9 @@ public:
DIEDwarfProcedure(); DIEDwarfProcedure();
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO:
// DW_AT_location
}; };
@@ -813,19 +1146,27 @@ public:
}; };
class DIENamespace : public DebugInfoEntry { class DIENamespace : public DIEDeclaredNamedBase {
public: public:
DIENamespace(); DIENamespace();
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO:
// DW_AT_extension
// DW_AT_start_scope
}; };
class DIEImportedModule : public DebugInfoEntry { class DIEImportedModule : public DIEDeclaredBase {
public: public:
DIEImportedModule(); DIEImportedModule();
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO:
// DW_AT_import
// DW_AT_start_scope
}; };
@@ -866,10 +1207,13 @@ public:
DIEImportedUnit(); DIEImportedUnit();
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO:
// DW_AT_import
}; };
class DIECondition : public DebugInfoEntry { class DIECondition : public DIEDeclaredNamedBase {
public: public:
DIECondition(); DIECondition();
@@ -877,7 +1221,6 @@ public:
}; };
class DIESharedType : public DIEModifiedType { class DIESharedType : public DIEModifiedType {
public: public:
DIESharedType(); DIESharedType();
+73 -3
View File
@@ -58,6 +58,13 @@ DebugInfoEntry::Name() const
} }
const char*
DebugInfoEntry::Description() const
{
return NULL;
}
status_t status_t
DebugInfoEntry::AddChild(DebugInfoEntry* child) DebugInfoEntry::AddChild(DebugInfoEntry* child)
{ {
@@ -66,6 +73,45 @@ DebugInfoEntry::AddChild(DebugInfoEntry* child)
} }
status_t
DebugInfoEntry::AddAttribute_decl_file(uint16 attributeName,
const AttributeValue& value)
{
if (DeclarationLocation* location = GetDeclarationLocation()) {
location->SetFile(value.constant);
return B_OK;
}
return ATTRIBUTE_NOT_HANDLED;
}
status_t
DebugInfoEntry::AddAttribute_decl_line(uint16 attributeName,
const AttributeValue& value)
{
if (DeclarationLocation* location = GetDeclarationLocation()) {
location->SetLine(value.constant);
return B_OK;
}
return ATTRIBUTE_NOT_HANDLED;
}
status_t
DebugInfoEntry::AddAttribute_decl_column(uint16 attributeName,
const AttributeValue& value)
{
if (DeclarationLocation* location = GetDeclarationLocation()) {
location->SetColumn(value.constant);
return B_OK;
}
return ATTRIBUTE_NOT_HANDLED;
}
status_t status_t
DebugInfoEntry::AddAttribute_sibling(uint16 attributeName, DebugInfoEntry::AddAttribute_sibling(uint16 attributeName,
const AttributeValue& value) const AttributeValue& value)
@@ -113,9 +159,6 @@ DEFINE_DEBUG_INFO_ENTRY_ATTR_SETTER(base_types)
DEFINE_DEBUG_INFO_ENTRY_ATTR_SETTER(calling_convention) DEFINE_DEBUG_INFO_ENTRY_ATTR_SETTER(calling_convention)
DEFINE_DEBUG_INFO_ENTRY_ATTR_SETTER(count) DEFINE_DEBUG_INFO_ENTRY_ATTR_SETTER(count)
DEFINE_DEBUG_INFO_ENTRY_ATTR_SETTER(data_member_location) DEFINE_DEBUG_INFO_ENTRY_ATTR_SETTER(data_member_location)
DEFINE_DEBUG_INFO_ENTRY_ATTR_SETTER(decl_column)
DEFINE_DEBUG_INFO_ENTRY_ATTR_SETTER(decl_file)
DEFINE_DEBUG_INFO_ENTRY_ATTR_SETTER(decl_line)
DEFINE_DEBUG_INFO_ENTRY_ATTR_SETTER(declaration) DEFINE_DEBUG_INFO_ENTRY_ATTR_SETTER(declaration)
DEFINE_DEBUG_INFO_ENTRY_ATTR_SETTER(discr_list) DEFINE_DEBUG_INFO_ENTRY_ATTR_SETTER(discr_list)
DEFINE_DEBUG_INFO_ENTRY_ATTR_SETTER(encoding) DEFINE_DEBUG_INFO_ENTRY_ATTR_SETTER(encoding)
@@ -163,6 +206,13 @@ DEFINE_DEBUG_INFO_ENTRY_ATTR_SETTER(pure)
DEFINE_DEBUG_INFO_ENTRY_ATTR_SETTER(recursive) DEFINE_DEBUG_INFO_ENTRY_ATTR_SETTER(recursive)
DeclarationLocation*
DebugInfoEntry::GetDeclarationLocation()
{
return NULL;
}
status_t status_t
DebugInfoEntry::SetDynamicAttributeValue(DynamicAttributeValue& toSet, DebugInfoEntry::SetDynamicAttributeValue(DynamicAttributeValue& toSet,
const AttributeValue& value) const AttributeValue& value)
@@ -181,3 +231,23 @@ DebugInfoEntry::SetDynamicAttributeValue(DynamicAttributeValue& toSet,
return B_BAD_DATA; return B_BAD_DATA;
} }
} }
status_t
DebugInfoEntry::SetConstantAttributeValue(ConstantAttributeValue& toSet,
const AttributeValue& value)
{
switch (value.attributeClass) {
case ATTRIBUTE_CLASS_CONSTANT:
toSet.SetTo(value.constant);
return B_OK;
case ATTRIBUTE_CLASS_STRING:
toSet.SetTo(value.string);
return B_OK;
case ATTRIBUTE_CLASS_BLOCK:
toSet.SetTo(value.block.data, value.block.length);
return B_OK;
default:
return B_BAD_DATA;
}
}
+14 -3
View File
@@ -21,6 +21,8 @@ enum {
class AttributeValue; class AttributeValue;
class ConstantAttributeValue;
class DeclarationLocation;
class DynamicAttributeValue; class DynamicAttributeValue;
struct SourceLanguageInfo; struct SourceLanguageInfo;
@@ -45,9 +47,16 @@ public:
virtual bool IsType() const; virtual bool IsType() const;
virtual const char* Name() const; virtual const char* Name() const;
virtual const char* Description() const;
virtual status_t AddChild(DebugInfoEntry* child); virtual status_t AddChild(DebugInfoEntry* child);
virtual status_t AddAttribute_decl_file(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_decl_line(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_decl_column(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_sibling(uint16 attributeName, virtual status_t AddAttribute_sibling(uint16 attributeName,
const AttributeValue& value); const AttributeValue& value);
@@ -90,9 +99,6 @@ public:
DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(calling_convention) DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(calling_convention)
DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(count) DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(count)
DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(data_member_location) DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(data_member_location)
DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(decl_column)
DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(decl_file)
DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(decl_line)
DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(declaration) DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(declaration)
DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(discr_list) DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(discr_list)
DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(encoding) DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(encoding)
@@ -140,9 +146,14 @@ public:
DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(recursive) DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(recursive)
protected: protected:
virtual DeclarationLocation* GetDeclarationLocation();
status_t SetDynamicAttributeValue( status_t SetDynamicAttributeValue(
DynamicAttributeValue& toSet, DynamicAttributeValue& toSet,
const AttributeValue& value); const AttributeValue& value);
status_t SetConstantAttributeValue(
ConstantAttributeValue& toSet,
const AttributeValue& value);
}; };