https://github.com/kpdev created https://github.com/llvm/llvm-project/pull/67784

When we trying to change not the whole string,
but single character in it - lldb's ValueObject fits in Scalar and therefore 
lldb trying to update it as a Scalar value which is currently only support 
numbers, so characters support added.

~~

Huawei RRI, OS Lab

>From 55dbf63ab7a052859fc7b297f699f0957484d3bf Mon Sep 17 00:00:00 2001
From: Pavel Kosov <kpde...@gmail.com>
Date: Fri, 29 Sep 2023 12:04:16 +0300
Subject: [PATCH] [lldb] Add support for changing char in
 Scalar::SetValueFromCString

When we trying to change not the whole string,
but single character in it - lldb's ValueObject fits in Scalar
and therefore lldb trying to update it as a Scalar value
which is currently only support numbers, so characters support added.

~~

Huawei RRI, OS Lab
---
 lldb/source/Utility/Scalar.cpp | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/lldb/source/Utility/Scalar.cpp b/lldb/source/Utility/Scalar.cpp
index 791c0fb74352913..33d0b832bfd9be6 100644
--- a/lldb/source/Utility/Scalar.cpp
+++ b/lldb/source/Utility/Scalar.cpp
@@ -18,6 +18,7 @@
 #include "llvm/ADT/SmallString.h"
 #include "llvm/ADT/StringExtras.h"
 
+#include <cctype> // for std::isalpha
 #include <cinttypes>
 #include <cstdio>
 
@@ -646,7 +647,15 @@ Status Scalar::SetValueFromCString(const char *value_str, 
Encoding encoding,
     bool is_signed = encoding == eEncodingSint;
     bool is_negative = is_signed && str.consume_front("-");
     APInt integer;
-    if (str.getAsInteger(0, integer)) {
+    if (str.size() == 1 && std::isalpha(static_cast<unsigned char>(str[0]))) {
+      // We can represent single character as Scalar -
+      // this is useful when working with symbols in string
+      // NOTE: it is okay to consider char size as 8-bit since we only have
+      // `SetValueFrom C String` api, not the `C Wstring` or something like
+      // that. If we can ever get wide characters here - we have to modify this
+      // behaviour somehow.
+      integer = APInt(8, static_cast<uint64_t>(str[0]));
+    } else if (str.getAsInteger(0, integer)) {
       error.SetErrorStringWithFormatv(
           "'{0}' is not a valid integer string value", value_str);
       break;

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

Reply via email to