[lldb/testsuite] Rewrite TestThreadLocal.py

It was an inline test before. Clang stopped emitting line information
for the TLS initialization and the inline test didn't have a way to
break before it anymore.

This rewrites the test as a full-fldeged python test and improves the
checking of the error case to verify that the failure we are looking
for is related to the TLS setup not being complete.
This commit is contained in:
Fred Riss 2020-03-18 20:07:45 -07:00
parent 127b9d9d77
commit 71db787c45
2 changed files with 48 additions and 11 deletions

View File

@ -1,6 +1,49 @@
from lldbsuite.test import lldbinline
from lldbsuite.test import decorators
lldbinline.MakeInlineTest(__file__, globals(),
lldbinline.expectedFailureAll(oslist=[
"windows", "linux", "netbsd"]))
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
from lldbsuite.test import lldbtest
class PlatformProcessCrashInfoTestCase(TestBase):
mydir = TestBase.compute_mydir(__file__)
@expectedFailureAll(oslist=["windows", "linux", "netbsd"])
def test_thread_local(self):
# Set a breakpoint on the first instruction of the main function,
# before the TLS initialization has run.
self.build()
exe = self.getBuildArtifact("a.out")
(target, process, _, _) = \
lldbutil.run_to_source_breakpoint(self, "Set breakpoint here",
lldb.SBFileSpec("main.cpp"))
self.expect_expr("tl_local_int + 1",
result_type="int", result_value="323")
self.expect_expr("*tl_local_ptr + 2",
result_type="int", result_value="324")
self.expect_expr("tl_global_int",
result_type="int", result_value="123")
self.expect_expr("*tl_global_ptr",
result_type="int", result_value="45")
# Now see if we emit the correct error when the TLS is not yet
# initialized. Let's set a breakpoint on the first instruction
# of main.
main_module = target.FindModule(lldb.SBFileSpec(exe))
main_address = main_module.FindSymbol("main").GetStartAddress()
main_bkpt = target.BreakpointCreateBySBAddress(main_address)
process.Kill()
lldbutil.run_to_breakpoint_do_run(self, target, main_bkpt)
self.expect("expr tl_local_int", error=True,
substrs=["couldn't get the value of variable tl_local_int",
"No TLS data currently exists for this thread"])
self.expect("expr *tl_local_ptr", error=True,
substrs=["couldn't get the value of variable tl_local_ptr",
"No TLS data currently exists for this thread"])

View File

@ -3,15 +3,9 @@ thread_local int tl_global_int = 123;
thread_local int *tl_global_ptr = &storage;
int main(int argc, char **argv) {
//% self.expect("expr tl_local_int", error=True, substrs=["couldn't get the value of variable tl_local_int"])
//% self.expect("expr *tl_local_ptr", error=True, substrs=["couldn't get the value of variable tl_local_ptr"])
thread_local int tl_local_int = 321;
thread_local int *tl_local_ptr = nullptr;
tl_local_ptr = &tl_local_int;
tl_local_int++;
//% self.expect("expr tl_local_int + 1", substrs=["int", "= 323"])
//% self.expect("expr *tl_local_ptr + 2", substrs=["int", "= 324"])
//% self.expect("expr tl_global_int", substrs=["int", "= 123"])
//% self.expect("expr *tl_global_ptr", substrs=["int", "= 45"])
return 0;
return 0; // Set breakpoint here
}