Because it's compiled in debug mode? I wouldn't expect *any* optimization to be done in that case.
On Mon, Apr 25, 2016 at 4:35 PM, Siva Chandra <sivachan...@google.com> wrote: > Clang is probably right. Why bother to emit an unused file static scalar? > > On Mon, Apr 25, 2016 at 4:21 PM, Chaoren Lin <chaor...@google.com> wrote: > > Ah, I see. Is that a known clang bug? > > > > On Mon, Apr 25, 2016 at 4:07 PM, Siva Chandra <sivachan...@google.com> > > wrote: > >> > >> AFAICT, happens only with Clang; Using g_static_var, say as "return > >> g_static_var - 123;", fixes for me. > >> > >> On Mon, Apr 25, 2016 at 3:50 PM, Chaoren Lin via lldb-commits > >> <lldb-commits@lists.llvm.org> wrote: > >> > Is g_global_var necessarily static? > >> > > >> > On Linux, we're only seeing 2 static variables when your test expects > 3. > >> > > >> >> static_names = ['static_var', 'g_global_var', 'static_var'] > >> > > >> > I'm guessing g_global_var isn't treated as static. > >> > > >> > On Mon, Apr 25, 2016 at 2:54 PM, Greg Clayton via lldb-commits > >> > <lldb-commits@lists.llvm.org> wrote: > >> >> > >> >> Author: gclayton > >> >> Date: Mon Apr 25 16:54:10 2016 > >> >> New Revision: 267478 > >> >> > >> >> URL: http://llvm.org/viewvc/llvm-project?rev=267478&view=rev > >> >> Log: > >> >> Fix StackFrame::GetVariables(...) function that was broken by 261858 > >> >> when > >> >> lambda functions were added to Block::AppendBlockVariables(). The > >> >> Stackframe::GetVariables(...) function should get all variables > >> >> regardless > >> >> if they are in scope. > >> >> > >> >> This wasn't caught by the test suite so I added a test for it. > >> >> > >> >> > >> >> Added: > >> >> > >> >> > >> >> > lldb/trunk/packages/Python/lldbsuite/test/python_api/frame/get-variables/ > >> >> > >> >> > >> >> > lldb/trunk/packages/Python/lldbsuite/test/python_api/frame/get-variables/Makefile > >> >> > >> >> > >> >> > lldb/trunk/packages/Python/lldbsuite/test/python_api/frame/get-variables/TestGetVariables.py > >> >> > >> >> > >> >> > lldb/trunk/packages/Python/lldbsuite/test/python_api/frame/get-variables/main.c > >> >> Modified: > >> >> lldb/trunk/source/Target/StackFrame.cpp > >> >> > >> >> Added: > >> >> > >> >> > lldb/trunk/packages/Python/lldbsuite/test/python_api/frame/get-variables/Makefile > >> >> URL: > >> >> > >> >> > http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/python_api/frame/get-variables/Makefile?rev=267478&view=auto > >> >> > >> >> > >> >> > ============================================================================== > >> >> --- > >> >> > >> >> > lldb/trunk/packages/Python/lldbsuite/test/python_api/frame/get-variables/Makefile > >> >> (added) > >> >> +++ > >> >> > >> >> > lldb/trunk/packages/Python/lldbsuite/test/python_api/frame/get-variables/Makefile > >> >> Mon Apr 25 16:54:10 2016 > >> >> @@ -0,0 +1,5 @@ > >> >> +LEVEL = ../../../make > >> >> + > >> >> +C_SOURCES := main.c > >> >> + > >> >> +include $(LEVEL)/Makefile.rules > >> >> > >> >> Added: > >> >> > >> >> > lldb/trunk/packages/Python/lldbsuite/test/python_api/frame/get-variables/TestGetVariables.py > >> >> URL: > >> >> > >> >> > http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/python_api/frame/get-variables/TestGetVariables.py?rev=267478&view=auto > >> >> > >> >> > >> >> > ============================================================================== > >> >> --- > >> >> > >> >> > lldb/trunk/packages/Python/lldbsuite/test/python_api/frame/get-variables/TestGetVariables.py > >> >> (added) > >> >> +++ > >> >> > >> >> > lldb/trunk/packages/Python/lldbsuite/test/python_api/frame/get-variables/TestGetVariables.py > >> >> Mon Apr 25 16:54:10 2016 > >> >> @@ -0,0 +1,190 @@ > >> >> +""" > >> >> +Test that SBFrame::GetVariables() calls work correctly. > >> >> +""" > >> >> + > >> >> +from __future__ import print_function > >> >> + > >> >> + > >> >> + > >> >> +import os, time > >> >> +import lldb > >> >> +from lldbsuite.test.decorators import * > >> >> +from lldbsuite.test.lldbtest import * > >> >> +from lldbsuite.test import lldbplatform > >> >> +from lldbsuite.test import lldbutil > >> >> + > >> >> +def get_names_from_value_list(value_list): > >> >> + names = list() > >> >> + for value in value_list: > >> >> + names.append(value.GetName()) > >> >> + return names > >> >> + > >> >> +class TestGetVariables(TestBase): > >> >> + > >> >> + mydir = TestBase.compute_mydir(__file__) > >> >> + > >> >> + def setUp(self): > >> >> + # Call super's setUp(). > >> >> + TestBase.setUp(self) > >> >> + self.source = 'main.c' > >> >> + > >> >> + def verify_variable_names(self, description, value_list, names): > >> >> + copy_names = list(names) > >> >> + actual_names = get_names_from_value_list(value_list) > >> >> + for name in actual_names: > >> >> + if name in copy_names: > >> >> + copy_names.remove(name) > >> >> + else: > >> >> + self.assertTrue(False, "didn't find '%s' in %s" % > >> >> (name, > >> >> copy_names)) > >> >> + self.assertEqual(len(copy_names), 0, "%s: we didn't find > >> >> variables: %s in value list (%s)" % (description, copy_names, > >> >> actual_names)) > >> >> + > >> >> + def test (self): > >> >> + self.build () > >> >> + > >> >> + # Set debugger into synchronous mode > >> >> + self.dbg.SetAsync(False) > >> >> + > >> >> + # Create a target by the debugger. > >> >> + exe = os.path.join(os.getcwd(), "a.out") > >> >> + target = self.dbg.CreateTarget(exe) > >> >> + self.assertTrue(target, VALID_TARGET) > >> >> + > >> >> + line1 = line_number(self.source, '// breakpoint 1') > >> >> + line2 = line_number(self.source, '// breakpoint 2') > >> >> + line3 = line_number(self.source, '// breakpoint 3') > >> >> + > >> >> + breakpoint1 = target.BreakpointCreateByLocation > (self.source, > >> >> line1); > >> >> + breakpoint2 = target.BreakpointCreateByLocation > (self.source, > >> >> line2); > >> >> + breakpoint3 = target.BreakpointCreateByLocation > (self.source, > >> >> line3); > >> >> + > >> >> + self.assertTrue(breakpoint1.GetNumLocations() >= 1, > >> >> PROCESS_IS_VALID) > >> >> + self.assertTrue(breakpoint2.GetNumLocations() >= 1, > >> >> PROCESS_IS_VALID) > >> >> + self.assertTrue(breakpoint3.GetNumLocations() >= 1, > >> >> PROCESS_IS_VALID) > >> >> + > >> >> + # Register our shared libraries for remote targets so they > get > >> >> automatically uploaded > >> >> + arguments = None > >> >> + environment = None > >> >> + > >> >> + # Now launch the process, and do not stop at entry point. > >> >> + process = target.LaunchSimple (arguments, environment, > >> >> self.get_process_working_directory()) > >> >> + self.assertTrue(process, PROCESS_IS_VALID) > >> >> + > >> >> + threads = lldbutil.get_threads_stopped_at_breakpoint > (process, > >> >> breakpoint1) > >> >> + self.assertEqual(len(threads), 1, "There should be a thread > >> >> stopped at breakpoint 1") > >> >> + > >> >> + thread = threads[0] > >> >> + self.assertTrue(thread.IsValid(), "Thread must be valid") > >> >> + frame = thread.GetFrameAtIndex(0) > >> >> + self.assertTrue(frame.IsValid(), "Frame must be valid") > >> >> + > >> >> + arg_names = ['argc', 'argv'] > >> >> + local_names = ['i', 'j', 'k'] > >> >> + static_names = ['static_var', 'g_global_var', 'static_var'] > >> >> + breakpoint1_locals = ['i'] > >> >> + breakpoint1_statics = ['static_var'] > >> >> + num_args = len(arg_names) > >> >> + num_locals = len(local_names) > >> >> + num_statics = len(static_names) > >> >> + args_yes = True > >> >> + args_no = False > >> >> + locals_yes = True > >> >> + locals_no = False > >> >> + statics_yes = True > >> >> + statics_no = False > >> >> + in_scopy_only = True > >> >> + ignore_scope = False > >> >> + > >> >> + # Verify if we ask for only arguments that we got what we > >> >> expect > >> >> + vars = frame.GetVariables(args_yes, locals_no, statics_no, > >> >> ignore_scope) > >> >> + self.assertEqual(vars.GetSize(), num_args, "There should be > %i > >> >> arguments, but we are reporting %i" % (num_args, vars.GetSize())) > >> >> + self.verify_variable_names("check names of arguments", vars, > >> >> arg_names) > >> >> + self.assertEqual(len(arg_names), num_args, "make sure > >> >> verify_variable_names() didn't mutate list") > >> >> + > >> >> + # Verify if we ask for only locals that we got what we > expect > >> >> + vars = frame.GetVariables(args_no, locals_yes, statics_no, > >> >> ignore_scope) > >> >> + self.assertEqual(vars.GetSize(), num_locals, "There should > be > >> >> %i > >> >> local variables, but we are reporting %i" % (num_locals, > >> >> vars.GetSize())) > >> >> + self.verify_variable_names("check names of locals", vars, > >> >> local_names) > >> >> + > >> >> + # Verify if we ask for only statics that we got what we > expect > >> >> + vars = frame.GetVariables(args_no, locals_no, statics_yes, > >> >> ignore_scope) > >> >> + print('statics: ', str(vars)) > >> >> + self.assertEqual(vars.GetSize(), num_statics, "There should > be > >> >> %i > >> >> static variables, but we are reporting %i" % (num_statics, > >> >> vars.GetSize())) > >> >> + self.verify_variable_names("check names of statics", vars, > >> >> static_names) > >> >> + > >> >> + # Verify if we ask for arguments and locals that we got what > >> >> we > >> >> expect > >> >> + vars = frame.GetVariables(args_yes, locals_yes, statics_no, > >> >> ignore_scope) > >> >> + desc = 'arguments + locals' > >> >> + names = arg_names + local_names > >> >> + count = len(names) > >> >> + self.assertEqual(vars.GetSize(), count, "There should be %i > %s > >> >> (%s) but we are reporting %i (%s)" % (count, desc, names, > >> >> vars.GetSize(), > >> >> get_names_from_value_list(vars))) > >> >> + self.verify_variable_names("check names of %s" % (desc), > vars, > >> >> names) > >> >> + > >> >> + # Verify if we ask for arguments and statics that we got > what > >> >> we > >> >> expect > >> >> + vars = frame.GetVariables(args_yes, locals_no, statics_yes, > >> >> ignore_scope) > >> >> + desc = 'arguments + statics' > >> >> + names = arg_names + static_names > >> >> + count = len(names) > >> >> + self.assertEqual(vars.GetSize(), count, "There should be %i > %s > >> >> (%s) but we are reporting %i (%s)" % (count, desc, names, > >> >> vars.GetSize(), > >> >> get_names_from_value_list(vars))) > >> >> + self.verify_variable_names("check names of %s" % (desc), > vars, > >> >> names) > >> >> + > >> >> + # Verify if we ask for locals and statics that we got what > we > >> >> expect > >> >> + vars = frame.GetVariables(args_no, locals_yes, statics_yes, > >> >> ignore_scope) > >> >> + desc = 'locals + statics' > >> >> + names = local_names + static_names > >> >> + count = len(names) > >> >> + self.assertEqual(vars.GetSize(), count, "There should be %i > %s > >> >> (%s) but we are reporting %i (%s)" % (count, desc, names, > >> >> vars.GetSize(), > >> >> get_names_from_value_list(vars))) > >> >> + self.verify_variable_names("check names of %s" % (desc), > vars, > >> >> names) > >> >> + > >> >> + # Verify if we ask for arguments, locals and statics that we > >> >> got > >> >> what we expect > >> >> + vars = frame.GetVariables(args_yes, locals_yes, statics_yes, > >> >> ignore_scope) > >> >> + desc = 'arguments + locals + statics' > >> >> + names = arg_names + local_names + static_names > >> >> + count = len(names) > >> >> + self.assertEqual(vars.GetSize(), count, "There should be %i > %s > >> >> (%s) but we are reporting %i (%s)" % (count, desc, names, > >> >> vars.GetSize(), > >> >> get_names_from_value_list(vars))) > >> >> + self.verify_variable_names("check names of %s" % (desc), > vars, > >> >> names) > >> >> + > >> >> + # Verify if we ask for in scope locals that we got what we > >> >> expect > >> >> + vars = frame.GetVariables(args_no, locals_yes, statics_no, > >> >> in_scopy_only) > >> >> + desc = 'in scope locals at breakpoint 1' > >> >> + names = ['i'] > >> >> + count = len(names) > >> >> + self.assertEqual(vars.GetSize(), count, "There should be %i > %s > >> >> (%s) but we are reporting %i (%s)" % (count, desc, names, > >> >> vars.GetSize(), > >> >> get_names_from_value_list(vars))) > >> >> + self.verify_variable_names("check names of %s" % (desc), > vars, > >> >> names) > >> >> + > >> >> + # Continue to breakpoint 2 > >> >> + process.Continue() > >> >> + > >> >> + threads = lldbutil.get_threads_stopped_at_breakpoint > (process, > >> >> breakpoint2) > >> >> + self.assertEqual(len(threads), 1, "There should be a thread > >> >> stopped at breakpoint 2") > >> >> + > >> >> + thread = threads[0] > >> >> + self.assertTrue(thread.IsValid(), "Thread must be valid") > >> >> + frame = thread.GetFrameAtIndex(0) > >> >> + self.assertTrue(frame.IsValid(), "Frame must be valid") > >> >> + > >> >> + # Verify if we ask for in scope locals that we got what we > >> >> expect > >> >> + vars = frame.GetVariables(args_no, locals_yes, statics_no, > >> >> in_scopy_only) > >> >> + desc = 'in scope locals at breakpoint 2' > >> >> + names = ['i', 'j'] > >> >> + count = len(names) > >> >> + self.assertEqual(vars.GetSize(), count, "There should be %i > %s > >> >> (%s) but we are reporting %i (%s)" % (count, desc, names, > >> >> vars.GetSize(), > >> >> get_names_from_value_list(vars))) > >> >> + self.verify_variable_names("check names of %s" % (desc), > vars, > >> >> names) > >> >> + > >> >> + # Continue to breakpoint 3 > >> >> + process.Continue() > >> >> + > >> >> + threads = lldbutil.get_threads_stopped_at_breakpoint > (process, > >> >> breakpoint3) > >> >> + self.assertEqual(len(threads), 1, "There should be a thread > >> >> stopped at breakpoint 3") > >> >> + > >> >> + thread = threads[0] > >> >> + self.assertTrue(thread.IsValid(), "Thread must be valid") > >> >> + frame = thread.GetFrameAtIndex(0) > >> >> + self.assertTrue(frame.IsValid(), "Frame must be valid") > >> >> + > >> >> + # Verify if we ask for in scope locals that we got what we > >> >> expect > >> >> + vars = frame.GetVariables(args_no, locals_yes, statics_no, > >> >> in_scopy_only) > >> >> + desc = 'in scope locals at breakpoint 3' > >> >> + names = ['i', 'j', 'k'] > >> >> + count = len(names) > >> >> + self.assertEqual(vars.GetSize(), count, "There should be %i > %s > >> >> (%s) but we are reporting %i (%s)" % (count, desc, names, > >> >> vars.GetSize(), > >> >> get_names_from_value_list(vars))) > >> >> + self.verify_variable_names("check names of %s" % (desc), > vars, > >> >> names) > >> >> > >> >> Added: > >> >> > >> >> > lldb/trunk/packages/Python/lldbsuite/test/python_api/frame/get-variables/main.c > >> >> URL: > >> >> > >> >> > http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/python_api/frame/get-variables/main.c?rev=267478&view=auto > >> >> > >> >> > >> >> > ============================================================================== > >> >> --- > >> >> > >> >> > lldb/trunk/packages/Python/lldbsuite/test/python_api/frame/get-variables/main.c > >> >> (added) > >> >> +++ > >> >> > >> >> > lldb/trunk/packages/Python/lldbsuite/test/python_api/frame/get-variables/main.c > >> >> Mon Apr 25 16:54:10 2016 > >> >> @@ -0,0 +1,28 @@ > >> >> +//===-- main.c --------------------------------------------------*- > >> >> C++ > >> >> -*-===// > >> >> +// > >> >> +// The LLVM Compiler Infrastructure > >> >> +// > >> >> +// This file is distributed under the University of Illinois Open > >> >> Source > >> >> +// License. See LICENSE.TXT for details. > >> >> +// > >> >> > >> >> > >> >> > +//===----------------------------------------------------------------------===// > >> >> +#include <stdio.h> > >> >> + > >> >> +int g_global_var = 123; > >> >> +static int g_static_var = 123; > >> >> + > >> >> +int main (int argc, char const *argv[]) > >> >> +{ > >> >> + static int static_var = 123; > >> >> + int i = 0; // breakpoint 1 > >> >> + for (i=0; i<1; ++i) > >> >> + { > >> >> + int j = i*2; > >> >> + printf("i = %i, j = %i\n", i, j); // breakpoint 2 > >> >> + { > >> >> + int k = i*j*3; > >> >> + printf("i = %i, j = %i\n", i, j); // breakpoint 3 > >> >> + } > >> >> + } > >> >> + return 0; > >> >> +} > >> >> > >> >> Modified: lldb/trunk/source/Target/StackFrame.cpp > >> >> URL: > >> >> > >> >> > http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/StackFrame.cpp?rev=267478&r1=267477&r2=267478&view=diff > >> >> > >> >> > >> >> > ============================================================================== > >> >> --- lldb/trunk/source/Target/StackFrame.cpp (original) > >> >> +++ lldb/trunk/source/Target/StackFrame.cpp Mon Apr 25 16:54:10 2016 > >> >> @@ -544,7 +544,7 @@ StackFrame::GetVariableList (bool get_fi > >> >> frame_block->AppendBlockVariables(can_create, > >> >> get_child_variables, > >> >> > >> >> stop_if_child_block_is_inlined_function, > >> >> - [this](Variable* v) { > >> >> return v->IsInScope(this); }, > >> >> + [this](Variable* v) { > >> >> return true; }, > >> >> > >> >> m_variable_list_sp.get()); > >> >> } > >> >> } > >> >> > >> >> > >> >> _______________________________________________ > >> >> lldb-commits mailing list > >> >> lldb-commits@lists.llvm.org > >> >> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits > >> > > >> > > >> > > >> > _______________________________________________ > >> > lldb-commits mailing list > >> > lldb-commits@lists.llvm.org > >> > http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits > >> > > > > > >
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits