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 136faff4886a3059a8cda08f015d29a6c9a0a4de3cAlexey Samsonov#include "llvm/ADT/ArrayRef.h" 14c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov#include "llvm/ADT/Optional.h" 1572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#include "llvm/Support/DataExtractor.h" 1672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 1772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramernamespace llvm { 1872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 19cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikieclass DWARFUnit; 2072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerclass raw_ostream; 2172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 2272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerclass DWARFFormValue { 23c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonovpublic: 24c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov enum FormClass { 25c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov FC_Unknown, 26c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov FC_Address, 27c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov FC_Block, 28c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov FC_Constant, 29c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov FC_String, 30c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov FC_Flag, 31c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov FC_Reference, 32c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov FC_Indirect, 33c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov FC_SectionOffset, 34c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov FC_Exprloc 35c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov }; 36c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov 37c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonovprivate: 3872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer struct ValueType { 39dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ValueType() : data(nullptr) { 4072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uval = 0; 4172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } 4272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 4372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer union { 4472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint64_t uval; 4572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer int64_t sval; 4672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const char* cstr; 4772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer }; 4872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const uint8_t* data; 4972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer }; 5072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 5172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint16_t Form; // Form for this value. 5272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer ValueType Value; // Contains all data for the form. 5372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 5472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerpublic: 55c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov DWARFFormValue(uint16_t Form = 0) : Form(Form) {} 5672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint16_t getForm() const { return Form; } 57c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov bool isFormClass(FormClass FC) const; 58c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov 59cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie void dump(raw_ostream &OS, const DWARFUnit *U) const; 6072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer bool extractValue(DataExtractor data, uint32_t *offset_ptr, 61cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie const DWARFUnit *u); 6272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer bool isInlinedCStr() const { 63dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return Value.data != nullptr && Value.data == (const uint8_t*)Value.cstr; 6472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } 6572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 66c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov /// getAsFoo functions below return the extracted value as Foo if only 67c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov /// DWARFFormValue has form class is suitable for representing Foo. 68c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov Optional<uint64_t> getAsReference(const DWARFUnit *U) const; 69c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov Optional<uint64_t> getAsUnsignedConstant() const; 70c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov Optional<const char *> getAsCString(const DWARFUnit *U) const; 71c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov Optional<uint64_t> getAsAddress(const DWARFUnit *U) const; 72c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov Optional<uint64_t> getAsSectionOffset() const; 7371f6d6ee1a42a39b897f165802716baaad91e21bAlexey Samsonov 7472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer bool skipValue(DataExtractor debug_info_data, uint32_t *offset_ptr, 75cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie const DWARFUnit *u) const; 7672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer static bool skipValue(uint16_t form, DataExtractor debug_info_data, 77cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie uint32_t *offset_ptr, const DWARFUnit *u); 7871f6d6ee1a42a39b897f165802716baaad91e21bAlexey Samsonov 796faff4886a3059a8cda08f015d29a6c9a0a4de3cAlexey Samsonov static ArrayRef<uint8_t> getFixedFormSizes(uint8_t AddrSize, 806faff4886a3059a8cda08f015d29a6c9a0a4de3cAlexey Samsonov uint16_t Version); 8172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer}; 8272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 8372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer} 8472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 8572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#endif 86