mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-14 15:28:20 +00:00
Update the list of function annotations for nocapture. All of these came up
when I was looking at functions used by python. Highlights include, better largefile support (64-bit file sizes on 32-bit systems), fputs string is nocapture, popen/pclose added (popen being noalias return), modf and frexp and friends. Also added some missing 'break' statements and combined identical sections. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@64615 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -255,12 +255,13 @@ void LibCallOptimization::EmitFPutC(Value *Char, Value *File, IRBuilder<> &B) {
|
|||||||
/// pointer and File is a pointer to FILE.
|
/// pointer and File is a pointer to FILE.
|
||||||
void LibCallOptimization::EmitFPutS(Value *Str, Value *File, IRBuilder<> &B) {
|
void LibCallOptimization::EmitFPutS(Value *Str, Value *File, IRBuilder<> &B) {
|
||||||
Module *M = Caller->getParent();
|
Module *M = Caller->getParent();
|
||||||
AttributeWithIndex AWI[2];
|
AttributeWithIndex AWI[3];
|
||||||
AWI[0] = AttributeWithIndex::get(2, Attribute::NoCapture);
|
AWI[0] = AttributeWithIndex::get(1, Attribute::NoCapture);
|
||||||
AWI[1] = AttributeWithIndex::get(~0u, Attribute::NoUnwind);
|
AWI[1] = AttributeWithIndex::get(2, Attribute::NoCapture);
|
||||||
|
AWI[2] = AttributeWithIndex::get(~0u, Attribute::NoUnwind);
|
||||||
Constant *F;
|
Constant *F;
|
||||||
if (isa<PointerType>(File->getType()))
|
if (isa<PointerType>(File->getType()))
|
||||||
F = M->getOrInsertFunction("fputs", AttrListPtr::get(AWI, 2), Type::Int32Ty,
|
F = M->getOrInsertFunction("fputs", AttrListPtr::get(AWI, 3), Type::Int32Ty,
|
||||||
PointerType::getUnqual(Type::Int8Ty),
|
PointerType::getUnqual(Type::Int8Ty),
|
||||||
File->getType(), NULL);
|
File->getType(), NULL);
|
||||||
else
|
else
|
||||||
@@ -1655,14 +1656,6 @@ bool SimplifyLibCalls::doInitialization(Module &M) {
|
|||||||
continue;
|
continue;
|
||||||
setDoesNotThrow(F);
|
setDoesNotThrow(F);
|
||||||
setDoesNotCapture(F, 1);
|
setDoesNotCapture(F, 1);
|
||||||
} else if (NameLen == 6 && !strcmp(NameStr, "sscanf")) {
|
|
||||||
if (FTy->getNumParams() < 2 ||
|
|
||||||
!isa<PointerType>(FTy->getParamType(0)) ||
|
|
||||||
!isa<PointerType>(FTy->getParamType(1)))
|
|
||||||
continue;
|
|
||||||
setDoesNotThrow(F);
|
|
||||||
setDoesNotCapture(F, 1);
|
|
||||||
setDoesNotCapture(F, 2);
|
|
||||||
} else if ((NameLen == 6 && !strcmp(NameStr, "strdup")) ||
|
} else if ((NameLen == 6 && !strcmp(NameStr, "strdup")) ||
|
||||||
(NameLen == 7 && !strcmp(NameStr, "strndup"))) {
|
(NameLen == 7 && !strcmp(NameStr, "strndup"))) {
|
||||||
if (FTy->getNumParams() < 1 ||
|
if (FTy->getNumParams() < 1 ||
|
||||||
@@ -1672,8 +1665,11 @@ bool SimplifyLibCalls::doInitialization(Module &M) {
|
|||||||
setDoesNotThrow(F);
|
setDoesNotThrow(F);
|
||||||
setDoesNotAlias(F, 0);
|
setDoesNotAlias(F, 0);
|
||||||
setDoesNotCapture(F, 1);
|
setDoesNotCapture(F, 1);
|
||||||
} else if (NameLen == 7 && !strcmp(NameStr, "sprintf")) {
|
} else if ((NameLen == 4 && !strcmp(NameStr, "stat")) ||
|
||||||
if (FTy->getNumParams() != 2 ||
|
(NameLen == 6 && !strcmp(NameStr, "sscanf")) ||
|
||||||
|
(NameLen == 7 && !strcmp(NameStr, "sprintf")) ||
|
||||||
|
(NameLen == 7 && !strcmp(NameStr, "statvfs"))) {
|
||||||
|
if (FTy->getNumParams() < 2 ||
|
||||||
!isa<PointerType>(FTy->getParamType(0)) ||
|
!isa<PointerType>(FTy->getParamType(0)) ||
|
||||||
!isa<PointerType>(FTy->getParamType(1)))
|
!isa<PointerType>(FTy->getParamType(1)))
|
||||||
continue;
|
continue;
|
||||||
@@ -1688,6 +1684,20 @@ bool SimplifyLibCalls::doInitialization(Module &M) {
|
|||||||
setDoesNotThrow(F);
|
setDoesNotThrow(F);
|
||||||
setDoesNotCapture(F, 1);
|
setDoesNotCapture(F, 1);
|
||||||
setDoesNotCapture(F, 3);
|
setDoesNotCapture(F, 3);
|
||||||
|
} else if (NameLen == 9 && !strcmp(NameStr, "setitimer")) {
|
||||||
|
if (FTy->getNumParams() != 3 ||
|
||||||
|
!isa<PointerType>(FTy->getParamType(1)) ||
|
||||||
|
!isa<PointerType>(FTy->getParamType(2)))
|
||||||
|
continue;
|
||||||
|
setDoesNotThrow(F);
|
||||||
|
setDoesNotCapture(F, 2);
|
||||||
|
setDoesNotCapture(F, 3);
|
||||||
|
} else if (NameLen == 6 && !strcmp(NameStr, "system")) {
|
||||||
|
if (FTy->getNumParams() != 1 ||
|
||||||
|
!isa<PointerType>(FTy->getParamType(0)))
|
||||||
|
continue;
|
||||||
|
// May throw; "system" is a valid pthread cancellation point.
|
||||||
|
setDoesNotCapture(F, 1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'm':
|
case 'm':
|
||||||
@@ -1706,10 +1716,13 @@ bool SimplifyLibCalls::doInitialization(Module &M) {
|
|||||||
continue;
|
continue;
|
||||||
setOnlyReadsMemory(F);
|
setOnlyReadsMemory(F);
|
||||||
setDoesNotThrow(F);
|
setDoesNotThrow(F);
|
||||||
} else if ((NameLen == 6 && !strcmp(NameStr, "memcpy")) ||
|
} else if ((NameLen == 4 && !strcmp(NameStr, "modf")) ||
|
||||||
|
(NameLen == 5 && !strcmp(NameStr, "modff")) ||
|
||||||
|
(NameLen == 5 && !strcmp(NameStr, "modfl")) ||
|
||||||
|
(NameLen == 6 && !strcmp(NameStr, "memcpy")) ||
|
||||||
(NameLen == 7 && !strcmp(NameStr, "memccpy")) ||
|
(NameLen == 7 && !strcmp(NameStr, "memccpy")) ||
|
||||||
(NameLen == 7 && !strcmp(NameStr, "memmove"))) {
|
(NameLen == 7 && !strcmp(NameStr, "memmove"))) {
|
||||||
if (FTy->getNumParams() < 3 ||
|
if (FTy->getNumParams() < 2 ||
|
||||||
!isa<PointerType>(FTy->getParamType(1)))
|
!isa<PointerType>(FTy->getParamType(1)))
|
||||||
continue;
|
continue;
|
||||||
setDoesNotThrow(F);
|
setDoesNotThrow(F);
|
||||||
@@ -1718,6 +1731,13 @@ bool SimplifyLibCalls::doInitialization(Module &M) {
|
|||||||
if (!isa<PointerType>(FTy->getReturnType()))
|
if (!isa<PointerType>(FTy->getReturnType()))
|
||||||
continue;
|
continue;
|
||||||
setDoesNotAlias(F, 0);
|
setDoesNotAlias(F, 0);
|
||||||
|
} else if ((NameLen == 5 && !strcmp(NameStr, "mkdir")) ||
|
||||||
|
(NameLen == 6 && !strcmp(NameStr, "mktime"))) {
|
||||||
|
if (FTy->getNumParams() == 0 ||
|
||||||
|
!isa<PointerType>(FTy->getParamType(0)))
|
||||||
|
continue;
|
||||||
|
setDoesNotThrow(F);
|
||||||
|
setDoesNotCapture(F, 1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'r':
|
case 'r':
|
||||||
@@ -1737,14 +1757,16 @@ bool SimplifyLibCalls::doInitialization(Module &M) {
|
|||||||
setDoesNotCapture(F, 2);
|
setDoesNotCapture(F, 2);
|
||||||
} else if ((NameLen == 5 && !strcmp(NameStr, "rmdir")) ||
|
} else if ((NameLen == 5 && !strcmp(NameStr, "rmdir")) ||
|
||||||
(NameLen == 6 && !strcmp(NameStr, "rewind")) ||
|
(NameLen == 6 && !strcmp(NameStr, "rewind")) ||
|
||||||
(NameLen == 6 && !strcmp(NameStr, "remove"))) {
|
(NameLen == 6 && !strcmp(NameStr, "remove")) ||
|
||||||
if (FTy->getNumParams() != 1 ||
|
(NameLen == 8 && !strcmp(NameStr, "realpath"))) {
|
||||||
|
if (FTy->getNumParams() < 1 ||
|
||||||
!isa<PointerType>(FTy->getParamType(0)))
|
!isa<PointerType>(FTy->getParamType(0)))
|
||||||
continue;
|
continue;
|
||||||
setDoesNotThrow(F);
|
setDoesNotThrow(F);
|
||||||
setDoesNotCapture(F, 1);
|
setDoesNotCapture(F, 1);
|
||||||
} else if (NameLen == 6 && !strcmp(NameStr, "rename")) {
|
} else if ((NameLen == 6 && !strcmp(NameStr, "rename")) ||
|
||||||
if (FTy->getNumParams() != 2 ||
|
(NameLen == 8 && !strcmp(NameStr, "readlink"))) {
|
||||||
|
if (FTy->getNumParams() < 2 ||
|
||||||
!isa<PointerType>(FTy->getParamType(0)) ||
|
!isa<PointerType>(FTy->getParamType(0)) ||
|
||||||
!isa<PointerType>(FTy->getParamType(1)))
|
!isa<PointerType>(FTy->getParamType(1)))
|
||||||
continue;
|
continue;
|
||||||
@@ -1795,7 +1817,9 @@ bool SimplifyLibCalls::doInitialization(Module &M) {
|
|||||||
continue;
|
continue;
|
||||||
setDoesNotThrow(F);
|
setDoesNotThrow(F);
|
||||||
setDoesNotAlias(F, 0);
|
setDoesNotAlias(F, 0);
|
||||||
} else if ((NameLen == 5 && !strcmp(NameStr, "chown")) ||
|
} else if ((NameLen == 5 && !strcmp(NameStr, "chmod")) ||
|
||||||
|
(NameLen == 5 && !strcmp(NameStr, "chown")) ||
|
||||||
|
(NameLen == 7 && !strcmp(NameStr, "ctermid")) ||
|
||||||
(NameLen == 8 && !strcmp(NameStr, "clearerr")) ||
|
(NameLen == 8 && !strcmp(NameStr, "clearerr")) ||
|
||||||
(NameLen == 8 && !strcmp(NameStr, "closedir"))) {
|
(NameLen == 8 && !strcmp(NameStr, "closedir"))) {
|
||||||
if (FTy->getNumParams() == 0 ||
|
if (FTy->getNumParams() == 0 ||
|
||||||
@@ -1853,7 +1877,10 @@ bool SimplifyLibCalls::doInitialization(Module &M) {
|
|||||||
(NameLen == 6 && !strcmp(NameStr, "fileno")) ||
|
(NameLen == 6 && !strcmp(NameStr, "fileno")) ||
|
||||||
(NameLen == 6 && !strcmp(NameStr, "fflush")) ||
|
(NameLen == 6 && !strcmp(NameStr, "fflush")) ||
|
||||||
(NameLen == 6 && !strcmp(NameStr, "fclose")) ||
|
(NameLen == 6 && !strcmp(NameStr, "fclose")) ||
|
||||||
(NameLen == 7 && !strcmp(NameStr, "fsetpos"))) {
|
(NameLen == 7 && !strcmp(NameStr, "fsetpos")) ||
|
||||||
|
(NameLen == 9 && !strcmp(NameStr, "flockfile")) ||
|
||||||
|
(NameLen == 11 && !strcmp(NameStr, "funlockfile")) ||
|
||||||
|
(NameLen == 12 && !strcmp(NameStr, "ftrylockfile"))) {
|
||||||
if (FTy->getNumParams() == 0 ||
|
if (FTy->getNumParams() == 0 ||
|
||||||
!isa<PointerType>(FTy->getParamType(0)))
|
!isa<PointerType>(FTy->getParamType(0)))
|
||||||
continue;
|
continue;
|
||||||
@@ -1867,7 +1894,11 @@ bool SimplifyLibCalls::doInitialization(Module &M) {
|
|||||||
setDoesNotCapture(F, 1);
|
setDoesNotCapture(F, 1);
|
||||||
setOnlyReadsMemory(F);
|
setOnlyReadsMemory(F);
|
||||||
} else if ((NameLen == 5 && !strcmp(NameStr, "fputc")) ||
|
} else if ((NameLen == 5 && !strcmp(NameStr, "fputc")) ||
|
||||||
(NameLen == 5 && !strcmp(NameStr, "fputs"))) {
|
(NameLen == 5 && !strcmp(NameStr, "fstat")) ||
|
||||||
|
(NameLen == 5 && !strcmp(NameStr, "frexp")) ||
|
||||||
|
(NameLen == 6 && !strcmp(NameStr, "frexpf")) ||
|
||||||
|
(NameLen == 6 && !strcmp(NameStr, "frexpl")) ||
|
||||||
|
(NameLen == 8 && !strcmp(NameStr, "fstatvfs"))) {
|
||||||
if (FTy->getNumParams() != 2 ||
|
if (FTy->getNumParams() != 2 ||
|
||||||
!isa<PointerType>(FTy->getParamType(1)))
|
!isa<PointerType>(FTy->getParamType(1)))
|
||||||
continue;
|
continue;
|
||||||
@@ -1889,15 +1920,10 @@ bool SimplifyLibCalls::doInitialization(Module &M) {
|
|||||||
setDoesNotThrow(F);
|
setDoesNotThrow(F);
|
||||||
setDoesNotCapture(F, 1);
|
setDoesNotCapture(F, 1);
|
||||||
setDoesNotCapture(F, 4);
|
setDoesNotCapture(F, 4);
|
||||||
} else if (NameLen == 7 && !strcmp(NameStr, "fgetpos")) {
|
} else if ((NameLen == 5 && !strcmp(NameStr, "fputs")) ||
|
||||||
if (FTy->getNumParams() != 2 ||
|
(NameLen == 6 && !strcmp(NameStr, "fscanf")) ||
|
||||||
!isa<PointerType>(FTy->getParamType(0)) ||
|
(NameLen == 7 && !strcmp(NameStr, "fprintf")) ||
|
||||||
!isa<PointerType>(FTy->getParamType(1)))
|
(NameLen == 7 && !strcmp(NameStr, "fgetpos"))) {
|
||||||
continue;
|
|
||||||
setDoesNotThrow(F);
|
|
||||||
setDoesNotCapture(F, 1);
|
|
||||||
setDoesNotCapture(F, 2);
|
|
||||||
} else if (NameLen == 6 && !strcmp(NameStr, "fscanf")) {
|
|
||||||
if (FTy->getNumParams() < 2 ||
|
if (FTy->getNumParams() < 2 ||
|
||||||
!isa<PointerType>(FTy->getParamType(0)) ||
|
!isa<PointerType>(FTy->getParamType(0)) ||
|
||||||
!isa<PointerType>(FTy->getParamType(1)))
|
!isa<PointerType>(FTy->getParamType(1)))
|
||||||
@@ -1905,19 +1931,12 @@ bool SimplifyLibCalls::doInitialization(Module &M) {
|
|||||||
setDoesNotThrow(F);
|
setDoesNotThrow(F);
|
||||||
setDoesNotCapture(F, 1);
|
setDoesNotCapture(F, 1);
|
||||||
setDoesNotCapture(F, 2);
|
setDoesNotCapture(F, 2);
|
||||||
} else if (NameLen == 7 && !strcmp(NameStr, "fprintf")) {
|
|
||||||
if (FTy->getNumParams() != 2 ||
|
|
||||||
!isa<PointerType>(FTy->getParamType(0)) ||
|
|
||||||
!isa<PointerType>(FTy->getParamType(1)))
|
|
||||||
continue;
|
|
||||||
setDoesNotThrow(F);
|
|
||||||
setDoesNotCapture(F, 1);
|
|
||||||
setDoesNotCapture(F, 2);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'g':
|
case 'g':
|
||||||
if ((NameLen == 4 && !strcmp(NameStr, "getc")) ||
|
if ((NameLen == 4 && !strcmp(NameStr, "getc")) ||
|
||||||
(NameLen == 10 && !strcmp(NameStr, "getlogin_r"))) {
|
(NameLen == 10 && !strcmp(NameStr, "getlogin_r")) ||
|
||||||
|
(NameLen == 13 && !strcmp(NameStr, "getc_unlocked"))) {
|
||||||
if (FTy->getNumParams() == 0 ||
|
if (FTy->getNumParams() == 0 ||
|
||||||
!isa<PointerType>(FTy->getParamType(0)))
|
!isa<PointerType>(FTy->getParamType(0)))
|
||||||
continue;
|
continue;
|
||||||
@@ -1933,6 +1952,18 @@ bool SimplifyLibCalls::doInitialization(Module &M) {
|
|||||||
} else if ((NameLen == 4 && !strcmp(NameStr, "gets")) ||
|
} else if ((NameLen == 4 && !strcmp(NameStr, "gets")) ||
|
||||||
(NameLen == 7 && !strcmp(NameStr, "getchar"))) {
|
(NameLen == 7 && !strcmp(NameStr, "getchar"))) {
|
||||||
setDoesNotThrow(F);
|
setDoesNotThrow(F);
|
||||||
|
} else if (NameLen == 9 && !strcmp(NameStr, "getitimer")) {
|
||||||
|
if (FTy->getNumParams() != 2 ||
|
||||||
|
!isa<PointerType>(FTy->getParamType(1)))
|
||||||
|
continue;
|
||||||
|
setDoesNotThrow(F);
|
||||||
|
setDoesNotCapture(F, 2);
|
||||||
|
} else if (NameLen == 8 && !strcmp(NameStr, "getpwnam")) {
|
||||||
|
if (FTy->getNumParams() != 1 ||
|
||||||
|
!isa<PointerType>(FTy->getParamType(0)))
|
||||||
|
continue;
|
||||||
|
setDoesNotThrow(F);
|
||||||
|
setDoesNotCapture(F, 1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'u':
|
case 'u':
|
||||||
@@ -1942,12 +1973,23 @@ bool SimplifyLibCalls::doInitialization(Module &M) {
|
|||||||
continue;
|
continue;
|
||||||
setDoesNotThrow(F);
|
setDoesNotThrow(F);
|
||||||
setDoesNotCapture(F, 2);
|
setDoesNotCapture(F, 2);
|
||||||
} else if (NameLen == 6 && !strcmp(NameStr, "unlink")) {
|
} else if ((NameLen == 5 && !strcmp(NameStr, "uname")) ||
|
||||||
|
(NameLen == 6 && !strcmp(NameStr, "unlink")) ||
|
||||||
|
(NameLen == 8 && !strcmp(NameStr, "unsetenv"))) {
|
||||||
if (FTy->getNumParams() != 1 ||
|
if (FTy->getNumParams() != 1 ||
|
||||||
!isa<PointerType>(FTy->getParamType(0)))
|
!isa<PointerType>(FTy->getParamType(0)))
|
||||||
continue;
|
continue;
|
||||||
setDoesNotThrow(F);
|
setDoesNotThrow(F);
|
||||||
setDoesNotCapture(F, 1);
|
setDoesNotCapture(F, 1);
|
||||||
|
} else if ((NameLen == 5 && !strcmp(NameStr, "utime")) ||
|
||||||
|
(NameLen == 6 && !strcmp(NameStr, "utimes"))) {
|
||||||
|
if (FTy->getNumParams() != 2 ||
|
||||||
|
!isa<PointerType>(FTy->getParamType(0)) ||
|
||||||
|
!isa<PointerType>(FTy->getParamType(1)))
|
||||||
|
continue;
|
||||||
|
setDoesNotThrow(F);
|
||||||
|
setDoesNotCapture(F, 1);
|
||||||
|
setDoesNotCapture(F, 2);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'p':
|
case 'p':
|
||||||
@@ -1974,6 +2016,22 @@ bool SimplifyLibCalls::doInitialization(Module &M) {
|
|||||||
setDoesNotCapture(F, 2);
|
setDoesNotCapture(F, 2);
|
||||||
} else if (NameLen == 7 && !strcmp(NameStr, "putchar")) {
|
} else if (NameLen == 7 && !strcmp(NameStr, "putchar")) {
|
||||||
setDoesNotThrow(F);
|
setDoesNotThrow(F);
|
||||||
|
} else if (NameLen == 5 && !strcmp(NameStr, "popen")) {
|
||||||
|
if (FTy->getNumParams() != 2 ||
|
||||||
|
!isa<PointerType>(FTy->getReturnType()) ||
|
||||||
|
!isa<PointerType>(FTy->getParamType(0)) ||
|
||||||
|
!isa<PointerType>(FTy->getParamType(1)))
|
||||||
|
continue;
|
||||||
|
setDoesNotThrow(F);
|
||||||
|
setDoesNotAlias(F, 0);
|
||||||
|
setDoesNotCapture(F, 1);
|
||||||
|
setDoesNotCapture(F, 2);
|
||||||
|
} else if (NameLen == 6 && !strcmp(NameStr, "pclose")) {
|
||||||
|
if (FTy->getNumParams() != 1 ||
|
||||||
|
!isa<PointerType>(FTy->getParamType(0)))
|
||||||
|
continue;
|
||||||
|
setDoesNotThrow(F);
|
||||||
|
setDoesNotCapture(F, 1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'v':
|
case 'v':
|
||||||
@@ -2023,13 +2081,20 @@ bool SimplifyLibCalls::doInitialization(Module &M) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'o':
|
case 'o':
|
||||||
if (NameLen == 7 && !strcmp(NameStr, "opendir")) {
|
if (NameLen == 4 && !strcmp(NameStr, "open")) {
|
||||||
// The description of fdopendir sounds like opening the same fd
|
if (FTy->getNumParams() < 2 ||
|
||||||
// twice might result in the same DIR* !
|
!isa<PointerType>(FTy->getParamType(0)))
|
||||||
if (!isa<PointerType>(FTy->getReturnType()))
|
continue;
|
||||||
|
// May throw; "open" is a valid pthread cancellation point.
|
||||||
|
setDoesNotCapture(F, 1);
|
||||||
|
} else if (NameLen == 7 && !strcmp(NameStr, "opendir")) {
|
||||||
|
if (FTy->getNumParams() != 1 ||
|
||||||
|
!isa<PointerType>(FTy->getReturnType()) ||
|
||||||
|
!isa<PointerType>(FTy->getParamType(0)))
|
||||||
continue;
|
continue;
|
||||||
setDoesNotThrow(F);
|
setDoesNotThrow(F);
|
||||||
setDoesNotAlias(F, 0);
|
setDoesNotAlias(F, 0);
|
||||||
|
setDoesNotCapture(F, 1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 't':
|
case 't':
|
||||||
@@ -2038,7 +2103,14 @@ bool SimplifyLibCalls::doInitialization(Module &M) {
|
|||||||
continue;
|
continue;
|
||||||
setDoesNotThrow(F);
|
setDoesNotThrow(F);
|
||||||
setDoesNotAlias(F, 0);
|
setDoesNotAlias(F, 0);
|
||||||
|
} else if (NameLen == 5 && !strcmp(NameStr, "times")) {
|
||||||
|
if (FTy->getNumParams() != 1 ||
|
||||||
|
!isa<PointerType>(FTy->getParamType(0)))
|
||||||
|
continue;
|
||||||
|
setDoesNotThrow(F);
|
||||||
|
setDoesNotCapture(F, 1);
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
case 'h':
|
case 'h':
|
||||||
if ((NameLen == 5 && !strcmp(NameStr, "htonl")) ||
|
if ((NameLen == 5 && !strcmp(NameStr, "htonl")) ||
|
||||||
(NameLen == 5 && !strcmp(NameStr, "htons"))) {
|
(NameLen == 5 && !strcmp(NameStr, "htons"))) {
|
||||||
@@ -2052,6 +2124,33 @@ bool SimplifyLibCalls::doInitialization(Module &M) {
|
|||||||
setDoesNotThrow(F);
|
setDoesNotThrow(F);
|
||||||
setDoesNotAccessMemory(F);
|
setDoesNotAccessMemory(F);
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case 'l':
|
||||||
|
if (NameLen == 5 && !strcmp(NameStr, "lstat")) {
|
||||||
|
if (FTy->getNumParams() != 2 ||
|
||||||
|
!isa<PointerType>(FTy->getParamType(0)) ||
|
||||||
|
!isa<PointerType>(FTy->getParamType(1)))
|
||||||
|
continue;
|
||||||
|
setDoesNotThrow(F);
|
||||||
|
setDoesNotCapture(F, 1);
|
||||||
|
setDoesNotCapture(F, 2);
|
||||||
|
} else if (NameLen == 6 && !strcmp(NameStr, "lchown")) {
|
||||||
|
if (FTy->getNumParams() != 3 ||
|
||||||
|
!isa<PointerType>(FTy->getParamType(0)))
|
||||||
|
continue;
|
||||||
|
setDoesNotThrow(F);
|
||||||
|
setDoesNotCapture(F, 1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'q':
|
||||||
|
if (NameLen == 5 && !strcmp(NameStr, "qsort")) {
|
||||||
|
if (FTy->getNumParams() != 4 ||
|
||||||
|
!isa<PointerType>(FTy->getParamType(3)))
|
||||||
|
continue;
|
||||||
|
// May throw; places call through function pointer.
|
||||||
|
setDoesNotCapture(F, 4);
|
||||||
|
}
|
||||||
|
break;
|
||||||
case '_':
|
case '_':
|
||||||
if ((NameLen == 8 && !strcmp(NameStr, "__strdup")) ||
|
if ((NameLen == 8 && !strcmp(NameStr, "__strdup")) ||
|
||||||
(NameLen == 9 && !strcmp(NameStr, "__strndup"))) {
|
(NameLen == 9 && !strcmp(NameStr, "__strndup"))) {
|
||||||
@@ -2081,6 +2180,7 @@ bool SimplifyLibCalls::doInitialization(Module &M) {
|
|||||||
setDoesNotThrow(F);
|
setDoesNotThrow(F);
|
||||||
setDoesNotCapture(F, 2);
|
setDoesNotCapture(F, 2);
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
if (NameLen == 15 && !strcmp(NameStr, "\1__isoc99_scanf")) {
|
if (NameLen == 15 && !strcmp(NameStr, "\1__isoc99_scanf")) {
|
||||||
if (FTy->getNumParams() < 1 ||
|
if (FTy->getNumParams() < 1 ||
|
||||||
@@ -2088,13 +2188,52 @@ bool SimplifyLibCalls::doInitialization(Module &M) {
|
|||||||
continue;
|
continue;
|
||||||
setDoesNotThrow(F);
|
setDoesNotThrow(F);
|
||||||
setDoesNotCapture(F, 1);
|
setDoesNotCapture(F, 1);
|
||||||
} else if (NameLen == 16 && !strcmp(NameStr, "\1__isoc99_sscanf")) {
|
} else if ((NameLen == 7 && !strcmp(NameStr, "\1stat64")) ||
|
||||||
|
(NameLen == 8 && !strcmp(NameStr, "\1lstat64")) ||
|
||||||
|
(NameLen == 10 && !strcmp(NameStr, "\1statvfs64")) ||
|
||||||
|
(NameLen == 16 && !strcmp(NameStr, "\1__isoc99_sscanf"))) {
|
||||||
if (FTy->getNumParams() < 1 ||
|
if (FTy->getNumParams() < 1 ||
|
||||||
!isa<PointerType>(FTy->getParamType(0)))
|
!isa<PointerType>(FTy->getParamType(0)) ||
|
||||||
|
!isa<PointerType>(FTy->getParamType(1)))
|
||||||
continue;
|
continue;
|
||||||
setDoesNotThrow(F);
|
setDoesNotThrow(F);
|
||||||
setDoesNotCapture(F, 1);
|
setDoesNotCapture(F, 1);
|
||||||
setDoesNotCapture(F, 2);
|
setDoesNotCapture(F, 2);
|
||||||
|
} else if (NameLen == 8 && !strcmp(NameStr, "\1fopen64")) {
|
||||||
|
if (FTy->getNumParams() != 2 ||
|
||||||
|
!isa<PointerType>(FTy->getReturnType()) ||
|
||||||
|
!isa<PointerType>(FTy->getParamType(0)) ||
|
||||||
|
!isa<PointerType>(FTy->getParamType(1)))
|
||||||
|
continue;
|
||||||
|
setDoesNotThrow(F);
|
||||||
|
setDoesNotAlias(F, 0);
|
||||||
|
setDoesNotCapture(F, 1);
|
||||||
|
setDoesNotCapture(F, 2);
|
||||||
|
} else if ((NameLen == 9 && !strcmp(NameStr, "\1fseeko64")) ||
|
||||||
|
(NameLen == 9 && !strcmp(NameStr, "\1ftello64"))) {
|
||||||
|
if (FTy->getNumParams() == 0 ||
|
||||||
|
!isa<PointerType>(FTy->getParamType(0)))
|
||||||
|
continue;
|
||||||
|
setDoesNotThrow(F);
|
||||||
|
setDoesNotCapture(F, 1);
|
||||||
|
} else if (NameLen == 10 && !strcmp(NameStr, "\1tmpfile64")) {
|
||||||
|
if (!isa<PointerType>(FTy->getReturnType()))
|
||||||
|
continue;
|
||||||
|
setDoesNotThrow(F);
|
||||||
|
setDoesNotAlias(F, 0);
|
||||||
|
} else if ((NameLen == 8 && !strcmp(NameStr, "\1fstat64")) ||
|
||||||
|
(NameLen == 11 && !strcmp(NameStr, "\1fstatvfs64"))) {
|
||||||
|
if (FTy->getNumParams() != 2 ||
|
||||||
|
!isa<PointerType>(FTy->getParamType(1)))
|
||||||
|
continue;
|
||||||
|
setDoesNotThrow(F);
|
||||||
|
setDoesNotCapture(F, 2);
|
||||||
|
} else if (NameLen == 7 && !strcmp(NameStr, "\1open64")) {
|
||||||
|
if (FTy->getNumParams() < 2 ||
|
||||||
|
!isa<PointerType>(FTy->getParamType(0)))
|
||||||
|
continue;
|
||||||
|
// May throw; "open" is a valid pthread cancellation point.
|
||||||
|
setDoesNotCapture(F, 1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user