diff options
author | Sean Callanan <scallanan@apple.com> | 2017-05-16 23:46:13 +0000 |
---|---|---|
committer | Sean Callanan <scallanan@apple.com> | 2017-05-16 23:46:13 +0000 |
commit | 9c99faa8563c11895b44d8e59c1a96216dfb17f7 (patch) | |
tree | fef4d3d6c880ca50f9eaa794d32855b084b55b37 /lldb/packages/Python/lldbsuite/test/lang/c | |
parent | 6fc88757397387ca1f1c86457231a845f354664a (diff) | |
download | bcm5719-llvm-9c99faa8563c11895b44d8e59c1a96216dfb17f7.tar.gz bcm5719-llvm-9c99faa8563c11895b44d8e59c1a96216dfb17f7.zip |
[Expression parser] Look up module symbols before hunting globally
When it resolves symbol-only variables, the expression parser
currently looks only in the global module list. It should prefer
the current module.
I've fixed that behavior by making it search the current module
first, and only search globally if it finds nothing. I've also
added a test case.
After review, I moved the core of the lookup algorithm into
SymbolContext for use by other code that needs it.
Thanks to Greg Clayton and Pavel Labath for their help.
Differential Revision: https://reviews.llvm.org/D33083
llvm-svn: 303223
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); +} |