diff options
Diffstat (limited to 'packages/Python/lldbsuite/test/macosx/indirect_symbol')
6 files changed, 172 insertions, 0 deletions
diff --git a/packages/Python/lldbsuite/test/macosx/indirect_symbol/Makefile b/packages/Python/lldbsuite/test/macosx/indirect_symbol/Makefile new file mode 100644 index 0000000..07aa39e --- /dev/null +++ b/packages/Python/lldbsuite/test/macosx/indirect_symbol/Makefile @@ -0,0 +1,48 @@ +CC ?= clang +ifeq "$(ARCH)" "" + ARCH = x86_64 +endif + +ifeq "$(OS)" "" + OS = $(shell uname -s) +endif + +CFLAGS ?= -g -O0 +CWD := $(shell pwd) + +LIB_PREFIX := lib + +ifeq "$(OS)" "Darwin" + CFLAGS += -arch $(ARCH) + DS := dsymutil + LD_FLAGS := -dynamiclib + LIB_INDIRECT := $(LIB_PREFIX)indirect.dylib + LIB_REEXPORT := $(LIB_PREFIX)reexport.dylib + EXEC_PATH := "@executable_path" + EXEC_PATH_INDIRECT := -install_name $(EXEC_PATH)/$(LIB_INDIRECT) + EXEC_PATH_REEXPORT := -install_name $(EXEC_PATH)/$(LIB_REEXPORT) +endif + +all: a.out $(LIB_INDIRECT) $(LIB_REEXPORT) + +a.out: main.o $(LIB_INDIRECT) $(LIB_REEXPORT) + $(CC) $(CFLAGS) -o a.out main.o -L. $(LIB_INDIRECT) $(LIB_REEXPORT) + +main.o: main.c + $(CC) $(CFLAGS) -c main.c + +$(LIB_INDIRECT): indirect.o + $(CC) $(CFLAGS) $(LD_FLAGS) $(EXEC_PATH_INDIRECT) -o $(LIB_INDIRECT) indirect.o + if [ "$(OS)" = "Darwin" ]; then dsymutil $(LIB_INDIRECT); fi + +indirect.o: indirect.c + $(CC) $(CFLAGS) -c indirect.c + +$(LIB_REEXPORT): reexport.o $(LIB_INDIRECT) + $(CC) $(CFLAGS) $(LD_FLAGS) $(EXEC_PATH_REEXPORT) -o $(LIB_REEXPORT) reexport.o -L. -lindirect -Wl,-alias_list,$(CWD)/alias.list + if [ "$(OS)" = "Darwin" ]; then dsymutil $(LIB_REEXPORT); fi + +reexport.o: reexport.c + $(CC) $(CFLAGS) -c reexport.c +clean: + rm -rf $(wildcard *.o *~ *.dylib *.so a.out *.dSYM) diff --git a/packages/Python/lldbsuite/test/macosx/indirect_symbol/TestIndirectSymbols.py b/packages/Python/lldbsuite/test/macosx/indirect_symbol/TestIndirectSymbols.py new file mode 100644 index 0000000..4f98865 --- /dev/null +++ b/packages/Python/lldbsuite/test/macosx/indirect_symbol/TestIndirectSymbols.py @@ -0,0 +1,88 @@ +"""Test stepping and setting breakpoints in indirect and re-exported symbols.""" + +from __future__ import print_function + + + +import os, time +import lldb +import lldbsuite.test.lldbutil as lldbutil +from lldbsuite.test.lldbtest import * + +class TestIndirectFunctions(TestBase): + + mydir = TestBase.compute_mydir(__file__) + + def setUp(self): + # Call super's setUp(). + TestBase.setUp(self) + # Find the line numbers that we will step to in main: + self.main_source = "main.c" + + @skipUnlessDarwin + @add_test_categories(['pyapi']) + def test_with_python_api(self): + """Test stepping and setting breakpoints in indirect and re-exported symbols.""" + self.build() + exe = os.path.join(os.getcwd(), "a.out") + + target = self.dbg.CreateTarget(exe) + self.assertTrue(target, VALID_TARGET) + + self.main_source_spec = lldb.SBFileSpec (self.main_source) + + break1 = target.BreakpointCreateBySourceRegex ("Set breakpoint here to step in indirect.", self.main_source_spec) + self.assertTrue(break1, VALID_BREAKPOINT) + + break2 = target.BreakpointCreateBySourceRegex ("Set breakpoint here to step in reexported.", self.main_source_spec) + self.assertTrue(break2, VALID_BREAKPOINT) + + # Now launch the process, and do not stop at entry point. + process = target.LaunchSimple (None, None, self.get_process_working_directory()) + + self.assertTrue(process, PROCESS_IS_VALID) + + # The stop reason of the thread should be breakpoint. + threads = lldbutil.get_threads_stopped_at_breakpoint (process, break1) + if len(threads) != 1: + self.fail ("Failed to stop at breakpoint 1.") + + thread = threads[0] + + # Now do a step-into, and we should end up in the hidden target of this indirect function. + thread.StepInto() + curr_function = thread.GetFrameAtIndex(0).GetFunctionName() + self.assertTrue (curr_function == "call_through_indirect_hidden", "Stepped into indirect symbols.") + + # Now set a breakpoint using the indirect symbol name, and make sure we get to that: + break_indirect = target.BreakpointCreateByName ("call_through_indirect"); + self.assertTrue (break_indirect, VALID_BREAKPOINT) + + # Now continue should take us to the second call through the indirect symbol: + + threads = lldbutil.continue_to_breakpoint (process, break_indirect) + self.assertTrue (len(threads) == 1, "Stopped at breakpoint in indirect function.") + curr_function = thread.GetFrameAtIndex(0).GetFunctionName() + self.assertTrue (curr_function == "call_through_indirect_hidden", "Stepped into indirect symbols.") + + # Delete this breakpoint so it won't get in the way: + target.BreakpointDelete (break_indirect.GetID()) + + # Now continue to the site of the first re-exported function call in main: + threads = lldbutil.continue_to_breakpoint (process, break2) + + # This is stepping Into through a re-exported symbol to an indirect symbol: + thread.StepInto() + curr_function = thread.GetFrameAtIndex(0).GetFunctionName() + self.assertTrue (curr_function == "call_through_indirect_hidden", "Stepped into indirect symbols.") + + # And the last bit is to set a breakpoint on the re-exported symbol and make sure we are again in out target function. + break_reexported = target.BreakpointCreateByName ("reexport_to_indirect"); + self.assertTrue (break_reexported, VALID_BREAKPOINT) + + # Now continue should take us to the second call through the indirect symbol: + + threads = lldbutil.continue_to_breakpoint (process, break_reexported) + self.assertTrue (len(threads) == 1, "Stopped at breakpoint in reexported function target.") + curr_function = thread.GetFrameAtIndex(0).GetFunctionName() + self.assertTrue (curr_function == "call_through_indirect_hidden", "Stepped into indirect symbols.") diff --git a/packages/Python/lldbsuite/test/macosx/indirect_symbol/alias.list b/packages/Python/lldbsuite/test/macosx/indirect_symbol/alias.list new file mode 100644 index 0000000..3232c58 --- /dev/null +++ b/packages/Python/lldbsuite/test/macosx/indirect_symbol/alias.list @@ -0,0 +1 @@ +_call_through_indirect _reexport_to_indirect
\ No newline at end of file diff --git a/packages/Python/lldbsuite/test/macosx/indirect_symbol/indirect.c b/packages/Python/lldbsuite/test/macosx/indirect_symbol/indirect.c new file mode 100644 index 0000000..48e1459 --- /dev/null +++ b/packages/Python/lldbsuite/test/macosx/indirect_symbol/indirect.c @@ -0,0 +1,14 @@ +#define MakeResolver(name) \ + void * name ## Resolver(void) __asm__("_" #name); \ + void * name ## Resolver(void) { \ + __asm__(".symbol_resolver _" #name); \ + return name ## _hidden; \ + } + +int +call_through_indirect_hidden(int arg) +{ + return arg + 5; +} + +MakeResolver(call_through_indirect) diff --git a/packages/Python/lldbsuite/test/macosx/indirect_symbol/main.c b/packages/Python/lldbsuite/test/macosx/indirect_symbol/main.c new file mode 100644 index 0000000..b5af058 --- /dev/null +++ b/packages/Python/lldbsuite/test/macosx/indirect_symbol/main.c @@ -0,0 +1,14 @@ +extern int call_through_indirect(int); +extern int reexport_to_indirect(int); + +int +main () +{ + int indirect_result = call_through_indirect(20); // Set breakpoint here to step in indirect. + indirect_result = call_through_indirect(30); + + int reexport_result = reexport_to_indirect (20); // Set breakpoint here to step in reexported. + reexport_result = reexport_to_indirect (30); + + return 0; +} diff --git a/packages/Python/lldbsuite/test/macosx/indirect_symbol/reexport.c b/packages/Python/lldbsuite/test/macosx/indirect_symbol/reexport.c new file mode 100644 index 0000000..096a463 --- /dev/null +++ b/packages/Python/lldbsuite/test/macosx/indirect_symbol/reexport.c @@ -0,0 +1,7 @@ +extern int call_through_indirect(int); + +int +fake_call_through_reexport(int value) +{ + return value + 10; +} |