Debugger: Handle some more v4 attributes.

- DIECompileUnit can also be marked with DW_AT_main_subprogram to
indicate that the main program resides within that particular unit.

- DIEBaseType and DIEMember now have the additional attribute
DW_AT_data_bit_offset which defines the offset in a somewhat different
manner than DWARF2/3's DW_AT_bit_offset, and deprecates the latter.

Unused/untested for the moment, as gcc 4.7.3 doesn't yet appear to be
generating either of the above attributes.
This commit is contained in:
Rene Gollent
2013-07-21 21:19:26 -04:00
parent 6dbd3ed18c
commit 8e80ec6aaa
2 changed files with 46 additions and 1 deletions
+27 -1
View File
@@ -28,7 +28,8 @@ DIECompileUnitBase::DIECompileUnitBase()
fBaseTypesUnit(NULL), fBaseTypesUnit(NULL),
fLanguage(0), fLanguage(0),
fIdentifierCase(0), fIdentifierCase(0),
fUseUTF8(true) fUseUTF8(true),
fContainsMainSubprogram(false)
{ {
} }
@@ -190,6 +191,15 @@ DIECompileUnitBase::AddAttribute_ranges(uint16 attributeName,
} }
status_t
DIECompileUnitBase::AddAttribute_main_subprogram(uint16 attributeName,
const AttributeValue& value)
{
fContainsMainSubprogram = true;
return B_OK;
}
// #pragma mark - DIEType // #pragma mark - DIEType
@@ -1069,6 +1079,14 @@ DIEMember::AddAttribute_bit_offset(uint16 attributeName,
} }
status_t
DIEMember::AddAttribute_data_bit_offset(uint16 attributeName,
const AttributeValue& value)
{
return SetDynamicAttributeValue(fDataBitOffset, value);
}
// #pragma mark - DIEPointerType // #pragma mark - DIEPointerType
@@ -1645,6 +1663,14 @@ DIEBaseType::AddAttribute_bit_offset(uint16 attributeName,
} }
status_t
DIEBaseType::AddAttribute_data_bit_offset(uint16 attributeName,
const AttributeValue& value)
{
return SetDynamicAttributeValue(fDataBitOffset, value);
}
status_t status_t
DIEBaseType::AddAttribute_endianity(uint16 attributeName, DIEBaseType::AddAttribute_endianity(uint16 attributeName,
const AttributeValue& value) const AttributeValue& value)
@@ -161,6 +161,9 @@ public:
off_t StatementListOffset() const off_t StatementListOffset() const
{ return fStatementListOffset; } { return fStatementListOffset; }
bool ContainsMainSubprogram() const
{ return fContainsMainSubprogram; }
virtual status_t AddChild(DebugInfoEntry* child); virtual status_t AddChild(DebugInfoEntry* child);
virtual status_t AddAttribute_name(uint16 attributeName, virtual status_t AddAttribute_name(uint16 attributeName,
@@ -188,6 +191,9 @@ public:
const AttributeValue& value); const AttributeValue& value);
virtual status_t AddAttribute_ranges(uint16 attributeName, virtual status_t AddAttribute_ranges(uint16 attributeName,
const AttributeValue& value); const AttributeValue& value);
virtual status_t AddAttribute_main_subprogram(
uint16 attributeName,
const AttributeValue& value);
//TODO: //TODO:
// virtual status_t AddAttribute_segment(uint16 attributeName, // virtual status_t AddAttribute_segment(uint16 attributeName,
@@ -209,6 +215,7 @@ protected:
uint16 fLanguage; uint16 fLanguage;
uint8 fIdentifierCase; uint8 fIdentifierCase;
bool fUseUTF8; bool fUseUTF8;
bool fContainsMainSubprogram;
}; };
@@ -669,6 +676,8 @@ public:
{ return &fByteSize; } { return &fByteSize; }
const DynamicAttributeValue* BitOffset() const const DynamicAttributeValue* BitOffset() const
{ return &fBitOffset; } { return &fBitOffset; }
const DynamicAttributeValue* DataBitOffset() const
{ return &fDataBitOffset; }
const DynamicAttributeValue* BitSize() const const DynamicAttributeValue* BitSize() const
{ return &fBitSize; } { return &fBitSize; }
const MemberLocation* Location() const const MemberLocation* Location() const
@@ -682,6 +691,9 @@ public:
const AttributeValue& value); const AttributeValue& value);
virtual status_t AddAttribute_bit_offset(uint16 attributeName, virtual status_t AddAttribute_bit_offset(uint16 attributeName,
const AttributeValue& value); const AttributeValue& value);
virtual status_t AddAttribute_data_bit_offset(
uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_data_member_location( virtual status_t AddAttribute_data_member_location(
uint16 attributeName, uint16 attributeName,
const AttributeValue& value); const AttributeValue& value);
@@ -693,6 +705,7 @@ private:
DIEType* fType; DIEType* fType;
DynamicAttributeValue fByteSize; DynamicAttributeValue fByteSize;
DynamicAttributeValue fBitOffset; DynamicAttributeValue fBitOffset;
DynamicAttributeValue fDataBitOffset;
DynamicAttributeValue fBitSize; DynamicAttributeValue fBitSize;
MemberLocation fLocation; MemberLocation fLocation;
}; };
@@ -1041,6 +1054,8 @@ public:
virtual const DynamicAttributeValue* ByteSize() const; virtual const DynamicAttributeValue* ByteSize() const;
const DynamicAttributeValue* BitOffset() const const DynamicAttributeValue* BitOffset() const
{ return &fBitOffset; } { return &fBitOffset; }
const DynamicAttributeValue* DataBitOffset() const
{ return &fDataBitOffset; }
const DynamicAttributeValue* BitSize() const const DynamicAttributeValue* BitSize() const
{ return &fBitSize; } { return &fBitSize; }
uint8 Encoding() const { return fEncoding; } uint8 Encoding() const { return fEncoding; }
@@ -1054,6 +1069,9 @@ public:
const AttributeValue& value); const AttributeValue& value);
virtual status_t AddAttribute_bit_offset(uint16 attributeName, virtual status_t AddAttribute_bit_offset(uint16 attributeName,
const AttributeValue& value); const AttributeValue& value);
virtual status_t AddAttribute_data_bit_offset(
uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_endianity(uint16 attributeName, virtual status_t AddAttribute_endianity(uint16 attributeName,
const AttributeValue& value); const AttributeValue& value);
@@ -1069,6 +1087,7 @@ public:
private: private:
DynamicAttributeValue fByteSize; DynamicAttributeValue fByteSize;
DynamicAttributeValue fBitOffset; DynamicAttributeValue fBitOffset;
DynamicAttributeValue fDataBitOffset;
DynamicAttributeValue fBitSize; DynamicAttributeValue fBitSize;
uint8 fEncoding; uint8 fEncoding;
uint8 fEndianity; uint8 fEndianity;