Files
clang-p2996/lldb/source/Plugins/SymbolFile/DWARF/DWARFBaseDIE.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

193 lines
5.3 KiB
C++

//===-- DWARFBaseDIE.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 "DWARFBaseDIE.h"
#include "DWARFUnit.h"
#include "DWARFDebugInfoEntry.h"
#include "SymbolFileDWARF.h"
#include "lldb/Core/Module.h"
#include "lldb/Symbol/ObjectFile.h"
using namespace lldb_private;
DIERef DWARFBaseDIE::GetDIERef() const {
if (!IsValid())
return DIERef();
dw_offset_t cu_offset = m_cu->GetOffset();
if (m_cu->GetBaseObjOffset() != DW_INVALID_OFFSET)
cu_offset = m_cu->GetBaseObjOffset();
return DIERef(cu_offset, m_die->GetOffset());
}
dw_tag_t DWARFBaseDIE::Tag() const {
if (m_die)
return m_die->Tag();
else
return 0;
}
const char *DWARFBaseDIE::GetTagAsCString() const {
return lldb_private::DW_TAG_value_to_name(Tag());
}
const char *DWARFBaseDIE::GetAttributeValueAsString(const dw_attr_t attr,
const char *fail_value) const {
if (IsValid())
return m_die->GetAttributeValueAsString(GetDWARF(), GetCU(), attr,
fail_value);
else
return fail_value;
}
uint64_t DWARFBaseDIE::GetAttributeValueAsUnsigned(const dw_attr_t attr,
uint64_t fail_value) const {
if (IsValid())
return m_die->GetAttributeValueAsUnsigned(GetDWARF(), GetCU(), attr,
fail_value);
else
return fail_value;
}
int64_t DWARFBaseDIE::GetAttributeValueAsSigned(const dw_attr_t attr,
int64_t fail_value) const {
if (IsValid())
return m_die->GetAttributeValueAsSigned(GetDWARF(), GetCU(), attr,
fail_value);
else
return fail_value;
}
uint64_t DWARFBaseDIE::GetAttributeValueAsReference(const dw_attr_t attr,
uint64_t fail_value) const {
if (IsValid())
return m_die->GetAttributeValueAsReference(GetDWARF(), GetCU(), attr,
fail_value);
else
return fail_value;
}
uint64_t DWARFBaseDIE::GetAttributeValueAsAddress(const dw_attr_t attr,
uint64_t fail_value) const {
if (IsValid())
return m_die->GetAttributeValueAsAddress(GetDWARF(), GetCU(), attr,
fail_value);
else
return fail_value;
}
lldb::user_id_t DWARFBaseDIE::GetID() const {
return GetDIERef().GetUID(GetDWARF());
}
const char *DWARFBaseDIE::GetName() const {
if (IsValid())
return m_die->GetName(GetDWARF(), m_cu);
else
return nullptr;
}
lldb::LanguageType DWARFBaseDIE::GetLanguage() const {
if (IsValid())
return m_cu->GetLanguageType();
else
return lldb::eLanguageTypeUnknown;
}
lldb::ModuleSP DWARFBaseDIE::GetModule() const {
SymbolFileDWARF *dwarf = GetDWARF();
if (dwarf)
return dwarf->GetObjectFile()->GetModule();
else
return lldb::ModuleSP();
}
lldb_private::CompileUnit *DWARFBaseDIE::GetLLDBCompileUnit() const {
if (IsValid())
return GetDWARF()->GetCompUnitForDWARFCompUnit(GetCU());
else
return nullptr;
}
dw_offset_t DWARFBaseDIE::GetOffset() const {
if (IsValid())
return m_die->GetOffset();
else
return DW_INVALID_OFFSET;
}
dw_offset_t DWARFBaseDIE::GetCompileUnitRelativeOffset() const {
if (IsValid())
return m_die->GetOffset() - m_cu->GetOffset();
else
return DW_INVALID_OFFSET;
}
SymbolFileDWARF *DWARFBaseDIE::GetDWARF() const {
if (m_cu)
return m_cu->GetSymbolFileDWARF();
else
return nullptr;
}
lldb_private::TypeSystem *DWARFBaseDIE::GetTypeSystem() const {
if (m_cu)
return m_cu->GetTypeSystem();
else
return nullptr;
}
DWARFASTParser *DWARFBaseDIE::GetDWARFParser() const {
lldb_private::TypeSystem *type_system = GetTypeSystem();
if (type_system)
return type_system->GetDWARFParser();
else
return nullptr;
}
bool DWARFBaseDIE::HasChildren() const {
return m_die && m_die->HasChildren();
}
bool DWARFBaseDIE::Supports_DW_AT_APPLE_objc_complete_type() const {
return IsValid() && GetDWARF()->Supports_DW_AT_APPLE_objc_complete_type(m_cu);
}
size_t DWARFBaseDIE::GetAttributes(DWARFAttributes &attributes,
uint32_t depth) const {
if (IsValid()) {
return m_die->GetAttributes(m_cu, m_cu->GetFixedFormSizes(), attributes,
depth);
}
if (depth == 0)
attributes.Clear();
return 0;
}
void DWARFBaseDIE::Dump(lldb_private::Stream *s,
const uint32_t recurse_depth) const {
if (s && IsValid())
m_die->Dump(GetDWARF(), GetCU(), *s, recurse_depth);
}
bool operator==(const DWARFBaseDIE &lhs, const DWARFBaseDIE &rhs) {
return lhs.GetDIE() == rhs.GetDIE() && lhs.GetCU() == rhs.GetCU();
}
bool operator!=(const DWARFBaseDIE &lhs, const DWARFBaseDIE &rhs) {
return !(lhs == rhs);
}
const DWARFDataExtractor &DWARFBaseDIE::GetData() const {
// Clients must check if this DIE is valid before calling this function.
assert(IsValid());
return m_cu->GetData();
}