spyffe created this revision.

When it resolved 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.


https://reviews.llvm.org/D33083

Files:
  packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Makefile
  packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One/One.c
  packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One/One.h
  packages/Python/lldbsuite/test/lang/c/conflicting-symbol/One/OneConstant.c
  
packages/Python/lldbsuite/test/lang/c/conflicting-symbol/TestConflictingSymbol.py
  packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two/Two.c
  packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two/Two.h
  packages/Python/lldbsuite/test/lang/c/conflicting-symbol/Two/TwoConstant.c
  packages/Python/lldbsuite/test/lang/c/conflicting-symbol/main.c
  source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp

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());
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: 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/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 <stdio.h>
+
+void two() {
+  printf("Two\n"); // break here
+}
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/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/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 <stdio.h>
+
+void one() {
+  printf("One\n"); // break here
+}
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
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to