Files
clang-p2996/lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.cpp
Chandler Carruth 2946cd7010 Update the file headers across all of the LLVM projects in the monorepo
to reflect the new license.

We understand that people may be surprised that we're moving the header
entirely to discuss the new license. We checked this carefully with the
Foundation's lawyer and we believe this is the correct approach.

Essentially, all code in the project is now made available by the LLVM
project under our new license, so you will see that the license headers
include that license only. Some of our contributors have contributed
code under our old license, and accordingly, we have retained a copy of
our old license notice in the top-level files in each project and
repository.

llvm-svn: 351636
2019-01-19 08:50:56 +00:00

88 lines
3.1 KiB
C++

//===-- DWARFDeclContext.cpp ------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "DWARFDeclContext.h"
const char *DWARFDeclContext::GetQualifiedName() const {
if (m_qualified_name.empty()) {
// The declaration context array for a class named "foo" in namespace
// "a::b::c" will be something like:
// [0] DW_TAG_class_type "foo"
// [1] DW_TAG_namespace "c"
// [2] DW_TAG_namespace "b"
// [3] DW_TAG_namespace "a"
if (!m_entries.empty()) {
if (m_entries.size() == 1) {
if (m_entries[0].name) {
m_qualified_name.append("::");
m_qualified_name.append(m_entries[0].name);
}
} else {
collection::const_reverse_iterator pos;
collection::const_reverse_iterator begin = m_entries.rbegin();
collection::const_reverse_iterator end = m_entries.rend();
for (pos = begin; pos != end; ++pos) {
if (pos != begin)
m_qualified_name.append("::");
if (pos->name == NULL) {
if (pos->tag == DW_TAG_namespace)
m_qualified_name.append("(anonymous namespace)");
else if (pos->tag == DW_TAG_class_type)
m_qualified_name.append("(anonymous class)");
else if (pos->tag == DW_TAG_structure_type)
m_qualified_name.append("(anonymous struct)");
else if (pos->tag == DW_TAG_union_type)
m_qualified_name.append("(anonymous union)");
else
m_qualified_name.append("(anonymous)");
} else
m_qualified_name.append(pos->name);
}
}
}
}
if (m_qualified_name.empty())
return NULL;
return m_qualified_name.c_str();
}
bool DWARFDeclContext::operator==(const DWARFDeclContext &rhs) const {
if (m_entries.size() != rhs.m_entries.size())
return false;
collection::const_iterator pos;
collection::const_iterator begin = m_entries.begin();
collection::const_iterator end = m_entries.end();
collection::const_iterator rhs_pos;
collection::const_iterator rhs_begin = rhs.m_entries.begin();
// The two entry arrays have the same size
// First compare the tags before we do expensive name compares
for (pos = begin, rhs_pos = rhs_begin; pos != end; ++pos, ++rhs_pos) {
if (pos->tag != rhs_pos->tag) {
// Check for DW_TAG_structure_type and DW_TAG_class_type as they are
// often used interchangeably in GCC
if (pos->tag == DW_TAG_structure_type &&
rhs_pos->tag == DW_TAG_class_type)
continue;
if (pos->tag == DW_TAG_class_type &&
rhs_pos->tag == DW_TAG_structure_type)
continue;
return false;
}
}
// The tags all match, now compare the names
for (pos = begin, rhs_pos = rhs_begin; pos != end; ++pos, ++rhs_pos) {
if (!pos->NameMatches(*rhs_pos))
return false;
}
// All tags and names match
return true;
}