[Lldb-commits] [PATCH] D98482: [lldb] Support for multiprocess extension [WIP]

2021-03-13 Thread Michał Górny via Phabricator via lldb-commits
mgorny updated this revision to Diff 330432.
mgorny marked an inline comment as done.
mgorny added a comment.

Updated utility function to use `StringRef` and reformatted. Further changes 
incoming.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D98482/new/

https://reviews.llvm.org/D98482

Files:
  lldb/include/lldb/Utility/StringExtractorGDBRemote.h
  lldb/packages/Python/lldbsuite/test/tools/lldb-server/gdbremote_testcase.py
  lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp
  lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h
  lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerCommon.cpp
  lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
  lldb/source/Utility/StringExtractorGDBRemote.cpp
  lldb/test/API/tools/lldb-server/TestLldbGdbServer.py
  lldb/unittests/Utility/CMakeLists.txt
  lldb/unittests/Utility/StringExtractorGDBRemoteTest.cpp

Index: lldb/unittests/Utility/StringExtractorGDBRemoteTest.cpp
===
--- /dev/null
+++ lldb/unittests/Utility/StringExtractorGDBRemoteTest.cpp
@@ -0,0 +1,169 @@
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include 
+
+#include "lldb/Utility/StringExtractorGDBRemote.h"
+#include "lldb/lldb-defines.h"
+
+namespace {
+class StringExtractorGDBRemoteTest : public ::testing::Test {};
+} // namespace
+
+TEST_F(StringExtractorGDBRemoteTest, GetPidTid) {
+  StringExtractorGDBRemote ex("");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  // invalid/short values
+
+  ex.Reset("narf");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset(";1234");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset(".1234");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("pnarf");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p;1234");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p.1234");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p1234.");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p1234.;1234");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("-2");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p1234.-2");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p-2");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p-2.1234");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  // overflow
+
+  ex.Reset("p1");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p1.0");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("1");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p0.1");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p1.1");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  // pure thread id
+
+  ex.Reset("0");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, 0));
+
+  ex.Reset("-1");
+  EXPECT_THAT(ex.GetPidTid(),
+  ::testing::Pair(llvm::None, LLDB_INVALID_THREAD_ID));
+
+  ex.Reset("1234");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, 0x1234ULL));
+
+  ex.Reset("123456789ABCDEF0");
+  EXPECT_THAT(ex.GetPidTid(),
+  ::testing::Pair(llvm::None, 0x123456789ABCDEF0ULL));
+
+  // pure process id
+
+  ex.Reset("p0");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(0, llvm::None));
+
+  ex.Reset("p-1");
+  EXPECT_THAT(ex.GetPidTid(),
+  ::testing::Pair(LLDB_INVALID_PROCESS_ID, llvm::None));
+
+  ex.Reset("p1234");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(0x1234ULL, llvm::None));
+
+  ex.Reset("p123456789ABCDEF0");
+  EXPECT_THAT(ex.GetPidTid(),
+  ::testing::Pair(0x123456789ABCDEF0ULL, llvm::None));
+
+  // combined thread id + process id
+
+  ex.Reset("p0.0");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(0, 0));
+
+  ex.Reset("p0.-1");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(0, LLDB_INVALID_THREAD_ID));
+
+  // NB: technically, specific thread with unspecified process is invalid
+  // but we do not filter that in StringExtractor
+
+  ex.Reset("p0.1234");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(0, 0x1234ULL));
+
+  ex.Reset("p0.123456789ABCDEF0");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(0, 0x123456789ABCDEF0U

[Lldb-commits] [PATCH] D98482: [lldb] Support for multiprocess extension [WIP]

2021-03-13 Thread Michał Górny via Phabricator via lldb-commits
mgorny added a comment.

In D98482#2623005 , @labath wrote:

> - I wouldn't add `multiprocess` to the qSupported packets just yet. Since 
> this is accepting the extended syntax regardless of whether the other side 
> claimed to support it (there's no hard in doing that, right?), we could flip 
> the switch after all packets have been ported.

Sure, I have this split into more commits locally, I'll keep `qSupported' last.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D98482/new/

https://reviews.llvm.org/D98482

___
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [PATCH] D98482: [lldb] Support for multiprocess extension [WIP]

2021-03-13 Thread Michał Górny via Phabricator via lldb-commits
mgorny updated this revision to Diff 330435.
mgorny added a comment.

Add a `GDBRemoteCommunicationServerLLGS::ReadTid()` helper that does 
appropriate PID verification and constructs error packets.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D98482/new/

https://reviews.llvm.org/D98482

Files:
  lldb/include/lldb/Utility/StringExtractorGDBRemote.h
  lldb/packages/Python/lldbsuite/test/tools/lldb-server/gdbremote_testcase.py
  lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp
  lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h
  lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerCommon.cpp
  lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
  lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.h
  lldb/source/Utility/StringExtractorGDBRemote.cpp
  lldb/test/API/tools/lldb-server/TestLldbGdbServer.py
  lldb/unittests/Utility/CMakeLists.txt
  lldb/unittests/Utility/StringExtractorGDBRemoteTest.cpp

Index: lldb/unittests/Utility/StringExtractorGDBRemoteTest.cpp
===
--- /dev/null
+++ lldb/unittests/Utility/StringExtractorGDBRemoteTest.cpp
@@ -0,0 +1,169 @@
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include 
+
+#include "lldb/Utility/StringExtractorGDBRemote.h"
+#include "lldb/lldb-defines.h"
+
+namespace {
+class StringExtractorGDBRemoteTest : public ::testing::Test {};
+} // namespace
+
+TEST_F(StringExtractorGDBRemoteTest, GetPidTid) {
+  StringExtractorGDBRemote ex("");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  // invalid/short values
+
+  ex.Reset("narf");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset(";1234");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset(".1234");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("pnarf");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p;1234");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p.1234");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p1234.");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p1234.;1234");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("-2");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p1234.-2");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p-2");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p-2.1234");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  // overflow
+
+  ex.Reset("p1");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p1.0");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("1");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p0.1");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p1.1");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  // pure thread id
+
+  ex.Reset("0");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, 0));
+
+  ex.Reset("-1");
+  EXPECT_THAT(ex.GetPidTid(),
+  ::testing::Pair(llvm::None, LLDB_INVALID_THREAD_ID));
+
+  ex.Reset("1234");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, 0x1234ULL));
+
+  ex.Reset("123456789ABCDEF0");
+  EXPECT_THAT(ex.GetPidTid(),
+  ::testing::Pair(llvm::None, 0x123456789ABCDEF0ULL));
+
+  // pure process id
+
+  ex.Reset("p0");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(0, llvm::None));
+
+  ex.Reset("p-1");
+  EXPECT_THAT(ex.GetPidTid(),
+  ::testing::Pair(LLDB_INVALID_PROCESS_ID, llvm::None));
+
+  ex.Reset("p1234");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(0x1234ULL, llvm::None));
+
+  ex.Reset("p123456789ABCDEF0");
+  EXPECT_THAT(ex.GetPidTid(),
+  ::testing::Pair(0x123456789ABCDEF0ULL, llvm::None));
+
+  // combined thread id + process id
+
+  ex.Reset("p0.0");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(0, 0));
+
+  ex.Reset("p0.-1");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(0, LLDB_INVALID_THREAD_ID));
+
+  // NB: technically, specific thread with unspecified process is invalid
+  // but we do not filter that in StringExtractor
+
+  ex.Reset("p0.1234");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(0, 0x1234ULL));
+
+  ex.Reset("p0.123456789ABCD

[Lldb-commits] [PATCH] D98482: [lldb] Support for multiprocess extension [WIP]

2021-03-13 Thread Michał Górny via Phabricator via lldb-commits
mgorny updated this revision to Diff 330441.
mgorny added a comment.

Added support for 0 and -1 values in `ReadTid()` helper, controlled via 
`allow_any` and `allow_all` parameters.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D98482/new/

https://reviews.llvm.org/D98482

Files:
  lldb/include/lldb/Utility/StringExtractorGDBRemote.h
  lldb/packages/Python/lldbsuite/test/tools/lldb-server/gdbremote_testcase.py
  lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp
  lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h
  lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerCommon.cpp
  lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
  lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.h
  lldb/source/Utility/StringExtractorGDBRemote.cpp
  lldb/test/API/tools/lldb-server/TestLldbGdbServer.py
  lldb/unittests/Utility/CMakeLists.txt
  lldb/unittests/Utility/StringExtractorGDBRemoteTest.cpp

Index: lldb/unittests/Utility/StringExtractorGDBRemoteTest.cpp
===
--- /dev/null
+++ lldb/unittests/Utility/StringExtractorGDBRemoteTest.cpp
@@ -0,0 +1,169 @@
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include 
+
+#include "lldb/Utility/StringExtractorGDBRemote.h"
+#include "lldb/lldb-defines.h"
+
+namespace {
+class StringExtractorGDBRemoteTest : public ::testing::Test {};
+} // namespace
+
+TEST_F(StringExtractorGDBRemoteTest, GetPidTid) {
+  StringExtractorGDBRemote ex("");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  // invalid/short values
+
+  ex.Reset("narf");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset(";1234");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset(".1234");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("pnarf");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p;1234");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p.1234");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p1234.");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p1234.;1234");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("-2");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p1234.-2");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p-2");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p-2.1234");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  // overflow
+
+  ex.Reset("p1");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p1.0");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("1");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p0.1");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  ex.Reset("p1.1");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, llvm::None));
+
+  // pure thread id
+
+  ex.Reset("0");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, 0));
+
+  ex.Reset("-1");
+  EXPECT_THAT(ex.GetPidTid(),
+  ::testing::Pair(llvm::None, LLDB_INVALID_THREAD_ID));
+
+  ex.Reset("1234");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(llvm::None, 0x1234ULL));
+
+  ex.Reset("123456789ABCDEF0");
+  EXPECT_THAT(ex.GetPidTid(),
+  ::testing::Pair(llvm::None, 0x123456789ABCDEF0ULL));
+
+  // pure process id
+
+  ex.Reset("p0");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(0, llvm::None));
+
+  ex.Reset("p-1");
+  EXPECT_THAT(ex.GetPidTid(),
+  ::testing::Pair(LLDB_INVALID_PROCESS_ID, llvm::None));
+
+  ex.Reset("p1234");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(0x1234ULL, llvm::None));
+
+  ex.Reset("p123456789ABCDEF0");
+  EXPECT_THAT(ex.GetPidTid(),
+  ::testing::Pair(0x123456789ABCDEF0ULL, llvm::None));
+
+  // combined thread id + process id
+
+  ex.Reset("p0.0");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(0, 0));
+
+  ex.Reset("p0.-1");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(0, LLDB_INVALID_THREAD_ID));
+
+  // NB: technically, specific thread with unspecified process is invalid
+  // but we do not filter that in StringExtractor
+
+  ex.Reset("p0.1234");
+  EXPECT_THAT(ex.GetPidTid(), ::testing::Pair(0, 0x1234ULL));
+
+  ex.Reset("p0.123456789ABCDEF0");
+  EXPECT

