1 //===-- DWARFFormValue.h ----------------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFFORMVALUE_H 10 #define LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFFORMVALUE_H 11 12 #include "DWARFDataExtractor.h" 13 #include <stddef.h> 14 #include "llvm/ADT/Optional.h" 15 16 class DWARFUnit; 17 class SymbolFileDWARF; 18 class DWARFDIE; 19 20 class DWARFFormValue { 21 public: 22 typedef struct ValueTypeTag { ValueTypeTagValueTypeTag23 ValueTypeTag() : value(), data(nullptr) { value.uval = 0; } 24 25 union { 26 uint64_t uval; 27 int64_t sval; 28 const char *cstr; 29 } value; 30 const uint8_t *data; 31 } ValueType; 32 33 enum { 34 eValueTypeInvalid = 0, 35 eValueTypeUnsigned, 36 eValueTypeSigned, 37 eValueTypeCStr, 38 eValueTypeBlock 39 }; 40 41 DWARFFormValue() = default; DWARFFormValue(const DWARFUnit * unit)42 DWARFFormValue(const DWARFUnit *unit) : m_unit(unit) {} DWARFFormValue(const DWARFUnit * unit,dw_form_t form)43 DWARFFormValue(const DWARFUnit *unit, dw_form_t form) 44 : m_unit(unit), m_form(form) {} GetUnit()45 const DWARFUnit *GetUnit() const { return m_unit; } SetUnit(const DWARFUnit * unit)46 void SetUnit(const DWARFUnit *unit) { m_unit = unit; } Form()47 dw_form_t Form() const { return m_form; } FormRef()48 dw_form_t& FormRef() { return m_form; } SetForm(dw_form_t form)49 void SetForm(dw_form_t form) { m_form = form; } Value()50 const ValueType &Value() const { return m_value; } ValueRef()51 ValueType &ValueRef() { return m_value; } SetValue(const ValueType & val)52 void SetValue(const ValueType &val) { m_value = val; } 53 54 void Dump(lldb_private::Stream &s) const; 55 bool ExtractValue(const lldb_private::DWARFDataExtractor &data, 56 lldb::offset_t *offset_ptr); 57 const uint8_t *BlockData() const; 58 static llvm::Optional<uint8_t> GetFixedSize(dw_form_t form, 59 const DWARFUnit *u); 60 llvm::Optional<uint8_t> GetFixedSize() const; 61 DWARFDIE Reference() const; 62 uint64_t Reference(dw_offset_t offset) const; Boolean()63 bool Boolean() const { return m_value.value.uval != 0; } Unsigned()64 uint64_t Unsigned() const { return m_value.value.uval; } SetUnsigned(uint64_t uval)65 void SetUnsigned(uint64_t uval) { m_value.value.uval = uval; } Signed()66 int64_t Signed() const { return m_value.value.sval; } SetSigned(int64_t sval)67 void SetSigned(int64_t sval) { m_value.value.sval = sval; } 68 const char *AsCString() const; 69 dw_addr_t Address() const; IsValid()70 bool IsValid() const { return m_form != 0; } 71 bool SkipValue(const lldb_private::DWARFDataExtractor &debug_info_data, 72 lldb::offset_t *offset_ptr) const; 73 static bool SkipValue(const dw_form_t form, 74 const lldb_private::DWARFDataExtractor &debug_info_data, 75 lldb::offset_t *offset_ptr, const DWARFUnit *unit); 76 static bool IsBlockForm(const dw_form_t form); 77 static bool IsDataForm(const dw_form_t form); 78 static int Compare(const DWARFFormValue &a, const DWARFFormValue &b); 79 void Clear(); 80 static bool FormIsSupported(dw_form_t form); 81 82 protected: 83 // Compile unit where m_value was located. 84 // It may be different from compile unit where m_value refers to. 85 const DWARFUnit *m_unit = nullptr; // Unit for this form 86 dw_form_t m_form = 0; // Form for this value 87 ValueType m_value; // Contains all data for the form 88 }; 89 90 #endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFFORMVALUE_H 91