172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer//===-- DWARFAbbreviationDeclaration.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_DWARFABBREVIATIONDECLARATION_H 1172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#define LLVM_DEBUGINFO_DWARFABBREVIATIONDECLARATION_H 1272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 1372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#include "DWARFAttribute.h" 1472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#include "llvm/ADT/SmallVector.h" 1572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#include "llvm/Support/DataExtractor.h" 1672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 1772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramernamespace llvm { 1872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 1972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerclass raw_ostream; 2072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 2172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerclass DWARFAbbreviationDeclaration { 2272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint32_t Code; 2372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint32_t Tag; 2472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer bool HasChildren; 2572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer SmallVector<DWARFAttribute, 8> Attributes; 2672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerpublic: 2772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer enum { InvalidCode = 0 }; 2872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer DWARFAbbreviationDeclaration() 2972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer : Code(InvalidCode), Tag(0), HasChildren(0) {} 3072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 3172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint32_t getCode() const { return Code; } 3272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint32_t getTag() const { return Tag; } 3372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer bool hasChildren() const { return HasChildren; } 3472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint32_t getNumAttributes() const { return Attributes.size(); } 3572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint16_t getAttrByIndex(uint32_t idx) const { 3672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer return Attributes.size() > idx ? Attributes[idx].getAttribute() : 0; 3772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } 3872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint16_t getFormByIndex(uint32_t idx) const { 3972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer return Attributes.size() > idx ? Attributes[idx].getForm() : 0; 4072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } 4172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 4272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint32_t findAttributeIndex(uint16_t attr) const; 4372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer bool extract(DataExtractor data, uint32_t* offset_ptr); 4472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer bool extract(DataExtractor data, uint32_t* offset_ptr, uint32_t code); 4572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer bool isValid() const { return Code != 0 && Tag != 0; } 4672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer void dump(raw_ostream &OS) const; 4772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const SmallVectorImpl<DWARFAttribute> &getAttributes() const { 4872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer return Attributes; 4972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } 5072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer}; 5172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 5272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer} 5372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 5472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#endif 55