diff options
Diffstat (limited to 'lldb/packages/Python/lldbsuite/test/lang/c')
11 files changed, 161 insertions, 0 deletions
diff --git a/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Makefile b/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Makefile new file mode 100644 index 00000000000..f8a04bd32b9 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Makefile @@ -0,0 +1,18 @@ +LEVEL := ../../../make + +LD_EXTRAS := -L. -l$(LIB_PREFIX)One -l$(LIB_PREFIX)Two +C_SOURCES := main.c + +main.o : CFLAGS_EXTRAS += -g -O0 + +include $(LEVEL)/Makefile.rules + +.PHONY: +a.out: lib_One lib_Two + +lib_%: + $(MAKE) -f $*.mk + +clean:: + $(MAKE) -f One.mk clean + $(MAKE) -f Two.mk clean diff --git a/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One.mk b/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One.mk new file mode 100644 index 00000000000..04f894c595e --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One.mk @@ -0,0 +1,12 @@ +LEVEL := ../../../make + +DYLIB_NAME := One +DYLIB_C_SOURCES := One/One.c One/OneConstant.c +DYLIB_ONLY := YES + +include $(LEVEL)/Makefile.rules + +CFLAGS_EXTRAS += -fPIC + +One/OneConstant.o: One/OneConstant.c + $(CC) $(CFLAGS_NO_DEBUG) -c $< -o $@ diff --git a/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One/One.c b/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One/One.c new file mode 100644 index 00000000000..6bd729f6570 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One/One.c @@ -0,0 +1,6 @@ +#include "One.h" +#include <stdio.h> + +void one() { + printf("One\n"); // break here +} diff --git a/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One/One.h b/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One/One.h new file mode 100644 index 00000000000..b59f5ad13f2 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One/One.h @@ -0,0 +1,4 @@ +#ifndef ONE_H +#define ONE_H +void one(); +#endif diff --git a/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One/OneConstant.c b/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One/OneConstant.c new file mode 100644 index 00000000000..8255c2fce99 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One/OneConstant.c @@ -0,0 +1 @@ +int __attribute__ ((visibility("hidden"))) conflicting_symbol = 11111; diff --git a/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/TestConflictingSymbol.py b/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/TestConflictingSymbol.py new file mode 100644 index 00000000000..fc3490b3f85 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/TestConflictingSymbol.py @@ -0,0 +1,86 @@ +"""Test that conflicting symbols in different shared libraries work correctly""" + +from __future__ import print_function + + +import os +import time +import lldb +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil + + +class TestConflictingSymbols(TestBase): + + mydir = TestBase.compute_mydir(__file__) + NO_DEBUG_INFO_TESTCASE = True + + @skipUnlessDarwin + def test_conflicting_symbols(self): + self.build() + self.common_setup() + + One_line = line_number('One/One.c', '// break here') + Two_line = line_number('Two/Two.c', '// break here') + main_line = line_number('main.c', '// break here') + lldbutil.run_break_set_command( + self, 'breakpoint set -f One.c -l %s' % (One_line)) + lldbutil.run_break_set_command( + self, 'breakpoint set -f Two.c -l %s' % (Two_line)) + lldbutil.run_break_set_by_file_and_line( + self, 'main.c', main_line, num_expected_locations=1, loc_exact=True) + + self.runCmd("run", RUN_SUCCEEDED) + + # The stop reason of the thread should be breakpoint. + self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, + substrs=['stopped', + 'stop reason = breakpoint']) + + self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE, + substrs=[' resolved, hit count = 1']) + + # This should display correctly. + self.expect( + "expr (unsigned long long)conflicting_symbol", + "Symbol from One should be found", + substrs=[ + "11111"]) + + self.runCmd("continue", RUN_SUCCEEDED) + + # The stop reason of the thread should be breakpoint. + self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, + substrs=['stopped', + 'stop reason = breakpoint']) + + self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE, + substrs=[' resolved, hit count = 1']) + + self.expect( + "expr (unsigned long long)conflicting_symbol", + "Symbol from Two should be found", + substrs=[ + "22222"]) + + self.runCmd("continue", RUN_SUCCEEDED) + + # The stop reason of the thread should be breakpoint. + self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, + substrs=['stopped', + 'stop reason = breakpoint']) + + self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE, + substrs=[' resolved, hit count = 1']) + + self.expect( + "expr (unsigned long long)conflicting_symbol", + "An error should be printed when symbols can't be ordered", + error=True, + substrs=[ + "Multiple internal symbols"]) + + def common_setup(self): + exe = os.path.join(os.getcwd(), "a.out") + self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) diff --git a/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two.mk b/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two.mk new file mode 100644 index 00000000000..117d9e00d44 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two.mk @@ -0,0 +1,12 @@ +LEVEL := ../../../make + +DYLIB_NAME := Two +DYLIB_C_SOURCES := Two/Two.c Two/TwoConstant.c +DYLIB_ONLY := YES + +include $(LEVEL)/Makefile.rules + +CFLAGS_EXTRAS += -fPIC + +Two/TwoConstant.o: Two/TwoConstant.c + $(CC) $(CFLAGS_NO_DEBUG) -c $< -o $@ diff --git a/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two/Two.c b/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two/Two.c new file mode 100644 index 00000000000..8d8d668b8c3 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two/Two.c @@ -0,0 +1,6 @@ +#include "Two.h" +#include <stdio.h> + +void two() { + printf("Two\n"); // break here +} diff --git a/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two/Two.h b/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two/Two.h new file mode 100644 index 00000000000..8d5bd6a3233 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two/Two.h @@ -0,0 +1,4 @@ +#ifndef TWO_H +#define TWO_H +void two(); +#endif diff --git a/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two/TwoConstant.c b/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two/TwoConstant.c new file mode 100644 index 00000000000..9fc7c4b7951 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two/TwoConstant.c @@ -0,0 +1 @@ +int __attribute__ ((visibility("hidden"))) conflicting_symbol = 22222; diff --git a/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/main.c b/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/main.c new file mode 100644 index 00000000000..4dcd443c049 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/main.c @@ -0,0 +1,11 @@ +#include "One/One.h" +#include "Two/Two.h" + +#include <stdio.h> + +int main() { + one(); + two(); + printf("main\n"); // break here + return(0); +} |