summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-02-25 23:06:40 +0000
committerChris Lattner <sabre@nondot.org>2004-02-25 23:06:40 +0000
commit52fc8d7ec901c851762c3b1722d4b239ef1cb1fa (patch)
tree50614a0e2aca59ceeb5b07cd0e7361995c605255 /lib
parent153f24070c43293a29499de3469a09ecd9a6a6f9 (diff)
downloadllvm-52fc8d7ec901c851762c3b1722d4b239ef1cb1fa.tar.gz
llvm-52fc8d7ec901c851762c3b1722d4b239ef1cb1fa.tar.bz2
llvm-52fc8d7ec901c851762c3b1722d4b239ef1cb1fa.tar.xz
Add a bunch more functions
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11847 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/Analysis/DataStructure/Local.cpp63
1 files changed, 55 insertions, 8 deletions
diff --git a/lib/Analysis/DataStructure/Local.cpp b/lib/Analysis/DataStructure/Local.cpp
index 81dca43100..c6575132ab 100644
--- a/lib/Analysis/DataStructure/Local.cpp
+++ b/lib/Analysis/DataStructure/Local.cpp
@@ -490,7 +490,11 @@ void GraphBuilder::visitCallSite(CallSite CS) {
F->getName() == "strcmp" || F->getName() == "strncmp" ||
F->getName() == "execl" || F->getName() == "execlp" ||
F->getName() == "execle" || F->getName() == "execv" ||
- F->getName() == "execvp" || F->getName() == "chmod") {
+ F->getName() == "execvp" || F->getName() == "chmod" ||
+ F->getName() == "puts" || F->getName() == "write" ||
+ F->getName() == "open" || F->getName() == "create" ||
+ F->getName() == "truncate" || F->getName() == "chdir" ||
+ F->getName() == "mkdir" || F->getName() == "rmdir") {
// These functions read all of their pointer operands.
for (CallSite::arg_iterator AI = CS.arg_begin(), E = CS.arg_end();
AI != E; ++AI) {
@@ -499,6 +503,16 @@ void GraphBuilder::visitCallSite(CallSite CS) {
N->setReadMarker();
}
return;
+ } else if (F->getName() == "read" || F->getName() == "pipe" ||
+ F->getName() == "wait") {
+ // These functions write all of their pointer operands.
+ for (CallSite::arg_iterator AI = CS.arg_begin(), E = CS.arg_end();
+ AI != E; ++AI) {
+ if (isPointerType((*AI)->getType()))
+ if (DSNode *N = getValueDest(**AI).getNode())
+ N->setModifiedMarker();
+ }
+ return;
} else if (F->getName() == "stat" || F->getName() == "fstat" ||
F->getName() == "lstat") {
// These functions read their first operand if its a pointer.
@@ -516,8 +530,6 @@ void GraphBuilder::visitCallSite(CallSite CS) {
if (const PointerType *PTy = dyn_cast<PointerType>(StatTy))
N->mergeTypeInfo(PTy->getElementType(), StatBuf.getOffset());
}
-
-
return;
} else if (F->getName() == "fopen" || F->getName() == "fdopen") {
// fopen reads the mode argument strings.
@@ -554,7 +566,8 @@ void GraphBuilder::visitCallSite(CallSite CS) {
} else if (CS.arg_end()-CS.arg_begin() == 1 &&
(F->getName() == "fflush" || F->getName() == "feof" ||
F->getName() == "fileno" || F->getName() == "clearerr" ||
- F->getName() == "rewind" || F->getName() == "ftell")) {
+ F->getName() == "rewind" || F->getName() == "ftell" ||
+ F->getName() == "ferror")) {
// fflush reads and writes the memory for the file descriptor. It
// merges the FILE type into the descriptor.
DSNodeHandle H = getValueDest(**CS.arg_begin());
@@ -605,15 +618,42 @@ void GraphBuilder::visitCallSite(CallSite CS) {
N->mergeTypeInfo(PTy->getElementType(), H.getOffset());
}
return;
- } else if (F->getName() == "ungetc" &&CS.arg_end()-CS.arg_begin() == 2){
- // ungetc reads and writes the memory for the file descriptor.
+ } else if (F->getName() == "ungetc" || F->getName() == "fputc" ||
+ F->getName() == "fputs" || F->getName() == "putc" ||
+ F->getName() == "ftell" || F->getName() == "rewind") {
+ // These functions read and write the memory for the file descriptor.
DSNodeHandle H = getValueDest(**--CS.arg_end());
if (DSNode *N = H.getNode()) {
N->setReadMarker()->setModifiedMarker();
- const Type *ArgTy = F->getFunctionType()->getParamType(1);
+ const Type *ArgTy = *--F->getFunctionType()->param_end();
if (const PointerType *PTy = dyn_cast<PointerType>(ArgTy))
N->mergeTypeInfo(PTy->getElementType(), H.getOffset());
}
+
+ // Any pointer arguments are read.
+ for (CallSite::arg_iterator AI = CS.arg_begin(), E = CS.arg_end();
+ AI != E; ++AI)
+ if (isPointerType((*AI)->getType()))
+ if (DSNode *N = getValueDest(**AI).getNode())
+ N->setReadMarker();
+ return;
+ } else if (F->getName() == "fseek" || F->getName() == "fgetpos" ||
+ F->getName() == "fsetpos") {
+ // These functions read and write the memory for the file descriptor,
+ // and read/write all other arguments.
+ DSNodeHandle H = getValueDest(**CS.arg_begin());
+ if (DSNode *N = H.getNode()) {
+ const Type *ArgTy = *--F->getFunctionType()->param_end();
+ if (const PointerType *PTy = dyn_cast<PointerType>(ArgTy))
+ N->mergeTypeInfo(PTy->getElementType(), H.getOffset());
+ }
+
+ // Any pointer arguments are read.
+ for (CallSite::arg_iterator AI = CS.arg_begin(), E = CS.arg_end();
+ AI != E; ++AI)
+ if (isPointerType((*AI)->getType()))
+ if (DSNode *N = getValueDest(**AI).getNode())
+ N->setReadMarker()->setModifiedMarker();
return;
} else if (F->getName() == "printf" || F->getName() == "fprintf" ||
F->getName() == "sprintf") {
@@ -708,7 +748,14 @@ void GraphBuilder::visitCallSite(CallSite CS) {
N->setReadMarker();
H.mergeWith(getValueDest(*CS.getInstruction())); // Returns buffer
return;
-
+ } else if (F->getName() == "modf" && CS.arg_end()-CS.arg_begin() == 2) {
+ // This writes its second argument, and forces it to double.
+ DSNodeHandle H = getValueDest(**--CS.arg_end());
+ if (DSNode *N = H.getNode()) {
+ N->setModifiedMarker();
+ N->mergeTypeInfo(Type::DoubleTy, H.getOffset());
+ }
+ return;
} else {
// Unknown function, warn if it returns a pointer type or takes a
// pointer argument.