[TLI] Fix NumParams==0 prototype checking typo.
There was a typo in r267758. It caused invalid accesses when
given something like "void @free(...)", as NumParams == 0, and
we then try to look at the 0th parameter.
Turns out, most of these were untested; add both attribute
and missing-prototype checks for all libc libfuncs.
Differential Revision: http://reviews.llvm.org/D20543
llvm-svn: 270750
diff --git a/llvm/lib/Analysis/TargetLibraryInfo.cpp b/llvm/lib/Analysis/TargetLibraryInfo.cpp
index 71f15b15..2b5947f 100644
--- a/llvm/lib/Analysis/TargetLibraryInfo.cpp
+++ b/llvm/lib/Analysis/TargetLibraryInfo.cpp
@@ -662,10 +662,6 @@
return (NumParams >= 2 && FTy.getParamType(1)->isPointerTy());
case LibFunc::memalign:
return (FTy.getReturnType()->isPointerTy());
- case LibFunc::mkdir:
- return (NumParams == 0 && FTy.getParamType(0)->isPointerTy());
- case LibFunc::mktime:
- return (NumParams == 0 && FTy.getParamType(0)->isPointerTy());
case LibFunc::realloc:
return (NumParams == 2 && FTy.getParamType(0)->isPointerTy() &&
FTy.getReturnType()->isPointerTy());
@@ -695,18 +691,53 @@
return (NumParams == 2 && FTy.getParamType(0)->isPointerTy());
case LibFunc::calloc:
return (NumParams == 2 && FTy.getReturnType()->isPointerTy());
- case LibFunc::chmod:
- case LibFunc::chown:
- return (NumParams == 0 && FTy.getParamType(0)->isPointerTy());
- case LibFunc::ctermid:
- case LibFunc::clearerr:
- case LibFunc::closedir:
- return (NumParams == 0 && FTy.getParamType(0)->isPointerTy());
+
+ case LibFunc::atof:
case LibFunc::atoi:
case LibFunc::atol:
- case LibFunc::atof:
case LibFunc::atoll:
+ case LibFunc::ferror:
+ case LibFunc::fseeko64:
+ case LibFunc::ftello64:
+ case LibFunc::getenv:
+ case LibFunc::getpwnam:
+ case LibFunc::pclose:
+ case LibFunc::perror:
+ case LibFunc::printf:
+ case LibFunc::puts:
+ case LibFunc::uname:
+ case LibFunc::under_IO_getc:
+ case LibFunc::unlink:
+ case LibFunc::unsetenv:
return (NumParams == 1 && FTy.getParamType(0)->isPointerTy());
+
+ case LibFunc::chmod:
+ case LibFunc::chown:
+ case LibFunc::clearerr:
+ case LibFunc::closedir:
+ case LibFunc::ctermid:
+ case LibFunc::fclose:
+ case LibFunc::feof:
+ case LibFunc::fflush:
+ case LibFunc::fgetc:
+ case LibFunc::fileno:
+ case LibFunc::flockfile:
+ case LibFunc::free:
+ case LibFunc::fseek:
+ case LibFunc::fseeko:
+ case LibFunc::fsetpos:
+ case LibFunc::ftell:
+ case LibFunc::ftello:
+ case LibFunc::ftrylockfile:
+ case LibFunc::funlockfile:
+ case LibFunc::getc:
+ case LibFunc::getc_unlocked:
+ case LibFunc::getlogin_r:
+ case LibFunc::mkdir:
+ case LibFunc::mktime:
+ case LibFunc::times:
+ return (NumParams != 0 && FTy.getParamType(0)->isPointerTy());
+
case LibFunc::access:
return (NumParams == 2 && FTy.getParamType(0)->isPointerTy());
case LibFunc::fopen:
@@ -716,23 +747,6 @@
case LibFunc::fdopen:
return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
FTy.getParamType(1)->isPointerTy());
- case LibFunc::feof:
- case LibFunc::free:
- case LibFunc::fseek:
- case LibFunc::ftell:
- case LibFunc::fgetc:
- case LibFunc::fseeko:
- case LibFunc::ftello:
- case LibFunc::fileno:
- case LibFunc::fflush:
- case LibFunc::fclose:
- case LibFunc::fsetpos:
- case LibFunc::flockfile:
- case LibFunc::funlockfile:
- case LibFunc::ftrylockfile:
- return (NumParams == 0 && FTy.getParamType(0)->isPointerTy());
- case LibFunc::ferror:
- return (NumParams == 1 && FTy.getParamType(0)->isPointerTy());
case LibFunc::fputc:
case LibFunc::fstat:
case LibFunc::frexp:
@@ -762,46 +776,25 @@
case LibFunc::fgetpos:
return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
FTy.getParamType(1)->isPointerTy());
- case LibFunc::getc:
- case LibFunc::getlogin_r:
- case LibFunc::getc_unlocked:
- return (NumParams == 0 && FTy.getParamType(0)->isPointerTy());
- case LibFunc::getenv:
- return (NumParams == 1 && FTy.getParamType(0)->isPointerTy());
case LibFunc::gets:
case LibFunc::getchar:
case LibFunc::getitimer:
return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
- case LibFunc::getpwnam:
- return (NumParams == 1 && FTy.getParamType(0)->isPointerTy());
case LibFunc::ungetc:
return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
- case LibFunc::uname:
- return (NumParams == 1 && FTy.getParamType(0)->isPointerTy());
- case LibFunc::unlink:
- return (NumParams == 1 && FTy.getParamType(0)->isPointerTy());
- case LibFunc::unsetenv:
- return (NumParams == 1 && FTy.getParamType(0)->isPointerTy());
case LibFunc::utime:
case LibFunc::utimes:
return (NumParams == 2 && FTy.getParamType(0)->isPointerTy() &&
FTy.getParamType(1)->isPointerTy());
case LibFunc::putc:
return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
- case LibFunc::puts:
- case LibFunc::printf:
- case LibFunc::perror:
- return (NumParams == 1 && FTy.getParamType(0)->isPointerTy());
case LibFunc::pread:
case LibFunc::pwrite:
return (NumParams == 4 && FTy.getParamType(1)->isPointerTy());
- case LibFunc::putchar:
case LibFunc::popen:
return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
FTy.getParamType(0)->isPointerTy() &&
FTy.getParamType(1)->isPointerTy());
- case LibFunc::pclose:
- return (NumParams == 1 && FTy.getParamType(0)->isPointerTy());
case LibFunc::vscanf:
return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
case LibFunc::vsscanf:
@@ -828,8 +821,6 @@
FTy.getParamType(0)->isPointerTy());
case LibFunc::tmpfile:
return (FTy.getReturnType()->isPointerTy());
- case LibFunc::times:
- return (NumParams == 1 && FTy.getParamType(0)->isPointerTy());
case LibFunc::htonl:
case LibFunc::htons:
case LibFunc::ntohl:
@@ -847,8 +838,6 @@
FTy.getParamType(0)->isPointerTy());
case LibFunc::dunder_strtok_r:
return (NumParams == 3 && FTy.getParamType(1)->isPointerTy());
- case LibFunc::under_IO_getc:
- return (NumParams == 1 && FTy.getParamType(0)->isPointerTy());
case LibFunc::under_IO_putc:
return (NumParams == 2 && FTy.getParamType(1)->isPointerTy());
case LibFunc::dunder_isoc99_scanf:
@@ -865,9 +854,6 @@
return (NumParams == 2 && FTy.getReturnType()->isPointerTy() &&
FTy.getParamType(0)->isPointerTy() &&
FTy.getParamType(1)->isPointerTy());
- case LibFunc::fseeko64:
- case LibFunc::ftello64:
- return (NumParams == 0 && FTy.getParamType(0)->isPointerTy());
case LibFunc::tmpfile64:
return (FTy.getReturnType()->isPointerTy());
case LibFunc::fstat64: