jcheca / rpms / clang

Forked from rpms/clang 2 years ago
Clone
14e25ec
From bc9aa904bf9d24e7f39a2a866ff6b463858b6ccb Mon Sep 17 00:00:00 2001
14e25ec
From: serge-sans-paille <sguelton@redhat.com>
14e25ec
Date: Wed, 21 Sep 2022 16:08:45 +0200
14e25ec
Subject: [PATCH] [clang] Fix interaction between asm labels and inline
14e25ec
 builtins
14e25ec
14e25ec
One must pick the same name as the one referenced in CodeGenFunction when
14e25ec
generating .inline version of an inline builtin, otherwise they are not
14e25ec
correctly replaced.
14e25ec
14e25ec
Differential Revision: https://reviews.llvm.org/D134362
14e25ec
---
14e25ec
 clang/lib/CodeGen/CGExpr.cpp                  |  5 ++-
14e25ec
 .../test/CodeGen/asm-label-inline-builtins.c  | 32 +++++++++++++++++++
14e25ec
 2 files changed, 36 insertions(+), 1 deletion(-)
14e25ec
 create mode 100644 clang/test/CodeGen/asm-label-inline-builtins.c
14e25ec
14e25ec
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp
14e25ec
index bf3dd812b9e8..a951d53423bf 100644
14e25ec
--- a/clang/lib/CodeGen/CGExpr.cpp
14e25ec
+++ b/clang/lib/CodeGen/CGExpr.cpp
14e25ec
@@ -5046,7 +5046,10 @@ static CGCallee EmitDirectCallee(CodeGenFunction &CGF, GlobalDecl GD) {
14e25ec
   if (auto builtinID = FD->getBuiltinID()) {
14e25ec
     std::string NoBuiltinFD = ("no-builtin-" + FD->getName()).str();
14e25ec
     std::string NoBuiltins = "no-builtins";
14e25ec
-    std::string FDInlineName = (FD->getName() + ".inline").str();
14e25ec
+
14e25ec
+    auto *A = FD->getAttr<AsmLabelAttr>();
14e25ec
+    StringRef Ident = A ? A->getLabel() : FD->getName();
14e25ec
+    std::string FDInlineName = (Ident + ".inline").str();
14e25ec
 
14e25ec
     bool IsPredefinedLibFunction =
14e25ec
         CGF.getContext().BuiltinInfo.isPredefinedLibFunction(builtinID);
14e25ec
diff --git a/clang/test/CodeGen/asm-label-inline-builtins.c b/clang/test/CodeGen/asm-label-inline-builtins.c
14e25ec
new file mode 100644
14e25ec
index 000000000000..ab9afc29411d
14e25ec
--- /dev/null
14e25ec
+++ b/clang/test/CodeGen/asm-label-inline-builtins.c
14e25ec
@@ -0,0 +1,32 @@
14e25ec
+// RUN: %clang_cc1 -triple x86_64 -S -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s
14e25ec
+//
14e25ec
+// Verifies that clang-generated *.inline carry the same name at call and callee
14e25ec
+// site, in spite of asm labels.
14e25ec
+
14e25ec
+typedef struct _IO_FILE FILE;
14e25ec
+extern FILE *stdout;
14e25ec
+extern int vprintf (const char *__restrict __format, __builtin_va_list __arg);
14e25ec
+extern int __vfprintf_chk (FILE *__restrict __stream, int __flag,
14e25ec
+      const char *__restrict __format, __builtin_va_list __ap);
14e25ec
+extern int __vprintf_chk (int __flag, const char *__restrict __format,
14e25ec
+     __builtin_va_list __ap);
14e25ec
+
14e25ec
+extern __typeof (vprintf) vprintf __asm ("__vprintfieee128");
14e25ec
+extern __typeof (__vfprintf_chk) __vfprintf_chk __asm ("__vfprintf_chkieee128");
14e25ec
+extern __typeof (__vprintf_chk) __vprintf_chk __asm ("__vprintf_chkieee128");
14e25ec
+
14e25ec
+extern __inline __attribute__ ((__always_inline__)) __attribute__ ((__gnu_inline__)) __attribute__ ((__artificial__)) int
14e25ec
+vprintf (const char *__restrict __fmt, __builtin_va_list __ap)
14e25ec
+{
14e25ec
+  return __vfprintf_chk (stdout, 2 - 1, __fmt, __ap);
14e25ec
+}
14e25ec
+
14e25ec
+void test(const char *fmt, __builtin_va_list ap) {
14e25ec
+  vprintf(fmt, ap);
14e25ec
+}
14e25ec
+
14e25ec
+// CHECK-LABEL: void @test(
14e25ec
+// CHECK: call i32 @__vprintfieee128.inline(
14e25ec
+//
14e25ec
+// CHECK-LABEL: internal i32 @__vprintfieee128.inline(
14e25ec
+// CHECK: call i32 @__vfprintf_chkieee128(
14e25ec
-- 
14e25ec
2.37.2
14e25ec