Add support for fopen/fclose. Specifically with fopen, we were marking all of the
authorChris Lattner <sabre@nondot.org>
Fri, 13 Feb 2004 20:05:32 +0000 (20:05 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 13 Feb 2004 20:05:32 +0000 (20:05 +0000)
operands as incomplete, though fopen is known to only read them.  This just adds
fclose for symmetry, though it doesn't gain anything.  This makes the dsgraphs for
181.mcf much more precise.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11390 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/DataStructure/Local.cpp

index 2a04d291283a810282657222bb417e9fe7919a58..16e3cbaed41f02a1309c0a5a95d3204394e379bf 100644 (file)
@@ -493,6 +493,33 @@ void GraphBuilder::visitCallSite(CallSite CS) {
           if (DSNode *N = H.getNode())
             N->setModifiedMarker();
           return;
+        } else if (F->getName() == "fopen" && CS.arg_end()-CS.arg_begin() == 2){
+          // fopen reads the mode argument strings.
+          CallSite::arg_iterator AI = CS.arg_begin();
+          DSNodeHandle Path = getValueDest(**AI);
+          DSNodeHandle Mode = getValueDest(**++AI);
+          if (DSNode *N = Path.getNode()) N->setReadMarker();
+          if (DSNode *N = Mode.getNode()) N->setReadMarker();
+          
+          // fopen allocates in an unknown way and writes to the file
+          // descriptor.  Also, merge the allocated type into the node.
+          DSNodeHandle Result = getValueDest(*CS.getInstruction());
+          Result.getNode()->setModifiedMarker()->setUnknownNodeMarker();
+          const Type *RetTy = F->getFunctionType()->getReturnType();
+          if (const PointerType *PTy = dyn_cast<PointerType>(RetTy))
+            Result.getNode()->mergeTypeInfo(PTy->getElementType(),
+                                            Result.getOffset());
+          return;
+        } else if (F->getName() == "fclose" && CS.arg_end()-CS.arg_begin() ==1){
+          // fclose reads and deallocates the memory in an unknown way for the
+          // file descriptor.  It merges the FILE type into the descriptor.
+          DSNodeHandle H = getValueDest(**CS.arg_begin());
+          H.getNode()->setReadMarker()->setUnknownNodeMarker();
+          
+          const Type *ArgTy = *F->getFunctionType()->param_begin();
+          if (const PointerType *PTy = dyn_cast<PointerType>(ArgTy))
+            H.getNode()->mergeTypeInfo(PTy->getElementType(), H.getOffset());
+          return;
         }
       }