* Added LocationDescription class.

* Handle DW_AT_location attributes.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31591 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold 2009-07-15 16:49:08 +00:00
parent dec24704e1
commit d24e0386a3
5 changed files with 145 additions and 12 deletions

View File

@ -200,6 +200,55 @@ struct ConstantAttributeValue {
}; };
struct LocationDescription {
union {
off_t listOffset; // location list
struct {
const void* data;
off_t length;
} expression; // location expression
};
uint8 attributeClass;
LocationDescription()
:
attributeClass(ATTRIBUTE_CLASS_BLOCK)
{
expression.data = NULL;
expression.length = 0;
}
bool IsExpression() const
{
return attributeClass == ATTRIBUTE_CLASS_BLOCK
&& expression.data != NULL;
}
bool IsLocationList() const
{
return attributeClass == ATTRIBUTE_CLASS_LOCLISTPTR;
}
bool IsValid() const
{
return IsExpression() || IsLocationList();
}
void SetToLocationList(off_t offset)
{
listOffset = offset;
attributeClass = ATTRIBUTE_CLASS_LOCLISTPTR;
}
void SetToExpression(const void* data, off_t length)
{
expression.data = data;
expression.length = length;
attributeClass = ATTRIBUTE_CLASS_BLOCK;
}
};
struct DeclarationLocation { struct DeclarationLocation {
uint32 file; uint32 file;
uint32 line; uint32 line;

View File

@ -788,6 +788,13 @@ DIEFormalParameter::Tag() const
} }
LocationDescription*
DIEFormalParameter::GetLocationDescription()
{
return &fLocationDescription;
}
// #pragma mark - DIEImportedDeclaration // #pragma mark - DIEImportedDeclaration
@ -1085,6 +1092,13 @@ DIECommonBlock::Tag() const
} }
LocationDescription*
DIECommonBlock::GetLocationDescription()
{
return &fLocationDescription;
}
// #pragma mark - DIECommonInclusion // #pragma mark - DIECommonInclusion
@ -1294,6 +1308,13 @@ DIEWithStatement::Tag() const
} }
LocationDescription*
DIEWithStatement::GetLocationDescription()
{
return &fLocationDescription;
}
// #pragma mark - DIEAccessDeclaration // #pragma mark - DIEAccessDeclaration
@ -1738,6 +1759,13 @@ DIEVariable::Tag() const
} }
LocationDescription*
DIEVariable::GetLocationDescription()
{
return &fLocationDescription;
}
// #pragma mark - DIEVolatileType // #pragma mark - DIEVolatileType
@ -1795,6 +1823,13 @@ DIEDwarfProcedure::Tag() const
} }
LocationDescription*
DIEDwarfProcedure::GetLocationDescription()
{
return &fLocationDescription;
}
// #pragma mark - DIERestrictType // #pragma mark - DIERestrictType

View File

@ -504,6 +504,8 @@ public:
virtual uint16 Tag() const; virtual uint16 Tag() const;
virtual LocationDescription* GetLocationDescription();
// TODO: // TODO:
// DW_AT_abstract_origin // DW_AT_abstract_origin
// DW_AT_artificial // DW_AT_artificial
@ -511,10 +513,12 @@ public:
// DW_AT_default_value // DW_AT_default_value
// DW_AT_endianity // DW_AT_endianity
// DW_AT_is_optional // DW_AT_is_optional
// DW_AT_location
// DW_AT_segment // DW_AT_segment
// DW_AT_type // DW_AT_type
// DW_AT_variable_parameter // DW_AT_variable_parameter
private:
LocationDescription fLocationDescription;
}; };
@ -704,9 +708,13 @@ public:
virtual uint16 Tag() const; virtual uint16 Tag() const;
virtual LocationDescription* GetLocationDescription();
// TODO: // TODO:
// DW_AT_location
// DW_AT_segment // DW_AT_segment
private:
LocationDescription fLocationDescription;
}; };
@ -849,17 +857,21 @@ public:
virtual uint16 Tag() const; virtual uint16 Tag() const;
virtual LocationDescription* GetLocationDescription();
// TODO: // TODO:
// DW_AT_accessibility // DW_AT_accessibility
// DW_AT_address_class // DW_AT_address_class
// DW_AT_declaration // DW_AT_declaration
// DW_AT_high_pc // DW_AT_high_pc
// DW_AT_location
// DW_AT_low_pc // DW_AT_low_pc
// DW_AT_ranges // DW_AT_ranges
// DW_AT_segment // DW_AT_segment
// DW_AT_type // DW_AT_type
// DW_AT_visibility // DW_AT_visibility
private:
LocationDescription fLocationDescription;
}; };
@ -1160,16 +1172,20 @@ public:
virtual uint16 Tag() const; virtual uint16 Tag() const;
virtual LocationDescription* GetLocationDescription();
// TODO: // TODO:
// DW_AT_abstract_origin // DW_AT_abstract_origin
// DW_AT_const_value // DW_AT_const_value
// DW_AT_endianity // DW_AT_endianity
// DW_AT_external // DW_AT_external
// DW_AT_location
// DW_AT_segment // DW_AT_segment
// DW_AT_specification // DW_AT_specification
// DW_AT_start_scope // DW_AT_start_scope
// DW_AT_type // DW_AT_type
private:
LocationDescription fLocationDescription;
}; };
@ -1197,8 +1213,10 @@ public:
virtual uint16 Tag() const; virtual uint16 Tag() const;
// TODO: virtual LocationDescription* GetLocationDescription();
// DW_AT_location
private:
LocationDescription fLocationDescription;
}; };

