[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.

Chaoren Lin via lldb-commits lldb-commits at lists.llvm.org
Mon Apr 25 17:37:52 PDT 2016


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
> >> >
> >
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20160425/a5102c05/attachment-0001.html>


More information about the lldb-commits mailing list