From 9d4de727029eea47e1b873e40a24587ea76e1999 Mon Sep 17 00:00:00 2001 From: liyunfei Date: Mon, 18 Nov 2024 21:11:56 +0800 Subject: [PATCH] [Backport][Clang][CodeGen] Add __builtin_bcopy Signed-off-by: liyunfei (cherry picked from commit ff48f158268109ddbaffecb4b8d2768770ed1523) --- ...TCH-Clang-CodeGen-Add__builtin_bcopy.patch | 146 ++++++++++++++++++ clang.spec | 7 +- 2 files changed, 151 insertions(+), 2 deletions(-) create mode 100644 0024-Backport-PATCH-Clang-CodeGen-Add__builtin_bcopy.patch diff --git a/0024-Backport-PATCH-Clang-CodeGen-Add__builtin_bcopy.patch b/0024-Backport-PATCH-Clang-CodeGen-Add__builtin_bcopy.patch new file mode 100644 index 0000000..346d0da --- /dev/null +++ b/0024-Backport-PATCH-Clang-CodeGen-Add__builtin_bcopy.patch @@ -0,0 +1,146 @@ +From 25282cd2e1bbae9c68a4f0df21fef831331503f4 Mon Sep 17 00:00:00 2001 +From: Carlos Eduardo Seo +Date: Sun, 24 Sep 2023 11:58:14 -0300 +Subject: [PATCH] [Clang][CodeGen] Add __builtin_bcopy (#67130) + +Add __builtin_bcopy to the list of GNU builtins. This was causing a +series of test failures in glibc. + +Adjust the tests to reflect the changes in codegen. + +Fixes #51409. +Fixes #63065. +--- + clang/include/clang/Basic/Builtins.def | 3 ++- + clang/lib/AST/Decl.cpp | 6 ++++++ + clang/lib/CodeGen/CGBuiltin.cpp | 14 ++++++++++++++ + clang/test/Analysis/bstring.c | 3 +-- + clang/test/Analysis/security-syntax-checks.m | 4 ++-- + .../CodeGen/PowerPC/builtins-ppc-xlcompat-macros.c | 6 +++--- + 6 files changed, 28 insertions(+), 8 deletions(-) + +diff --git a/clang/include/clang/Basic/Builtins.def b/clang/include/clang/Basic/Builtins.def +index 6dad8b512bd2..3f2cbcedc4b5 100644 +--- a/clang/include/clang/Basic/Builtins.def ++++ b/clang/include/clang/Basic/Builtins.def +@@ -560,7 +560,7 @@ BUILTIN(__builtin_va_copy, "vAA", "n") + BUILTIN(__builtin_stdarg_start, "vA.", "nt") + BUILTIN(__builtin_assume_aligned, "v*vC*z.", "nctE") + BUILTIN(__builtin_bcmp, "ivC*vC*z", "FnE") +-BUILTIN(__builtin_bcopy, "vv*v*z", "n") ++BUILTIN(__builtin_bcopy, "vvC*v*z", "nF") + BUILTIN(__builtin_bzero, "vv*z", "nF") + BUILTIN(__builtin_free, "vv*", "nF") + BUILTIN(__builtin_malloc, "v*z", "nF") +@@ -1154,6 +1154,7 @@ LIBBUILTIN(strndup, "c*cC*z", "f", STRING_H, ALL_GNU_LANGUAGES) + LIBBUILTIN(index, "c*cC*i", "f", STRINGS_H, ALL_GNU_LANGUAGES) + LIBBUILTIN(rindex, "c*cC*i", "f", STRINGS_H, ALL_GNU_LANGUAGES) + LIBBUILTIN(bzero, "vv*z", "f", STRINGS_H, ALL_GNU_LANGUAGES) ++LIBBUILTIN(bcopy, "vvC*v*z", "f", STRINGS_H, ALL_GNU_LANGUAGES) + LIBBUILTIN(bcmp, "ivC*vC*z", "fE", STRINGS_H, ALL_GNU_LANGUAGES) + // In some systems str[n]casejmp is a macro that expands to _str[n]icmp. + // We undefine then here to avoid wrong name. +diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp +index fbc45fb6397f..3de1e4509bc0 100644 +--- a/clang/lib/AST/Decl.cpp ++++ b/clang/lib/AST/Decl.cpp +@@ -4320,6 +4320,10 @@ unsigned FunctionDecl::getMemoryFunctionKind() const { + case Builtin::BIbzero: + return Builtin::BIbzero; + ++ case Builtin::BI__builtin_bcopy: ++ case Builtin::BIbcopy: ++ return Builtin::BIbcopy; ++ + case Builtin::BIfree: + return Builtin::BIfree; + +@@ -4351,6 +4355,8 @@ unsigned FunctionDecl::getMemoryFunctionKind() const { + return Builtin::BIstrlen; + if (FnInfo->isStr("bzero")) + return Builtin::BIbzero; ++ if (FnInfo->isStr("bcopy")) ++ return Builtin::BIbcopy; + } else if (isInStdNamespace()) { + if (FnInfo->isStr("free")) + return Builtin::BIfree; +diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp +index e512762fafaf..8f87c4d46109 100644 +--- a/clang/lib/CodeGen/CGBuiltin.cpp ++++ b/clang/lib/CodeGen/CGBuiltin.cpp +@@ -3555,6 +3555,20 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID, + Builder.CreateMemSet(Dest, Builder.getInt8(0), SizeVal, false); + return RValue::get(nullptr); + } ++ ++ case Builtin::BIbcopy: ++ case Builtin::BI__builtin_bcopy: { ++ Address Src = EmitPointerWithAlignment(E->getArg(0)); ++ Address Dest = EmitPointerWithAlignment(E->getArg(1)); ++ Value *SizeVal = EmitScalarExpr(E->getArg(2)); ++ EmitNonNullArgCheck(RValue::get(Src.getPointer()), E->getArg(0)->getType(), ++ E->getArg(0)->getExprLoc(), FD, 0); ++ EmitNonNullArgCheck(RValue::get(Dest.getPointer()), E->getArg(1)->getType(), ++ E->getArg(1)->getExprLoc(), FD, 0); ++ Builder.CreateMemMove(Dest, Src, SizeVal, false); ++ return RValue::get(Dest.getPointer()); ++ } ++ + case Builtin::BImemcpy: + case Builtin::BI__builtin_memcpy: + case Builtin::BImempcpy: +diff --git a/clang/test/Analysis/bstring.c b/clang/test/Analysis/bstring.c +index a7c7bdb23683..5d86241a4ac9 100644 +--- a/clang/test/Analysis/bstring.c ++++ b/clang/test/Analysis/bstring.c +@@ -483,8 +483,7 @@ int memcmp8(char *a, size_t n) { + //===----------------------------------------------------------------------=== + + #define bcopy BUILTIN(bcopy) +-// __builtin_bcopy is not defined with const in Builtins.def. +-void bcopy(/*const*/ void *s1, void *s2, size_t n); ++void bcopy(const void *s1, void *s2, size_t n); + + + void bcopy0 (void) { +diff --git a/clang/test/Analysis/security-syntax-checks.m b/clang/test/Analysis/security-syntax-checks.m +index 5b4f35055f51..59e60f685236 100644 +--- a/clang/test/Analysis/security-syntax-checks.m ++++ b/clang/test/Analysis/security-syntax-checks.m +@@ -77,9 +77,9 @@ int test_bcmp(void *a, void *b, size_t n) { + } + + // Obsolete function bcopy +-void bcopy(void *, void *, size_t); ++void bcopy(const void *, void *, size_t); + +-void test_bcopy(void *a, void *b, size_t n) { ++void test_bcopy(const void *a, void *b, size_t n) { + bcopy(a, b, n); // expected-warning{{The bcopy() function is obsoleted by memcpy() or memmove(}} + } + +diff --git a/clang/test/CodeGen/PowerPC/builtins-ppc-xlcompat-macros.c b/clang/test/CodeGen/PowerPC/builtins-ppc-xlcompat-macros.c +index cced16431926..64bd6e3ed41e 100644 +--- a/clang/test/CodeGen/PowerPC/builtins-ppc-xlcompat-macros.c ++++ b/clang/test/CodeGen/PowerPC/builtins-ppc-xlcompat-macros.c +@@ -167,15 +167,15 @@ void testalignx(const void *pointer) { + } + + // 64BIT-LABEL: @testbcopy( +-// 64BIT: call void @bcopy(ptr noundef {{%.*}}, ptr noundef {{%.*}}, i64 noundef {{%.*}}) ++// 64BIT: call void @llvm.memmove.p0.p0.i64(ptr align 1 {{%.*}}, ptr align 1 {{%.*}}, i64 {{%.*}}, i1 false) + // 64BIT-NEXT: ret void + // + // 32BIT-LABEL: @testbcopy( +-// 32BIT: call void @bcopy(ptr noundef {{%.*}}, ptr noundef {{%.*}}, i32 noundef {{%.*}}) ++// 32BIT: call void @llvm.memmove.p0.p0.i32(ptr align 1 {{%.*}}, ptr align 1 {{%.*}}, i32 {{%.*}}, i1 false) + // 32BIT-NEXT: ret void + // + void testbcopy(const void *src, void *dest, size_t n) { +- __bcopy(src, dest, n); ++ bcopy(src, dest, n); + } + + // 64BIT-LABEL: @testbzero( +-- +Gitee diff --git a/clang.spec b/clang.spec index 1259ca9..670748c 100644 --- a/clang.spec +++ b/clang.spec @@ -43,7 +43,7 @@ Name: %{pkg_name} Version: %{clang_version} -Release: 27 +Release: 28 Summary: A C language family front-end for LLVM License: NCSA @@ -75,7 +75,7 @@ Patch20: 0020-Backport-LoongArch-fix-and-add-some-new-support.patch Patch21: 0021-AArch64-Delete-hip09-macro.patch Patch22: 0022-Driver-Pass-z-arg-and-Wl-z-arg-option-to-the-linker.patch Patch23: 0023-Handling-of-option-Wall-and-Werror-format-2-override.patch - +Patch24: 0024-Backport-PATCH-Clang-CodeGen-Add__builtin_bcopy.patch # Patches for clang-tools-extra # See https://reviews.llvm.org/D120301 Patch201: fedora-clang-tools-extra-Make-test-dependency-on-LLVMHello-.patch @@ -419,6 +419,9 @@ LD_LIBRARY_PATH=%{buildroot}/%{install_libdir} %{__ninja} check-all -C ./_build %{install_bindir}/git-clang-format %changelog +* Wed Nov 20 2024 liyunfei - 17.0.6-28 +- [Backport][Clang][CodeGen] Add __builtin_bcopy + * Tue Nov 19 2024 wangqiang - 17.0.6-27 - Handling of option `-Wall` and `-Werror=format=2` override `-Wno` -- Gitee