1/* 2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Distributed under the terms of the MIT License. 4 */ 5#ifndef DEBUG_INFO_ENTRY_H 6#define DEBUG_INFO_ENTRY_H 7 8#include <String.h> 9 10#include <util/DoublyLinkedList.h> 11 12#include "Types.h" 13 14 15#define DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(name) \ 16 virtual status_t AddAttribute_##name(uint16 attributeName, \ 17 const AttributeValue& value); 18 19enum { 20 ATTRIBUTE_NOT_HANDLED = 1, 21 ENTRY_NOT_HANDLED = 2 22}; 23 24 25struct AttributeValue; 26struct ConstantAttributeValue; 27struct DeclarationLocation; 28struct DynamicAttributeValue; 29struct LocationDescription; 30struct MemberLocation; 31struct SourceLanguageInfo; 32 33 34struct DebugInfoEntryInitInfo { 35 const SourceLanguageInfo* languageInfo; 36}; 37 38 39class DebugInfoEntry : public DoublyLinkedListLinkImpl<DebugInfoEntry> { 40public: 41 DebugInfoEntry(); 42 virtual ~DebugInfoEntry(); 43 44 virtual status_t InitAfterHierarchy( 45 DebugInfoEntryInitInfo& info); 46 virtual status_t InitAfterAttributes( 47 DebugInfoEntryInitInfo& info); 48 49 virtual uint16 Tag() const = 0; 50 51 DebugInfoEntry* Parent() const { return fParent; } 52 void SetParent(DebugInfoEntry* parent); 53 54 virtual bool IsType() const; 55 virtual bool IsNamespace() const; 56 // a namespace-like thingy (namespace, 57 // class, ...) 58 59 virtual const char* Name() const; 60 virtual const char* Description() const; 61 virtual DebugInfoEntry* Specification() const; 62 virtual DebugInfoEntry* AbstractOrigin() const; 63 virtual LocationDescription* GetLocationDescription(); 64 65 bool GetDeclarationFile(uint32& _file) const; 66 bool GetDeclarationLine(uint32& _line) const; 67 bool GetDeclarationColumn(uint32& _column) const; 68 69 virtual status_t AddChild(DebugInfoEntry* child); 70 71 virtual status_t AddAttribute_decl_file(uint16 attributeName, 72 const AttributeValue& value); 73 virtual status_t AddAttribute_decl_line(uint16 attributeName, 74 const AttributeValue& value); 75 virtual status_t AddAttribute_decl_column(uint16 attributeName, 76 const AttributeValue& value); 77 virtual status_t AddAttribute_location(uint16 attributeName, 78 const AttributeValue& value); 79 virtual status_t AddAttribute_sibling(uint16 attributeName, 80 const AttributeValue& value); 81 82// TODO: Handle (ignore?) DW_AT_description here? 83 84 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(name) 85 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(ordering) 86 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(byte_size) 87 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(bit_offset) 88 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(bit_size) 89 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(stmt_list) 90 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(low_pc) 91 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(high_pc) 92 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(language) 93 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(discr) 94 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(discr_value) 95 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(visibility) 96 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(import) 97 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(string_length) 98 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(common_reference) 99 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(comp_dir) 100 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(const_value) 101 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(containing_type) 102 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(default_value) 103 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(inline) 104 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(is_optional) 105 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(lower_bound) 106 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(producer) 107 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(prototyped) 108 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(return_addr) 109 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(start_scope) 110 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(bit_stride) 111 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(upper_bound) 112 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(abstract_origin) 113 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(accessibility) 114 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(address_class) 115 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(artificial) 116 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(base_types) 117 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(calling_convention) 118 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(count) 119 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(data_member_location) 120 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(declaration) 121 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(discr_list) 122 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(encoding) 123 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(external) 124 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(frame_base) 125 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(friend) 126 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(identifier_case) 127 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(macro_info) 128 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(namelist_item) 129 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(priority) 130 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(segment) 131 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(specification) 132 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(static_link) 133 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(type) 134 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(use_location) 135 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(variable_parameter) 136 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(virtuality) 137 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(vtable_elem_location) 138 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(allocated) 139 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(associated) 140 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(data_location) 141 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(byte_stride) 142 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(entry_pc) 143 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(use_UTF8) 144 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(extension) 145 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(ranges) 146 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(trampoline) 147 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(call_column) 148 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(call_file) 149 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(call_line) 150 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(description) 151 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(binary_scale) 152 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(decimal_scale) 153 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(small) 154 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(decimal_sign) 155 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(digit_count) 156 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(picture_string) 157 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(mutable) 158 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(threads_scaled) 159 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(explicit) 160 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(object_pointer) 161 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(endianity) 162 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(elemental) 163 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(pure) 164 DECLARE_DEBUG_INFO_ENTRY_ATTR_SETTER(recursive) 165 166protected: 167 virtual DeclarationLocation* GetDeclarationLocation(); 168 169 status_t SetDynamicAttributeValue( 170 DynamicAttributeValue& toSet, 171 const AttributeValue& value); 172 status_t SetConstantAttributeValue( 173 ConstantAttributeValue& toSet, 174 const AttributeValue& value); 175 status_t SetMemberLocation(MemberLocation& toSet, 176 const AttributeValue& value); 177 178protected: 179 DebugInfoEntry* fParent; 180}; 181 182 183typedef DoublyLinkedList<DebugInfoEntry> DebugInfoEntryList; 184 185 186#endif // DEBUG_INFO_ENTRY_H 187