[clang] b208016 - CodeGen: Fix implementation of __builtin_trivially_relocate.
via cfe-commits
cfe-commits at lists.llvm.org
Fri May 23 17:02:51 PDT 2025
Author: Peter Collingbourne
Date: 2025-05-23T17:02:49-07:00
New Revision: b20801646a72b936983261b249e2bc97987445e4
URL: https://github.com/llvm/llvm-project/commit/b20801646a72b936983261b249e2bc97987445e4
DIFF: https://github.com/llvm/llvm-project/commit/b20801646a72b936983261b249e2bc97987445e4.diff
LOG: CodeGen: Fix implementation of __builtin_trivially_relocate.
The builtin is documented to copy `count` elements, but the implementation
copies `count` bytes. Fix that.
Reviewers: cor3ntin, ojhunt
Pull Request: https://github.com/llvm/llvm-project/pull/140312
Added:
Modified:
clang/lib/CodeGen/CGBuiltin.cpp
clang/test/CodeGenCXX/cxx2c-trivially-relocatable.cpp
Removed:
################################################################################
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 809ffe549be88..ca29a6dbe9c9a 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -4453,6 +4453,14 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
Address Dest = EmitPointerWithAlignment(E->getArg(0));
Address Src = EmitPointerWithAlignment(E->getArg(1));
Value *SizeVal = EmitScalarExpr(E->getArg(2));
+ if (BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_trivially_relocate)
+ SizeVal = Builder.CreateMul(
+ SizeVal,
+ ConstantInt::get(
+ SizeVal->getType(),
+ getContext()
+ .getTypeSizeInChars(E->getArg(0)->getType()->getPointeeType())
+ .getQuantity()));
EmitArgCheck(TCK_Store, Dest, E->getArg(0), 0);
EmitArgCheck(TCK_Load, Src, E->getArg(1), 1);
Builder.CreateMemMove(Dest, Src, SizeVal, false);
diff --git a/clang/test/CodeGenCXX/cxx2c-trivially-relocatable.cpp b/clang/test/CodeGenCXX/cxx2c-trivially-relocatable.cpp
index 17144cffb6476..465e539d363e8 100644
--- a/clang/test/CodeGenCXX/cxx2c-trivially-relocatable.cpp
+++ b/clang/test/CodeGenCXX/cxx2c-trivially-relocatable.cpp
@@ -1,5 +1,7 @@
// RUN: %clang_cc1 -std=c++26 -triple x86_64-linux-gnu -emit-llvm -o - %s | FileCheck %s
+typedef __SIZE_TYPE__ size_t;
+
struct S trivially_relocatable_if_eligible {
S(const S&);
~S();
@@ -8,9 +10,13 @@ struct S trivially_relocatable_if_eligible {
};
// CHECK: @_Z4testP1SS0_
-// CHECK: call void @llvm.memmove.p0.p0.i64
-// CHECK-NOT: __builtin
-// CHECK: ret
-void test(S* source, S* dest) {
+void test(S* source, S* dest, size_t count) {
+ // CHECK: call void @llvm.memmove.p0.p0.i64({{.*}}, i64 8
+ // CHECK-NOT: __builtin
__builtin_trivially_relocate(dest, source, 1);
+ // CHECK: [[A:%.*]] = load i64, ptr %count.addr
+ // CHECK: [[M:%.*]] = mul i64 [[A]], 8
+ // CHECK: call void @llvm.memmove.p0.p0.i64({{.*}}, i64 [[M]]
+ __builtin_trivially_relocate(dest, source, count);
+ // CHECK: ret
};
More information about the cfe-commits
mailing list