[llvm-commits] [poolalloc] r109453 - /poolalloc/trunk/lib/DSA/SanityCheck.cpp

John Criswell criswell at uiuc.edu
Mon Jul 26 15:05:35 PDT 2010


Author: criswell
Date: Mon Jul 26 17:05:34 2010
New Revision: 109453

URL: http://llvm.org/viewvc/llvm-project?rev=109453&view=rev
Log:
Pass that does some sanity checking on DSA results.

Added:
    poolalloc/trunk/lib/DSA/SanityCheck.cpp

Added: poolalloc/trunk/lib/DSA/SanityCheck.cpp
URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/lib/DSA/SanityCheck.cpp?rev=109453&view=auto
==============================================================================
--- poolalloc/trunk/lib/DSA/SanityCheck.cpp (added)
+++ poolalloc/trunk/lib/DSA/SanityCheck.cpp Mon Jul 26 17:05:34 2010
@@ -0,0 +1,136 @@
+//===- SanityCheck.cpp - Check sanity and consistency of DSA results ------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file was developed by the LLVM research group and is distributed under
+// the University of Illinois Open Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// Perform a sanity check on the DSA results.
+//
+//===----------------------------------------------------------------------===//
+
+#define DEBUG_TYPE "dsa-check"
+
+#include "dsa/DataStructure.h"
+#include "dsa/DSGraph.h"
+
+#include "llvm/Instructions.h"
+#include "llvm/Module.h"
+
+using namespace llvm;
+
+//
+// Class: CheckSanity
+//
+// Description:
+//  This is an LLVM pass that will request DSA results and then do some sanity
+//  checks on the DSA results.
+//
+class SanityCheck : public ModulePass {
+  public:
+    static char ID;
+    SanityCheck() : ModulePass ((intptr_t)&ID) {
+      dsaPass = 0;
+    }
+    virtual bool runOnModule(Module &M);
+    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+      AU.addRequired<EQTDDataStructures>();
+      AU.setPreservesAll();
+    }
+
+  protected:
+    void checkLoad (LoadInst & LI);
+
+    // The DSA pass which is to be sanitized
+    DataStructures * dsaPass;
+};
+
+// Sanity Check Pass ID
+char SanityCheck::ID = 0;
+
+static RegisterPass<SanityCheck>
+X("dsa-check", "Check consistency of Data Structure Analysis");
+
+//
+// Method: checkLoad()
+//
+// Description:
+//  This method ensures that the DSNode associated with the result of a load
+//  instruction is linked from the DSNode associated with the pointer
+//  dereferenced by the load.
+//
+void
+SanityCheck::checkLoad (LoadInst & LI) {
+  //
+  // Get the DSA Graph for the function in which the load instruction lives.
+  //
+  Function * F = LI.getParent()->getParent();
+  DSGraph * G = dsaPass->getDSGraph (*F);
+
+  //
+  // Get the DSNode information for both the result of the load instruction
+  // and its pointer operand.  If the result of the load has no DSNode, then
+  // nothing needs to be done.
+  //
+  DSNode* ResultNode = G->getNodeForValue (&LI).getNode();
+  DSNode* PtrNode    = G->getNodeForValue (LI.getPointerOperand()).getNode();
+  if (!ResultNode) {
+    return;
+  }
+  assert (PtrNode && "Load operand has no DSNode!\n");
+
+  //
+  // Scan through the links of the DSNode of the load's pointer operand; we
+  // need to determine the offset into the memory object from which the result
+  // of the load is loaded.
+  //
+  DSNode::LinkMapTy::iterator linki = PtrNode->edge_begin();
+  bool found = false;
+  for (; linki != PtrNode->edge_end(); ++linki) {
+    DSNodeHandle & LinkNode = linki->second;
+    if (LinkNode.getNode() == ResultNode) {
+      found = true;
+    }
+  }
+
+  assert (found && "Can't find link for load result!\n");
+  return;
+}
+
+//
+// Method: runOnModule()
+//
+// Description:
+//  This method is the entry point for the sanity checking pass.
+//
+// Inputs:
+//  M - The LLVM module which should be analyzed for sanity and consistency.
+//
+// Return value:
+//  false - The Module has not been modified (this pass should never modify the
+//          Module).
+//
+bool
+SanityCheck::runOnModule(Module & M) {
+  //
+  // Get a reference to the DSA pass to check.
+  //
+  dsaPass = &getAnalysis<EQTDDataStructures>();
+
+  //
+  // Scan through all instructions in the module and sanity check the load
+  // instructions.
+  //
+  for (Module::iterator F = M.begin(); F != M.end(); ++F) {
+    for (Function::iterator BB = F->begin(); BB != F->end(); ++BB) {
+      for (BasicBlock::iterator I = BB->begin(); I != BB->end(); ++I) {
+        if (LoadInst * LI = dyn_cast<LoadInst>(I))
+          checkLoad (*LI);
+      }
+    }
+  }
+
+  return false;
+}





More information about the llvm-commits mailing list