[llvm-commits] [llvm] r62456 - /llvm/trunk/lib/Transforms/Scalar/SimplifyLibCalls.cpp
Nick Lewycky
nicholas at mxc.ca
Sat Jan 17 20:34:41 PST 2009
Author: nicholas
Date: Sat Jan 17 22:34:36 2009
New Revision: 62456
URL: http://llvm.org/viewvc/llvm-project?rev=62456&view=rev
Log:
Fix copy and pasted typos that prevented strtok_r, realloc, getenv, ungetc,
putc, puts, perror, vscanf and vsscanf from getting annotations.
Add annotations for eight printf functions, memalign, pread and pwrite.
On Linux, llvm-gcc sometimes renames strdup, getc, putc, strtok_r, scanf and
sscanf. Match the alternate function names.
Fix a crash annotating opendir.
Don't mark fsetpos's second parameter as nocapture. It's supposed to be
captured.
Do mark fopen's path and mode strings as nocapture. Mark ferror as readonly,
but not fileno which may set errno.
Modified:
llvm/trunk/lib/Transforms/Scalar/SimplifyLibCalls.cpp
Modified: llvm/trunk/lib/Transforms/Scalar/SimplifyLibCalls.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/SimplifyLibCalls.cpp?rev=62456&r1=62455&r2=62456&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/SimplifyLibCalls.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/SimplifyLibCalls.cpp Sat Jan 17 22:34:36 2009
@@ -1612,7 +1612,7 @@
setDoesNotThrow(F);
setDoesNotCapture(F, 2);
} else if ((NameLen == 6 && !strcmp(NameStr, "strtok")) ||
- (NameLen == 7 && !strcmp(NameStr, "strtok_r"))) {
+ (NameLen == 8 && !strcmp(NameStr, "strtok_r"))) {
if (FTy->getNumParams() < 2 ||
!isa<PointerType>(FTy->getParamType(1)))
continue;
@@ -1643,6 +1643,22 @@
setDoesNotThrow(F);
setDoesNotAlias(F, 0);
setDoesNotCapture(F, 1);
+ } else if (NameLen == 7 && !strcmp(NameStr, "sprintf")) {
+ 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 == 8 && !strcmp(NameStr, "snprintf")) {
+ if (FTy->getNumParams() != 3 ||
+ !isa<PointerType>(FTy->getParamType(0)) ||
+ !isa<PointerType>(FTy->getParamType(2)))
+ continue;
+ setDoesNotThrow(F);
+ setDoesNotCapture(F, 1);
+ setDoesNotCapture(F, 3);
}
break;
case 'm':
@@ -1669,11 +1685,15 @@
continue;
setDoesNotThrow(F);
setDoesNotCapture(F, 2);
+ } else if (NameLen == 8 && !strcmp(NameStr, "memalign")) {
+ if (!isa<PointerType>(FTy->getReturnType()))
+ continue;
+ setDoesNotAlias(F, 0);
}
break;
case 'r':
if (NameLen == 7 && !strcmp(NameStr, "realloc")) {
- if (FTy->getNumParams() != 1 ||
+ if (FTy->getNumParams() != 2 ||
!isa<PointerType>(FTy->getParamType(0)) ||
!isa<PointerType>(FTy->getReturnType()))
continue;
@@ -1684,7 +1704,7 @@
if (FTy->getNumParams() != 3 ||
!isa<PointerType>(FTy->getParamType(1)))
continue;
- setDoesNotThrow(F);
+ // May throw; "read" is a valid pthread cancellation point.
setDoesNotCapture(F, 2);
} else if ((NameLen == 5 && !strcmp(NameStr, "rmdir")) ||
(NameLen == 6 && !strcmp(NameStr, "rewind")) ||
@@ -1709,7 +1729,7 @@
if (FTy->getNumParams() != 3 ||
!isa<PointerType>(FTy->getParamType(1)))
continue;
- setDoesNotThrow(F);
+ // May throw; "write" is a valid pthread cancellation point.
setDoesNotCapture(F, 2);
}
break;
@@ -1776,12 +1796,24 @@
}
break;
case 'f':
- if ((NameLen == 5 && !strcmp(NameStr, "fopen")) ||
- (NameLen == 6 && !strcmp(NameStr, "fdopen"))) {
- if (!isa<PointerType>(FTy->getReturnType()))
+ if (NameLen == 5 && !strcmp(NameStr, "fopen")) {
+ 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, "fdopen")) {
+ if (FTy->getNumParams() != 2 ||
+ !isa<PointerType>(FTy->getReturnType()) ||
+ !isa<PointerType>(FTy->getParamType(1)))
+ continue;
+ setDoesNotThrow(F);
+ setDoesNotAlias(F, 0);
+ setDoesNotCapture(F, 2);
} else if ((NameLen == 4 && !strcmp(NameStr, "feof")) ||
(NameLen == 4 && !strcmp(NameStr, "free")) ||
(NameLen == 5 && !strcmp(NameStr, "fseek")) ||
@@ -1789,15 +1821,22 @@
(NameLen == 5 && !strcmp(NameStr, "fgetc")) ||
(NameLen == 6 && !strcmp(NameStr, "fseeko")) ||
(NameLen == 6 && !strcmp(NameStr, "ftello")) ||
- (NameLen == 6 && !strcmp(NameStr, "ferror")) ||
(NameLen == 6 && !strcmp(NameStr, "fileno")) ||
(NameLen == 6 && !strcmp(NameStr, "fflush")) ||
- (NameLen == 6 && !strcmp(NameStr, "fclose"))) {
+ (NameLen == 6 && !strcmp(NameStr, "fclose")) ||
+ (NameLen == 7 && !strcmp(NameStr, "fsetpos"))) {
if (FTy->getNumParams() == 0 ||
!isa<PointerType>(FTy->getParamType(0)))
continue;
setDoesNotThrow(F);
setDoesNotCapture(F, 1);
+ } else if (NameLen == 6 && !strcmp(NameStr, "ferror")) {
+ if (FTy->getNumParams() != 1 ||
+ !isa<PointerType>(FTy->getParamType(0)))
+ continue;
+ setDoesNotThrow(F);
+ setDoesNotCapture(F, 1);
+ setOnlyReadsMemory(F);
} else if ((NameLen == 5 && !strcmp(NameStr, "fputc")) ||
(NameLen == 5 && !strcmp(NameStr, "fputs"))) {
if (FTy->getNumParams() != 2 ||
@@ -1821,8 +1860,7 @@
setDoesNotThrow(F);
setDoesNotCapture(F, 1);
setDoesNotCapture(F, 4);
- } else if ((NameLen == 7 && !strcmp(NameStr, "fgetpos")) ||
- (NameLen == 7 && !strcmp(NameStr, "fsetpos"))) {
+ } else if (NameLen == 7 && !strcmp(NameStr, "fgetpos")) {
if (FTy->getNumParams() != 2 ||
!isa<PointerType>(FTy->getParamType(0)) ||
!isa<PointerType>(FTy->getParamType(1)))
@@ -1838,6 +1876,14 @@
setDoesNotThrow(F);
setDoesNotCapture(F, 1);
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;
case 'g':
@@ -1849,23 +1895,26 @@
setDoesNotThrow(F);
setDoesNotCapture(F, 1);
} else if (NameLen == 6 && !strcmp(NameStr, "getenv")) {
- if (!FTy->getNumParams() != 1 ||
+ if (FTy->getNumParams() != 1 ||
!isa<PointerType>(FTy->getParamType(0)))
continue;
setDoesNotThrow(F);
setOnlyReadsMemory(F);
- setDoesNotCapture(F, 0);
+ setDoesNotCapture(F, 1);
+ } else if ((NameLen == 4 && !strcmp(NameStr, "gets")) ||
+ (NameLen == 7 && !strcmp(NameStr, "getchar"))) {
+ setDoesNotThrow(F);
}
break;
case 'u':
- if (NameLen == 4 && !strcmp(NameStr, "ungetc")) {
- if (!FTy->getNumParams() != 2 ||
+ if (NameLen == 6 && !strcmp(NameStr, "ungetc")) {
+ if (FTy->getNumParams() != 2 ||
!isa<PointerType>(FTy->getParamType(1)))
continue;
setDoesNotThrow(F);
setDoesNotCapture(F, 2);
} else if (NameLen == 6 && !strcmp(NameStr, "unlink")) {
- if (!FTy->getNumParams() != 1 ||
+ if (FTy->getNumParams() != 1 ||
!isa<PointerType>(FTy->getParamType(0)))
continue;
setDoesNotThrow(F);
@@ -1874,44 +1923,81 @@
break;
case 'p':
if (NameLen == 4 && !strcmp(NameStr, "putc")) {
- if (!FTy->getNumParams() != 2 ||
+ if (FTy->getNumParams() != 2 ||
!isa<PointerType>(FTy->getParamType(1)))
continue;
setDoesNotThrow(F);
setDoesNotCapture(F, 2);
} else if ((NameLen == 4 && !strcmp(NameStr, "puts")) ||
+ (NameLen == 6 && !strcmp(NameStr, "printf")) ||
(NameLen == 6 && !strcmp(NameStr, "perror"))) {
- if (!FTy->getNumParams() != 1 ||
+ if (FTy->getNumParams() != 1 ||
!isa<PointerType>(FTy->getParamType(0)))
continue;
setDoesNotThrow(F);
setDoesNotCapture(F, 1);
+ } else if ((NameLen == 5 && !strcmp(NameStr, "pread")) ||
+ (NameLen == 6 && !strcmp(NameStr, "pwrite"))) {
+ if (FTy->getNumParams() != 4 ||
+ !isa<PointerType>(FTy->getParamType(1)))
+ continue;
+ // May throw; these are valid pthread cancellation points.
+ setDoesNotCapture(F, 2);
+ } else if (NameLen == 7 && !strcmp(NameStr, "putchar")) {
+ setDoesNotThrow(F);
}
break;
case 'v':
if (NameLen == 6 && !strcmp(NameStr, "vscanf")) {
- if (!FTy->getNumParams() != 2 ||
+ if (FTy->getNumParams() != 2 ||
!isa<PointerType>(FTy->getParamType(1)))
continue;
setDoesNotThrow(F);
setDoesNotCapture(F, 1);
} else if ((NameLen == 7 && !strcmp(NameStr, "vsscanf")) ||
(NameLen == 7 && !strcmp(NameStr, "vfscanf"))) {
- if (!FTy->getNumParams() != 4 ||
+ if (FTy->getNumParams() != 3 ||
!isa<PointerType>(FTy->getParamType(1)) ||
!isa<PointerType>(FTy->getParamType(2)))
continue;
setDoesNotThrow(F);
setDoesNotCapture(F, 1);
setDoesNotCapture(F, 2);
+ } else if (NameLen == 6 && !strcmp(NameStr, "valloc")) {
+ if (!isa<PointerType>(FTy->getReturnType()))
+ continue;
+ setDoesNotThrow(F);
+ setDoesNotAlias(F, 0);
+ } else if (NameLen == 7 && !strcmp(NameStr, "vprintf")) {
+ if (FTy->getNumParams() != 2 ||
+ !isa<PointerType>(FTy->getParamType(0)))
+ continue;
+ setDoesNotThrow(F);
+ setDoesNotCapture(F, 1);
+ } else if ((NameLen == 8 && !strcmp(NameStr, "vfprintf")) ||
+ (NameLen == 8 && !strcmp(NameStr, "vsprintf"))) {
+ if (FTy->getNumParams() != 3 ||
+ !isa<PointerType>(FTy->getParamType(0)) ||
+ !isa<PointerType>(FTy->getParamType(1)))
+ continue;
+ setDoesNotThrow(F);
+ setDoesNotCapture(F, 1);
+ setDoesNotCapture(F, 2);
+ } else if (NameLen == 9 && !strcmp(NameStr, "vsnprintf")) {
+ if (FTy->getNumParams() != 4 ||
+ !isa<PointerType>(FTy->getParamType(0)) ||
+ !isa<PointerType>(FTy->getParamType(2)))
+ continue;
+ setDoesNotThrow(F);
+ setDoesNotCapture(F, 1);
+ setDoesNotCapture(F, 3);
}
break;
case 'o':
if (NameLen == 7 && !strcmp(NameStr, "opendir")) {
// The description of fdopendir sounds like opening the same fd
// twice might result in the same DIR* !
- if (FTy->getNumParams() != 1 ||
- !isa<PointerType>(FTy->getParamType(1)))
+ if (!isa<PointerType>(FTy->getReturnType()))
continue;
setDoesNotThrow(F);
setDoesNotAlias(F, 0);
@@ -1937,6 +2023,50 @@
setDoesNotThrow(F);
setDoesNotAccessMemory(F);
}
+ case '_':
+ if ((NameLen == 8 && !strcmp(NameStr, "__strdup")) ||
+ (NameLen == 9 && !strcmp(NameStr, "__strndup"))) {
+ if (FTy->getNumParams() < 1 ||
+ !isa<PointerType>(FTy->getReturnType()) ||
+ !isa<PointerType>(FTy->getParamType(0)))
+ continue;
+ setDoesNotThrow(F);
+ setDoesNotAlias(F, 0);
+ setDoesNotCapture(F, 1);
+ } else if (NameLen == 10 && !strcmp(NameStr, "__strtok_r")) {
+ if (FTy->getNumParams() != 3 ||
+ !isa<PointerType>(FTy->getParamType(1)))
+ continue;
+ setDoesNotThrow(F);
+ setDoesNotCapture(F, 2);
+ } else if (NameLen == 8 && !strcmp(NameStr, "_IO_getc")) {
+ if (FTy->getNumParams() != 1 ||
+ !isa<PointerType>(FTy->getParamType(0)))
+ continue;
+ setDoesNotThrow(F);
+ setDoesNotCapture(F, 1);
+ } else if (NameLen == 8 && !strcmp(NameStr, "_IO_putc")) {
+ if (FTy->getNumParams() != 2 ||
+ !isa<PointerType>(FTy->getParamType(1)))
+ continue;
+ setDoesNotThrow(F);
+ setDoesNotCapture(F, 2);
+ }
+ case 1:
+ if (NameLen == 15 && !strcmp(NameStr, "\1__isoc99_scanf")) {
+ if (FTy->getNumParams() < 1 ||
+ !isa<PointerType>(FTy->getParamType(0)))
+ continue;
+ setDoesNotThrow(F);
+ setDoesNotCapture(F, 1);
+ } else if (NameLen == 16 && !strcmp(NameStr, "\1__isoc99_sscanf")) {
+ if (FTy->getNumParams() < 1 ||
+ !isa<PointerType>(FTy->getParamType(0)))
+ continue;
+ setDoesNotThrow(F);
+ setDoesNotCapture(F, 1);
+ setDoesNotCapture(F, 2);
+ }
break;
}
}
More information about the llvm-commits
mailing list