From: Nick Lewycky Date: Sun, 18 Jan 2009 04:34:36 +0000 (+0000) Subject: Fix copy and pasted typos that prevented strtok_r, realloc, getenv, ungetc, X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=0b6679d32ff86d8fec964110e5293798369c98e6;p=oota-llvm.git 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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@62456 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/SimplifyLibCalls.cpp b/lib/Transforms/Scalar/SimplifyLibCalls.cpp index 2c0008e6f1f..dba0c553069 100644 --- a/lib/Transforms/Scalar/SimplifyLibCalls.cpp +++ b/lib/Transforms/Scalar/SimplifyLibCalls.cpp @@ -1612,7 +1612,7 @@ bool SimplifyLibCalls::doInitialization(Module &M) { 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(FTy->getParamType(1))) continue; @@ -1643,6 +1643,22 @@ bool SimplifyLibCalls::doInitialization(Module &M) { setDoesNotThrow(F); setDoesNotAlias(F, 0); setDoesNotCapture(F, 1); + } else if (NameLen == 7 && !strcmp(NameStr, "sprintf")) { + if (FTy->getNumParams() != 2 || + !isa(FTy->getParamType(0)) || + !isa(FTy->getParamType(1))) + continue; + setDoesNotThrow(F); + setDoesNotCapture(F, 1); + setDoesNotCapture(F, 2); + } else if (NameLen == 8 && !strcmp(NameStr, "snprintf")) { + if (FTy->getNumParams() != 3 || + !isa(FTy->getParamType(0)) || + !isa(FTy->getParamType(2))) + continue; + setDoesNotThrow(F); + setDoesNotCapture(F, 1); + setDoesNotCapture(F, 3); } break; case 'm': @@ -1669,11 +1685,15 @@ bool SimplifyLibCalls::doInitialization(Module &M) { continue; setDoesNotThrow(F); setDoesNotCapture(F, 2); + } else if (NameLen == 8 && !strcmp(NameStr, "memalign")) { + if (!isa(FTy->getReturnType())) + continue; + setDoesNotAlias(F, 0); } break; case 'r': if (NameLen == 7 && !strcmp(NameStr, "realloc")) { - if (FTy->getNumParams() != 1 || + if (FTy->getNumParams() != 2 || !isa(FTy->getParamType(0)) || !isa(FTy->getReturnType())) continue; @@ -1684,7 +1704,7 @@ bool SimplifyLibCalls::doInitialization(Module &M) { if (FTy->getNumParams() != 3 || !isa(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 @@ bool SimplifyLibCalls::doInitialization(Module &M) { if (FTy->getNumParams() != 3 || !isa(FTy->getParamType(1))) continue; - setDoesNotThrow(F); + // May throw; "write" is a valid pthread cancellation point. setDoesNotCapture(F, 2); } break; @@ -1776,12 +1796,24 @@ bool SimplifyLibCalls::doInitialization(Module &M) { } break; case 'f': - if ((NameLen == 5 && !strcmp(NameStr, "fopen")) || - (NameLen == 6 && !strcmp(NameStr, "fdopen"))) { - if (!isa(FTy->getReturnType())) + if (NameLen == 5 && !strcmp(NameStr, "fopen")) { + if (FTy->getNumParams() != 2 || + !isa(FTy->getReturnType()) || + !isa(FTy->getParamType(0)) || + !isa(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(FTy->getReturnType()) || + !isa(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 @@ bool SimplifyLibCalls::doInitialization(Module &M) { (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(FTy->getParamType(0))) continue; setDoesNotThrow(F); setDoesNotCapture(F, 1); + } else if (NameLen == 6 && !strcmp(NameStr, "ferror")) { + if (FTy->getNumParams() != 1 || + !isa(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 @@ bool SimplifyLibCalls::doInitialization(Module &M) { 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(FTy->getParamType(0)) || !isa(FTy->getParamType(1))) @@ -1838,6 +1876,14 @@ bool SimplifyLibCalls::doInitialization(Module &M) { setDoesNotThrow(F); setDoesNotCapture(F, 1); setDoesNotCapture(F, 2); + } else if (NameLen == 7 && !strcmp(NameStr, "fprintf")) { + if (FTy->getNumParams() != 2 || + !isa(FTy->getParamType(0)) || + !isa(FTy->getParamType(1))) + continue; + setDoesNotThrow(F); + setDoesNotCapture(F, 1); + setDoesNotCapture(F, 2); } break; case 'g': @@ -1849,23 +1895,26 @@ bool SimplifyLibCalls::doInitialization(Module &M) { setDoesNotThrow(F); setDoesNotCapture(F, 1); } else if (NameLen == 6 && !strcmp(NameStr, "getenv")) { - if (!FTy->getNumParams() != 1 || + if (FTy->getNumParams() != 1 || !isa(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(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(FTy->getParamType(0))) continue; setDoesNotThrow(F); @@ -1874,44 +1923,81 @@ bool SimplifyLibCalls::doInitialization(Module &M) { break; case 'p': if (NameLen == 4 && !strcmp(NameStr, "putc")) { - if (!FTy->getNumParams() != 2 || + if (FTy->getNumParams() != 2 || !isa(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(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(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(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(FTy->getParamType(1)) || !isa(FTy->getParamType(2))) continue; setDoesNotThrow(F); setDoesNotCapture(F, 1); setDoesNotCapture(F, 2); + } else if (NameLen == 6 && !strcmp(NameStr, "valloc")) { + if (!isa(FTy->getReturnType())) + continue; + setDoesNotThrow(F); + setDoesNotAlias(F, 0); + } else if (NameLen == 7 && !strcmp(NameStr, "vprintf")) { + if (FTy->getNumParams() != 2 || + !isa(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(FTy->getParamType(0)) || + !isa(FTy->getParamType(1))) + continue; + setDoesNotThrow(F); + setDoesNotCapture(F, 1); + setDoesNotCapture(F, 2); + } else if (NameLen == 9 && !strcmp(NameStr, "vsnprintf")) { + if (FTy->getNumParams() != 4 || + !isa(FTy->getParamType(0)) || + !isa(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(FTy->getParamType(1))) + if (!isa(FTy->getReturnType())) continue; setDoesNotThrow(F); setDoesNotAlias(F, 0); @@ -1937,6 +2023,50 @@ bool SimplifyLibCalls::doInitialization(Module &M) { setDoesNotThrow(F); setDoesNotAccessMemory(F); } + case '_': + if ((NameLen == 8 && !strcmp(NameStr, "__strdup")) || + (NameLen == 9 && !strcmp(NameStr, "__strndup"))) { + if (FTy->getNumParams() < 1 || + !isa(FTy->getReturnType()) || + !isa(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(FTy->getParamType(1))) + continue; + setDoesNotThrow(F); + setDoesNotCapture(F, 2); + } else if (NameLen == 8 && !strcmp(NameStr, "_IO_getc")) { + if (FTy->getNumParams() != 1 || + !isa(FTy->getParamType(0))) + continue; + setDoesNotThrow(F); + setDoesNotCapture(F, 1); + } else if (NameLen == 8 && !strcmp(NameStr, "_IO_putc")) { + if (FTy->getNumParams() != 2 || + !isa(FTy->getParamType(1))) + continue; + setDoesNotThrow(F); + setDoesNotCapture(F, 2); + } + case 1: + if (NameLen == 15 && !strcmp(NameStr, "\1__isoc99_scanf")) { + if (FTy->getNumParams() < 1 || + !isa(FTy->getParamType(0))) + continue; + setDoesNotThrow(F); + setDoesNotCapture(F, 1); + } else if (NameLen == 16 && !strcmp(NameStr, "\1__isoc99_sscanf")) { + if (FTy->getNumParams() < 1 || + !isa(FTy->getParamType(0))) + continue; + setDoesNotThrow(F); + setDoesNotCapture(F, 1); + setDoesNotCapture(F, 2); + } break; } }