[Lldb-commits] [PATCH] D92643: [lldb] Lookup static const members in FindGlobalVariables

2021-03-13 Thread Andy Yankovsky via Phabricator via lldb-commits
werat updated this revision to Diff 330445.
werat added a comment.

Address review comments:

- Don't create expensive `ConstString` objects
- Merge `ParseStaticConstMemberDIE` into `ParseVariableDIE`
- Add more test cases


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D92643/new/

https://reviews.llvm.org/D92643

Files:
  lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
  lldb/test/API/python_api/target/globals/Makefile
  lldb/test/API/python_api/target/globals/TestTargetGlobals.py
  lldb/test/API/python_api/target/globals/main.cpp

Index: lldb/test/API/python_api/target/globals/main.cpp
===
--- /dev/null
+++ lldb/test/API/python_api/target/globals/main.cpp
@@ -0,0 +1,30 @@
+namespace ns1 {
+class Klass {
+public:
+  inline static int x = 1;
+};
+} // namespace ns1
+
+namespace ns2 {
+class Klass {
+public:
+  inline static int x = 2;
+};
+} // namespace ns2
+
+class Vars {
+public:
+  inline static double inline_static = 1.5;
+  static constexpr int static_constexpr = 2;
+  static const int static_const_out_out_class;
+};
+
+const int Vars::static_const_out_out_class = 3;
+
+char global_var_of_char_type = 'X';
+
+int main() {
+  ns1::Klass ns1;
+  ns2::Klass ns2;
+  Vars v;
+}
Index: lldb/test/API/python_api/target/globals/TestTargetGlobals.py
===
--- /dev/null
+++ lldb/test/API/python_api/target/globals/TestTargetGlobals.py
@@ -0,0 +1,54 @@
+"""
+Test SBTarget::FindGlobalVariables API.
+"""
+
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+
+class TargetAPITestCase(TestBase):
+
+mydir = TestBase.compute_mydir(__file__)
+
+@add_test_categories(['pyapi'])
+def test_find_global_variables(self):
+"""Exercise SBTarget.FindGlobalVariables() API."""
+self.build()
+
+# Don't need to launch a process, since we're only interested in
+# looking up global variables.
+target = self.dbg.CreateTarget(self.getBuildArtifact())
+
+def test_global_var(query, name, type_name, value):
+value_list = target.FindGlobalVariables(query, 100500)
+self.assertEqual(value_list.GetSize(), 1)
+var = value_list.GetValueAtIndex(0)
+self.DebugSBValue(var)
+self.assertTrue(var)
+self.assertEqual(var.GetName(), name)
+self.assertEqual(var.GetTypeName(), type_name)
+self.assertEqual(var.GetValue(), value)
+
+test_global_var(
+"Vars::inline_static",
+"Vars::inline_static", "double", "1.5")
+test_global_var(
+"Vars::static_constexpr",
+"Vars::static_constexpr", "const int", "2")
+test_global_var(
+"Vars::static_const_out_out_class",
+"Vars::static_const_out_out_class", "const int", "3")
+test_global_var(
+"global_var_of_char_type",
+"::global_var_of_char_type", "char", "'X'")
+
+# Looking for a specific scope should find the variable from that scope.
+test_global_var("ns1::Klass::x", "ns1::Klass::x", "int", "1")
+test_global_var("ns2::Klass::x", "ns2::Klass::x", "int", "2")
+
+# However the query for `Klass::x` should return both variables:
+# `ns1::Klass::x` and `ns2::Klass::x`.
+values = target.FindGlobalVariables("Klass::x", 100500)
+self.assertEqual(values.GetSize(), 2)
+self.assertEqual(
+{values[0].GetName(), values[1].GetName()}, 
+{"ns1::Klass::x", "ns2::Klass::x"})
Index: lldb/test/API/python_api/target/globals/Makefile
===
--- /dev/null
+++ lldb/test/API/python_api/target/globals/Makefile
@@ -0,0 +1,3 @@
+CXX_SOURCES := main.cpp
+
+include Makefile.rules
Index: lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
===
--- lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -2147,6 +2147,46 @@
 return variables.GetSize() - original_size < max_matches;
   });
 
