This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG201c4b9cc4a6: [demangler] Rust demangler buffer return 
(authored by urnathan).
Herald added a project: LLDB.
Herald added a subscriber: lldb-commits.

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D123420

Files:
  lldb/source/Core/Mangled.cpp
  llvm/include/llvm/Demangle/Demangle.h
  llvm/lib/Demangle/Demangle.cpp
  llvm/lib/Demangle/RustDemangle.cpp
  llvm/tools/llvm-rust-demangle-fuzzer/llvm-rust-demangle-fuzzer.cpp
  llvm/unittests/Demangle/RustDemangleTest.cpp

Index: llvm/unittests/Demangle/RustDemangleTest.cpp
===================================================================
--- llvm/unittests/Demangle/RustDemangleTest.cpp
+++ llvm/unittests/Demangle/RustDemangleTest.cpp
@@ -13,78 +13,19 @@
 #include <cstdlib>
 
 TEST(RustDemangle, Success) {
-  char *Demangled =
-      llvm::rustDemangle("_RNvC1a4main", nullptr, nullptr, nullptr);
-  EXPECT_STREQ(Demangled, "a::main");
-  std::free(Demangled);
-
-  // With status.
-  int Status = 0;
-  Demangled = llvm::rustDemangle("_RNvC1a4main", nullptr, nullptr, &Status);
-  EXPECT_EQ(Status, llvm::demangle_success);
-  EXPECT_STREQ(Demangled, "a::main");
-  std::free(Demangled);
-
-  // With status and length.
-  size_t N = 0;
-  Demangled = llvm::rustDemangle("_RNvC1a4main", nullptr, &N, &Status);
-  EXPECT_EQ(Status, llvm::demangle_success);
-  EXPECT_EQ(N, 8u);
+  char *Demangled = llvm::rustDemangle("_RNvC1a4main");
   EXPECT_STREQ(Demangled, "a::main");
   std::free(Demangled);
 }
 
 TEST(RustDemangle, Invalid) {
-  int Status = 0;
   char *Demangled = nullptr;
 
   // Invalid prefix.
-  Demangled = llvm::rustDemangle("_ABCDEF", nullptr, nullptr, &Status);
-  EXPECT_EQ(Status, llvm::demangle_invalid_mangled_name);
+  Demangled = llvm::rustDemangle("_ABCDEF");
   EXPECT_EQ(Demangled, nullptr);
 
   // Correct prefix but still invalid.
-  Demangled = llvm::rustDemangle("_RRR", nullptr, nullptr, &Status);
-  EXPECT_EQ(Status, llvm::demangle_invalid_mangled_name);
+  Demangled = llvm::rustDemangle("_RRR");
   EXPECT_EQ(Demangled, nullptr);
 }
-
-TEST(RustDemangle, OutputBufferWithoutLength) {
-  char *Buffer = static_cast<char *>(std::malloc(1024));
-  ASSERT_NE(Buffer, nullptr);
-
-  int Status = 0;
-  char *Demangled =
-      llvm::rustDemangle("_RNvC1a4main", Buffer, nullptr, &Status);
-
-  EXPECT_EQ(Status, llvm::demangle_invalid_args);
-  EXPECT_EQ(Demangled, nullptr);
-  std::free(Buffer);
-}
-
-TEST(RustDemangle, OutputBuffer) {
-  size_t N = 1024;
-  char *Buffer = static_cast<char *>(std::malloc(N));
-  ASSERT_NE(Buffer, nullptr);
-
-  int Status = 0;
-  char *Demangled = llvm::rustDemangle("_RNvC1a4main", Buffer, &N, &Status);
-
-  EXPECT_EQ(Status, llvm::demangle_success);
-  EXPECT_EQ(Demangled, Buffer);
-  EXPECT_STREQ(Demangled, "a::main");
-  std::free(Demangled);
-}
-
-TEST(RustDemangle, SmallOutputBuffer) {
-  size_t N = 1;
-  char *Buffer = static_cast<char *>(std::malloc(N));
-  ASSERT_NE(Buffer, nullptr);
-
-  int Status = 0;
-  char *Demangled = llvm::rustDemangle("_RNvC1a4main", Buffer, &N, &Status);
-
-  EXPECT_EQ(Status, llvm::demangle_success);
-  EXPECT_STREQ(Demangled, "a::main");
-  std::free(Demangled);
-}
Index: llvm/tools/llvm-rust-demangle-fuzzer/llvm-rust-demangle-fuzzer.cpp
===================================================================
--- llvm/tools/llvm-rust-demangle-fuzzer/llvm-rust-demangle-fuzzer.cpp
+++ llvm/tools/llvm-rust-demangle-fuzzer/llvm-rust-demangle-fuzzer.cpp
@@ -13,9 +13,7 @@
 
 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
   std::string NullTerminatedString((const char *)Data, Size);
