]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/lldb/source/Plugins/SymbolFile/DWARF/UniqueDWARFASTType.cpp
Merge ACPICA 20180105.
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / lldb / source / Plugins / SymbolFile / DWARF / UniqueDWARFASTType.cpp
1 //===-- UniqueDWARFASTType.cpp ----------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "UniqueDWARFASTType.h"
11
12 // C Includes
13 // C++ Includes
14 // Other libraries and framework includes
15 // Project includes
16 #include "lldb/Symbol/Declaration.h"
17
18 bool UniqueDWARFASTTypeList::Find(const DWARFDIE &die,
19                                   const lldb_private::Declaration &decl,
20                                   const int32_t byte_size,
21                                   UniqueDWARFASTType &entry) const {
22   for (const UniqueDWARFASTType &udt : m_collection) {
23     // Make sure the tags match
24     if (udt.m_die.Tag() == die.Tag()) {
25       // Validate byte sizes of both types only if both are valid.
26       if (udt.m_byte_size < 0 || byte_size < 0 ||
27           udt.m_byte_size == byte_size) {
28         // Make sure the file and line match
29         if (udt.m_declaration == decl) {
30           // The type has the same name, and was defined on the same
31           // file and line. Now verify all of the parent DIEs match.
32           DWARFDIE parent_arg_die = die.GetParent();
33           DWARFDIE parent_pos_die = udt.m_die.GetParent();
34           bool match = true;
35           bool done = false;
36           while (!done && match && parent_arg_die && parent_pos_die) {
37             const dw_tag_t parent_arg_tag = parent_arg_die.Tag();
38             const dw_tag_t parent_pos_tag = parent_pos_die.Tag();
39             if (parent_arg_tag == parent_pos_tag) {
40               switch (parent_arg_tag) {
41               case DW_TAG_class_type:
42               case DW_TAG_structure_type:
43               case DW_TAG_union_type:
44               case DW_TAG_namespace: {
45                 const char *parent_arg_die_name = parent_arg_die.GetName();
46                 if (parent_arg_die_name ==
47                     NULL) // Anonymous (i.e. no-name) struct
48                 {
49                   match = false;
50                 } else {
51                   const char *parent_pos_die_name = parent_pos_die.GetName();
52                   if (parent_pos_die_name == NULL ||
53                       ((parent_arg_die_name != parent_pos_die_name) &&
54                        strcmp(parent_arg_die_name, parent_pos_die_name)))
55                     match = false;
56                 }
57               } break;
58
59               case DW_TAG_compile_unit:
60                 done = true;
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 }