[lldb] Don't filter variable list when doing a lookup by mangled name in SymbolFileDWARF::FindGlobalVariables
Differential Revision: https://reviews.llvm.org/D60737 llvm-svn: 358629
This commit is contained in:
parent
91a06bee78
commit
e5e9a6be6a
|
@ -0,0 +1,5 @@
|
|||
LEVEL = ../../../make
|
||||
|
||||
CXX_SOURCES := main.cpp
|
||||
|
||||
include $(LEVEL)/Makefile.rules
|
|
@ -0,0 +1,41 @@
|
|||
"""Test that C++ global variables can be inspected by name and also their mangled name."""
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
|
||||
from lldbsuite.test.decorators import *
|
||||
from lldbsuite.test.lldbtest import *
|
||||
from lldbsuite.test import lldbutil
|
||||
|
||||
|
||||
class GlobalVariablesCppTestCase(TestBase):
|
||||
|
||||
mydir = TestBase.compute_mydir(__file__)
|
||||
|
||||
def setUp(self):
|
||||
TestBase.setUp(self)
|
||||
self.source = lldb.SBFileSpec('main.cpp')
|
||||
|
||||
@expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24764")
|
||||
def test(self):
|
||||
self.build()
|
||||
|
||||
(target, _, _, _) = lldbutil.run_to_source_breakpoint(self, "// Set break point at this line.", self.source)
|
||||
|
||||
# Check that we can access g_file_global_int by its name
|
||||
self.expect("target variable g_file_global_int", VARIABLES_DISPLAYED_CORRECTLY,
|
||||
substrs=['42'])
|
||||
self.expect("target variable abc::g_file_global_int", VARIABLES_DISPLAYED_CORRECTLY,
|
||||
substrs=['42'])
|
||||
self.expect("target variable xyz::g_file_global_int", VARIABLES_DISPLAYED_CORRECTLY,
|
||||
error=True, substrs=['can\'t find global variable'])
|
||||
|
||||
# Check that we can access g_file_global_int by its mangled name
|
||||
addr = target.EvaluateExpression("&abc::g_file_global_int").GetValueAsUnsigned()
|
||||
self.assertTrue(addr != 0)
|
||||
mangled = lldb.SBAddress(addr, target).GetSymbol().GetMangledName()
|
||||
self.assertTrue(mangled != None)
|
||||
gv = target.FindFirstGlobalVariable(mangled)
|
||||
self.assertTrue(gv.IsValid())
|
||||
self.assertEqual(gv.GetName(), "abc::g_file_global_int")
|
||||
self.assertEqual(gv.GetValueAsUnsigned(), 42)
|
|
@ -0,0 +1,17 @@
|
|||
//===-- main.c --------------------------------------------------*- C++ -*-===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
#include <stdio.h>
|
||||
|
||||
namespace abc {
|
||||
int g_file_global_int = 42;
|
||||
}
|
||||
|
||||
int main (int argc, char const *argv[])
|
||||
{
|
||||
return abc::g_file_global_int; // Set break point at this line.
|
||||
}
|
|
@ -2036,6 +2036,7 @@ uint32_t SymbolFileDWARF::FindGlobalVariables(
|
|||
|
||||
llvm::StringRef basename;
|
||||
llvm::StringRef context;
|
||||
bool name_is_mangled = (bool)Mangled(name);
|
||||
|
||||
if (!CPlusPlusLanguage::ExtractContextAndIdentifier(name.GetCString(),
|
||||
context, basename))
|
||||
|
@ -2085,7 +2086,8 @@ uint32_t SymbolFileDWARF::FindGlobalVariables(
|
|||
&variables);
|
||||
while (pruned_idx < variables.GetSize()) {
|
||||
VariableSP var_sp = variables.GetVariableAtIndex(pruned_idx);
|
||||
if (var_sp->GetName().GetStringRef().contains(name.GetStringRef()))
|
||||
if (name_is_mangled ||
|
||||
var_sp->GetName().GetStringRef().contains(name.GetStringRef()))
|
||||
++pruned_idx;
|
||||
else
|
||||
variables.RemoveVariableAtIndex(pruned_idx);
|
||||
|
|
Loading…
Reference in New Issue