-  int Status = 0;
-  char *Demangled = llvm::rustDemangle(NullTerminatedString.c_str(), nullptr,
-                                       nullptr, &Status);
+  char *Demangled = llvm::rustDemangle(NullTerminatedString.c_str());
   std::free(Demangled);
   return 0;
 }
Index: llvm/lib/Demangle/RustDemangle.cpp
===================================================================
--- llvm/lib/Demangle/RustDemangle.cpp
+++ llvm/lib/Demangle/RustDemangle.cpp
@@ -147,57 +147,27 @@
 
 } // namespace
 
-char *llvm::rustDemangle(const char *MangledName, char *Buf, size_t *N,
-                         int *Status) {
-  if (MangledName == nullptr || (Buf != nullptr && N == nullptr)) {
-    if (Status != nullptr)
-      *Status = demangle_invalid_args;
+char *llvm::rustDemangle(const char *MangledName) {
+  if (MangledName == nullptr)
     return nullptr;
-  }
 
   // Return early if mangled name doesn't look like a Rust symbol.
   StringView Mangled(MangledName);
-  if (!Mangled.startsWith("_R")) {
-    if (Status != nullptr)
-      *Status = demangle_invalid_mangled_name;
+  if (!Mangled.startsWith("_R"))
     return nullptr;
-  }
 
   Demangler D;
-  if (!initializeOutputBuffer(nullptr, nullptr, D.Output, 1024)) {
-    if (Status != nullptr)
-      *Status = demangle_memory_alloc_failure;
+  if (!initializeOutputBuffer(nullptr, nullptr, D.Output, 1024))
     return nullptr;
-  }
 
   if (!D.demangle(Mangled)) {
-    if (Status != nullptr)
-      *Status = demangle_invalid_mangled_name;
     std::free(D.Output.getBuffer());
     return nullptr;
   }
 
   D.Output += '\0';
-  char *Demangled = D.Output.getBuffer();
-  size_t DemangledLen = D.Output.getCurrentPosition();
-
-  if (Buf != nullptr) {
-    if (DemangledLen <= *N) {
-      std::memcpy(Buf, Demangled, DemangledLen);
-      std::free(Demangled);
-      Demangled = Buf;
-    } else {
-      std::free(Buf);
-    }
-  }
-
-  if (N != nullptr)
-    *N = DemangledLen;
-
-  if (Status != nullptr)
-    *Status = demangle_success;
 
-  return Demangled;
+  return D.Output.getBuffer();
 }
 
 Demangler::Demangler(size_t MaxRecursionLevel)
Index: llvm/lib/Demangle/Demangle.cpp
===================================================================
--- llvm/lib/Demangle/Demangle.cpp
+++ llvm/lib/Demangle/Demangle.cpp
@@ -51,7 +51,7 @@
   if (isItaniumEncoding(MangledName))
     Demangled = itaniumDemangle(MangledName, nullptr, nullptr, nullptr);
   else if (isRustEncoding(MangledName))
-    Demangled = rustDemangle(MangledName, nullptr, nullptr, nullptr);
+    Demangled = rustDemangle(MangledName);
   else if (isDLangEncoding(MangledName))
     Demangled = dlangDemangle(MangledName);
 
Index: llvm/include/llvm/Demangle/Demangle.h
===================================================================
--- llvm/include/llvm/Demangle/Demangle.h
+++ llvm/include/llvm/Demangle/Demangle.h
@@ -57,8 +57,8 @@
                         size_t *n_buf, int *status,
                         MSDemangleFlags Flags = MSDF_None);
 
-// Demangles a Rust v0 mangled symbol. The API follows that of __cxa_demangle.
-char *rustDemangle(const char *MangledName, char *Buf, size_t *N, int *Status);
+// Demangles a Rust v0 mangled symbol.
+char *rustDemangle(const char *MangledName);
 
 // Demangles a D mangled symbol.
 char *dlangDemangle(const char *MangledName);
Index: lldb/source/Core/Mangled.cpp
===================================================================
--- lldb/source/Core/Mangled.cpp
+++ lldb/source/Core/Mangled.cpp
@@ -168,7 +168,7 @@
 }
 
 static char *GetRustV0DemangledStr(const char *M) {
-  char *demangled_cstr = llvm::rustDemangle(M, nullptr, nullptr, nullptr);
+  char *demangled_cstr = llvm::rustDemangle(M);
 
   if (Log *log = GetLog(LLDBLog::Demangle)) {
     if (demangled_cstr && demangled_cstr[0])
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to