[llvm-branch-commits] [clang] [clang][CodeGen] Copy calling convention to .inline builtin clones (PR #234089)

Vitaly Buka via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Tue Oct 20 22:57:09 PDT 2026


https://github.com/vitalybuka created https://github.com/llvm/llvm-project/pull/234089

0f0e31cf511d created a separate `.inline` function for inline builtins instead
of renaming `Fn` in place, leaving the default C calling convention on the
clone even when `Fn` uses a different calling convention.

>From 3bae4a249026509adcd86a7054625c469a1d4e83 Mon Sep 17 00:00:00 2001
From: Vitaly Buka <vitalybuka at google.com>
Date: Tue, 20 Oct 2026 22:56:30 -0700
Subject: [PATCH] Split calling convention fix into separate PR

Created using spr 2.0.0-beta.1
---
 clang/lib/CodeGen/CGExpr.cpp                         | 1 +
 clang/lib/CodeGen/CodeGenFunction.cpp                | 1 +
 clang/test/CodeGen/memcpy-inline-builtin-no-extern.c | 2 +-
 3 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp
index dec071292d32d..86a8aa34318f8 100644
--- a/clang/lib/CodeGen/CGExpr.cpp
+++ b/clang/lib/CodeGen/CGExpr.cpp
@@ -6723,6 +6723,7 @@ static CGCallee EmitDirectCallee(CodeGenFunction &CGF, GlobalDecl GD) {
         Clone = llvm::Function::Create(Fn->getFunctionType(),
                                        llvm::GlobalValue::InternalLinkage,
                                        Fn->getAddressSpace(), FDInlineName, M);
+        Clone->setCallingConv(Fn->getCallingConv());
         Clone->setAttributes(Fn->getAttributes());
         Clone->addFnAttr(llvm::Attribute::AlwaysInline);
       }
diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp
index 73bdfa94d4911..51588a7ebc556 100644
--- a/clang/lib/CodeGen/CodeGenFunction.cpp
+++ b/clang/lib/CodeGen/CodeGenFunction.cpp
@@ -1505,6 +1505,7 @@ void CodeGenFunction::GenerateCode(GlobalDecl GD, llvm::Function *Fn,
       Clone = llvm::Function::Create(Fn->getFunctionType(),
                                      llvm::GlobalValue::InternalLinkage,
                                      Fn->getAddressSpace(), FDInlineName, M);
+    Clone->setCallingConv(Fn->getCallingConv());
     Clone->setAttributes(Fn->getAttributes());
     CGM.SetLLVMFunctionAttributesForDefinition(FD, Clone);
     Clone->addFnAttr(llvm::Attribute::AlwaysInline);
diff --git a/clang/test/CodeGen/memcpy-inline-builtin-no-extern.c b/clang/test/CodeGen/memcpy-inline-builtin-no-extern.c
index 44501c47b5c02..1ac1b0262170c 100644
--- a/clang/test/CodeGen/memcpy-inline-builtin-no-extern.c
+++ b/clang/test/CodeGen/memcpy-inline-builtin-no-extern.c
@@ -113,7 +113,7 @@ int call_umask(int m) {
 //
 //
 // CHECK: Function Attrs: alwaysinline nobuiltin nounwind
-// CHECK-LABEL: define internal i32 @umask.inline(
+// CHECK-LABEL: define internal preserve_mostcc i32 @umask.inline(
 // CHECK-SAME: i32 noundef [[M:%.*]]) #[[ATTR2]] {
 // CHECK-NEXT:  [[ENTRY:.*:]]
 // CHECK-NEXT:    [[M_ADDR:%.*]] = alloca i32, align 4



More information about the llvm-branch-commits mailing list