Skip to content

Commit

Permalink
Take 2: Use an artifical namespace so that member vars do not hide lo…
Browse files Browse the repository at this point in the history
…cal vars.

Summary: This relands r259810 with fix for failures on Mac.

Reviewers: spyffe, tfiala

Subscribers: tfiala, lldb-commits

Differential Revision: http://reviews.llvm.org/D16900

llvm-svn: 259902
  • Loading branch information
Siva Chandra committed Feb 5, 2016
1 parent d79514e commit 03ff5c8
Show file tree
Hide file tree
Showing 12 changed files with 409 additions and 13 deletions.
9 changes: 8 additions & 1 deletion lldb/include/lldb/Symbol/ClangASTContext.h
Expand Up @@ -422,6 +422,11 @@ class ClangASTContext : public TypeSystem
GetUniqueNamespaceDeclaration (const char *name,
clang::DeclContext *decl_ctx);

static clang::NamespaceDecl *
GetUniqueNamespaceDeclaration (clang::ASTContext *ast,
const char *name,
clang::DeclContext *decl_ctx);

//------------------------------------------------------------------
// Function Types
//------------------------------------------------------------------
Expand Down Expand Up @@ -565,7 +570,9 @@ class ClangASTContext : public TypeSystem
//----------------------------------------------------------------------

std::vector<CompilerDecl>
DeclContextFindDeclByName (void *opaque_decl_ctx, ConstString name) override;
DeclContextFindDeclByName (void *opaque_decl_ctx,
ConstString name,
const bool ignore_using_decls) override;

bool
DeclContextIsStructUnionOrClass (void *opaque_decl_ctx) override;
Expand Down
2 changes: 1 addition & 1 deletion lldb/include/lldb/Symbol/CompilerDeclContext.h
Expand Up @@ -66,7 +66,7 @@ class CompilerDeclContext
IsClang () const;

std::vector<CompilerDecl>
FindDeclByName (ConstString name);
FindDeclByName (ConstString name, const bool ignore_using_decls);

//----------------------------------------------------------------------
/// Checks if this decl context represents a method of a class.
Expand Down
4 changes: 3 additions & 1 deletion lldb/include/lldb/Symbol/TypeSystem.h
Expand Up @@ -143,7 +143,9 @@ class TypeSystem : public PluginInterface
//----------------------------------------------------------------------

virtual std::vector<CompilerDecl>
DeclContextFindDeclByName (void *opaque_decl_ctx, ConstString name);
DeclContextFindDeclByName (void *opaque_decl_ctx,
ConstString name,
const bool ignore_imported_decls);

virtual bool
DeclContextIsStructUnionOrClass (void *opaque_decl_ctx) = 0;
Expand Down
@@ -0,0 +1,5 @@
LEVEL = ../../../make

CXX_SOURCES = main.cpp

include $(LEVEL)/Makefile.rules
@@ -0,0 +1,197 @@
import lldb
from lldbsuite.test.lldbtest import *
import lldbsuite.test.lldbutil as lldbutil

class TestMembersAndLocalsWithSameName(TestBase):

mydir = TestBase.compute_mydir(__file__)

def test_when_stopped_in_method(self):
self._load_exe()

# Set breakpoints
bp1 = self.target.BreakpointCreateBySourceRegex("Break 1", self.src_file_spec)
self.assertTrue(bp1.IsValid() and bp1.GetNumLocations() >= 1, VALID_BREAKPOINT)
bp2 = self.target.BreakpointCreateBySourceRegex("Break 2", self.src_file_spec)
self.assertTrue(bp2.IsValid() and bp2.GetNumLocations() >= 1, VALID_BREAKPOINT)
bp3 = self.target.BreakpointCreateBySourceRegex("Break 3", self.src_file_spec)
self.assertTrue(bp3.IsValid() and bp3.GetNumLocations() >= 1, VALID_BREAKPOINT)
bp4 = self.target.BreakpointCreateBySourceRegex("Break 4", self.src_file_spec)
self.assertTrue(bp4.IsValid() and bp4.GetNumLocations() >= 1, VALID_BREAKPOINT)

# Launch the process
self.process = self.target.LaunchSimple(None, None, self.get_process_working_directory())
self.assertTrue(self.process.IsValid(), PROCESS_IS_VALID)

