1 //===-- DWARFFormValue.h ----------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef LLVM_DEBUGINFO_DWARFFORMVALUE_H 11 #define LLVM_DEBUGINFO_DWARFFORMVALUE_H 12 13 #include "llvm/Support/DataExtractor.h" 14 15 namespace llvm { 16 17 class DWARFCompileUnit; 18 class raw_ostream; 19 20 class DWARFFormValue { 21 public: 22 struct ValueType { ValueTypeValueType23 ValueType() : data(NULL) { 24 uval = 0; 25 } 26 27 union { 28 uint64_t uval; 29 int64_t sval; 30 const char* cstr; 31 }; 32 const uint8_t* data; 33 }; 34 35 enum { 36 eValueTypeInvalid = 0, 37 eValueTypeUnsigned, 38 eValueTypeSigned, 39 eValueTypeCStr, 40 eValueTypeBlock 41 }; 42 43 private: 44 uint16_t Form; // Form for this value. 45 ValueType Value; // Contains all data for the form. 46 47 public: Form(form)48 DWARFFormValue(uint16_t form = 0) : Form(form) {} getForm()49 uint16_t getForm() const { return Form; } value()50 const ValueType& value() const { return Value; } 51 void dump(raw_ostream &OS, const DWARFCompileUnit* cu) const; 52 bool extractValue(DataExtractor data, uint32_t *offset_ptr, 53 const DWARFCompileUnit *cu); isInlinedCStr()54 bool isInlinedCStr() const { 55 return Value.data != NULL && Value.data == (uint8_t*)Value.cstr; 56 } 57 const uint8_t *BlockData() const; 58 uint64_t getReference(const DWARFCompileUnit* cu) const; 59 60 /// Resolve any compile unit specific references so that we don't need 61 /// the compile unit at a later time in order to work with the form 62 /// value. 63 bool resolveCompileUnitReferences(const DWARFCompileUnit* cu); getUnsigned()64 uint64_t getUnsigned() const { return Value.uval; } getSigned()65 int64_t getSigned() const { return Value.sval; } 66 const char *getAsCString(const DataExtractor *debug_str_data_ptr) const; 67 bool skipValue(DataExtractor debug_info_data, uint32_t *offset_ptr, 68 const DWARFCompileUnit *cu) const; 69 static bool skipValue(uint16_t form, DataExtractor debug_info_data, 70 uint32_t *offset_ptr, const DWARFCompileUnit *cu); 71 static bool isBlockForm(uint16_t form); 72 static bool isDataForm(uint16_t form); 73 static const uint8_t *getFixedFormSizesForAddressSize(uint8_t addr_size); 74 }; 75 76 } 77 78 #endif 79