1dda28197Spatrick //===-- DWARFDeclContext.cpp ----------------------------------------------===// 2061da546Spatrick // 3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information. 5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6061da546Spatrick // 7061da546Spatrick //===----------------------------------------------------------------------===// 8061da546Spatrick 9061da546Spatrick #include "DWARFDeclContext.h" 10061da546Spatrick 11*f6aab3d8Srobert using namespace lldb_private::dwarf; 12*f6aab3d8Srobert GetQualifiedName() const13061da546Spatrickconst char *DWARFDeclContext::GetQualifiedName() const { 14061da546Spatrick if (m_qualified_name.empty()) { 15061da546Spatrick // The declaration context array for a class named "foo" in namespace 16061da546Spatrick // "a::b::c" will be something like: 17061da546Spatrick // [0] DW_TAG_class_type "foo" 18061da546Spatrick // [1] DW_TAG_namespace "c" 19061da546Spatrick // [2] DW_TAG_namespace "b" 20061da546Spatrick // [3] DW_TAG_namespace "a" 21061da546Spatrick if (!m_entries.empty()) { 22061da546Spatrick if (m_entries.size() == 1) { 23061da546Spatrick if (m_entries[0].name) { 24061da546Spatrick m_qualified_name.append("::"); 25061da546Spatrick m_qualified_name.append(m_entries[0].name); 26061da546Spatrick } 27061da546Spatrick } else { 28061da546Spatrick collection::const_reverse_iterator pos; 29061da546Spatrick collection::const_reverse_iterator begin = m_entries.rbegin(); 30061da546Spatrick collection::const_reverse_iterator end = m_entries.rend(); 31061da546Spatrick for (pos = begin; pos != end; ++pos) { 32061da546Spatrick if (pos != begin) 33061da546Spatrick m_qualified_name.append("::"); 34061da546Spatrick if (pos->name == nullptr) { 35061da546Spatrick if (pos->tag == DW_TAG_namespace) 36061da546Spatrick m_qualified_name.append("(anonymous namespace)"); 37061da546Spatrick else if (pos->tag == DW_TAG_class_type) 38061da546Spatrick m_qualified_name.append("(anonymous class)"); 39061da546Spatrick else if (pos->tag == DW_TAG_structure_type) 40061da546Spatrick m_qualified_name.append("(anonymous struct)"); 41061da546Spatrick else if (pos->tag == DW_TAG_union_type) 42061da546Spatrick m_qualified_name.append("(anonymous union)"); 43061da546Spatrick else 44061da546Spatrick m_qualified_name.append("(anonymous)"); 45061da546Spatrick } else 46061da546Spatrick m_qualified_name.append(pos->name); 47061da546Spatrick } 48061da546Spatrick } 49061da546Spatrick } 50061da546Spatrick } 51061da546Spatrick if (m_qualified_name.empty()) 52061da546Spatrick return nullptr; 53061da546Spatrick return m_qualified_name.c_str(); 54061da546Spatrick } 55061da546Spatrick operator ==(const DWARFDeclContext & rhs) const56061da546Spatrickbool DWARFDeclContext::operator==(const DWARFDeclContext &rhs) const { 57061da546Spatrick if (m_entries.size() != rhs.m_entries.size()) 58061da546Spatrick return false; 59061da546Spatrick 60061da546Spatrick collection::const_iterator pos; 61061da546Spatrick collection::const_iterator begin = m_entries.begin(); 62061da546Spatrick collection::const_iterator end = m_entries.end(); 63061da546Spatrick 64061da546Spatrick collection::const_iterator rhs_pos; 65061da546Spatrick collection::const_iterator rhs_begin = rhs.m_entries.begin(); 66061da546Spatrick // The two entry arrays have the same size 67061da546Spatrick 68061da546Spatrick // First compare the tags before we do expensive name compares 69061da546Spatrick for (pos = begin, rhs_pos = rhs_begin; pos != end; ++pos, ++rhs_pos) { 70061da546Spatrick if (pos->tag != rhs_pos->tag) { 71061da546Spatrick // Check for DW_TAG_structure_type and DW_TAG_class_type as they are 72061da546Spatrick // often used interchangeably in GCC 73061da546Spatrick if (pos->tag == DW_TAG_structure_type && 74061da546Spatrick rhs_pos->tag == DW_TAG_class_type) 75061da546Spatrick continue; 76061da546Spatrick if (pos->tag == DW_TAG_class_type && 77061da546Spatrick rhs_pos->tag == DW_TAG_structure_type) 78061da546Spatrick continue; 79061da546Spatrick return false; 80061da546Spatrick } 81061da546Spatrick } 82061da546Spatrick // The tags all match, now compare the names 83061da546Spatrick for (pos = begin, rhs_pos = rhs_begin; pos != end; ++pos, ++rhs_pos) { 84061da546Spatrick if (!pos->NameMatches(*rhs_pos)) 85061da546Spatrick return false; 86061da546Spatrick } 87061da546Spatrick // All tags and names match 88061da546Spatrick return true; 89061da546Spatrick } 90