[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.
This commit is contained in:
parent
bc6e7f0573
commit
7523550853
@ -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.
|
||||
|
@ -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;
|
||||
|
@ -3703,6 +3703,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:
|
||||
|
@ -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) {
|
||||
|
@ -57,9 +57,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(}}
|
||||
}
|
||||
|
||||
|
@ -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(
|
||||
|
Loading…
x
Reference in New Issue
Block a user