[clang] [Clang][CodeGen] Add __builtin_bcopy (PR #67130)

2023-09-22 Thread Carlos Eduardo Seo via cfe-commits

https://github.com/ceseo created https://github.com/llvm/llvm-project/pull/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.

>From af8c9b6d0757c109aa83a35248d58ff15f9384dd Mon Sep 17 00:00:00 2001
From: Carlos Eduardo Seo 
Date: Wed, 16 Aug 2023 21:56:54 +
Subject: [PATCH] [Clang][Codegen] Add __builtin_bcopy

Add __builtin_bcopy to the list of GNU builtins. This was causing a series of
test failures in glibc.

Modify the tests to reflect the addition of the builtin.

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 586dcf05170eb58..6ea8484606cfd5d 100644
--- a/clang/include/clang/Basic/Builtins.def
+++ b/clang/include/clang/Basic/Builtins.def
@@ -565,7 +565,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")
@@ -1161,6 +1161,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 6109829cf20a678..d5507b7c23c3e5c 100644
--- a/clang/lib/AST/Decl.cpp
+++ b/clang/lib/AST/Decl.cpp
@@ -4356,6 +4356,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;
 
@@ -4387,6 +4391,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 27e4eb630356412..d7232e1e620893d 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -3676,6 +3676,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 a7c7bdb23683e76..5d86241a4ac9a81 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 ab6a5311f49efad..154f0c1bae427c0 100644
--- a/clang/test/Analysis/security-syntax-check

[clang] [Clang][CodeGen] Add __builtin_bcopy (PR #67130)

2023-09-24 Thread Carlos Eduardo Seo via cfe-commits

https://github.com/ceseo closed https://github.com/llvm/llvm-project/pull/67130
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits