xref: /openbsd-src/gnu/llvm/lldb/source/Plugins/SymbolFile/DWARF/DWARFAttribute.cpp (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
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