Skip to content

Commit

Permalink
Add an explicit API to read the Xcode SDK DWARF attribute from compil…
Browse files Browse the repository at this point in the history
…e units

When debugging from a SymbolMap the creation of CompileUnits for the
individual object files is so lazy that RegisterXcodeSDK() is not
invoked at all before the Swift TypeSystem wants to read it. This
patch fixes this by introducing an explicit
SymbolFile::ParseXcodeSDK() call that can be invoked deterministically
before the result is required.

<rdar://problem/62532151+62326862>

https://reviews.llvm.org/D79273
  • Loading branch information
adrian-prantl committed May 6, 2020
1 parent 5e3ab8f commit 5935227
Show file tree
Hide file tree
Showing 8 changed files with 42 additions and 22 deletions.
9 changes: 0 additions & 9 deletions lldb/include/lldb/Core/Module.h
Original file line number Diff line number Diff line change
Expand Up @@ -512,7 +512,6 @@ class Module : public std::enable_shared_from_this<Module>,

/// This callback will be called by SymbolFile implementations when
/// parsing a compile unit that contains SDK information.
/// \param sdk will be merged with \p m_sdk.
/// \param sysroot will be added to the path remapping dictionary.
void RegisterXcodeSDK(llvm::StringRef sdk, llvm::StringRef sysroot);

Expand Down Expand Up @@ -864,11 +863,6 @@ class Module : public std::enable_shared_from_this<Module>,
bool RemapSourceFile(llvm::StringRef path, std::string &new_path) const;
bool RemapSourceFile(const char *, std::string &) const = delete;

/// Return the Xcode SDK this module was compiled against. This
/// is computed by merging the SDKs from each compilation unit in
/// the module.
XcodeSDK GetXcodeSDK() const { return m_xcode_sdk; }

/// Update the ArchSpec to a more specific variant.
bool MergeArchitecture(const ArchSpec &arch_spec);

Expand Down Expand Up @@ -984,9 +978,6 @@ class Module : public std::enable_shared_from_this<Module>,
PathMappingList m_source_mappings =
ModuleList::GetGlobalModuleListProperties().GetSymlinkMappings();

/// The (Xcode) SDK this module was compiled with.
XcodeSDK m_xcode_sdk;

