Skip to content

Commit 6751108

Browse files
committed
Get TLS variables to work for minidump, add a test that the value is accessable correctly
1 parent 3f86934 commit 6751108

File tree

5 files changed

+50
-6
lines changed

5 files changed

+50
-6
lines changed

lldb/source/Core/DynamicLoader.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ int64_t DynamicLoader::ReadUnsignedIntWithSizeInBytes(addr_t addr,
355355
return (int64_t)value;
356356
}
357357

358-
addr_t DynamicLoader::ReadPointer(addr_t addr) {
358+
addr_t DynamicLoader:: ReadPointer(addr_t addr) {
359359
Status error;
360360
addr_t value = m_process->ReadPointerFromMemory(addr, error);
361361
if (error.Fail())
@@ -369,4 +369,3 @@ void DynamicLoader::LoadOperatingSystemPlugin(bool flush)
369369
if (m_process)
370370
m_process->LoadOperatingSystemPlugin(flush);
371371
}
372-

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,6 @@ void DynamicLoaderPOSIXDYLD::DidAttach() {
118118
addr_t load_addr = addr.GetLoadAddress(&target);
119119
if (load_addr != LLDB_INVALID_ADDRESS) {
120120
rebase_exec = false;
121-
m_loaded_modules[executable_sp] = load_addr;
122121
}
123122
}
124123
} else {
@@ -127,7 +126,7 @@ void DynamicLoaderPOSIXDYLD::DidAttach() {
127126
}
128127

129128
// if the target executable should be re-based
130-
if (rebase_exec) {
129+
if (rebase_exec || IsCoreFile()) {
131130
ModuleList module_list;
132131

133132
module_list.Append(executable_sp);

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

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,17 @@ static void writeRegister(const void *reg_src, uint8_t *context,
4444
memcpy(reg_dest.data(), reg_src, reg_dest.size());
4545
}
4646

47+
// TODO: Fix the registers in this file!
48+
// writeRegister checks x86_64 registers without base registers. This causes
49+
// an overlap in the register enum values. So we were truncating fs_base.
50+
// We should standardize to the x86_64_with_base registers.
51+
static void writeBaseRegister(const void *reg_src, uint8_t *context,
52+
const RegisterInfo &reg) {
53+
auto bytes = reg.mutable_data(context);
54+
llvm::MutableArrayRef<uint8_t> reg_dest = bytes.take_front(8);
55+
memcpy(reg_dest.data(), reg_src, reg_dest.size());
56+
}
57+
4758
lldb::DataBufferSP lldb_private::minidump::ConvertMinidumpContext_x86_64(
4859
llvm::ArrayRef<uint8_t> source_data,
4960
RegisterInfoInterface *target_reg_interface) {
@@ -105,10 +116,11 @@ lldb::DataBufferSP lldb_private::minidump::ConvertMinidumpContext_x86_64(
105116
writeRegister(&context->r15, result_base, reg_info[lldb_r15_x86_64]);
106117
}
107118

119+
// See comment on base regsiter
108120
if ((context_flags & LLDBSpecificFlag) == LLDBSpecificFlag) {
109-
writeRegister(&context->fs_base, result_base,
121+
writeBaseRegister(&context->fs_base, result_base,
110122
reg_info[x86_64_with_base::lldb_fs_base]);
111-
writeRegister(&context->gs_base, result_base,
123+
writeBaseRegister(&context->gs_base, result_base,
112124
reg_info[x86_64_with_base::lldb_gs_base]);
113125
}
114126

lldb/test/API/functionalities/process_save_core_minidump/TestProcessSaveCoreMinidump.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -548,6 +548,7 @@ def minidump_saves_fs_base_region(self):
548548

549549
registers = thread.GetFrameAtIndex(0).GetRegisters()
550550
fs_base = registers.GetFirstValueByName("fs_base").GetValueAsUnsigned()
551+
self.assertTrue(fs_base != 0)
551552
core_target = self.dbg.CreateTarget(None)
552553
core_proc = core_target.LoadCore(one_region_file)
553554
core_region_list = core_proc.GetMemoryRegions()
@@ -598,3 +599,34 @@ def minidump_deterministic_difference(self):
598599

599600
finally:
600601
self.assertTrue(self.dbg.DeleteTarget(target))
602+
603+
@skipUnlessPlatform(["linux"])
604+
@skipUnlessArch("x86_64")
605+
def minidump_saves_fs_base_region(self):
606+
self.build()
607+
exe = self.getBuildArtifact("a.out")
608+
try:
609+
target = self.dbg.CreateTarget(exe)
610+
process = target.LaunchSimple(
611+
None, None, self.get_process_working_directory()
612+
)
613+
self.assertState(process.GetState(), lldb.eStateStopped)
614+
thread = process.GetThreadAtIndex(0)
615+
tls_file = self.getBuildArtifact("core.tls.dmp")
616+
options = lldb.SBSaveCoreOptions()
617+
options.SetOutputFile(lldb.SBFileSpec(tls_file))
618+
options.SetPluginName("minidump")
619+
options.SetStyle(lldb.eSaveCoreCustomOnly)
620+
options.AddThread(thread)
621+
error = process.SaveCore(options)
622+
self.assertTrue(error.Success())
623+
core_target = self.dbg.CreateTarget(None)
624+
core_proc = core_target.LoadCore(tls_file)
625+
frame = core_proc.GetThreadAtIndex(0).GetFrameAtIndex(0)
626+
tls_val = frame.FindValue('lf')
627+
self.assertEqual(tls_val.GetValueAsUnsigned(), 42)
628+
629+
except:
630+
self.assertTrue(self.dbg.DeleteTarget(target))
631+
if os.path.isfile(tls_file):
632+
os.unlink(tls_file)

lldb/test/API/functionalities/process_save_core_minidump/main.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include <cassert>
22
#include <iostream>
33
#include <thread>
4+
thread_local size_t lf = 42;
45

56
void g() { assert(false); }
67

@@ -16,6 +17,7 @@ size_t h() {
1617
return sum;
1718
}
1819

20+
1921
int main() {
2022
std::thread t1(f);
2123

0 commit comments

Comments
 (0)