[PATCH] D111948: [Demangle] Add prepend functionality to OutputString

Luís Ferreira via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sat Oct 16 12:37:35 PDT 2021


ljmf00 created this revision.
ljmf00 added a project: LLVM.
ljmf00 requested review of this revision.
Herald added a project: libc++abi.
Herald added subscribers: llvm-commits, libcxx-commits.
Herald added a reviewer: libc++abi.

Implement the functionallity of prepend, required by D demangler.
Please read discussion https://reviews.llvm.org/D111414 for context.
See also https://reviews.llvm.org/D111947 .


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D111948

Files:
  libcxxabi/src/demangle/Utility.h
  llvm/include/llvm/Demangle/Utility.h
  llvm/unittests/Demangle/OutputStringTest.cpp


Index: llvm/unittests/Demangle/OutputStringTest.cpp
===================================================================
--- llvm/unittests/Demangle/OutputStringTest.cpp
+++ llvm/unittests/Demangle/OutputStringTest.cpp
@@ -6,6 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "llvm/Demangle/MicrosoftDemangleNodes.h"
 #include "llvm/Demangle/Utility.h"
 #include "gtest/gtest.h"
 #include <string>
@@ -59,3 +60,12 @@
 
   std::free(OS.getBuffer());
 }
+
+TEST(OutputStringTest, Prepend)
+{
+  OutputString OS;
+
+  OS << "abc";
+  OS.prepend("def");
+  EXPECT_EQ("defabc", toString(OS));
+}
Index: llvm/include/llvm/Demangle/Utility.h
===================================================================
--- llvm/include/llvm/Demangle/Utility.h
+++ llvm/include/llvm/Demangle/Utility.h
@@ -14,6 +14,7 @@
 #define DEMANGLE_UTILITY_H
 
 #include "StringView.h"
+#include "llvm/Demangle/MicrosoftDemangleNodes.h"
 #include <cstdint>
 #include <cstdlib>
 #include <cstring>
@@ -93,6 +94,23 @@
     return *this;
   }
 
+  OutputString prepend(StringView R)
+  {
+      char *TempBuffer;
+      size_t Size = R.size();
+
+    if (Size != 0) {
+      grow(Size);
+      for (TempBuffer = (Buffer + CurrentPosition) - 1; TempBuffer >= Buffer; --TempBuffer) {
+        TempBuffer[Size] = TempBuffer[0];
+      }
+      std::memcpy(Buffer, R.begin(), Size);
+      CurrentPosition += Size;
+    }
+
+    return *this;
+  }
+
   OutputString &operator<<(StringView R) { return (*this += R); }
 
   OutputString &operator<<(char C) { return (*this += C); }
Index: libcxxabi/src/demangle/Utility.h
===================================================================
--- libcxxabi/src/demangle/Utility.h
+++ libcxxabi/src/demangle/Utility.h
@@ -14,6 +14,7 @@
 #define DEMANGLE_UTILITY_H
 
 #include "StringView.h"
+#include "llvm/Demangle/MicrosoftDemangleNodes.h"
 #include <cstdint>
 #include <cstdlib>
 #include <cstring>
@@ -93,6 +94,23 @@
     return *this;
   }
 
+  OutputString prepend(StringView R)
+  {
+      char *TempBuffer;
+      size_t Size = R.size();
+
+    if (Size != 0) {
+      grow(Size);
+      for (TempBuffer = (Buffer + CurrentPosition) - 1; TempBuffer >= Buffer; --TempBuffer) {
+        TempBuffer[Size] = TempBuffer[0];
+      }
+      std::memcpy(Buffer, R.begin(), Size);
+      CurrentPosition += Size;
+    }
+
+    return *this;
+  }
+
   OutputString &operator<<(StringView R) { return (*this += R); }
 
   OutputString &operator<<(char C) { return (*this += C); }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D111948.380206.patch
Type: text/x-patch
Size: 2543 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211016/5bf894ef/attachment.bin>


More information about the llvm-commits mailing list