View File

@ -94,6 +94,13 @@ DebugInfoEntry::AbstractOrigin() const
} }
LocationDescription*
DebugInfoEntry::GetLocationDescription()
{
return NULL;
}
bool bool
DebugInfoEntry::GetDeclarationFile(uint32& _file) const DebugInfoEntry::GetDeclarationFile(uint32& _file) const
{ {
@ -180,6 +187,28 @@ DebugInfoEntry::AddAttribute_decl_column(uint16 attributeName,
} }
status_t
DebugInfoEntry::AddAttribute_location(uint16 attributeName,
const AttributeValue& value)
{
if (LocationDescription* location = GetLocationDescription()) {
if (value.attributeClass == ATTRIBUTE_CLASS_LOCLISTPTR) {
location->SetToLocationList(value.pointer);
return B_OK;
}
if (value.attributeClass == ATTRIBUTE_CLASS_BLOCK) {
location->SetToExpression(value.block.data, value.block.length);
return B_OK;
}
return B_BAD_DATA;
}
return ATTRIBUTE_NOT_HANDLED;
}
status_t status_t
DebugInfoEntry::AddAttribute_sibling(uint16 attributeName, DebugInfoEntry::AddAttribute_sibling(uint16 attributeName,
const AttributeValue& value) const AttributeValue& value)
@ -190,7 +219,6 @@ DebugInfoEntry::AddAttribute_sibling(uint16 attributeName,
} }
DEFINE_DEBUG_INFO_ENTRY_ATTR_SETTER(location)
DEFINE_DEBUG_INFO_ENTRY_ATTR_SETTER(name) DEFINE_DEBUG_INFO_ENTRY_ATTR_SETTER(name)
DEFINE_DEBUG_INFO_ENTRY_ATTR_SETTER(ordering) DEFINE_DEBUG_INFO_ENTRY_ATTR_SETTER(ordering)
DEFINE_DEBUG_INFO_ENTRY_ATTR_SETTER(byte_size) DEFINE_DEBUG_INFO_ENTRY_ATTR_SETTER(byte_size)

View File

@ -22,10 +22,11 @@ enum {
}; };
class AttributeValue; struct AttributeValue;
class ConstantAttributeValue; struct ConstantAttributeValue;
class DeclarationLocation; struct DeclarationLocation;
class DynamicAttributeValue; struct DynamicAttributeValue;
struct LocationDescription;
struct SourceLanguageInfo; struct SourceLanguageInfo;
@ -58,6 +59,7 @@ public:
virtual const char* Description() const; virtual const char* Description() const;
virtual DebugInfoEntry* Specification() const; virtual DebugInfoEntry* Specification() const;
virtual DebugInfoEntry* AbstractOrigin() const; virtual DebugInfoEntry* AbstractOrigin() const;
virtual LocationDescription* GetLocationDescription();
bool GetDeclarationFile(uint32& _file) const; bool GetDeclarationFile(uint32& _file) const;
bool GetDeclarationLine(uint32& _line) const; bool GetDeclarationLine(uint32& _line) const;
@ -71,12 +73,13 @@ public:
const AttributeValue& value); const AttributeValue& value);
virtual status_t AddAttribute_decl_column(uint16 attributeName, virtual status_t AddAttribute_decl_column(uint16 attributeName,
const AttributeValue& value); const AttributeValue& value);
virtual status_t AddAttribute_location(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);
// TODO: Handle (ignore?) DW_AT_description here? // TODO: Handle (ignore?) DW_AT_description here?
DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(location)
DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(name) DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(name)
DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(ordering) DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(ordering)
DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(byte_size) DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(byte_size)