When fission is enabled, we were indexing the skeleton CU _and_ the .dwo CU. Issues arise when users enable compiler options that add extra data to the skeleton CU (like -fsplit-dwarf-inlining) and there can end up being types in the skeleton CU due to template parameters. We never want to index this information since the .dwo file has the real definition, and we really don't want function prototypes from this info since all parameters are removed. The index doesn't work correctly if it does index the skeleton CU as the DIE offset will assume it is from the .dwo file, so even if we do index the skeleton CU, the index entries will try and grab information from the .dwo file using the wrong DIE offset which can cause errors to be displayed or even worse, if the DIE offsets is valid in the .dwo CU, the wrong DIE will be used. We also fix DWO ID detection to use llvm::Optional<uint64_t> to make sure we can load a .dwo file with a DWO ID of zero. Differential Revision: https://reviews.llvm.org/D131437
135 lines
3.6 KiB
C++
135 lines
3.6 KiB
C++
//===-- DWARFBaseDIE.cpp --------------------------------------------------===//
|
|
//
|
|
// 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"
|
|
#include "lldb/Utility/Log.h"
|
|
|
|
using namespace lldb_private;
|
|
|
|
llvm::Optional<DIERef> DWARFBaseDIE::GetDIERef() const {
|
|
if (!IsValid())
|
|
return llvm::None;
|
|
|
|
return DIERef(m_cu->GetSymbolFileDWARF().GetDwoNum(), m_cu->GetDebugSection(),
|
|
m_die->GetOffset());
|
|
}
|
|
|
|
dw_tag_t DWARFBaseDIE::Tag() const {
|
|
if (m_die)
|
|
return m_die->Tag();
|
|
else
|
|
return llvm::dwarf::DW_TAG_null;
|
|
}
|
|
|
|
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(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(GetCU(), attr, fail_value);
|
|
else
|
|
return fail_value;
|
|
}
|
|
|
|
llvm::Optional<uint64_t>
|
|
DWARFBaseDIE::GetAttributeValueAsOptionalUnsigned(const dw_attr_t attr) const {
|
|
if (IsValid())
|
|
return m_die->GetAttributeValueAsOptionalUnsigned(GetCU(), attr);
|
|
return llvm::None;
|
|
}
|
|
|
|
uint64_t DWARFBaseDIE::GetAttributeValueAsAddress(const dw_attr_t attr,
|
|
uint64_t fail_value) const {
|
|
if (IsValid())
|
|
return m_die->GetAttributeValueAsAddress(GetCU(), attr, fail_value);
|
|
else
|
|
return fail_value;
|
|
}
|
|
|
|
lldb::user_id_t DWARFBaseDIE::GetID() const {
|
|
if (IsValid())
|
|
return GetDWARF()->GetUID(*this);
|
|
return LLDB_INVALID_UID;
|
|
}
|
|
|
|
const char *DWARFBaseDIE::GetName() const {
|
|
if (IsValid())
|
|
return m_die->GetName(m_cu);
|
|
else
|
|
return nullptr;
|
|
}
|
|
|
|
lldb::ModuleSP DWARFBaseDIE::GetModule() const {
|
|
SymbolFileDWARF *dwarf = GetDWARF();
|
|
if (dwarf)
|
|
return dwarf->GetObjectFile()->GetModule();
|
|
else
|
|
return lldb::ModuleSP();
|
|
}
|
|
|
|
dw_offset_t DWARFBaseDIE::GetOffset() const {
|
|
if (IsValid())
|
|
return m_die->GetOffset();
|
|
else
|
|
return DW_INVALID_OFFSET;
|
|
}
|
|
|
|
SymbolFileDWARF *DWARFBaseDIE::GetDWARF() const {
|
|
if (m_cu)
|
|
return &m_cu->GetSymbolFileDWARF();
|
|
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,
|
|
Recurse recurse) const {
|
|
if (IsValid())
|
|
return m_die->GetAttributes(m_cu, attributes, recurse);
|
|
attributes.Clear();
|
|
return 0;
|
|
}
|
|
|
|
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();
|
|
}
|