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