aboutsummaryrefslogtreecommitdiff
path: root/source/Plugins/SymbolFile/DWARF/UniqueDWARFASTType.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/Plugins/SymbolFile/DWARF/UniqueDWARFASTType.cpp')
-rw-r--r--source/Plugins/SymbolFile/DWARF/UniqueDWARFASTType.cpp94
1 files changed, 94 insertions, 0 deletions
diff --git a/source/Plugins/SymbolFile/DWARF/UniqueDWARFASTType.cpp b/source/Plugins/SymbolFile/DWARF/UniqueDWARFASTType.cpp
new file mode 100644
index 000000000000..94044c0feb30
--- /dev/null
+++ b/source/Plugins/SymbolFile/DWARF/UniqueDWARFASTType.cpp
@@ -0,0 +1,94 @@
+//===-- UniqueDWARFASTType.cpp ----------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "UniqueDWARFASTType.h"
+
+// C Includes
+// C++ Includes
+// Other libraries and framework includes
+// Project includes
+#include "lldb/Symbol/Declaration.h"
+
+#include "DWARFDebugInfoEntry.h"
+
+bool
+UniqueDWARFASTTypeList::Find
+(
+ SymbolFileDWARF *symfile,
+ const DWARFCompileUnit *cu,
+ const DWARFDebugInfoEntry *die,
+ const lldb_private::Declaration &decl,
+ const int32_t byte_size,
+ UniqueDWARFASTType &entry
+) const
+{
+ collection::const_iterator pos, end = m_collection.end();
+ for (pos = m_collection.begin(); pos != end; ++pos)
+ {
+ // Make sure the tags match
+ if (pos->m_die->Tag() == die->Tag())
+ {
+ // Validate byte sizes of both types only if both are valid.
+ if (pos->m_byte_size < 0 || byte_size < 0 || pos->m_byte_size == byte_size)
+ {
+ // Make sure the file and line match
+ if (pos->m_declaration == decl)
+ {
+ // The type has the same name, and was defined on the same
+ // file and line. Now verify all of the parent DIEs match.
+ const DWARFDebugInfoEntry *parent_arg_die = die->GetParent();
+ const DWARFDebugInfoEntry *parend_pos_die = pos->m_die->GetParent();
+ bool match = true;
+ bool done = false;
+ while (!done && match && parent_arg_die && parend_pos_die)
+ {
+ if (parent_arg_die->Tag() == parend_pos_die->Tag())
+ {
+ const dw_tag_t tag = parent_arg_die->Tag();
+ switch (tag)
+ {
+ case DW_TAG_class_type:
+ case DW_TAG_structure_type:
+ case DW_TAG_union_type:
+ case DW_TAG_namespace:
+ {
+ const char *parent_arg_die_name = parent_arg_die->GetName(symfile, cu);
+ if (parent_arg_die_name == NULL) // Anonymous (i.e. no-name) struct
+ {
+ match = false;
+ }
+ else
+ {
+ const char *parent_pos_die_name = parend_pos_die->GetName(pos->m_symfile, pos->m_cu);
+ if (parent_pos_die_name == NULL || strcmp (parent_arg_die_name, parent_pos_die_name))
+ match = false;
+ }
+ }
+ break;
+
+ case DW_TAG_compile_unit:
+ done = true;
+ break;
+ }
+ }
+ parent_arg_die = parent_arg_die->GetParent();
+ parend_pos_die = parend_pos_die->GetParent();
+ }
+
+ if (match)
+ {
+ entry = *pos;
+ return true;
+ }
+ }
+ }
+ }
+ }
+ return false;
+}