https://github.com/tbaederr created 
https://github.com/llvm/llvm-project/pull/140789

If we know the char width is 1, we can just copy
the data over instead of going through the Pointer API.

>From a4209fc8d9e93d5a7e080bd3cfab0d6cef37a102 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbae...@redhat.com>
Date: Sat, 10 May 2025 07:01:26 +0200
Subject: [PATCH] [clang][bytecode] Initialize global strings via memcpy

If we know the char width is 1, we can just copy
the data over instead of going through the Pointer API.
---
 clang/lib/AST/ByteCode/Program.cpp | 52 +++++++++++++++++-------------
 1 file changed, 29 insertions(+), 23 deletions(-)

diff --git a/clang/lib/AST/ByteCode/Program.cpp 
b/clang/lib/AST/ByteCode/Program.cpp
index 8b0b07f42e3f3..5ac0f59f32d4e 100644
--- a/clang/lib/AST/ByteCode/Program.cpp
+++ b/clang/lib/AST/ByteCode/Program.cpp
@@ -68,32 +68,38 @@ unsigned Program::createGlobalString(const StringLiteral 
*S, const Expr *Base) {
                                        /*isExtern=*/false);
   G->block()->invokeCtor();
 
-  new (G->block()->rawData()) InlineDescriptor(Desc);
+  new (G->block()->rawData())
+      GlobalInlineDescriptor{GlobalInitState::Initialized};
   Globals.push_back(G);
 
-  // Construct the string in storage.
   const Pointer Ptr(G->block());
-  for (unsigned I = 0; I <= StringLength; ++I) {
-    Pointer Field = Ptr.atIndex(I);
-    const uint32_t CodePoint = I == StringLength ? 0 : S->getCodeUnit(I);
-    switch (CharType) {
-    case PT_Sint8: {
-      using T = PrimConv<PT_Sint8>::T;
-      Field.deref<T>() = T::from(CodePoint, BitWidth);
-      break;
-    }
-    case PT_Uint16: {
-      using T = PrimConv<PT_Uint16>::T;
-      Field.deref<T>() = T::from(CodePoint, BitWidth);
-      break;
-    }
-    case PT_Uint32: {
-      using T = PrimConv<PT_Uint32>::T;
-      Field.deref<T>() = T::from(CodePoint, BitWidth);
-      break;
-    }
-    default:
-      llvm_unreachable("unsupported character type");
+  if (CharWidth == 1) {
+    std::memcpy(&Ptr.atIndex(0).deref<char>(), S->getString().data(),
+                StringLength);
+  } else {
+    // Construct the string in storage.
+    for (unsigned I = 0; I <= StringLength; ++I) {
+      Pointer Field = Ptr.atIndex(I);
+      const uint32_t CodePoint = I == StringLength ? 0 : S->getCodeUnit(I);
+      switch (CharType) {
+      case PT_Sint8: {
+        using T = PrimConv<PT_Sint8>::T;
+        Field.deref<T>() = T::from(CodePoint, BitWidth);
+        break;
+      }
+      case PT_Uint16: {
+        using T = PrimConv<PT_Uint16>::T;
+        Field.deref<T>() = T::from(CodePoint, BitWidth);
+        break;
+      }
+      case PT_Uint32: {
+        using T = PrimConv<PT_Uint32>::T;
+        Field.deref<T>() = T::from(CodePoint, BitWidth);
+        break;
+      }
+      default:
+        llvm_unreachable("unsupported character type");
+      }
     }
   }
   Ptr.initialize();

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

Reply via email to