summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Analysis/DataStructure/Local.cpp
diff options
context:
space:
mode:
authorAndrew Lenharth <andrewl@lenharth.org>2006-03-15 03:43:59 +0000
committerAndrew Lenharth <andrewl@lenharth.org>2006-03-15 03:43:59 +0000
commitc254e5b180b741ac1220d0ea9c39ba836a4a0ec6 (patch)
tree3b75882b7cfe2223011b409193aca764029e4fc7 /llvm/lib/Analysis/DataStructure/Local.cpp
parentc4e2468251afac9f1a9c0576a0d6db17422bc380 (diff)
downloadbcm5719-llvm-c254e5b180b741ac1220d0ea9c39ba836a4a0ec6.tar.gz
bcm5719-llvm-c254e5b180b741ac1220d0ea9c39ba836a4a0ec6.zip
improve mem intrinsics and add a few things povray uses
llvm-svn: 26774
Diffstat (limited to 'llvm/lib/Analysis/DataStructure/Local.cpp')
-rw-r--r--llvm/lib/Analysis/DataStructure/Local.cpp33
1 files changed, 30 insertions, 3 deletions
diff --git a/llvm/lib/Analysis/DataStructure/Local.cpp b/llvm/lib/Analysis/DataStructure/Local.cpp
index 10c9bb28470..783f87d9744 100644
--- a/llvm/lib/Analysis/DataStructure/Local.cpp
+++ b/llvm/lib/Analysis/DataStructure/Local.cpp
@@ -545,10 +545,18 @@ void GraphBuilder::visitCallSite(CallSite CS) {
return;
case Intrinsic::vaend:
return; // noop
- case Intrinsic::memmove_i32:
case Intrinsic::memcpy_i32:
- case Intrinsic::memmove_i64:
case Intrinsic::memcpy_i64: {
+ //write first location
+ if (DSNode *N = getValueDest(**CS.arg_begin()).getNode())
+ N->setHeapNodeMarker()->setModifiedMarker();
+ //and read second pointer
+ if (DSNode *N = getValueDest(**(CS.arg_begin() + 1)).getNode())
+ N->setReadMarker();
+ return;
+ }
+ case Intrinsic::memmove_i32:
+ case Intrinsic::memmove_i64: {
// Merge the first & second arguments, and mark the memory read and
// modified.
DSNodeHandle RetNH = getValueDest(**CS.arg_begin());
@@ -676,7 +684,6 @@ void GraphBuilder::visitCallSite(CallSite CS) {
Link.mergeWith(getValueDest(**CS.arg_begin()));
}
}
-
return;
} else if (F->getName() == "fopen" || F->getName() == "fdopen" ||
F->getName() == "freopen") {
@@ -981,6 +988,26 @@ void GraphBuilder::visitCallSite(CallSite CS) {
N->mergeTypeInfo(Type::DoubleTy, H.getOffset());
}
return;
+ } else if (F->getName() == "qsort") {
+ CallSite::arg_iterator AI = CS.arg_begin();
+ if (DSNode *N = getValueDest(**AI).getNode())
+ N->setModifiedMarker();
+ //How do you mark a function pointer as being called? Assume it is a read
+ AI += 3;
+ if (DSNode *N = getValueDest(**AI).getNode())
+ N->setReadMarker();
+ return;
+ } else if (F->getName() == "strcat" || F->getName() == "strncat") {
+ //This might be making unsafe assumptions about usage
+ //Merge return and first arg
+ DSNodeHandle RetNH = getValueDest(*CS.getInstruction());
+ RetNH.mergeWith(getValueDest(**CS.arg_begin()));
+ if (DSNode *N = RetNH.getNode())
+ N->setHeapNodeMarker()->setModifiedMarker()->setReadMarker();
+ //and read second pointer
+ if (DSNode *N = getValueDest(**(CS.arg_begin() + 1)).getNode())
+ N->setReadMarker();
+ return;
} else {
// Unknown function, warn if it returns a pointer type or takes a
// pointer argument.
OpenPOWER on IntegriCloud