LLDB  mainline
UniqueDWARFASTType.cpp
Go to the documentation of this file.
1 //===-- UniqueDWARFASTType.cpp --------------------------------------------===//
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 
9 #include "UniqueDWARFASTType.h"
10 
11 #include "lldb/Core/Declaration.h"
12 
13 using namespace lldb_private::dwarf;
14 
16  const lldb_private::Declaration &decl,
17  const int32_t byte_size,
18  UniqueDWARFASTType &entry) const {
19  for (const UniqueDWARFASTType &udt : m_collection) {
20  // Make sure the tags match
21  if (udt.m_die.Tag() == die.Tag()) {
22  // Validate byte sizes of both types only if both are valid.
23  if (udt.m_byte_size < 0 || byte_size < 0 ||
24  udt.m_byte_size == byte_size) {
25  // Make sure the file and line match
26  if (udt.m_declaration == decl) {
27  // The type has the same name, and was defined on the same file and
28  // line. Now verify all of the parent DIEs match.
29  DWARFDIE parent_arg_die = die.GetParent();
30  DWARFDIE parent_pos_die = udt.m_die.GetParent();
31  bool match = true;
32  bool done = false;
33  while (!done && match && parent_arg_die && parent_pos_die) {
34  const dw_tag_t parent_arg_tag = parent_arg_die.Tag();
35  const dw_tag_t parent_pos_tag = parent_pos_die.Tag();
36  if (parent_arg_tag == parent_pos_tag) {
37  switch (parent_arg_tag) {
38  case DW_TAG_class_type:
39  case DW_TAG_structure_type:
40  case DW_TAG_union_type:
41  case DW_TAG_namespace: {
42  const char *parent_arg_die_name = parent_arg_die.GetName();
43  if (parent_arg_die_name ==
44  nullptr) // Anonymous (i.e. no-name) struct
45  {
46  match = false;
47  } else {
48  const char *parent_pos_die_name = parent_pos_die.GetName();
49  if (parent_pos_die_name == nullptr ||
50  ((parent_arg_die_name != parent_pos_die_name) &&
51  strcmp(parent_arg_die_name, parent_pos_die_name)))
52  match = false;
53  }
54  } break;
55 
56  case DW_TAG_compile_unit:
57  case DW_TAG_partial_unit:
58  done = true;
59  break;
60  default:
61  break;
62  }
63  }
64  parent_arg_die = parent_arg_die.GetParent();
65  parent_pos_die = parent_pos_die.GetParent();
66  }
67 
68  if (match) {
69  entry = udt;
70  return true;
71  }
72  }
73  }
74  }
75  }
76  return false;
77 }
DWARFDIE::GetParent
DWARFDIE GetParent() const
Definition: DWARFDIE.cpp:91
dw_tag_t
llvm::dwarf::Tag dw_tag_t
Definition: dwarf.h:28
UniqueDWARFASTType
Definition: UniqueDWARFASTType.h:19
DWARFBaseDIE::m_die
DWARFDebugInfoEntry * m_die
Definition: DWARFBaseDIE.h:119
UniqueDWARFASTTypeList::Find
bool Find(const DWARFDIE &die, const lldb_private::Declaration &decl, const int32_t byte_size, UniqueDWARFASTType &entry) const
Definition: UniqueDWARFASTType.cpp:15
UniqueDWARFASTType.h
DWARFDIE
Definition: DWARFDIE.h:16
DWARFDIE::GetName
void GetName(lldb_private::Stream &s) const
Definition: DWARFDIE.cpp:230
Declaration.h
lldb_private::Declaration
Definition: Declaration.h:24
DWARFDebugInfoEntry::GetParent
DWARFDebugInfoEntry * GetParent()
Definition: DWARFDebugInfoEntry.h:126
DWARFBaseDIE::Tag
dw_tag_t Tag() const
Definition: DWARFBaseDIE.cpp:29
lldb_private::dwarf
Definition: dwarf.h:19