blob: 94044c0feb30fc260a598afd36bfd3c7c8198a47 [file] [log] [blame]
//===-- 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;
}