1cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton//===-- DWARFDeclContext.cpp ------------------------------------*- C++ -*-===//
2cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton//
3cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton//                     The LLVM Compiler Infrastructure
4cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton//
5cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton// This file is distributed under the University of Illinois Open Source
6cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton// License. See LICENSE.TXT for details.
7cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton//
8cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton//===----------------------------------------------------------------------===//
9cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton
10cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton#include "DWARFDeclContext.h"
11cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton
12cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Claytonconst char *
13cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg ClaytonDWARFDeclContext::GetQualifiedName () const
14cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton{
15cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton    if (m_qualified_name.empty())
16cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton    {
17cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton        // The declaration context array for a class named "foo" in namespace
18cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton        // "a::b::c" will be something like:
19cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton        //  [0] DW_TAG_class_type "foo"
20cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton        //  [1] DW_TAG_namespace "c"
21cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton        //  [2] DW_TAG_namespace "b"
22cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton        //  [3] DW_TAG_namespace "a"
23cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton        if (!m_entries.empty())
24cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton        {
25cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton            if (m_entries.size() == 1)
26cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton            {
27cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton                if (m_entries[0].name)
28cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton                {
29cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton                    m_qualified_name.append("::");
30cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton                    m_qualified_name.append(m_entries[0].name);
31cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton                }
32cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton            }
33cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton            else
34cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton            {
35cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton                collection::const_reverse_iterator pos;
36cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton                collection::const_reverse_iterator begin = m_entries.rbegin();
37cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton                collection::const_reverse_iterator end = m_entries.rend();
38cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton                for (pos = begin; pos != end; ++pos)
39cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton                {
40cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton                    if (pos != begin)
41cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton                        m_qualified_name.append("::");
422938217a06aa2d741488ff36902ea3f0b9a24f15Greg Clayton                    if (pos->name == NULL)
43b4fe2274b9eb07534226807c3f8d1098dd563479Greg Clayton                    {
44b4fe2274b9eb07534226807c3f8d1098dd563479Greg Clayton                        if (pos->tag == DW_TAG_namespace)
45b4fe2274b9eb07534226807c3f8d1098dd563479Greg Clayton                            m_qualified_name.append ("(anonymous namespace)");
46b4fe2274b9eb07534226807c3f8d1098dd563479Greg Clayton                        else if (pos->tag == DW_TAG_class_type)
47b4fe2274b9eb07534226807c3f8d1098dd563479Greg Clayton                            m_qualified_name.append ("(anonymous class)");
48b4fe2274b9eb07534226807c3f8d1098dd563479Greg Clayton                        else if (pos->tag == DW_TAG_structure_type)
49b4fe2274b9eb07534226807c3f8d1098dd563479Greg Clayton                            m_qualified_name.append ("(anonymous struct)");
50b4fe2274b9eb07534226807c3f8d1098dd563479Greg Clayton                        else if (pos->tag == DW_TAG_union_type)
51b4fe2274b9eb07534226807c3f8d1098dd563479Greg Clayton                            m_qualified_name.append ("(anonymous union)");
52b4fe2274b9eb07534226807c3f8d1098dd563479Greg Clayton                        else
53b4fe2274b9eb07534226807c3f8d1098dd563479Greg Clayton                            m_qualified_name.append ("(anonymous)");
54b4fe2274b9eb07534226807c3f8d1098dd563479Greg Clayton                    }
552938217a06aa2d741488ff36902ea3f0b9a24f15Greg Clayton                    else
562938217a06aa2d741488ff36902ea3f0b9a24f15Greg Clayton                        m_qualified_name.append(pos->name);
57cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton                }
58cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton            }
59cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton        }
60cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton    }
61cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton    if (m_qualified_name.empty())
62cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton        return NULL;
63cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton    return m_qualified_name.c_str();
64cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton}
65cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton
66cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton
67cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Claytonbool
68cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg ClaytonDWARFDeclContext::operator==(const DWARFDeclContext& rhs) const
69cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton{
70cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton    if (m_entries.size() != rhs.m_entries.size())
71cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton        return false;
72cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton
73cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton    collection::const_iterator pos;
74cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton    collection::const_iterator begin = m_entries.begin();
75cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton    collection::const_iterator end = m_entries.end();
76cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton
77cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton    collection::const_iterator rhs_pos;
78cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton    collection::const_iterator rhs_begin = rhs.m_entries.begin();
79cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton    // The two entry arrays have the same size
80cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton
81cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton    // First compare the tags before we do expensize name compares
82cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton    for (pos = begin, rhs_pos = rhs_begin; pos != end; ++pos, ++rhs_pos)
83cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton    {
84cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton        if (pos->tag != rhs_pos->tag)
851e46e1a0d88b2a8a132550d346b23ed93f03165aGreg Clayton        {
861e46e1a0d88b2a8a132550d346b23ed93f03165aGreg Clayton            // Check for DW_TAG_structure_type and DW_TAG_class_type as they are often
871e46e1a0d88b2a8a132550d346b23ed93f03165aGreg Clayton            // used interchangeably in GCC
881e46e1a0d88b2a8a132550d346b23ed93f03165aGreg Clayton            if (pos->tag == DW_TAG_structure_type && rhs_pos->tag == DW_TAG_class_type)
891e46e1a0d88b2a8a132550d346b23ed93f03165aGreg Clayton                continue;
901e46e1a0d88b2a8a132550d346b23ed93f03165aGreg Clayton            if (pos->tag == DW_TAG_class_type && rhs_pos->tag == DW_TAG_structure_type)
911e46e1a0d88b2a8a132550d346b23ed93f03165aGreg Clayton                continue;
92cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton            return false;
931e46e1a0d88b2a8a132550d346b23ed93f03165aGreg Clayton        }
94cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton    }
95cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton    // The tags all match, now compare the names
96cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton    for (pos = begin, rhs_pos = rhs_begin; pos != end; ++pos, ++rhs_pos)
97cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton    {
98cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton        if (!pos->NameMatches (*rhs_pos))
99cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton            return false;
100cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton    }
101cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton    // All tags and names match
102cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton    return true;
103cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton}
104cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton
105