forked from OSchip/llvm-project
[BuildLibCalls] Add noalias for strcat and stpcpy
strcat: destination and source shall not overlap. (http://www.cplusplus.com/reference/cstring/strcat/) stpcpy: The strings may not overlap, and the destination string dest must be large enough to receive the copy. (https://man7.org/linux/man-pages/man3/stpcpy.3.html) Reviewed By: jdoerfert Differential Revision: https://reviews.llvm.org/D88335
This commit is contained in:
parent
0103df7903
commit
155ac33394
|
@ -203,9 +203,6 @@ bool llvm::inferLibFuncAttributes(Function &F, const TargetLibraryInfo &TLI) {
|
|||
return Changed;
|
||||
case LibFunc_strcpy:
|
||||
case LibFunc_strncpy:
|
||||
Changed |= setDoesNotAlias(F, 0);
|
||||
Changed |= setDoesNotAlias(F, 1);
|
||||
LLVM_FALLTHROUGH;
|
||||
case LibFunc_strcat:
|
||||
case LibFunc_strncat:
|
||||
Changed |= setReturnedArg(F, 0);
|
||||
|
@ -215,6 +212,8 @@ bool llvm::inferLibFuncAttributes(Function &F, const TargetLibraryInfo &TLI) {
|
|||
Changed |= setDoesNotThrow(F);
|
||||
Changed |= setDoesNotCapture(F, 1);
|
||||
Changed |= setOnlyReadsMemory(F, 1);
|
||||
Changed |= setDoesNotAlias(F, 0);
|
||||
Changed |= setDoesNotAlias(F, 1);
|
||||
return Changed;
|
||||
case LibFunc_strxfrm:
|
||||
Changed |= setDoesNotThrow(F);
|
||||
|
|
|
@ -825,16 +825,16 @@ declare i32 @statvfs(i8*, %opaque*)
|
|||
; CHECK-LINUX: declare noundef i32 @statvfs64(i8* nocapture noundef readonly, %opaque* nocapture noundef) [[G1]]
|
||||
declare i32 @statvfs64(i8*, %opaque*)
|
||||
|
||||
; CHECK: declare i8* @stpcpy(i8*, i8* nocapture readonly) [[G1]]
|
||||
; CHECK: declare i8* @stpcpy(i8* noalias, i8* noalias nocapture readonly) [[G1]]
|
||||
declare i8* @stpcpy(i8*, i8*)
|
||||
|
||||
; CHECK: declare i8* @stpncpy(i8*, i8* nocapture readonly, i64) [[G1]]
|
||||
; CHECK: declare i8* @stpncpy(i8* noalias, i8* noalias nocapture readonly, i64) [[G1]]
|
||||
declare i8* @stpncpy(i8*, i8*, i64)
|
||||
|
||||
; CHECK: declare i32 @strcasecmp(i8* nocapture, i8* nocapture) [[G2]]
|
||||
declare i32 @strcasecmp(i8*, i8*)
|
||||
|
||||
; CHECK: declare i8* @strcat(i8* returned, i8* nocapture readonly) [[G1]]
|
||||
; CHECK: declare i8* @strcat(i8* noalias returned, i8* noalias nocapture readonly) [[G1]]
|
||||
declare i8* @strcat(i8*, i8*)
|
||||
|
||||
; CHECK: declare i8* @strchr(i8*, i32) [[ARGMEMONLY_NOFREE_NOUNWIND_READONLY]]
|
||||
|
@ -861,7 +861,7 @@ declare i64 @strlen(i8*)
|
|||
; CHECK: declare i32 @strncasecmp(i8* nocapture, i8* nocapture, i64) [[G2]]
|
||||
declare i32 @strncasecmp(i8*, i8*, i64)
|
||||
|
||||
; CHECK: declare i8* @strncat(i8* returned, i8* nocapture readonly, i64) [[G1]]
|
||||
; CHECK: declare i8* @strncat(i8* noalias returned, i8* noalias nocapture readonly, i64) [[G1]]
|
||||
declare i8* @strncat(i8*, i8*, i64)
|
||||
|
||||
; CHECK: declare i32 @strncmp(i8* nocapture, i8* nocapture, i64) [[ARGMEMONLY_NOFREE_NOUNWIND_READONLY]]
|
||||
|
|
Loading…
Reference in New Issue