self.assertTrue(self.process.GetState() == lldb.eStateStopped, PROCESS_STOPPED)

self._test_globals()

self.process.Continue()
self.assertTrue(self.process.GetState() == lldb.eStateStopped, PROCESS_STOPPED)
thread = lldbutil.get_stopped_thread(self.process, lldb.eStopReasonBreakpoint)
self.assertTrue(thread.IsValid())
frame = thread.GetSelectedFrame()
self.assertTrue(frame.IsValid())

val = frame.EvaluateExpression("a");
self.assertTrue(val.IsValid())
self.assertEqual(val.GetValueAsUnsigned(), 12345)

val = frame.EvaluateExpression("b");
self.assertTrue(val.IsValid())
self.assertEqual(val.GetValueAsUnsigned(), 54321)

val = frame.EvaluateExpression("c");
self.assertTrue(val.IsValid())
self.assertEqual(val.GetValueAsUnsigned(), 34567)

self.process.Continue()
self.assertTrue(self.process.GetState() == lldb.eStateStopped, PROCESS_STOPPED)
thread = lldbutil.get_stopped_thread(self.process, lldb.eStopReasonBreakpoint)
self.assertTrue(thread.IsValid())
frame = thread.GetSelectedFrame()
self.assertTrue(frame.IsValid())

val = frame.EvaluateExpression("a");
self.assertTrue(val.IsValid())
self.assertEqual(val.GetValueAsUnsigned(), 10001)

val = frame.EvaluateExpression("b");
self.assertTrue(val.IsValid())
self.assertEqual(val.GetValueAsUnsigned(), 10002)

val = frame.EvaluateExpression("c");
self.assertTrue(val.IsValid())
self.assertEqual(val.GetValueAsUnsigned(), 10003)

self.process.Continue()
self.assertTrue(self.process.GetState() == lldb.eStateStopped, PROCESS_STOPPED)
thread = lldbutil.get_stopped_thread(self.process, lldb.eStopReasonBreakpoint)
self.assertTrue(thread.IsValid())
frame = thread.GetSelectedFrame()
self.assertTrue(frame.IsValid())

val = frame.EvaluateExpression("a");
self.assertTrue(val.IsValid())
self.assertEqual(val.GetValueAsUnsigned(), 1)

val = frame.EvaluateExpression("b");
self.assertTrue(val.IsValid())
self.assertEqual(val.GetValueAsUnsigned(), 2)

val = frame.EvaluateExpression("c");
self.assertTrue(val.IsValid())
self.assertEqual(val.GetValueAsUnsigned(), 778899)

def test_when_stopped_in_function(self):
self._load_exe()

# Set breakpoints
bp1 = self.target.BreakpointCreateBySourceRegex("Break 1", self.src_file_spec)
self.assertTrue(bp1.IsValid() and bp1.GetNumLocations() >= 1, VALID_BREAKPOINT)
bp5 = self.target.BreakpointCreateBySourceRegex("Break 5", self.src_file_spec)
self.assertTrue(bp5.IsValid() and bp5.GetNumLocations() >= 1, VALID_BREAKPOINT)
bp6 = self.target.BreakpointCreateBySourceRegex("Break 6", self.src_file_spec)
self.assertTrue(bp6.IsValid() and bp6.GetNumLocations() >= 1, VALID_BREAKPOINT)
bp7 = self.target.BreakpointCreateBySourceRegex("Break 7", self.src_file_spec)
self.assertTrue(bp7.IsValid() and bp7.GetNumLocations() >= 1, VALID_BREAKPOINT)

# Launch the process
self.process = self.target.LaunchSimple(None, None, self.get_process_working_directory())
self.assertTrue(self.process.IsValid(), PROCESS_IS_VALID)

self.assertTrue(self.process.GetState() == lldb.eStateStopped, PROCESS_STOPPED)

self._test_globals()

self.process.Continue()
self.assertTrue(self.process.GetState() == lldb.eStateStopped, PROCESS_STOPPED)
thread = lldbutil.get_stopped_thread(self.process, lldb.eStopReasonBreakpoint)
self.assertTrue(thread.IsValid())
frame = thread.GetSelectedFrame()
self.assertTrue(frame.IsValid())

val = frame.EvaluateExpression("a");
self.assertTrue(val.IsValid())
self.assertEqual(val.GetValueAsUnsigned(), 12345)

