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