diff options
Diffstat (limited to 'packages/Python/lldbsuite/test/lang')
11 files changed, 165 insertions, 0 deletions
| diff --git a/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Makefile b/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Makefile new file mode 100644 index 000000000000..f8a04bd32b90 --- /dev/null +++ b/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/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One.mk b/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One.mk new file mode 100644 index 000000000000..04f894c595e8 --- /dev/null +++ b/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/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One/One.c b/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One/One.c new file mode 100644 index 000000000000..6bd729f65700 --- /dev/null +++ b/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/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One/One.h b/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One/One.h new file mode 100644 index 000000000000..b59f5ad13f22 --- /dev/null +++ b/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/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One/OneConstant.c b/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One/OneConstant.c new file mode 100644 index 000000000000..8255c2fce995 --- /dev/null +++ b/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One/OneConstant.c @@ -0,0 +1 @@ +int __attribute__ ((visibility("hidden"))) conflicting_symbol = 11111; diff --git a/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/TestConflictingSymbol.py b/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/TestConflictingSymbol.py new file mode 100644 index 000000000000..d3327700bfd2 --- /dev/null +++ b/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/TestConflictingSymbol.py @@ -0,0 +1,90 @@ +"""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 + +    def test_conflicting_symbols(self): +        self.build() +        exe = os.path.join(os.getcwd(), "a.out") +        target = self.dbg.CreateTarget("a.out") +        self.assertTrue(target, VALID_TARGET) + +        # Register our shared libraries for remote targets so they get +        # automatically uploaded +        environment = self.registerSharedLibrariesWithTarget( +            target, ['One', 'Two']) + +        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) + +        process = target.LaunchSimple( +            None, environment, self.get_process_working_directory()) +        self.assertTrue(process, PROCESS_IS_VALID) + +        # 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"]) diff --git a/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two.mk b/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two.mk new file mode 100644 index 000000000000..117d9e00d443 --- /dev/null +++ b/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/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two/Two.c b/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two/Two.c new file mode 100644 index 000000000000..8d8d668b8c31 --- /dev/null +++ b/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/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two/Two.h b/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two/Two.h new file mode 100644 index 000000000000..8d5bd6a32330 --- /dev/null +++ b/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/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two/TwoConstant.c b/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two/TwoConstant.c new file mode 100644 index 000000000000..9fc7c4b79515 --- /dev/null +++ b/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two/TwoConstant.c @@ -0,0 +1 @@ +int __attribute__ ((visibility("hidden"))) conflicting_symbol = 22222; diff --git a/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/main.c b/packages/Python/lldbsuite/test/lang/c/conflicting-symbol/main.c new file mode 100644 index 000000000000..4dcd443c0492 --- /dev/null +++ b/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);  +} | 
