Skip to content

Commit 3f86934

Browse files
committed
Change DYLD To support TLS for minidump
1 parent fe3c0eb commit 3f86934

File tree

5 files changed

+34
-22
lines changed

5 files changed

+34
-22
lines changed

lldb/source/Expression/DWARFExpression.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2168,8 +2168,6 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
21682168
// pushes it on the stack.
21692169
case DW_OP_form_tls_address:
21702170
case DW_OP_GNU_push_tls_address: {
2171-
bool debug = true;
2172-
while (debug) {}
21732171
if (stack.size() < 1) {
21742172
if (op == DW_OP_form_tls_address)
21752173
return llvm::createStringError(

lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,11 @@ void DynamicLoaderPOSIXDYLD::DidAttach() {
115115
// don't rebase if the module already has a load address
116116
Target &target = m_process->GetTarget();
117117
Address addr = obj->GetImageInfoAddress(&target);
118-
if (addr.GetLoadAddress(&target) != LLDB_INVALID_ADDRESS)
118+
addr_t load_addr = addr.GetLoadAddress(&target);
119+
if (load_addr != LLDB_INVALID_ADDRESS) {
119120
rebase_exec = false;
121+
m_loaded_modules[executable_sp] = load_addr;
122+
}
120123
}
121124
} else {
122125
// no executable, nothing to re-base

lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -336,18 +336,20 @@ ArchSpec ProcessMinidump::GetArchitecture() {
336336
}
337337

338338
DynamicLoader* ProcessMinidump::GetDynamicLoader() {
339-
if (m_dyld_up && m_dyld_up.get())
340-
return m_dyld_up.get();
341-
342-
ArchSpec arch = GetArchitecture();
343-
if (arch.GetTriple().getOS() == llvm::Triple::Linux) {
339+
if (m_dyld_up.get() == nullptr)
344340
m_dyld_up.reset(DynamicLoader::FindPlugin(
345341
this, DynamicLoaderPOSIXDYLD::GetPluginNameStatic()));
346-
}
347-
348342
return m_dyld_up.get();
349343
}
350344

345+
DataExtractor ProcessMinidump::GetAuxvData() {
346+
std::optional<llvm::ArrayRef<uint8_t>> auxv = m_minidump_parser->GetStream(StreamType::LinuxAuxv);
347+
if (!auxv)
348+
return DataExtractor();
349+
350+
return DataExtractor(auxv->data(), auxv->size(), ByteOrder::eByteOrderLittle, GetAddressByteSize(), GetAddressByteSize());
351+
}
352+
351353
void ProcessMinidump::BuildMemoryRegions() {
352354
if (m_memory_regions)
353355
return;

lldb/source/Plugins/Process/minidump/ProcessMinidump.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,13 @@ class ProcessMinidump : public PostMortemProcess {
5454

5555
Status DoLoadCore() override;
5656

57+
// Returns AUXV structure found in the core file
58+
lldb_private::DataExtractor GetAuxvData() override;
59+
5760
DynamicLoader *GetDynamicLoader() override;
5861

5962
llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
6063

61-
SystemRuntime *GetSystemRuntime() override { return nullptr; }
62-
6364
Status DoDestroy() override;
6465

6566
void RefreshStateAfterStop() override;

lldb/source/Target/Process.cpp

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6543,7 +6543,7 @@ static void AddRegisterSections(Process &process, ThreadSP &thread_sp, CoreFileM
65436543
return;
65446544

65456545
const uint64_t fail_value = UINT64_MAX;
6546-
bool readSuccess = true;
6546+
bool readSuccess = false;
65476547
const lldb::addr_t reg_value_addr = reg_value.GetAsUInt64(fail_value, &readSuccess);
65486548
if (!readSuccess || reg_value_addr == fail_value)
65496549
return;
@@ -6562,23 +6562,29 @@ static void AddRegisterSections(Process &process, ThreadSP &thread_sp, CoreFileM
65626562
AddRegion(register_region, true, ranges);
65636563
}
65646564

6565-
static void AddModuleThreadLocalSections(Process &process, ThreadSP &thread_sp, CoreFileMemoryRanges &ranges, lldb::addr_t range_end) {
6565+
static void AddModuleSections(Process &process, CoreFileMemoryRanges &ranges, std::set<addr_t> &stack_ends) {
65666566
ModuleList &module_list = process.GetTarget().GetImages();
6567+
Target* target = &process.GetTarget();
65676568
for (size_t idx = 0; idx < module_list.GetSize(); idx++) {
65686569
ModuleSP module_sp = module_list.GetModuleAtIndex(idx);
65696570
if (!module_sp)
65706571
continue;
6571-
// We want the entire section, so the offset is 0.
6572-
const lldb::addr_t tls_storage_addr = thread_sp->GetThreadLocalData(module_sp, 0);
6573-
if (tls_storage_addr == LLDB_INVALID_ADDRESS)
6572+
6573+
ObjectFile *obj = module_sp->GetObjectFile();
6574+
if (!obj)
6575+
continue;
6576+
Address addr = obj->GetImageInfoAddress(target);
6577+
addr_t load_addr = addr.GetLoadAddress(target);
6578+
if (load_addr == LLDB_INVALID_ADDRESS)
65746579
continue;
6580+
65756581
MemoryRegionInfo tls_storage_region;
6576-
Status err = process.GetMemoryRegionInfo(tls_storage_addr, tls_storage_region);
6582+
Status err = process.GetMemoryRegionInfo(load_addr, tls_storage_region);
65776583
if (err.Fail())
65786584
continue;
65796585

65806586
// We already saved off this truncated stack range.
6581-
if (tls_storage_region.GetRange().GetRangeEnd() == range_end)
6587+
if (stack_ends.count(tls_storage_region.GetRange().GetRangeEnd()) > 0)
65826588
continue;
65836589

65846590
AddRegion(tls_storage_region, true, ranges);
@@ -6625,7 +6631,6 @@ static void SaveOffRegionsWithStackPointers(Process &process,
66256631
// Add the register section if x86_64 and add the module tls data
66266632
// only if the range isn't the same as this truncated stack range.
66276633
AddRegisterSections(process, thread_sp, ranges, range_end);
6628-
AddModuleThreadLocalSections(process, thread_sp, ranges, range_end);
66296634
}
66306635
}
66316636
}
@@ -6735,9 +6740,12 @@ Status Process::CalculateCoreFileSaveRanges(const SaveCoreOptions &options,
67356740
std::set<addr_t> stack_ends;
67366741
// For fully custom set ups, we don't want to even look at threads if there
67376742
// are no threads specified.
6738-
if (core_style != lldb::eSaveCoreCustomOnly || options.HasSpecifiedThreads())
6743+
if (core_style != lldb::eSaveCoreCustomOnly || options.HasSpecifiedThreads()) {
67396744
SaveOffRegionsWithStackPointers(*this, options, regions, ranges,
6740-
stack_ends);
6745+
stack_ends);
6746+
AddModuleSections(*this, ranges, stack_ends);
6747+
}
6748+
67416749

67426750
switch (core_style) {
67436751
case eSaveCoreUnspecified:

0 commit comments

Comments
 (0)