DWARFFormValue.h revision 344779
1254721Semaste//===-- DWARFFormValue.h ----------------------------------------*- C++ -*-===// 2254721Semaste// 3254721Semaste// The LLVM Compiler Infrastructure 4254721Semaste// 5254721Semaste// This file is distributed under the University of Illinois Open Source 6254721Semaste// License. See LICENSE.TXT for details. 7254721Semaste// 8254721Semaste//===----------------------------------------------------------------------===// 9254721Semaste 10254721Semaste#ifndef SymbolFileDWARF_DWARFFormValue_h_ 11254721Semaste#define SymbolFileDWARF_DWARFFormValue_h_ 12254721Semaste 13314564Sdim#include "DWARFDataExtractor.h" 14344779Sdim#include <stddef.h> 15254721Semaste 16341825Sdimclass DWARFUnit; 17344779Sdimclass SymbolFileDWARF; 18254721Semaste 19314564Sdimclass DWARFFormValue { 20254721Semastepublic: 21314564Sdim typedef struct ValueTypeTag { 22314564Sdim ValueTypeTag() : value(), data(NULL) { value.uval = 0; } 23254721Semaste 24314564Sdim union { 25314564Sdim uint64_t uval; 26314564Sdim int64_t sval; 27314564Sdim const char *cstr; 28314564Sdim } value; 29314564Sdim const uint8_t *data; 30314564Sdim } ValueType; 31254721Semaste 32314564Sdim class FixedFormSizes { 33314564Sdim public: 34314564Sdim FixedFormSizes() : m_fix_sizes(nullptr), m_size(0) {} 35296417Sdim 36314564Sdim FixedFormSizes(const uint8_t *fix_sizes, size_t size) 37314564Sdim : m_fix_sizes(fix_sizes), m_size(size) {} 38296417Sdim 39314564Sdim uint8_t GetSize(uint32_t index) const { 40314564Sdim return index < m_size ? m_fix_sizes[index] : 0; 41314564Sdim } 42296417Sdim 43314564Sdim bool Empty() const { return m_size == 0; } 44296417Sdim 45314564Sdim private: 46314564Sdim const uint8_t *m_fix_sizes; 47314564Sdim size_t m_size; 48314564Sdim }; 49254721Semaste 50314564Sdim enum { 51314564Sdim eValueTypeInvalid = 0, 52314564Sdim eValueTypeUnsigned, 53314564Sdim eValueTypeSigned, 54314564Sdim eValueTypeCStr, 55314564Sdim eValueTypeBlock 56314564Sdim }; 57314564Sdim 58314564Sdim DWARFFormValue(); 59344779Sdim DWARFFormValue(const DWARFUnit *cu); 60341825Sdim DWARFFormValue(const DWARFUnit *cu, dw_form_t form); 61341825Sdim const DWARFUnit *GetCompileUnit() const { return m_cu; } 62341825Sdim void SetCompileUnit(const DWARFUnit *cu) { m_cu = cu; } 63314564Sdim dw_form_t Form() const { return m_form; } 64344779Sdim dw_form_t& FormRef() { return m_form; } 65314564Sdim void SetForm(dw_form_t form) { m_form = form; } 66314564Sdim const ValueType &Value() const { return m_value; } 67344779Sdim ValueType &ValueRef() { return m_value; } 68344779Sdim void SetValue(const ValueType &val) { m_value = val; } 69344779Sdim 70314564Sdim void Dump(lldb_private::Stream &s) const; 71314564Sdim bool ExtractValue(const lldb_private::DWARFDataExtractor &data, 72314564Sdim lldb::offset_t *offset_ptr); 73314564Sdim const uint8_t *BlockData() const; 74314564Sdim uint64_t Reference() const; 75314564Sdim uint64_t Reference(dw_offset_t offset) const; 76314564Sdim bool Boolean() const { return m_value.value.uval != 0; } 77314564Sdim uint64_t Unsigned() const { return m_value.value.uval; } 78314564Sdim void SetUnsigned(uint64_t uval) { m_value.value.uval = uval; } 79314564Sdim int64_t Signed() const { return m_value.value.sval; } 80314564Sdim void SetSigned(int64_t sval) { m_value.value.sval = sval; } 81314564Sdim const char *AsCString() const; 82314564Sdim dw_addr_t Address() const; 83314564Sdim bool IsValid() const { return m_form != 0; } 84314564Sdim bool SkipValue(const lldb_private::DWARFDataExtractor &debug_info_data, 85314564Sdim lldb::offset_t *offset_ptr) const; 86314564Sdim static bool SkipValue(const dw_form_t form, 87314564Sdim const lldb_private::DWARFDataExtractor &debug_info_data, 88341825Sdim lldb::offset_t *offset_ptr, const DWARFUnit *cu); 89314564Sdim static bool IsBlockForm(const dw_form_t form); 90314564Sdim static bool IsDataForm(const dw_form_t form); 91314564Sdim static FixedFormSizes GetFixedFormSizesForAddressSize(uint8_t addr_size, 92314564Sdim bool is_dwarf64); 93314564Sdim static int Compare(const DWARFFormValue &a, const DWARFFormValue &b); 94314564Sdim void Clear(); 95327952Sdim static bool FormIsSupported(dw_form_t form); 96314564Sdim 97254721Semasteprotected: 98341825Sdim const DWARFUnit *m_cu; // Compile unit for this form 99314564Sdim dw_form_t m_form; // Form for this value 100314564Sdim ValueType m_value; // Contains all data for the form 101254721Semaste}; 102254721Semaste 103314564Sdim#endif // SymbolFileDWARF_DWARFFormValue_h_ 104