[Lldb-commits] [lldb] r245381 - Fix resolution conflict between global and class static variables in C++
Paul Herman via lldb-commits
lldb-commits at lists.llvm.org
Tue Aug 18 15:46:57 PDT 2015
Author: paulherman
Date: Tue Aug 18 17:46:57 2015
New Revision: 245381
URL: http://llvm.org/viewvc/llvm-project?rev=245381&view=rev
Log:
Fix resolution conflict between global and class static variables in C++
Added:
lldb/trunk/test/lang/cpp/scope/
lldb/trunk/test/lang/cpp/scope/Makefile
lldb/trunk/test/lang/cpp/scope/TestCppScope.py
lldb/trunk/test/lang/cpp/scope/main.cpp
Modified:
lldb/trunk/include/lldb/Symbol/Variable.h
lldb/trunk/include/lldb/Symbol/VariableList.h
lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
lldb/trunk/source/Symbol/Variable.cpp
lldb/trunk/source/Symbol/VariableList.cpp
lldb/trunk/source/Target/StackFrame.cpp
Modified: lldb/trunk/include/lldb/Symbol/Variable.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/Variable.h?rev=245381&r1=245380&r2=245381&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/Variable.h (original)
+++ lldb/trunk/include/lldb/Symbol/Variable.h Tue Aug 18 17:46:57 2015
@@ -36,7 +36,8 @@ public:
Declaration* decl,
const DWARFExpression& location,
bool external,
- bool artificial);
+ bool artificial,
+ bool static_member = false);
virtual
~Variable();
@@ -99,6 +100,11 @@ public:
return m_artificial;
}
+ bool IsStaticMember() const
+ {
+ return m_static_member;
+ }
+
DWARFExpression &
LocationExpression()
{
@@ -171,7 +177,8 @@ protected:
DWARFExpression m_location; // The location of this variable that can be fed to DWARFExpression::Evaluate()
uint8_t m_external:1, // Visible outside the containing compile unit?
m_artificial:1, // Non-zero if the variable is not explicitly declared in source
- m_loc_is_const_data:1; // The m_location expression contains the constant variable value data, not a DWARF location
+ m_loc_is_const_data:1, // The m_location expression contains the constant variable value data, not a DWARF location
+ m_static_member:1; // Non-zero if variable is static member of a class or struct.
private:
Variable(const Variable& rhs);
Variable& operator=(const Variable& rhs);
Modified: lldb/trunk/include/lldb/Symbol/VariableList.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/VariableList.h?rev=245381&r1=245380&r2=245381&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/VariableList.h (original)
+++ lldb/trunk/include/lldb/Symbol/VariableList.h Tue Aug 18 17:46:57 2015
@@ -48,10 +48,10 @@ public:
RemoveVariableAtIndex (size_t idx);
lldb::VariableSP
- FindVariable (const ConstString& name);
+ FindVariable (const ConstString& name, bool include_static_members = true);
lldb::VariableSP
- FindVariable (const ConstString& name, lldb::ValueType value_type);
+ FindVariable (const ConstString& name, lldb::ValueType value_type, bool include_static_members = true);
uint32_t
FindVariableIndex (const lldb::VariableSP &var_sp);
Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp?rev=245381&r1=245380&r2=245381&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp Tue Aug 18 17:46:57 2015
@@ -3968,7 +3968,6 @@ SymbolFileDWARF::ParseVariablesForContex
return 0;
}
-
VariableSP
SymbolFileDWARF::ParseVariableDIE
(
@@ -4124,6 +4123,9 @@ SymbolFileDWARF::ParseVariableDIE
}
}
+ const DWARFDebugInfoEntry *parent_context_die = GetDeclContextDIEContainingDIE(dwarf_cu, die);
+ bool is_static_member = die->GetParent()->Tag() == DW_TAG_compile_unit && (parent_context_die->Tag() == DW_TAG_class_type || parent_context_die->Tag() == DW_TAG_structure_type);
+
ValueType scope = eValueTypeInvalid;
const DWARFDebugInfoEntry *sc_parent_die = GetParentSymbolContextDIE(die);
@@ -4301,7 +4303,8 @@ SymbolFileDWARF::ParseVariableDIE
&decl,
location,
is_external,
- is_artificial));
+ is_artificial,
+ is_static_member));
var_sp->SetLocationIsConstantValueData (location_is_const_value_data);
}
Modified: lldb/trunk/source/Symbol/Variable.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/Variable.cpp?rev=245381&r1=245380&r2=245381&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/Variable.cpp (original)
+++ lldb/trunk/source/Symbol/Variable.cpp Tue Aug 18 17:46:57 2015
@@ -44,7 +44,8 @@ Variable::Variable
Declaration* decl_ptr,
const DWARFExpression& location,
bool external,
- bool artificial
+ bool artificial,
+ bool static_member
) :
UserID(uid),
m_name(name),
@@ -55,7 +56,8 @@ Variable::Variable
m_declaration(decl_ptr),
m_location(location),
m_external(external),
- m_artificial(artificial)
+ m_artificial(artificial),
+ m_static_member(static_member)
{
}
Modified: lldb/trunk/source/Symbol/VariableList.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/VariableList.cpp?rev=245381&r1=245380&r2=245381&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/VariableList.cpp (original)
+++ lldb/trunk/source/Symbol/VariableList.cpp Tue Aug 18 17:46:57 2015
@@ -100,7 +100,7 @@ VariableList::FindVariableIndex (const V
}
VariableSP
-VariableList::FindVariable(const ConstString& name)
+VariableList::FindVariable(const ConstString& name, bool include_static_members)
{
VariableSP var_sp;
iterator pos, end = m_variables.end();
@@ -108,15 +108,18 @@ VariableList::FindVariable(const ConstSt
{
if ((*pos)->NameMatches(name))
{
- var_sp = (*pos);
- break;
+ if (include_static_members || !(*pos)->IsStaticMember())
+ {
+ var_sp = (*pos);
+ break;
+ }
}
}
return var_sp;
}
VariableSP
-VariableList::FindVariable (const ConstString& name, lldb::ValueType value_type)
+VariableList::FindVariable (const ConstString& name, lldb::ValueType value_type, bool include_static_members)
{
VariableSP var_sp;
iterator pos, end = m_variables.end();
@@ -124,8 +127,11 @@ VariableList::FindVariable (const ConstS
{
if ((*pos)->NameMatches(name) && (*pos)->GetScope() == value_type)
{
- var_sp = (*pos);
- break;
+ if (include_static_members || !(*pos)->IsStaticMember())
+ {
+ var_sp = (*pos);
+ break;
+ }
}
}
return var_sp;
Modified: lldb/trunk/source/Target/StackFrame.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/StackFrame.cpp?rev=245381&r1=245380&r2=245381&view=diff
==============================================================================
--- lldb/trunk/source/Target/StackFrame.cpp (original)
+++ lldb/trunk/source/Target/StackFrame.cpp Tue Aug 18 17:46:57 2015
@@ -659,7 +659,7 @@ StackFrame::GetValueForVariableExpressio
else
name_const_string.SetCStringWithLength (var_path.c_str(), separator_idx);
- var_sp = variable_list->FindVariable(name_const_string);
+ var_sp = variable_list->FindVariable(name_const_string, false);
bool synthetically_added_instance_object = false;
Added: lldb/trunk/test/lang/cpp/scope/Makefile
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/cpp/scope/Makefile?rev=245381&view=auto
==============================================================================
--- lldb/trunk/test/lang/cpp/scope/Makefile (added)
+++ lldb/trunk/test/lang/cpp/scope/Makefile Tue Aug 18 17:46:57 2015
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+
+include $(LEVEL)/Makefile.rules
Added: lldb/trunk/test/lang/cpp/scope/TestCppScope.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/cpp/scope/TestCppScope.py?rev=245381&view=auto
==============================================================================
--- lldb/trunk/test/lang/cpp/scope/TestCppScope.py (added)
+++ lldb/trunk/test/lang/cpp/scope/TestCppScope.py Tue Aug 18 17:46:57 2015
@@ -0,0 +1,83 @@
+"""
+Test scopes in C++.
+"""
+import lldb
+from lldbtest import *
+import lldbutil
+
+class TestCppScopes(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @skipUnlessDarwin
+ @dsym_test
+ def test_with_dsym_and_run_command(self):
+ self.buildDsym()
+ self.check()
+
+ @dwarf_test
+ def test_with_dwarf_and_run_command(self):
+ self.buildDwarf()
+ self.check()
+
+ def setUp(self):
+ TestBase.setUp(self)
+
+ def check(self):
+ # Get main source file
+ src_file = "main.cpp"
+ src_file_spec = lldb.SBFileSpec(src_file)
+ self.assertTrue(src_file_spec.IsValid(), "Main source file")
+
+ # Get the path of the executable
+ cwd = os.getcwd()
+ exe_file = "a.out"
+ exe_path = os.path.join(cwd, exe_file)
+
+ # Load the executable
+ target = self.dbg.CreateTarget(exe_path)
+ self.assertTrue(target.IsValid(), VALID_TARGET)
+
+ # Break on main function
+ main_breakpoint = target.BreakpointCreateBySourceRegex("// break here", src_file_spec)
+ self.assertTrue(main_breakpoint.IsValid() and main_breakpoint.GetNumLocations() >= 1, VALID_BREAKPOINT)
+
+ # Launch the process
+ args = None
+ env = None
+ process = target.LaunchSimple(args, env, cwd)
+ self.assertTrue(process.IsValid(), PROCESS_IS_VALID)
+
+ # Get the thread of the process
+ self.assertTrue(process.GetState() == lldb.eStateStopped, PROCESS_STOPPED)
+ thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint)
+
+ # Get current fream of the thread at the breakpoint
+ frame = thread.GetSelectedFrame()
+
+ # Test result for scopes of variables
+
+ global_variables = frame.GetVariables(True, True, True, False)
+ global_variables_assert = {
+ 'A::a': 1111,
+ 'B::a': 2222,
+ 'C::a': 3333,
+ '::a': 4444,
+ 'a': 4444
+ }
+
+ self.assertTrue(global_variables.GetSize() == 4, "target variable returns all variables")
+ for variable in global_variables:
+ name = variable.GetName()
+ self.assertTrue(name in global_variables_assert, "target variable returns wrong variable " + name)
+
+ for name in global_variables_assert:
+ value = frame.EvaluateExpression(name)
+ assert_value = global_variables_assert[name]
+ self.assertTrue(value.IsValid() and value.GetValueAsSigned() == assert_value, name + " = " + str(assert_value))
+
+if __name__ == '__main__':
+ import atexit
+ lldb.SBDebugger.Initialize()
+ atexit.register(lambda: lldb.SBDebugger.Terminate())
+ unittest2.main()
Added: lldb/trunk/test/lang/cpp/scope/main.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/cpp/scope/main.cpp?rev=245381&view=auto
==============================================================================
--- lldb/trunk/test/lang/cpp/scope/main.cpp (added)
+++ lldb/trunk/test/lang/cpp/scope/main.cpp Tue Aug 18 17:46:57 2015
@@ -0,0 +1,25 @@
+class A {
+public:
+ static int a;
+ int b;
+};
+
+class B {
+public:
+ static int a;
+ int b;
+};
+
+struct C {
+ static int a;
+};
+
+int A::a = 1111;
+int B::a = 2222;
+int C::a = 3333;
+int a = 4444;
+
+int main() // break here
+{
+ return 0;
+}
More information about the lldb-commits
mailing list