* 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:
parent
dec24704e1
commit
d24e0386a3
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue