LLDB  mainline
DWARFAbbreviationDeclaration.cpp
Go to the documentation of this file.
1 //===-- DWARFAbbreviationDeclaration.cpp ------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
10 
11 #include "lldb/Core/dwarf.h"
12 #include "lldb/Utility/Stream.h"
13 
14 #include "llvm/Object/Error.h"
15 
16 #include "DWARFFormValue.h"
17 
18 using namespace lldb_private;
19 
21  : m_code(InvalidCode), m_tag(0), m_has_children(0), m_attributes() {}
22 
24  uint8_t has_children)
25  : m_code(InvalidCode), m_tag(tag), m_has_children(has_children),
26  m_attributes() {}
27 
28 llvm::Expected<DWARFEnumState>
30  lldb::offset_t *offset_ptr) {
31  m_code = data.GetULEB128(offset_ptr);
32  if (m_code == 0)
33  return DWARFEnumState::Complete;
34 
35  m_attributes.clear();
36  m_tag = data.GetULEB128(offset_ptr);
37  if (m_tag == DW_TAG_null)
38  return llvm::make_error<llvm::object::GenericBinaryError>(
39  "abbrev decl requires non-null tag.");
40 
41  m_has_children = data.GetU8(offset_ptr);
42 
43  while (data.ValidOffset(*offset_ptr)) {
44  dw_attr_t attr = data.GetULEB128(offset_ptr);
45  dw_form_t form = data.GetULEB128(offset_ptr);
46 
47  // This is the last attribute for this abbrev decl, but there may still be
48  // more abbrev decls, so return MoreItems to indicate to the caller that
49  // they should call this function again.
50  if (!attr && !form)
51  return DWARFEnumState::MoreItems;
52 
53  if (!attr || !form)
54  return llvm::make_error<llvm::object::GenericBinaryError>(
55  "malformed abbreviation declaration attribute");
56 
58 
59  if (form == DW_FORM_implicit_const)
60  val.value.sval = data.GetULEB128(offset_ptr);
61 
62  m_attributes.push_back(DWARFAttribute(attr, form, val));
63  }
64 
65  return llvm::make_error<llvm::object::GenericBinaryError>(
66  "abbreviation declaration attribute list not terminated with a null "
67  "entry");
68 }
69 
71  return m_code != 0 && m_tag != 0;
72 }
73 
76  uint32_t i;
77  const uint32_t kNumAttributes = m_attributes.size();
78  for (i = 0; i < kNumAttributes; ++i) {
79  if (m_attributes[i].get_attr() == attr)
80  return i;
81  }
82  return DW_INVALID_INDEX;
83 }
84 
87  return Tag() == rhs.Tag() && HasChildren() == rhs.HasChildren() &&
89 }
Enumerations for broadcasting.
Definition: SBLaunchInfo.h:14
uint32_t FindAttributeIndex(dw_attr_t attr) const
#define DW_INVALID_INDEX
Definition: dwarf.h:35
llvm::Expected< lldb_private::DWARFEnumState > extract(const lldb_private::DWARFDataExtractor &data, lldb::offset_t *offset_ptr)
Extract one abbreviation declaration and all of its associated attributes.
union DWARFFormValue::ValueTypeTag::@150 value
uint64_t offset_t
Definition: lldb-types.h:87
bool operator==(const DWARFAbbreviationDeclaration &rhs) const
bool ValidOffset(lldb::offset_t offset) const
Test the validity of offset.
uint64_t GetULEB128(lldb::offset_t *offset_ptr) const
Extract a unsigned LEB128 value from *offset_ptr.
uint8_t GetU8(lldb::offset_t *offset_ptr) const
Extract a uint8_t value from *offset_ptr.
DWARFAttribute::collection m_attributes