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