Files
haiku-beta6/src/apps/debugger/dwarf/DebugInfoEntries.h
T
Ingo Weinhold 6e72ebfce3 * More work on retrieving local variable values. Address and compound types can
now be inspected. Still work in progress -- bit fields and arrays don't work
  correctly yet nor does type lookup beyond the current compilation unit.
* Made most of the debugger output configurable via a config header. By default
  it's much less noisy now.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33217 a95241bf-73f2-0310-859d-f6bbb57e9c96
2009-09-21 04:39:40 +00:00

1557 lines
35 KiB
C++

/*
* Copyright 2009, Ingo Weinhold, [email protected].
* Distributed under the terms of the MIT License.
*/
#ifndef DEBUG_INFO_ENTRIES_H
#define DEBUG_INFO_ENTRIES_H
#include "DebugInfoEntry.h"
#include "AttributeValue.h"
// common:
// DW_AT_name
// // not supported by all types:
// DW_AT_allocated
// DW_AT_associated
// DW_AT_data_location
// DW_AT_start_scope
// modified:
// DW_AT_type
// declared:
// DECL
// DW_AT_accessibility // !file, !pointer to member
// DW_AT_declaration // !file
// DW_AT_abstract_origin // !interface
// DW_AT_description // !interface
// DW_AT_visibility // !interface
// derived: declared
// DW_AT_type
// addressing: modified
// DW_AT_address_class
// compound: declared
// DW_AT_byte_size // !interface
// DW_AT_specification // !interface
// class base: compound
// unspecified: common
// DECL
// DW_AT_description
// class/structure: class base
// interface: class base
// union: compound
// string: declared
// DW_AT_byte_size
// DW_AT_string_length
// subroutine: declared
// DW_AT_address_class
// DW_AT_prototyped
// DW_AT_type
// enumeration: derived
// DW_AT_bit_stride
// DW_AT_byte_size
// DW_AT_byte_stride
// DW_AT_specification
// pointer to member: derived
// DW_AT_address_class
// DW_AT_containing_type
// DW_AT_use_location
// set: derived
// DW_AT_byte_size
// subrange: derived
// DW_AT_bit_stride
// DW_AT_byte_size
// DW_AT_byte_stride
// DW_AT_count
// DW_AT_lower_bound
// DW_AT_threads_scaled
// DW_AT_upper_bound
// array: derived
// DW_AT_bit_stride
// DW_AT_byte_size
// DW_AT_ordering
// DW_AT_specification
// typedef: derived
// file: derived
// DW_AT_byte_size
// shared: modified
// DECL
// DW_AT_count
// const: modified
// packed: modified
// volatile: modified
// DECL
// restrict: modified
// pointer: addressing
// DW_AT_specification
// reference: addressing
// basetype:
// DW_AT_binary_scale
// DW_AT_bit_offset
// DW_AT_bit_size
// DW_AT_byte_size
// DW_AT_decimal_scale
// DW_AT_decimal_sign
// DW_AT_description
// DW_AT_digit_count
// DW_AT_encoding
// DW_AT_endianity
// DW_AT_picture_string
// DW_AT_small
class DIECompileUnitBase : public DebugInfoEntry {
public:
DIECompileUnitBase();
~DIECompileUnitBase();
virtual status_t InitAfterAttributes(
DebugInfoEntryInitInfo& info);
virtual const char* Name() const;
const char* CompilationDir() const
{ return fCompilationDir; }
uint16 Language() const { return fLanguage; }
const DebugInfoEntryList& Types() const { return fTypes; }
const DebugInfoEntryList& OtherChildren() const
{ return fOtherChildren; }
off_t AddressRangesOffset() const
{ return fAddressRangesOffset; }
target_addr_t LowPC() const { return fLowPC; }
target_addr_t HighPC() const { return fHighPC; }
off_t StatementListOffset() const
{ return fStatementListOffset; }
virtual status_t AddChild(DebugInfoEntry* child);
virtual status_t AddAttribute_name(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_comp_dir(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_low_pc(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_high_pc(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_producer(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_stmt_list(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_macro_info(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_base_types(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_language(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_identifier_case(
uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_use_UTF8(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_ranges(uint16 attributeName,
const AttributeValue& value);
//TODO:
// virtual status_t AddAttribute_segment(uint16 attributeName,
// const AttributeValue& value);
// TODO: DW_AT_import
protected:
const char* fName;
const char* fCompilationDir;
target_addr_t fLowPC;
target_addr_t fHighPC;
off_t fStatementListOffset;
off_t fMacroInfoOffset;
off_t fAddressRangesOffset;
DIECompileUnitBase* fBaseTypesUnit;
DebugInfoEntryList fTypes;
DebugInfoEntryList fOtherChildren;
uint16 fLanguage;
uint8 fIdentifierCase;
bool fUseUTF8;
};
class DIEType : public DebugInfoEntry {
public:
DIEType();
virtual bool IsType() const;
virtual const char* Name() const;
virtual bool IsDeclaration() const;
virtual const DynamicAttributeValue* ByteSize() const;
virtual status_t AddAttribute_name(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_allocated(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_associated(uint16 attributeName,
const AttributeValue& value);
// TODO:
// DW_AT_data_location
// DW_AT_start_scope
protected:
const char* fName;
DynamicAttributeValue fAllocated;
DynamicAttributeValue fAssociated;
};
class DIEModifiedType : public DIEType {
public:
DIEModifiedType();
DIEType* GetType() const { return fType; }
virtual status_t AddAttribute_type(uint16 attributeName,
const AttributeValue& value);
protected:
DIEType* fType;
};
class DIEAddressingType : public DIEModifiedType {
public:
DIEAddressingType();
virtual status_t AddAttribute_address_class(uint16 attributeName,
const AttributeValue& value);
protected:
uint8 fAddressClass;
};
class DIEDeclaredType : public DIEType {
public:
DIEDeclaredType();
virtual const char* Description() const;
virtual DebugInfoEntry* AbstractOrigin() const;
virtual bool IsDeclaration() const;
virtual status_t AddAttribute_accessibility(uint16 attributeName,
const AttributeValue& value);
// TODO: !file, !pointer to member
virtual status_t AddAttribute_declaration(uint16 attributeName,
const AttributeValue& value);
// TODO: !file
virtual status_t AddAttribute_description(uint16 attributeName,
const AttributeValue& value);
// TODO: !interface
virtual status_t AddAttribute_abstract_origin(
uint16 attributeName,
const AttributeValue& value);
// TODO: !interface
// TODO:
// DW_AT_visibility // !interface
protected:
virtual DeclarationLocation* GetDeclarationLocation();
protected:
const char* fDescription;
DeclarationLocation fDeclarationLocation;
DebugInfoEntry* fAbstractOrigin;
uint8 fAccessibility;
bool fDeclaration;
};
class DIEDerivedType : public DIEDeclaredType {
public:
DIEDerivedType();
DIEType* GetType() const { return fType; }
virtual status_t AddAttribute_type(uint16 attributeName,
const AttributeValue& value);
protected:
DIEType* fType;
};
class DIECompoundType : public DIEDeclaredType {
public:
DIECompoundType();
virtual bool IsNamespace() const;
virtual DebugInfoEntry* Specification() const;
virtual const DynamicAttributeValue* ByteSize() const;
const DebugInfoEntryList& DataMembers() const
{ return fDataMembers; }
virtual status_t AddChild(DebugInfoEntry* child);
virtual status_t AddAttribute_byte_size(uint16 attributeName,
const AttributeValue& value);
// TODO: !interface
virtual status_t AddAttribute_specification(uint16 attributeName,
const AttributeValue& value);
// TODO: !interface
protected:
DynamicAttributeValue fByteSize;
DIECompoundType* fSpecification;
DebugInfoEntryList fDataMembers;
};
class DIEClassBaseType : public DIECompoundType {
public:
DIEClassBaseType();
const DebugInfoEntryList& BaseTypes() const
{ return fBaseTypes; }
virtual status_t AddChild(DebugInfoEntry* child);
protected:
DebugInfoEntryList fBaseTypes;
DebugInfoEntryList fFriends;
DebugInfoEntryList fAccessDeclarations;
DebugInfoEntryList fMemberFunctions;
DebugInfoEntryList fInnerTypes;
};
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;
uint8 Accessibility() const { return fAccessibility; }
uint8 Visibility() const { return fVisibility; }
virtual bool IsDeclaration() 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 -
class DIEArrayType : public DIEDerivedType {
public:
DIEArrayType();
virtual uint16 Tag() const;
virtual status_t InitAfterHierarchy(
DebugInfoEntryInitInfo& info);
virtual DebugInfoEntry* Specification() const;
virtual const DynamicAttributeValue* ByteSize() const;
virtual status_t AddChild(DebugInfoEntry* child);
virtual status_t AddAttribute_ordering(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_bit_stride(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_stride_size(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_byte_size(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_specification(uint16 attributeName,
const AttributeValue& value);
private:
DynamicAttributeValue fBitStride;
DynamicAttributeValue fByteSize;
DebugInfoEntryList fDimensions;
DIEArrayType* fSpecification;
uint8 fOrdering;
};
class DIEClassType : public DIEClassBaseType {
public:
DIEClassType();
virtual uint16 Tag() const;
};
class DIEEntryPoint : public DebugInfoEntry {
public:
// TODO: Maybe introduce a common base class for DIEEntryPoint and
// DIESubprogram.
DIEEntryPoint();
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
};
class DIEEnumerationType : public DIEDerivedType {
public:
DIEEnumerationType();
virtual uint16 Tag() const;
virtual DebugInfoEntry* Specification() const;
virtual const DynamicAttributeValue* ByteSize() const;
virtual status_t AddChild(DebugInfoEntry* child);
virtual status_t AddAttribute_bit_stride(uint16 attributeName,
const AttributeValue& value);
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 DIEDeclaredNamedBase {
public:
DIEFormalParameter();
virtual uint16 Tag() const;
virtual DebugInfoEntry* AbstractOrigin() const;
virtual LocationDescription* GetLocationDescription();
DIEType* GetType() const { return fType; }
const ConstantAttributeValue* ConstValue() const
{ return &fValue; }
virtual status_t AddAttribute_abstract_origin(
uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_const_value(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_type(uint16 attributeName,
const AttributeValue& value);
// TODO:
// DW_AT_artificial
// DW_AT_default_value
// DW_AT_endianity
// DW_AT_is_optional
// DW_AT_segment
// DW_AT_variable_parameter
private:
LocationDescription fLocationDescription;
DebugInfoEntry* fAbstractOrigin;
DIEType* fType;
ConstantAttributeValue fValue;
};
class DIEImportedDeclaration : public DIEDeclaredNamedBase {
public:
DIEImportedDeclaration();
virtual uint16 Tag() const;
// TODO:
// DW_AT_import
// DW_AT_start_scope
};
class DIELabel : public DIEDeclaredNamedBase {
public:
DIELabel();
virtual uint16 Tag() const;
// TODO:
// DW_AT_abstract_origin
// DW_AT_low_pc
// DW_AT_segment
// DW_AT_start_scope
};
class DIELexicalBlock : public DIENamedBase {
public:
DIELexicalBlock();
virtual uint16 Tag() const;
virtual DebugInfoEntry* AbstractOrigin() const;
off_t AddressRangesOffset() const
{ return fAddressRangesOffset; }
target_addr_t LowPC() const { return fLowPC; }
target_addr_t HighPC() const { return fHighPC; }
const DebugInfoEntryList Variables() const { return fVariables; }
const DebugInfoEntryList Blocks() const { return fBlocks; }
virtual status_t AddChild(DebugInfoEntry* child);
virtual status_t AddAttribute_low_pc(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_high_pc(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_ranges(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_abstract_origin(
uint16 attributeName,
const AttributeValue& value);
protected:
DebugInfoEntryList fVariables;
DebugInfoEntryList fBlocks;
target_addr_t fLowPC;
target_addr_t fHighPC;
off_t fAddressRangesOffset;
DIELexicalBlock* fAbstractOrigin;
// TODO:
// DW_AT_segment
};
class DIEMember : public DIEDeclaredNamedBase {
public:
DIEMember();
virtual uint16 Tag() const;
DIEType* GetType() const { return fType; }
const DynamicAttributeValue* ByteSize() const
{ return &fByteSize; }
const DynamicAttributeValue* BitOffset() const
{ return &fBitOffset; }
const DynamicAttributeValue* BitSize() const
{ return &fBitSize; }
const MemberLocation* Location() const
{ return &fLocation; }
virtual status_t AddAttribute_type(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_byte_size(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_bit_size(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_bit_offset(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_data_member_location(
uint16 attributeName,
const AttributeValue& value);
// TODO:
// DW_AT_mutable
private:
DIEType* fType;
DynamicAttributeValue fByteSize;
DynamicAttributeValue fBitOffset;
DynamicAttributeValue fBitSize;
MemberLocation fLocation;
};
class DIEPointerType : public DIEAddressingType {
public:
DIEPointerType();
virtual uint16 Tag() const;
virtual DebugInfoEntry* Specification() const;
virtual status_t AddAttribute_specification(uint16 attributeName,
const AttributeValue& value);
private:
DIEPointerType* fSpecification;
};
class DIEReferenceType : public DIEAddressingType {
public:
DIEReferenceType();
virtual uint16 Tag() const;
};
class DIECompileUnit : public DIECompileUnitBase {
public:
DIECompileUnit();
virtual uint16 Tag() const;
};
class DIEStringType : public DIEDeclaredType {
public:
DIEStringType();
virtual uint16 Tag() const;
virtual const DynamicAttributeValue* ByteSize() const;
virtual status_t AddAttribute_byte_size(uint16 attributeName,
const AttributeValue& value);
private:
DynamicAttributeValue fByteSize;
// TODO:
// DW_AT_string_length
};
class DIEStructureType : public DIEClassBaseType {
public:
DIEStructureType();
virtual uint16 Tag() const;
};
class DIESubroutineType : public DIEDeclaredType {
public:
DIESubroutineType();
virtual uint16 Tag() const;
virtual status_t AddChild(DebugInfoEntry* child);
virtual status_t AddAttribute_address_class(uint16 attributeName,
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;
};
class DIETypedef : public DIEDerivedType {
public:
DIETypedef();
virtual uint16 Tag() const;
};
class DIEUnionType : public DIECompoundType {
public:
DIEUnionType();
virtual uint16 Tag() const;
};
class DIEUnspecifiedParameters : public DIEDeclaredBase {
public:
DIEUnspecifiedParameters();
virtual uint16 Tag() const;
// TODO:
// DW_AT_abstract_origin
// DW_AT_artificial
};
class DIEVariant : public DIEDeclaredBase {
public:
DIEVariant();
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 DIEDeclaredNamedBase {
public:
DIECommonBlock();
virtual uint16 Tag() const;
virtual LocationDescription* GetLocationDescription();
// TODO:
// DW_AT_segment
private:
LocationDescription fLocationDescription;
};
class DIECommonInclusion : public DIEDeclaredBase {
public:
DIECommonInclusion();
virtual uint16 Tag() const;
// TODO:
// DW_AT_common_reference
// DW_AT_declaration
// DW_AT_visibility
};
class DIEInheritance : public DIEDeclaredBase {
public:
DIEInheritance();
virtual uint16 Tag() const;
DIEType* GetType() const { return fType; }
const MemberLocation* Location() const
{ return &fLocation; }
virtual status_t AddAttribute_type(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_data_member_location(
uint16 attributeName,
const AttributeValue& value);
// TODO:
// DW_AT_accessibility
// DW_AT_virtuality
private:
DIEType* fType;
MemberLocation fLocation;
};
class DIEInlinedSubroutine : public DebugInfoEntry {
public:
DIEInlinedSubroutine();
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 DIEDeclaredNamedBase {
public:
DIEModule();
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
};
class DIEPointerToMemberType : public DIEDerivedType {
public:
DIEPointerToMemberType();
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:
// DW_AT_use_location
};
class DIESetType : public DIEDerivedType {
public:
DIESetType();
virtual uint16 Tag() const;
virtual const DynamicAttributeValue* ByteSize() const;
virtual status_t AddAttribute_byte_size(uint16 attributeName,
const AttributeValue& value);
private:
DynamicAttributeValue fByteSize;
};
class DIESubrangeType : public DIEDerivedType {
public:
DIESubrangeType();
virtual uint16 Tag() const;
virtual const DynamicAttributeValue* ByteSize() const;
virtual status_t AddAttribute_bit_stride(uint16 attributeName,
const AttributeValue& value);
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_count(uint16 attributeName,
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;
};
class DIEWithStatement : public DebugInfoEntry {
public:
DIEWithStatement();
virtual uint16 Tag() const;
DIEType* GetType() const { return fType; }
virtual LocationDescription* GetLocationDescription();
virtual status_t AddAttribute_type(uint16 attributeName,
const AttributeValue& value);
// TODO:
// DW_AT_accessibility
// DW_AT_address_class
// DW_AT_declaration
// DW_AT_high_pc
// DW_AT_low_pc
// DW_AT_ranges
// DW_AT_segment
// DW_AT_visibility
private:
DIEType* fType;
LocationDescription fLocationDescription;
};
class DIEAccessDeclaration : public DIEDeclaredNamedBase {
public:
DIEAccessDeclaration();
virtual uint16 Tag() const;
};
class DIEBaseType : public DIEType {
public:
DIEBaseType();
virtual uint16 Tag() const;
virtual const DynamicAttributeValue* ByteSize() const;
const DynamicAttributeValue* BitOffset() const
{ return &fBitOffset; }
const DynamicAttributeValue* BitSize() const
{ return &fBitSize; }
uint8 Encoding() const { return fEncoding; }
uint8 Endianity() const { return fEndianity; }
virtual status_t AddAttribute_encoding(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_byte_size(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_bit_size(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_bit_offset(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_endianity(uint16 attributeName,
const AttributeValue& value);
// TODO:
// DW_AT_binary_scale
// DW_AT_decimal_scale
// DW_AT_decimal_sign
// DW_AT_description
// DW_AT_digit_count
// DW_AT_picture_string
// DW_AT_small
private:
DynamicAttributeValue fByteSize;
DynamicAttributeValue fBitOffset;
DynamicAttributeValue fBitSize;
uint8 fEncoding;
uint8 fEndianity;
};
class DIECatchBlock : public DebugInfoEntry {
public:
DIECatchBlock();
virtual uint16 Tag() const;
// TODO:
// DW_AT_abstract_origin
// DW_AT_high_pc
// DW_AT_low_pc
// DW_AT_ranges
// DW_AT_segment
};
class DIEConstType : public DIEModifiedType {
public:
DIEConstType();
virtual uint16 Tag() const;
};
class DIEConstant : public DIEDeclaredNamedBase {
public:
DIEConstant();
virtual uint16 Tag() const;
DIEType* GetType() const { return fType; }
const ConstantAttributeValue* ConstValue() const
{ return &fValue; }
virtual status_t AddAttribute_const_value(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_type(uint16 attributeName,
const AttributeValue& value);
// TODO:
// DW_AT_endianity
// DW_AT_external
// DW_AT_start_scope
private:
DIEType* fType;
ConstantAttributeValue fValue;
};
class DIEEnumerator : public DIEDeclaredNamedBase {
public:
DIEEnumerator();
virtual uint16 Tag() const;
const ConstantAttributeValue* ConstValue() const
{ return &fValue; }
virtual status_t AddAttribute_const_value(uint16 attributeName,
const AttributeValue& value);
private:
ConstantAttributeValue fValue;
};
class DIEFileType : public DIEDerivedType {
public:
DIEFileType();
virtual uint16 Tag() const;
virtual const DynamicAttributeValue* ByteSize() const;
virtual status_t AddAttribute_byte_size(uint16 attributeName,
const AttributeValue& value);
private:
DynamicAttributeValue fByteSize;
};
class DIEFriend : public DIEDeclaredBase {
public:
DIEFriend();
virtual uint16 Tag() const;
// TODO:
// DW_AT_abstract_origin
// DW_AT_friend
};
class DIENameList : public DIEDeclaredNamedBase {
public:
DIENameList();
virtual uint16 Tag() const;
// TODO:
// DW_AT_abstract_origin
};
class DIENameListItem : public DIEDeclaredBase {
public:
DIENameListItem();
virtual uint16 Tag() const;
// TODO:
// DW_AT_namelist_item
};
class DIEPackedType : public DIEModifiedType {
public:
DIEPackedType();
virtual uint16 Tag() const;
};
class DIESubprogram : public DIEDeclaredNamedBase {
public:
DIESubprogram();
~DIESubprogram();
virtual uint16 Tag() const;
virtual DebugInfoEntry* Specification() const;
virtual DebugInfoEntry* AbstractOrigin() const;
off_t AddressRangesOffset() const
{ return fAddressRangesOffset; }
target_addr_t LowPC() const { return fLowPC; }
target_addr_t HighPC() const { return fHighPC; }
const LocationDescription* FrameBase() const { return &fFrameBase; }
const DebugInfoEntryList Parameters() const { return fParameters; }
const DebugInfoEntryList Variables() const { return fVariables; }
const DebugInfoEntryList Blocks() const { return fBlocks; }
bool IsPrototyped() const { return fPrototyped; }
uint8 Inline() const { return fInline; }
virtual status_t AddChild(DebugInfoEntry* child);
virtual status_t AddAttribute_low_pc(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_high_pc(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_ranges(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_specification(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_address_class(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_prototyped(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_type(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_inline(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_abstract_origin(
uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_frame_base(
uint16 attributeName,
const AttributeValue& value);
protected:
DebugInfoEntryList fParameters;
DebugInfoEntryList fVariables;
DebugInfoEntryList fBlocks;
target_addr_t fLowPC;
target_addr_t fHighPC;
off_t fAddressRangesOffset;
DIESubprogram* fSpecification;
DIESubprogram* fAbstractOrigin;
DIEType* fReturnType;
LocationDescription fFrameBase;
uint8 fAddressClass;
bool fPrototyped;
uint8 fInline;
// TODO:
// DW_AT_artificial
// DW_AT_calling_convention
// DW_AT_elemental
// DW_AT_entry_pc
// DW_AT_explicit
// DW_AT_external
// DW_AT_object_pointer
// DW_AT_pure
// DW_AT_recursive
// DW_AT_return_addr
// DW_AT_segment
// DW_AT_start_scope
// DW_AT_static_link
// DW_AT_trampoline
// DW_AT_virtuality
// DW_AT_vtable_elem_location
};
class DIETemplateTypeParameter : public DIEDeclaredNamedBase {
public:
DIETemplateTypeParameter();
virtual uint16 Tag() const;
DIEType* GetType() const { return fType; }
virtual status_t AddAttribute_type(uint16 attributeName,
const AttributeValue& value);
private:
DIEType* fType;
};
class DIETemplateValueParameter : public DIEDeclaredNamedBase {
public:
DIETemplateValueParameter();
virtual uint16 Tag() const;
DIEType* GetType() const { return fType; }
const ConstantAttributeValue* ConstValue() const
{ return &fValue; }
virtual status_t AddAttribute_const_value(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_type(uint16 attributeName,
const AttributeValue& value);
private:
DIEType* fType;
ConstantAttributeValue fValue;
};
class DIEThrownType : public DIEDeclaredBase {
public:
DIEThrownType();
virtual uint16 Tag() const;
DIEType* GetType() const { return fType; }
virtual status_t AddAttribute_type(uint16 attributeName,
const AttributeValue& value);
// TODO:
// DW_AT_allocated
// DW_AT_associated
// DW_AT_data_location
private:
DIEType* fType;
};
class DIETryBlock : public DebugInfoEntry {
public:
DIETryBlock();
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 DIEDeclaredBase {
public:
DIEVariantPart();
virtual uint16 Tag() const;
DIEType* GetType() const { return fType; }
virtual status_t AddAttribute_type(uint16 attributeName,
const AttributeValue& value);
// TODO:
// DW_AT_abstract_origin
// DW_AT_accessibility
// DW_AT_declaration
// DW_AT_discr
private:
DIEType* fType;
};
class DIEVariable : public DIEDeclaredNamedBase {
public:
DIEVariable();
virtual uint16 Tag() const;
virtual DebugInfoEntry* Specification() const;
virtual DebugInfoEntry* AbstractOrigin() const;
virtual LocationDescription* GetLocationDescription();
DIEType* GetType() const { return fType; }
const ConstantAttributeValue* ConstValue() const
{ return &fValue; }
uint64 StartScope() const { return fStartScope; }
virtual status_t AddAttribute_const_value(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_type(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_specification(uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_abstract_origin(
uint16 attributeName,
const AttributeValue& value);
virtual status_t AddAttribute_start_scope(
uint16 attributeName,
const AttributeValue& value);
// TODO:
// DW_AT_endianity
// DW_AT_external
// DW_AT_segment
private:
LocationDescription fLocationDescription;
ConstantAttributeValue fValue;
DIEType* fType;
DIEVariable* fSpecification;
DIEVariable* fAbstractOrigin;
uint64 fStartScope;
};
class DIEVolatileType : public DIEModifiedType {
public:
DIEVolatileType();
virtual uint16 Tag() const;
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);
private:
DeclarationLocation fDeclarationLocation;
};
class DIEDwarfProcedure : public DebugInfoEntry {
public:
DIEDwarfProcedure();
virtual uint16 Tag() const;
virtual LocationDescription* GetLocationDescription();
private:
LocationDescription fLocationDescription;
};
class DIERestrictType : public DIEModifiedType {
public:
DIERestrictType();
virtual uint16 Tag() const;
};
class DIEInterfaceType : public DIEClassBaseType {
public:
DIEInterfaceType();
virtual uint16 Tag() const;
};
class DIENamespace : public DIEDeclaredNamedBase {
public:
DIENamespace();
virtual uint16 Tag() const;
virtual bool IsNamespace() const;
const DebugInfoEntryList& Children() const
{ return fChildren; }
virtual status_t AddChild(DebugInfoEntry* child);
private:
DebugInfoEntryList fChildren;
// TODO:
// DW_AT_extension
// DW_AT_start_scope
};
class DIEImportedModule : public DIEDeclaredBase {
public:
DIEImportedModule();
virtual uint16 Tag() const;
// TODO:
// DW_AT_import
// DW_AT_start_scope
};
class DIEUnspecifiedType : public DIEType {
public:
DIEUnspecifiedType();
virtual uint16 Tag() const;
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);
// TODO:
// DW_AT_description
private:
DeclarationLocation fDeclarationLocation;
};
class DIEPartialUnit : public DIECompileUnitBase {
public:
DIEPartialUnit();
virtual uint16 Tag() const;
// TODO:
// DW_AT_description
};
class DIEImportedUnit : public DebugInfoEntry {
public:
DIEImportedUnit();
virtual uint16 Tag() const;
// TODO:
// DW_AT_import
};
class DIECondition : public DIEDeclaredNamedBase {
public:
DIECondition();
virtual uint16 Tag() const;
};
class DIESharedType : public DIEModifiedType {
public:
DIESharedType();
virtual uint16 Tag() const;
virtual status_t AddAttribute_count(uint16 attributeName,
const AttributeValue& value);
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);
private:
DynamicAttributeValue fBlockSize;
DeclarationLocation fDeclarationLocation;
};
// #pragma mark - DebugInfoEntryFactory
class DebugInfoEntryFactory {
public:
DebugInfoEntryFactory();
status_t CreateDebugInfoEntry(uint16 tag,
DebugInfoEntry*& entry);
};
#endif // DEBUG_INFO_ENTRIES_H