DWARFFormValue.h revision 72c0d7fdd3d0930c7507060e96aec7d7429a8190
172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer//===-- DWARFFormValue.h ----------------------------------------*- C++ -*-===// 272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer// 372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer// The LLVM Compiler Infrastructure 472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer// 572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer// This file is distributed under the University of Illinois Open Source 672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer// License. See LICENSE.TXT for details. 772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer// 872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer//===----------------------------------------------------------------------===// 972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 1072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#ifndef LLVM_DEBUGINFO_DWARFFORMVALUE_H 1172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#define LLVM_DEBUGINFO_DWARFFORMVALUE_H 1272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 1372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#include "llvm/Support/DataExtractor.h" 1472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 1572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramernamespace llvm { 1672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 1772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerclass DWARFCompileUnit; 1872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerclass raw_ostream; 1972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 2072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerclass DWARFFormValue { 2172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerpublic: 2272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer struct ValueType { 2372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer ValueType() : data(NULL) { 2472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uval = 0; 2572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } 2672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 2772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer union { 2872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint64_t uval; 2972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer int64_t sval; 3072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const char* cstr; 3172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer }; 3272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const uint8_t* data; 3372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer }; 3472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 3572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer enum { 3672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer eValueTypeInvalid = 0, 3772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer eValueTypeUnsigned, 3872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer eValueTypeSigned, 3972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer eValueTypeCStr, 4072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer eValueTypeBlock 4172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer }; 4272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 4372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerprivate: 4472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint16_t Form; // Form for this value. 4572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer ValueType Value; // Contains all data for the form. 4672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 4772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerpublic: 4872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer DWARFFormValue(uint16_t form = 0) : Form(form) {} 4972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint16_t getForm() const { return Form; } 5072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const ValueType& value() const { return Value; } 5172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer void dump(raw_ostream &OS, const DataExtractor *debug_str_data, 5272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const DWARFCompileUnit* cu) const; 5372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer bool extractValue(DataExtractor data, uint32_t *offset_ptr, 5472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const DWARFCompileUnit *cu); 5572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer bool isInlinedCStr() const { 5672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer return Value.data != NULL && Value.data == (uint8_t*)Value.cstr; 5772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } 5872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const uint8_t *BlockData() const; 5972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint64_t getReference(const DWARFCompileUnit* cu) const; 6072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 6172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer /// Resolve any compile unit specific references so that we don't need 6272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer /// the compile unit at a later time in order to work with the form 6372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer /// value. 6472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer bool resolveCompileUnitReferences(const DWARFCompileUnit* cu); 6572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint64_t getUnsigned() const { return Value.uval; } 6672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer int64_t getSigned() const { return Value.sval; } 6772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const char *getAsCString(const DataExtractor *debug_str_data_ptr) const; 6872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer bool skipValue(DataExtractor debug_info_data, uint32_t *offset_ptr, 6972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const DWARFCompileUnit *cu) const; 7072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer static bool skipValue(uint16_t form, DataExtractor debug_info_data, 7172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint32_t *offset_ptr, const DWARFCompileUnit *cu); 7272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer static bool isBlockForm(uint16_t form); 7372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer static bool isDataForm(uint16_t form); 7472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer static const uint8_t *getFixedFormSizesForAddressSize(uint8_t addr_size); 7572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer}; 7672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 7772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer} 7872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 7972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#endif 80