+  // If we don't have enough matches and the variable context is not empty, try
+  // to resolve the context as a type and look for static const members.
+  if (variables.GetSize() - original_size < max_matches && !context.empty()) {
+llvm::StringRef type_scope;
+llvm::StringRef type_name;
+TypeClass type_class;
+if (!Type::GetTypeScopeAndBasename(context, type_scope, type_name,
+   type_class))
+  type_name = context;
+
+m_index->GetTypes(ConstString(type_name), [&](DWARFDIE parent) {
+  DWARFDeclContext dwarf_decl_ctx = GetDWARFDeclContext(parent);
+  llvm::StringRef parent_type_name = dwarf_decl_ctx.GetQualifiedName();
+
+

[Lldb-commits] [PATCH] D92643: [lldb] Lookup static const members in FindGlobalVariables

2021-03-13 Thread Andy Yankovsky via Phabricator via lldb-commits
werat marked 4 inline comments as done.
werat added inline comments.



Comment at: lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp:2162
 
 void SymbolFileDWARF::FindGlobalVariables(const RegularExpression ®ex,
   uint32_t max_matches,

jankratochvil wrote:
> jankratochvil wrote:
> > ConstString here is needlessly expensive to construct and it is then used 
> > only once. Use plain `const char *` or `std::string` is also much cheaper.
> This function also needs to be patched (with a testcase) as this command 
> works:
> ```
> (lldb) target variable Vars::inline_static
> (double) Vars::inline_static = 1.5
> ```
> But this one does not (and it should work):
> ```
> (lldb) target variable -r Vars::inline_static
> error: can't find global variable 'Vars::inline_static'
> ```
With the current approach implementing a search by regexp would mean 
enumerating ALL types and looking at ALL their static members for a potential 
match. This sounds way to expensive (and a significant degradation compared to 
the current logic). On the other hand I agree that's very confusing that 
`target variable` works, but `target variable -r` doesn't. What do you think?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D92643/new/

https://reviews.llvm.org/D92643

___
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [PATCH] D98289: [lldb] Fix DW_AT_ranges DW_FORM_sec_offset not using DW_AT_rnglists_base (used by GCC)

2021-03-13 Thread Jan Kratochvil via Phabricator via lldb-commits
jankratochvil updated this revision to Diff 330473.
jankratochvil edited the summary of this revision.
jankratochvil added a comment.

The testcase assumes checked-in D98589 .


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D98289/new/

https://reviews.llvm.org/D98289

Files:
  lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp
  lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h
  lldb/test/Shell/SymbolFile/DWARF/DW_AT_range-DW_FORM_sec_offset.s

Index: lldb/test/Shell/SymbolFile/DWARF/DW_AT_range-DW_FORM_sec_offset.s
===
--- /dev/null
+++ lldb/test/Shell/SymbolFile/DWARF/DW_AT_range-DW_FORM_sec_offset.s
@@ -0,0 +1,138 @@
+# DW_AT_ranges can use DW_FORM_sec_offset (instead of DW_FORM_rnglistx).
+# In such case DW_AT_rnglists_base does not need to be present.
+
+# REQUIRES: x86
+
+# RUN: llvm-mc -triple=x86_64-pc-linux -filetype=obj %s > %t
+# RUN: %lldb %t -o "image lookup -v -s lookup_rnglists" \
+# RUN:   -o exit | FileCheck %s
+
+# Failure was the block range 1..2 was not printed plus:
+# error: DW_AT_range-DW_FORM_sec_offset.s.tmp {0x003f}: DIE has DW_AT_ranges(0xc) attribute, but range extraction failed (missing or invalid range list table), please file a bug and attach the file at the start of this error message
+
+# CHECK-LABEL: image lookup -v -s lookup_rnglists
+# CHECK:  Function: id = {0x0029}, name = "rnglists", range = [0x-0x0003)
+# CHECK:Blocks: id = {0x0029}, range = [0x-0x0003)
+# CHECK-NEXT:   id = {0x003f}, range = [0x0001-0x0002)
+
+# RUN: llvm-mc -triple=x86_64-pc-linux -filetype=obj \
+# RUN:   --defsym RNGLISTX=0 %s > %t-rnglistx
+# RUN: %lldb %t-rnglistx -o "image lookup -v -s lookup_rnglists" \
+# RUN:   -o exit 2>&1 | FileCheck --check-prefix=RNGLISTX %s
+
+# RNGLISTX-LABEL: image lookup -v -s lookup_rnglists
+# RNGLISTX: error: DW_AT_range-DW_FORM_sec_offset.s.tmp-rnglistx : DW_FORM_rnglistx cannot be used without DW_AT_rnglists_base
+
+# RUN: llvm-mc -triple=x86_64-pc-linux -filetype=obj \
+# RUN:   --defsym RNGLISTX=0 --defsym RNGLISTBASE=0 %s > %t-rnglistbase
+# RUN: %lldb %t-rnglistbase -o "image lookup -v -s lookup_rnglists" \
+# RUN:   -o exit 2>&1 | FileCheck --check-prefix=RNGLISTBASE %s
+
+# RNGLISTBASE-LABEL: image lookup -v -s lookup_rnglists
+# RNGLISTBASE: error: DW_AT_range-DW_FORM_sec_offset.s.tmp-rnglistbase {0x0043}: DIE has DW_AT_ranges(0x0) attribute, but range extraction failed (invalid range list table index 0), please file a bug and attach the file at the start of this error message
+
+.text
+rnglists:
+nop
+.Lblock1_begin:
+lookup_rnglists:
+nop
+.Lblock1_end:
+nop
+.Lrnglists_end:
+
+.section.debug_abbrev,"",@progbits
+.byte   1   # Abbreviation Code
+.byte   17  # DW_TAG_compile_unit
+.byte   1   # DW_CHILDREN_yes
+.byte   37  # DW_AT_producer
+.byte   8   # DW_FORM_string
+.byte   17  # DW_AT_low_pc
+.byte   27  # DW_FORM_addrx
+.byte   18  # DW_AT_high_pc
+.byte   6   # DW_FORM_data4
+.byte   115 # DW_AT_addr_base
+.byte   23  # DW_FORM_sec_offset
+.ifdef RNGLISTBASE
+.byte   0x74# DW_AT_rnglists_base
+.byte   23  # DW_FORM_sec_offset
+.endif
+.byte   0   # EOM(1)
+.byte   0   # EOM(2)
+.byte   2   # Abbreviation Code
+.byte   46  # DW_TAG_subprogram
+.byte   1   # DW_CHILDREN_yes
+.byte   17  # DW_AT_low_pc
+.byte   1   # DW_FORM_addr
+.byte   18  # DW_AT_high_pc
+.byte   6   # DW_FORM_data4
+.byte   3   # DW_AT_name
+.byte   8   # DW_FORM_string
+.byte   0   # EOM(1)
+.byte   0   # EOM(2)
+.byte   5   # Abbreviation Code
+.byte   11  # DW_TAG_lexical_block
+.byte   0   # DW_CHILDREN_no
+.byte   85  # DW_AT_ranges
+.ifndef RNGLISTX
+.byte   0x17# DW_FORM_sec_offset
+.else
+.byte   0x23# DW_FORM_rnglistx
+.endif
+.byte   0   # EOM(1)
+.byte   0   # EOM(2)
+.byte   0   # EOM(3)
+
+.section.debug_info,"",@prog