From e5e9a6be6a237b4d1965680b83acdede7544f709 Mon Sep 17 00:00:00 2001 From: Kuba Mracek Date: Thu, 18 Apr 2019 00:15:44 +0000 Subject: [PATCH] [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 --- .../test/lang/cpp/global_variables/Makefile | 5 +++ .../global_variables/TestGlobalVariables.py | 41 +++++++++++++++++++ .../test/lang/cpp/global_variables/main.cpp | 17 ++++++++ .../SymbolFile/DWARF/SymbolFileDWARF.cpp | 4 +- 4 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 lldb/packages/Python/lldbsuite/test/lang/cpp/global_variables/Makefile create mode 100644 lldb/packages/Python/lldbsuite/test/lang/cpp/global_variables/TestGlobalVariables.py create mode 100644 lldb/packages/Python/lldbsuite/test/lang/cpp/global_variables/main.cpp diff --git a/lldb/packages/Python/lldbsuite/test/lang/cpp/global_variables/Makefile b/lldb/packages/Python/lldbsuite/test/lang/cpp/global_variables/Makefile new file mode 100644 index 0000000000000..314f1cb2f077b --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/cpp/global_variables/Makefile @@ -0,0 +1,5 @@ +LEVEL = ../../../make + +CXX_SOURCES := main.cpp + +include $(LEVEL)/Makefile.rules diff --git a/lldb/packages/Python/lldbsuite/test/lang/cpp/global_variables/TestGlobalVariables.py b/lldb/packages/Python/lldbsuite/test/lang/cpp/global_variables/TestGlobalVariables.py new file mode 100644 index 0000000000000..5e240b8ac6357 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/cpp/global_variables/TestGlobalVariables.py @@ -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) diff --git a/lldb/packages/Python/lldbsuite/test/lang/cpp/global_variables/main.cpp b/lldb/packages/Python/lldbsuite/test/lang/cpp/global_variables/main.cpp new file mode 100644 index 0000000000000..0a164186e714a --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/cpp/global_variables/main.cpp @@ -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 + +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. +} diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index 5e6dd275388ac..f9b3143cb786b 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -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);