Index: packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Makefile =================================================================== --- packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Makefile +++ packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Makefile @@ -0,0 +1,27 @@ +LEVEL = ../../../make + +DEBUG_CFLAGS = -g -O0 +NDEBUG_CFLAGS = -O0 +LDFLAGS = $(CFLAGS) -lobjc -framework Foundation + +all: a.out libOne.dylib libTwo.dylib + +libOne.dylib: One/One.c One/OneConstant.c + $(CC) $(DEBUG_CFLAGS) -I. -c -o One.o One/One.c + $(CC) $(NDEBUG_CFLAGS) -I. -c -o OneConstant.o One/OneConstant.c + $(CC) $(LDFLAGS) -shared -o libOne.dylib One.o OneConstant.o + dsymutil libOne.dylib + +libTwo.dylib: Two/Two.c Two/TwoConstant.c + $(CC) $(DEBUG_CFLAGS) -I. -c -o Two.o Two/Two.c + $(CC) $(NDEBUG_CFLAGS) -I. -c -o TwoConstant.o Two/TwoConstant.c + $(CC) $(LDFLAGS) -shared -o libTwo.dylib Two.o TwoConstant.o + dsymutil libTwo.dylib + +a.out: main.c libOne.dylib libTwo.dylib + $(CC) $(LDFLAGS) -I. -L. -lOne -lTwo -o a.out main.c + +.PHONY: clean + +clean: + rm -rf *.dylib *.o *.dSYM a.out Index: packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One/One.h =================================================================== --- packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One/One.h +++ packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One/One.h @@ -0,0 +1,4 @@ +#ifndef ONE_H +#define ONE_H +void one(); +#endif Index: packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One/One.c =================================================================== --- packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One/One.c +++ packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One/One.c @@ -0,0 +1,6 @@ +#include "One.h" +#include + +void one() { + printf("One\n"); // break here +} Index: packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One/OneConstant.c =================================================================== --- packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One/OneConstant.c +++ packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One/OneConstant.c @@ -0,0 +1 @@ +__private_extern__ int conflicting_symbol = 11111; \ No newline at end of file Index: packages/Python/lldbsuite/test/lang/c/conflicting-symbol/TestConflictingSymbol.py =================================================================== --- packages/Python/lldbsuite/test/lang/c/conflicting-symbol/TestConflictingSymbol.py +++ packages/Python/lldbsuite/test/lang/c/conflicting-symbol/TestConflictingSymbol.py @@ -0,0 +1,67 @@ +"""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 TestRealDefinition(TestBase): + + mydir = TestBase.compute_mydir(__file__) + + @skipUnlessDarwin + def test_frame_var_after_stop_at_implementation(self): + if self.getArchitecture() == 'i386': + self.skipTest("requires modern objc runtime") + self.build() + self.common_setup() + + line = line_number('One/One.c', '// break here') + line = line_number('Two/Two.c', '// break here') + lldbutil.run_break_set_by_file_and_line( + self, 'One.c', line, num_expected_locations=1, loc_exact=True) + lldbutil.run_break_set_by_file_and_line( + self, 'Two.c', 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"]) + + def common_setup(self): + exe = os.path.join(os.getcwd(), "a.out") + self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) Index: packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two/Two.h =================================================================== --- packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two/Two.h +++ packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two/Two.h @@ -0,0 +1,4 @@ +#ifndef TWO_H +#define TWO_H +void two(); +#endif Index: packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two/Two.c =================================================================== --- packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two/Two.c +++ packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two/Two.c @@ -0,0 +1,6 @@ +#include "Two.h" +#include + +void two() { + printf("Two\n"); // break here +} Index: packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two/TwoConstant.c =================================================================== --- packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two/TwoConstant.c +++ packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two/TwoConstant.c @@ -0,0 +1 @@ +__private_extern__ int conflicting_symbol = 22222; \ No newline at end of file Index: packages/Python/lldbsuite/test/lang/c/conflicting-symbol/main.c =================================================================== --- packages/Python/lldbsuite/test/lang/c/conflicting-symbol/main.c +++ packages/Python/lldbsuite/test/lang/c/conflicting-symbol/main.c @@ -0,0 +1,8 @@ +#include "One/One.h" +#include "Two/Two.h" + +int main() { + one(); + two(); + return(0); +} Index: source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp =================================================================== --- source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp +++ source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp @@ -1526,9 +1526,15 @@ // We couldn't find a non-symbol variable for this. Now we'll hunt for // a generic // data symbol, and -- if it is found -- treat it as a variable. - - const Symbol *data_symbol = FindGlobalDataSymbol(*target, name); - + + const Symbol *module_data_symbol = (m_parser_vars->m_sym_ctx.module_sp ? + FindGlobalDataSymbol(*target, name, + m_parser_vars->m_sym_ctx.module_sp.get()) : + nullptr); + + const Symbol *data_symbol = module_data_symbol ? + module_data_symbol : FindGlobalDataSymbol(*target, name); + if (data_symbol) { std::string warning("got name from symbols: "); warning.append(name.AsCString());