lldb::SectionListUP m_sections_up; ///< Unified section list for module that
/// is used by the ObjectFile and and
/// ObjectFile instances for the debug info
Expand Down
3 changes: 3 additions & 0 deletions lldb/include/lldb/Symbol/SymbolFile.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "lldb/Symbol/Type.h"
#include "lldb/Symbol/TypeList.h"
#include "lldb/Symbol/TypeSystem.h"
#include "lldb/Utility/XcodeSDK.h"
#include "lldb/lldb-private.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/Support/Errc.h"
Expand Down Expand Up @@ -128,6 +129,8 @@ class SymbolFile : public PluginInterface {
Symtab *GetSymtab();

virtual lldb::LanguageType ParseLanguage(CompileUnit &comp_unit) = 0;
/// Return the Xcode SDK comp_unit was compiled against.
virtual XcodeSDK ParseXcodeSDK(CompileUnit &comp_unit) { return {}; }
virtual size_t ParseFunctions(CompileUnit &comp_unit) = 0;
virtual bool ParseLineTable(CompileUnit &comp_unit) = 0;
virtual bool ParseDebugMacros(CompileUnit &comp_unit) = 0;
Expand Down
3 changes: 0 additions & 3 deletions lldb/source/Core/Module.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1598,9 +1598,6 @@ bool Module::RemapSourceFile(llvm::StringRef path,

void Module::RegisterXcodeSDK(llvm::StringRef sdk_name, llvm::StringRef sysroot) {
XcodeSDK sdk(sdk_name.str());
if (m_xcode_sdk == sdk)
return;
m_xcode_sdk.Merge(sdk);
PlatformSP module_platform =
Platform::GetPlatformForArchitecture(GetArchitecture(), nullptr);
ConstString sdk_path(module_platform->GetSDKPath(sdk));
Expand Down
26 changes: 20 additions & 6 deletions lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -664,12 +664,6 @@ lldb::CompUnitSP SymbolFileDWARF::ParseCompileUnit(DWARFCompileUnit &dwarf_cu) {
const DWARFBaseDIE cu_die =
dwarf_cu.GetNonSkeletonUnit().GetUnitDIEOnly();
if (cu_die) {
if (const char *sdk =
cu_die.GetAttributeValueAsString(DW_AT_APPLE_sdk, nullptr)) {
const char *sysroot =
cu_die.GetAttributeValueAsString(DW_AT_LLVM_sysroot, "");
module_sp->RegisterXcodeSDK(sdk, sysroot);
}
FileSpec cu_file_spec(cu_die.GetName(), dwarf_cu.GetPathStyle());
MakeAbsoluteAndRemap(cu_file_spec, dwarf_cu, module_sp);

Expand Down Expand Up @@ -778,6 +772,26 @@ lldb::LanguageType SymbolFileDWARF::ParseLanguage(CompileUnit &comp_unit) {
return eLanguageTypeUnknown;
}

XcodeSDK SymbolFileDWARF::ParseXcodeSDK(CompileUnit &comp_unit) {
std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
DWARFUnit *dwarf_cu = GetDWARFCompileUnit(&comp_unit);
if (!dwarf_cu)
return {};
ModuleSP module_sp = m_objfile_sp->GetModule();
if (!module_sp)
return {};
const DWARFBaseDIE cu_die = dwarf_cu->GetNonSkeletonUnit().GetUnitDIEOnly();
if (!cu_die)
return {};
const char *sdk = cu_die.GetAttributeValueAsString(DW_AT_APPLE_sdk, nullptr);
if (!sdk)
return {};
const char *sysroot =
cu_die.GetAttributeValueAsString(DW_AT_LLVM_sysroot, "");
module_sp->RegisterXcodeSDK(sdk, sysroot);
return {sdk};
}

size_t SymbolFileDWARF::ParseFunctions(CompileUnit &comp_unit) {
static Timer::Category func_cat(LLVM_PRETTY_FUNCTION);
Timer scoped_timer(func_cat, "SymbolFileDWARF::ParseFunctions");
Expand Down
3 changes: 3 additions & 0 deletions lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,9 @@ class SymbolFileDWARF : public lldb_private::SymbolFile,
lldb::LanguageType
ParseLanguage(lldb_private::CompileUnit &comp_unit) override;

lldb_private::XcodeSDK
ParseXcodeSDK(lldb_private::CompileUnit &comp_unit) override;

size_t ParseFunctions(lldb_private::CompileUnit &comp_unit) override;

bool ParseLineTable(lldb_private::CompileUnit &comp_unit) override;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -628,6 +628,15 @@ SymbolFileDWARFDebugMap::ParseLanguage(CompileUnit &comp_unit) {
return eLanguageTypeUnknown;
}

XcodeSDK
SymbolFileDWARFDebugMap::ParseXcodeSDK(CompileUnit &comp_unit) {
std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
SymbolFileDWARF *oso_dwarf = GetSymbolFile(comp_unit);
if (oso_dwarf)
return oso_dwarf->ParseXcodeSDK(comp_unit);
return {};
}

size_t SymbolFileDWARFDebugMap::ParseFunctions(CompileUnit &comp_unit) {
std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
SymbolFileDWARF *oso_dwarf = GetSymbolFile(comp_unit);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,9 @@ class SymbolFileDWARFDebugMap : public lldb_private::SymbolFile {
lldb::LanguageType
ParseLanguage(lldb_private::CompileUnit &comp_unit) override;

lldb_private::XcodeSDK
ParseXcodeSDK(lldb_private::CompileUnit &comp_unit) override;

size_t ParseFunctions(lldb_private::CompileUnit &comp_unit) override;

bool ParseLineTable(lldb_private::CompileUnit &comp_unit) override;
Expand Down
8 changes: 4 additions & 4 deletions lldb/unittests/SymbolFile/DWARF/XcodeSDKModuleTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,13 +64,13 @@ TEST_F(XcodeSDKModuleTests, TestModuleGetXcodeSDK) {

auto triple = "x86_64-apple-macosx";
YAMLModuleTester t(yamldata, triple);
auto module = t.GetModule();
auto dwarf_unit_sp = t.GetDwarfUnit();
auto *dwarf_cu = llvm::cast<DWARFCompileUnit>(dwarf_unit_sp.get());
ASSERT_TRUE((bool)dwarf_cu);
ASSERT_TRUE((bool)dwarf_cu->GetSymbolFileDWARF().GetCompUnitForDWARFCompUnit(
*dwarf_cu));
XcodeSDK sdk = module->GetXcodeSDK();
SymbolFileDWARF &sym_file = dwarf_cu->GetSymbolFileDWARF();
CompUnitSP comp_unit = sym_file.GetCompileUnitAtIndex(0);
ASSERT_TRUE((bool)comp_unit.get());
XcodeSDK sdk = sym_file.ParseXcodeSDK(*comp_unit);
ASSERT_EQ(sdk.GetType(), XcodeSDK::Type::MacOSX);
}
#endif

0 comments on commit 5935227

Please sign in to comment.