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