* 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 {
uint32 file;
uint32 line;

View File

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

View File

@ -504,6 +504,8 @@ public:
virtual uint16 Tag() const;
virtual LocationDescription* GetLocationDescription();
// TODO:
// DW_AT_abstract_origin
// DW_AT_artificial
@ -511,10 +513,12 @@ public:
// DW_AT_default_value
// DW_AT_endianity
// DW_AT_is_optional
// DW_AT_location
// DW_AT_segment
// DW_AT_type
// DW_AT_variable_parameter
private:
LocationDescription fLocationDescription;
};
@ -704,9 +708,13 @@ public:
virtual uint16 Tag() const;
virtual LocationDescription* GetLocationDescription();
// TODO:
// DW_AT_location
// DW_AT_segment
private:
LocationDescription fLocationDescription;
};
@ -849,17 +857,21 @@ public:
virtual uint16 Tag() const;
virtual LocationDescription* GetLocationDescription();
// 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
private:
LocationDescription fLocationDescription;
};
@ -1160,16 +1172,20 @@ public:
virtual uint16 Tag() const;
virtual LocationDescription* GetLocationDescription();
// 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
private:
LocationDescription fLocationDescription;
};
@ -1197,8 +1213,10 @@ public:
virtual uint16 Tag() const;
// TODO:
// DW_AT_location
virtual LocationDescription* GetLocationDescription();
private:
LocationDescription fLocationDescription;
};

View File

@ -94,6 +94,13 @@ DebugInfoEntry::AbstractOrigin() const
}
LocationDescription*
DebugInfoEntry::GetLocationDescription()
{
return NULL;
}
bool
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
DebugInfoEntry::AddAttribute_sibling(uint16 attributeName,
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(ordering)
DEFINE_DEBUG_INFO_ENTRY_ATTR_SETTER(byte_size)

View File

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