Changes in directory llvm-poolalloc/lib/DSA:
Local.cpp updated: 1.158.2.4.2.2 -> 1.158.2.4.2.3 --- Log message: Nodes returned from llva_save_stackp() are now collapsed. Ensure that all globals with a DSNode have a MetaPool. Disabled debugging and random kernel hacks. --- Diffs of the changes: (+56 -2) Local.cpp | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 56 insertions(+), 2 deletions(-) Index: llvm-poolalloc/lib/DSA/Local.cpp diff -u llvm-poolalloc/lib/DSA/Local.cpp:1.158.2.4.2.2 llvm-poolalloc/lib/DSA/Local.cpp:1.158.2.4.2.3 --- llvm-poolalloc/lib/DSA/Local.cpp:1.158.2.4.2.2 Wed Feb 28 11:35:32 2007 +++ llvm-poolalloc/lib/DSA/Local.cpp Wed Mar 7 17:42:43 2007 @@ -386,7 +386,7 @@ void GraphBuilder::visitGetElementPtrInst(User &GEP) { #ifdef LLVA_KERNEL -#if 1 +#if 0 int debug = 0; if (isa<Instruction>(GEP)) { Instruction * IGEP = (Instruction *)(&GEP); @@ -589,7 +589,7 @@ if (isPointerType(StoredTy)) Dest.addEdgeTo(getValueDest(*SI.getOperand(0))); #ifdef LLVA_KERNEL -#if 1 +#if 0 { if (SI.getParent()->getParent()->getName() == "alloc_vfsmnt") { DSNode * N = getValueDest(*SI.getOperand(1)).getNode(); @@ -1120,7 +1120,9 @@ } else { Value *actualPD = *(CS.arg_begin()); if (!isa<GlobalValue>(actualPD)) { +#if 0 std::cerr << "WARNING: Pool is not global. Function = " << CS.getCaller()->getName() << "\n"; +#endif } else { ++GlobalPools; } @@ -1183,7 +1185,9 @@ } else { Value *actualPD = *(CS.arg_begin()); if (!isa<GlobalValue>(actualPD)) { +#if 0 std::cerr << "WARNING: Pool is not global. Function = " << CS.getCaller()->getName() << "\n"; +#endif } else { ++GlobalPools; } @@ -1241,6 +1245,7 @@ N->setAllocaNodeMarker(); N->setUnknownNodeMarker(); N->setIncompleteMarker(); + N->foldNodeCompletely(); // // TODO: @@ -1248,6 +1253,7 @@ // are ignored by our analysis. // #endif +#if 0 } else if (F->getName() == "__generic_copy_from_user") { if (CS.getCaller()->getName() == "kmem_cache_alloc") return false; @@ -1260,6 +1266,7 @@ return true; #endif } +#endif return false; } @@ -1291,7 +1298,9 @@ } else { Value *actualPD = *(CS.arg_begin()); if (!isa<GlobalValue>(actualPD)) { +#if 0 std::cerr << "WARNING: Pool is not global. Function = " << CS.getCaller()->getName() << "\n"; +#endif } else { ++GlobalPools; } @@ -1377,7 +1386,9 @@ } else { Value *actualPD = *(CS.arg_begin()); if (!isa<GlobalValue>(actualPD)) { +#if 0 std::cerr << "WARNING: Pool is not global. Function = " << CS.getCaller()->getName() << "\n"; +#endif } else { ++GlobalPools; } @@ -1702,6 +1713,49 @@ DEBUG(std::cerr << "Eliminating " << ECGlobals.size() << " EC Globals!\n"); ECGlobals.clear(); +#ifdef LLVA_KERNEL + // + // Scan through all the globals; if they have a DSNode but no MetaPool, give + // them a MetaPool. + // + const Type * VoidPtrType = PointerType::get(Type::SByteTy); + for (Module::global_iterator I = M.global_begin(), E = M.global_end(); + I != E; ++I) { + // Skip functions and externally declared variables + if (!isa<GlobalVariable>(I)) continue; + if (I->isExternal()) continue; + + GlobalValue * GV = I; + GlobalValue * GVL = GlobalsGraph->getScalarMap().getLeaderForGlobal(I); + DSNode *Node = GlobalsGraph->getNodeForValue(GVL).getNode(); + + // If this global happens to be a MetaPool, it will have no DSNode. + // In that case, do not assign a MetaPool. + if (!Node) continue; + + // + // Add the MetaPool for the DSNode if it does not already have one. + // + if (GlobalsGraph->getPoolDescriptorsMap().count(Node) == 0) { + Value * TheMetaPool = 0; + TheMetaPool = new GlobalVariable( + /*type=*/ VoidPtrType, + /*isConstant=*/ false, + /*Linkage=*/ GlobalValue::InternalLinkage, + /*initializer=*/ Constant::getNullValue(VoidPtrType), + /*name=*/ "_metaPool_", + /*parent=*/ &M ); + + // + // Create the internal data structure for the MetaPool and associate the + // DSNode with it. + // + MetaPoolHandle* tmpvh = new MetaPoolHandle(new MetaPool(TheMetaPool), NULL); + GlobalsGraph->getPoolDescriptorsMap()[Node] = tmpvh; + } + } +#endif + // Calculate all of the graphs... for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) if (!I->isExternal()) _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits