[PATCH] D88712: [CGBuiltin] Respect asm labels and redefine_extname for builtins with specialized emitting
Fangrui Song via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Oct 1 17:02:41 PDT 2020
MaskRay updated this revision to Diff 295696.
MaskRay added a comment.
Improve tests
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D88712/new/
https://reviews.llvm.org/D88712
Files:
clang/lib/CodeGen/CGBuiltin.cpp
clang/test/CodeGen/asm-label.c
clang/test/CodeGen/redefine_extname.c
Index: clang/test/CodeGen/redefine_extname.c
===================================================================
--- clang/test/CodeGen/redefine_extname.c
+++ clang/test/CodeGen/redefine_extname.c
@@ -30,3 +30,9 @@
int baz() { return foo_static(); }
// CHECK-NOT: call i32 @bar_static()
+// Check that pragma redefine_extname applies to builtin functions.
+typedef unsigned long size_t;
+extern void *memcpy(void *, const void *, size_t);
+#pragma redefine_extname memcpy __GI_memcpy
+void *test_memcpy(void *dst, const void *src, size_t n) { return memcpy(dst, src, n); }
+// CHECK: call i8* @__GI_memcpy(
Index: clang/test/CodeGen/asm-label.c
===================================================================
--- clang/test/CodeGen/asm-label.c
+++ clang/test/CodeGen/asm-label.c
@@ -1,5 +1,5 @@
-// RUN: %clang_cc1 -triple=i686-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=LINUX
-// RUN: %clang_cc1 -triple=i686-apple-darwin9 -emit-llvm %s -o - | FileCheck %s --check-prefix=DARWIN
+// RUN: %clang_cc1 -triple=i686-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefixes=CHECK,LINUX
+// RUN: %clang_cc1 -triple=i686-apple-darwin9 -emit-llvm %s -o - | FileCheck %s --check-prefixes=CHECK,DARWIN
char *strerror(int) asm("alias");
int x __asm("foo");
@@ -17,3 +17,28 @@
// DARWIN: @"\01bar" = internal global i32 0
// DARWIN: @"\01foo" = global i32 0
// DARWIN: declare i8* @"\01alias"(i32)
+
+extern void *memcpy(void *__restrict, const void *__restrict, unsigned long);
+extern __typeof(memcpy) memcpy asm("__GI_memcpy");
+void test_memcpy(void *dst, void *src, unsigned long n) {
+ memcpy(dst, src, n);
+}
+
+// CHECK-LABEL: @test_memcpy(
+// LINUX: call i8* @__GI_memcpy(
+// LINUX: declare i8* @__GI_memcpy(i8*, i8*, i32)
+
+// DARWIN: call i8* @"\01__GI_memcpy"(
+// DARWIN: declare i8* @"\01__GI_memcpy"(i8*, i8*, i32)
+
+long lrint(double x) asm("__GI_lrint");
+long test_lrint(double x) {
+ return lrint(x);
+}
+
+// CHECK-LABEL: @test_lrint(
+// LINUX: call i32 @__GI_lrint(
+// LINUX: declare i32 @__GI_lrint(double)
+
+// DARWIN: call i32 @"\01__GI_lrint"(
+// DARWIN: declare i32 @"\01__GI_lrint"(double)
Index: clang/lib/CodeGen/CGBuiltin.cpp
===================================================================
--- clang/lib/CodeGen/CGBuiltin.cpp
+++ clang/lib/CodeGen/CGBuiltin.cpp
@@ -1663,13 +1663,18 @@
Result.Val.getFloat()));
}
+ // If the builtin has been declared explicitly with an assembler label,
+ // disable the specialized emitting below.
+ const unsigned BuiltinIDIfNoAsmLabel =
+ FD->hasAttr<AsmLabelAttr>() ? 0 : BuiltinID;
+
// There are LLVM math intrinsics/instructions corresponding to math library
// functions except the LLVM op will never set errno while the math library
// might. Also, math builtins have the same semantics as their math library
// twins. Thus, we can transform math library and builtin calls to their
// LLVM counterparts if the call is marked 'const' (known to never set errno).
if (FD->hasAttr<ConstAttr>()) {
- switch (BuiltinID) {
+ switch (BuiltinIDIfNoAsmLabel) {
case Builtin::BIceil:
case Builtin::BIceilf:
case Builtin::BIceill:
@@ -1946,7 +1951,7 @@
}
}
- switch (BuiltinID) {
+ switch (BuiltinIDIfNoAsmLabel) {
default: break;
case Builtin::BI__builtin___CFStringMakeConstantString:
case Builtin::BI__builtin___NSStringMakeConstantString:
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D88712.295696.patch
Type: text/x-patch
Size: 3520 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20201002/3a2e3bdf/attachment-0001.bin>
More information about the cfe-commits
mailing list