val = frame.EvaluateExpression("b");
self.assertTrue(val.IsValid())
self.assertEqual(val.GetValueAsUnsigned(), 54321)

val = frame.EvaluateExpression("c");
self.assertTrue(val.IsValid())
self.assertEqual(val.GetValueAsUnsigned(), 34567)

self.process.Continue()
self.assertTrue(self.process.GetState() == lldb.eStateStopped, PROCESS_STOPPED)
thread = lldbutil.get_stopped_thread(self.process, lldb.eStopReasonBreakpoint)
self.assertTrue(thread.IsValid())
frame = thread.GetSelectedFrame()
self.assertTrue(frame.IsValid())

val = frame.EvaluateExpression("a");
self.assertTrue(val.IsValid())
self.assertEqual(val.GetValueAsUnsigned(), 10001)

val = frame.EvaluateExpression("b");
self.assertTrue(val.IsValid())
self.assertEqual(val.GetValueAsUnsigned(), 10002)

val = frame.EvaluateExpression("c");
self.assertTrue(val.IsValid())
self.assertEqual(val.GetValueAsUnsigned(), 10003)

self.process.Continue()
self.assertTrue(self.process.GetState() == lldb.eStateStopped, PROCESS_STOPPED)
thread = lldbutil.get_stopped_thread(self.process, lldb.eStopReasonBreakpoint)
self.assertTrue(thread.IsValid())
frame = thread.GetSelectedFrame()
self.assertTrue(frame.IsValid())

val = frame.EvaluateExpression("a");
self.assertTrue(val.IsValid())
self.assertEqual(val.GetValueAsUnsigned(), 1)

val = frame.EvaluateExpression("b");
self.assertTrue(val.IsValid())
self.assertEqual(val.GetValueAsUnsigned(), 2)

val = frame.EvaluateExpression("c");
self.assertTrue(val.IsValid())
self.assertEqual(val.GetValueAsUnsigned(), 778899)

def _load_exe(self):
self.build()

cwd = os.getcwd()

src_file = os.path.join(cwd, "main.cpp")
self.src_file_spec = lldb.SBFileSpec(src_file)
self.assertTrue(self.src_file_spec.IsValid(), "breakpoint file")

# Get the path of the executable
exe_path = os.path.join(cwd, 'a.out')

# Load the executable
self.target = self.dbg.CreateTarget(exe_path)
self.assertTrue(self.target.IsValid(), VALID_TARGET)

def _test_globals(self):
thread = lldbutil.get_stopped_thread(self.process, lldb.eStopReasonBreakpoint)
self.assertTrue(thread.IsValid())
frame = thread.GetSelectedFrame()
self.assertTrue(frame.IsValid())

val = frame.EvaluateExpression("a");
self.assertTrue(val.IsValid())
self.assertEqual(val.GetValueAsUnsigned(), 112233)

val = frame.EvaluateExpression("b");
self.assertTrue(val.IsValid())
self.assertEqual(val.GetValueAsUnsigned(), 445566)

val = frame.EvaluateExpression("c");
self.assertTrue(val.IsValid())
self.assertEqual(val.GetValueAsUnsigned(), 778899)
@@ -0,0 +1,73 @@
namespace NN
{
int a = 778899;
int b = 665544;
int c = 445566;
}

class A
{
public:
A();
int Method(int a, int b);

private:
int a, b;
};

A::A() : a(10), b(100) { }

int a = 112233;
int b = 445566;
int c = 778899;

int
A::Method(int a, int b)
{
{
int a = 12345;
int b = 54321;
int c = 34567;
this->a = a + b + this->b; // Break 2
}

{
using namespace NN;
int a = 10001;
int b = 10002;
int c = 10003;
this->a = a + b + this->b; // Break 3
}

return this->a + this->b + a + b; // Break 4
}

int
Function(int a, int b)
{
int A;

{
int a = 12345;
int b = 54321;
int c = 34567;
A = a + b + c; // Break 5
}

{
using namespace NN;
int a = 10001;
int b = 10002;
int c = 10003;
A = a + b + c; // Break 6
}

return A + a + b; // Break 7
}

int
main()
{
A obj;
return obj.Method(1, 2) + Function(1, 2); // Break 1
}

0 comments on commit 03ff5c8

Please sign in to comment.