1dda28197Spatrick //===-- DWARFAttribute.cpp ------------------------------------------------===//
2061da546Spatrick //
3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061da546Spatrick //
7061da546Spatrick //===----------------------------------------------------------------------===//
8061da546Spatrick
9061da546Spatrick #include "DWARFAttribute.h"
10061da546Spatrick #include "DWARFUnit.h"
11061da546Spatrick #include "DWARFDebugInfo.h"
12061da546Spatrick
13*f6aab3d8Srobert using namespace lldb_private::dwarf;
14*f6aab3d8Srobert
DWARFAttributes()15061da546Spatrick DWARFAttributes::DWARFAttributes() : m_infos() {}
16061da546Spatrick
17be691f3bSpatrick DWARFAttributes::~DWARFAttributes() = default;
18061da546Spatrick
FindAttributeIndex(dw_attr_t attr) const19061da546Spatrick uint32_t DWARFAttributes::FindAttributeIndex(dw_attr_t attr) const {
20061da546Spatrick collection::const_iterator end = m_infos.end();
21061da546Spatrick collection::const_iterator beg = m_infos.begin();
22061da546Spatrick collection::const_iterator pos;
23061da546Spatrick for (pos = beg; pos != end; ++pos) {
24061da546Spatrick if (pos->attr.get_attr() == attr)
25061da546Spatrick return std::distance(beg, pos);
26061da546Spatrick }
27061da546Spatrick return UINT32_MAX;
28061da546Spatrick }
29061da546Spatrick
Append(const DWARFFormValue & form_value,dw_offset_t attr_die_offset,dw_attr_t attr)30be691f3bSpatrick void DWARFAttributes::Append(const DWARFFormValue &form_value,
31be691f3bSpatrick dw_offset_t attr_die_offset, dw_attr_t attr) {
32be691f3bSpatrick AttributeValue attr_value = {const_cast<DWARFUnit *>(form_value.GetUnit()),
33be691f3bSpatrick attr_die_offset,
34be691f3bSpatrick {attr, form_value.Form(), form_value.Value()}};
35061da546Spatrick m_infos.push_back(attr_value);
36061da546Spatrick }
37061da546Spatrick
ExtractFormValueAtIndex(uint32_t i,DWARFFormValue & form_value) const38061da546Spatrick bool DWARFAttributes::ExtractFormValueAtIndex(
39061da546Spatrick uint32_t i, DWARFFormValue &form_value) const {
40061da546Spatrick const DWARFUnit *cu = CompileUnitAtIndex(i);
41061da546Spatrick form_value.SetUnit(cu);
42061da546Spatrick form_value.SetForm(FormAtIndex(i));
43be691f3bSpatrick if (form_value.Form() == DW_FORM_implicit_const) {
44be691f3bSpatrick form_value.SetValue(ValueAtIndex(i));
45be691f3bSpatrick return true;
46be691f3bSpatrick }
47061da546Spatrick lldb::offset_t offset = DIEOffsetAtIndex(i);
48061da546Spatrick return form_value.ExtractValue(cu->GetData(), &offset);
49061da546Spatrick }
50061da546Spatrick
51061da546Spatrick DWARFDIE
FormValueAsReference(dw_attr_t attr) const52061da546Spatrick DWARFAttributes::FormValueAsReference(dw_attr_t attr) const {
53061da546Spatrick const uint32_t attr_idx = FindAttributeIndex(attr);
54061da546Spatrick if (attr_idx != UINT32_MAX)
55061da546Spatrick return FormValueAsReferenceAtIndex(attr_idx);
56061da546Spatrick return {};
57061da546Spatrick }
58061da546Spatrick
59061da546Spatrick DWARFDIE
FormValueAsReferenceAtIndex(uint32_t i) const60061da546Spatrick DWARFAttributes::FormValueAsReferenceAtIndex(uint32_t i) const {
61061da546Spatrick DWARFFormValue form_value;
62061da546Spatrick if (ExtractFormValueAtIndex(i, form_value))
63061da546Spatrick return form_value.Reference();
64061da546Spatrick return {};
65061da546Spatrick }
66