Changes in directory llvm-poolalloc/lib/DSA:
Local.cpp updated: 1.158.2.4.2.9 -> 1.158.2.4.2.10 Makefile updated: 1.5.2.2 -> 1.5.2.2.2.1 --- Log message: new memcpy --- Diffs of the changes: (+70 -16) Local.cpp | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++----------- Makefile | 1 2 files changed, 70 insertions(+), 16 deletions(-) Index: llvm-poolalloc/lib/DSA/Local.cpp diff -u llvm-poolalloc/lib/DSA/Local.cpp:1.158.2.4.2.9 llvm-poolalloc/lib/DSA/Local.cpp:1.158.2.4.2.10 --- llvm-poolalloc/lib/DSA/Local.cpp:1.158.2.4.2.9 Mon Apr 9 15:20:07 2007 +++ llvm-poolalloc/lib/DSA/Local.cpp Fri May 18 12:38:28 2007 @@ -12,7 +12,6 @@ // external interface to this file is the DSGraph constructor. // //===----------------------------------------------------------------------===// - #include "llvm/ADT/Statistic.h" #include "dsa/DataStructure.h" #include "dsa/DSGraph.h" @@ -650,12 +649,21 @@ case Intrinsic::memcpy_i64: 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()); - RetNH.mergeWith(getValueDest(**(CS.arg_begin()+1))); - if (DSNode *N = RetNH.getNode()) - N->setModifiedMarker()->setReadMarker(); + DSNodeHandle destNH = getValueDest(**CS.arg_begin()); + DSNodeHandle srcNH = getValueDest(**(CS.arg_begin()+1)); + if (!destNH.getNode()) { + setDestTo(**CS.arg_begin(), createNode()); + destNH = getValueDest(**CS.arg_begin()); + } + if (!srcNH.getNode()) { + setDestTo(**(CS.arg_begin() + 1), createNode()); + srcNH = getValueDest(**(CS.arg_begin() + 1)); + } + destNH.getNode()->foldNodeCompletely(); + srcNH.getNode()->foldNodeCompletely(); + getLink(destNH.getNode()).mergeWith(getLink(srcNH.getNode())); + destNH.getNode()->setModifiedMarker(); + srcNH.getNode()->setReadMarker(); return true; } case Intrinsic::memset_i32: @@ -788,7 +796,7 @@ N->setModifiedMarker()->setUnknownNodeMarker(); const Type *RetTy = F->getFunctionType()->getReturnType(); if (const PointerType *PTy = dyn_cast<PointerType>(RetTy)) - N->mergeTypeInfo(PTy->getElementType(), Result.getOffset()); + N->mergeTypeInfo(PTy->getElementType(), Result.getOffset()); } // If this is freopen, merge the file descriptor passed in with the @@ -1101,12 +1109,21 @@ } else if (F->getName() == "llva_memcpy") { if (CS.getCaller()->getName() == "kmem_cache_alloc") return false; - // Merge the first & second arguments, and mark the memory read and - // modified. - DSNodeHandle RetNH = getValueDest(**CS.arg_begin()); - RetNH.mergeWith(getValueDest(**(CS.arg_begin()+1))); - if (DSNode *N = RetNH.getNode()) - N->setModifiedMarker()->setReadMarker(); + DSNodeHandle destNH = getValueDest(**CS.arg_begin()); + DSNodeHandle srcNH = getValueDest(**(CS.arg_begin()+1)); + if (!destNH.getNode()) { + setDestTo(**CS.arg_begin(), createNode()); + destNH = getValueDest(**CS.arg_begin()); + } + if (!srcNH.getNode()) { + setDestTo(**(CS.arg_begin() + 1), createNode()); + srcNH = getValueDest(**(CS.arg_begin() + 1)); + } + destNH.getNode()->foldNodeCompletely(); + srcNH.getNode()->foldNodeCompletely(); + getLink(destNH.getNode()).mergeWith(getLink(srcNH.getNode())); + destNH.getNode()->setModifiedMarker(); + srcNH.getNode()->setReadMarker(); return true; #if 1 } else if (F->getName() == "llva_save_stackp") { @@ -1137,7 +1154,7 @@ #endif } #endif - + return false; } @@ -1145,6 +1162,16 @@ Value *Callee = CS.getCalledValue(); if (Function *F = dyn_cast<Function>(Callee)) { +// if (F->getName() == "printk") { +// CallSite::arg_iterator AI = CS.arg_begin(), E = CS.arg_end(); +// for (; AI != E; ++AI) { +// // printf reads all pointer arguments. +// if (isPointerType((*AI)->getType())) +// if (DSNode *N = getValueDest(**AI).getNode()) +// N->setReadMarker(); +// } +// return; +// } if (F->isExternal()) if (F->isIntrinsic() && visitIntrinsic(CS, F)) return; @@ -1171,6 +1198,34 @@ if (visitExternal(CS,F)) return; + + if (F->getName() == "llva_invoke") { + Value* FF = *(CS.arg_begin() + 1); + if (isa<CastInst>(FF)) { + FF = cast<CastInst>(FF)->getOperand(0); + } + if (isa<ConstantExpr>(FF) && cast<ConstantExpr>(FF)->getOpcode() == Instruction::Cast) { + FF = cast<ConstantExpr>(FF)->getOperand(0); + } + //std::cerr << "invoke special for: "; FF->dump(); std::cerr << "\n"; + std::vector<DSNodeHandle> Args; + // Calculate the arguments vector... + for (CallSite::arg_iterator I = CS.arg_begin() + 2, E = CS.arg_end(); I != E; ++I) { + Value* AA = *I; + if (isa<CastInst>(AA)) { + AA = cast<CastInst>(AA)->getOperand(0); + } + if (isPointerType(AA->getType())) + Args.push_back(getValueDest(*AA)); + } + // Add a new function call entry... + if (isa<Function>(FF)) + FunctionCalls->push_back(DSCallSite(CS, DSNodeHandle(), cast<Function>(FF), Args)); + else + FunctionCalls->push_back(DSCallSite(CS, DSNodeHandle(), getValueDest(*FF).getNode(), Args)); + return; + } + // Unknown function, warn if it returns a pointer type or takes a // pointer argument. bool Warn = isPointerType(CS.getInstruction()->getType()); Index: llvm-poolalloc/lib/DSA/Makefile diff -u llvm-poolalloc/lib/DSA/Makefile:1.5.2.2 llvm-poolalloc/lib/DSA/Makefile:1.5.2.2.2.1 --- llvm-poolalloc/lib/DSA/Makefile:1.5.2.2 Thu Jan 11 16:29:43 2007 +++ llvm-poolalloc/lib/DSA/Makefile Fri May 18 12:38:28 2007 @@ -6,7 +6,6 @@ # the University of Illinois Open Source License. See LICENSE.TXT for details. # ##===----------------------------------------------------------------------===## - LEVEL = ../.. SHARED_LIBRARY=1 LOADABLE_MODULE = 1 _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits