[Lldb-commits] [lldb] r267478 - 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.

Jim Ingham via lldb-commits lldb-commits at lists.llvm.org
Mon Apr 25 17:46:54 PDT 2016


Debug mode doesn't mean no optimization, but -O0 SHOULD...  OTOH, long experience has shown that it is very hard to convince compilers to be as dumb at -O0 as you would like them to be.  That's why in all our test cases, we initialize variables, and generally do something dumb like printf the variable so the compiler thinks it is actually being used.

Jim


> On Apr 25, 2016, at 5:37 PM, Chaoren Lin via lldb-commits <lldb-commits at lists.llvm.org> wrote:
> 
> 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 <sivachandra at 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 <chaorenl at google.com> wrote:
> > Ah, I see. Is that a known clang bug?
> >
> > On Mon, Apr 25, 2016 at 4:07 PM, Siva Chandra <sivachandra at 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 at 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 at 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 at lists.llvm.org
> >> >> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
> >> >
> >> >
> >> >
> >> > _______________________________________________
> >> > lldb-commits mailing list
> >> > lldb-commits at lists.llvm.org
> >> > http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
> >> >
> >
> >
> 
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits



More information about the lldb-commits mailing list