| //===-- DWARFFormValue.h ----------------------------------------*- C++ -*-===// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_DEBUGINFO_DWARFFORMVALUE_H | |
| #define LLVM_DEBUGINFO_DWARFFORMVALUE_H | |
| #include "llvm/Support/DataExtractor.h" | |
| namespace llvm { | |
| class DWARFCompileUnit; | |
| class raw_ostream; | |
| class DWARFFormValue { | |
| public: | |
| struct ValueType { | |
| ValueType() : data(NULL) { | |
| uval = 0; | |
| } | |
| union { | |
| uint64_t uval; | |
| int64_t sval; | |
| const char* cstr; | |
| }; | |
| const uint8_t* data; | |
| }; | |
| enum { | |
| eValueTypeInvalid = 0, | |
| eValueTypeUnsigned, | |
| eValueTypeSigned, | |
| eValueTypeCStr, | |
| eValueTypeBlock | |
| }; | |
| private: | |
| uint16_t Form; // Form for this value. | |
| ValueType Value; // Contains all data for the form. | |
| public: | |
| DWARFFormValue(uint16_t form = 0) : Form(form) {} | |
| uint16_t getForm() const { return Form; } | |
| const ValueType& value() const { return Value; } | |
| void dump(raw_ostream &OS, const DWARFCompileUnit* cu) const; | |
| bool extractValue(DataExtractor data, uint32_t *offset_ptr, | |
| const DWARFCompileUnit *cu); | |
| bool isInlinedCStr() const { | |
| return Value.data != NULL && Value.data == (uint8_t*)Value.cstr; | |
| } | |
| const uint8_t *BlockData() const; | |
| uint64_t getReference(const DWARFCompileUnit* cu) const; | |
| /// Resolve any compile unit specific references so that we don't need | |
| /// the compile unit at a later time in order to work with the form | |
| /// value. | |
| bool resolveCompileUnitReferences(const DWARFCompileUnit* cu); | |
| uint64_t getUnsigned() const { return Value.uval; } | |
| int64_t getSigned() const { return Value.sval; } | |
| const char *getAsCString(const DataExtractor *debug_str_data_ptr) const; | |
| bool skipValue(DataExtractor debug_info_data, uint32_t *offset_ptr, | |
| const DWARFCompileUnit *cu) const; | |
| static bool skipValue(uint16_t form, DataExtractor debug_info_data, | |
| uint32_t *offset_ptr, const DWARFCompileUnit *cu); | |
| static bool isBlockForm(uint16_t form); | |
| static bool isDataForm(uint16_t form); | |
| static const uint8_t *getFixedFormSizesForAddressSize(uint8_t addr_size); | |
| }; | |
| } | |
| #endif |