diff options
author | Ahmed Bougacha <ahmed.bougacha@gmail.com> | 2016-05-25 20:22:45 +0000 |
---|---|---|
committer | Ahmed Bougacha <ahmed.bougacha@gmail.com> | 2016-05-25 20:22:45 +0000 |
commit | 1fe3f1ca50bfc7b1dcc356ee9785bfe3757a8aec (patch) | |
tree | 10f351c1cf2fa2150df5f7af950129b6dff7f309 /llvm/lib/Analysis/TargetLibraryInfo.cpp | |
parent | fdbc64beeaf50d5dacf340dfba5fa21d5714a147 (diff) | |
download | llvm-1fe3f1ca50bfc7b1dcc356ee9785bfe3757a8aec.zip llvm-1fe3f1ca50bfc7b1dcc356ee9785bfe3757a8aec.tar.gz llvm-1fe3f1ca50bfc7b1dcc356ee9785bfe3757a8aec.tar.bz2 |
[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
Diffstat (limited to 'llvm/lib/Analysis/TargetLibraryInfo.cpp')
-rw-r--r-- | llvm/lib/Analysis/TargetLibraryInfo.cpp | 100 |
1 files changed, 43 insertions, 57 deletions
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 @@ bool TargetLibraryInfoImpl::isValidProtoForLibFunc(const FunctionType &FTy, 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 @@ bool TargetLibraryInfoImpl::isValidProtoForLibFunc(const FunctionType &FTy, 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 @@ bool TargetLibraryInfoImpl::isValidProtoForLibFunc(const FunctionType &FTy, 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 @@ bool TargetLibraryInfoImpl::isValidProtoForLibFunc(const FunctionType &FTy, 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 @@ bool TargetLibraryInfoImpl::isValidProtoForLibFunc(const FunctionType &FTy, 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 @@ bool TargetLibraryInfoImpl::isValidProtoForLibFunc(const FunctionType &FTy, 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 @@ bool TargetLibraryInfoImpl::isValidProtoForLibFunc(const FunctionType &FTy, 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: |