blob: ee07402506cc238e83d20433b74390af2aaba66f [file] [log] [blame]
//===- TypeSafety.h - Find Type-Safe Pointers ---------------------*- C++ -*--//
//
// 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.
//
//===----------------------------------------------------------------------===//
//
// This analysis pass determines which pointers within a program are used in
// a type-safe fashion. It uses DSA to determine type-consistency and
// abstracts the details of interpreting DSA's results.
//
//===----------------------------------------------------------------------===//
#ifndef DSA_TYPESAFETY_H
#define DSA_TYPESAFETY_H
#include "dsa/DataStructure.h"
#include "dsa/DSGraph.h"
#include "llvm/Pass.h"
#include <set>
using namespace llvm;
namespace dsa {
//
// Pass: TypeSafety
//
// Description:
// This pass determines which pointers within a function are type-safe. It is
// used to abstract away the interpretation of the DSNode flags and fields
// for clients.
//
// Template parameters:
// dsa - The name of the DSA Pass which this pass should use.
//
template<class dsa>
struct TypeSafety : public ModulePass {
protected:
// Methods
DSNodeHandle getDSNodeHandle (const Value * V, const Function * F);
DSNodeHandle getDSNodeHandle (const GlobalValue * V);
void findTypeSafeDSNodes (const DSGraph * Graph);
bool isTypeSafe (const DSNode * N);
bool typeFieldsOverlap (const DSNode * N);
// Pointers to prerequisite passes
DataLayout * TD;
dsa * dsaPass;
// Data structures
std::set<const DSNode *> TypeSafeNodes;
public:
static char ID;
TypeSafety() : ModulePass(ID) {}
virtual bool runOnModule (Module & M);
const char *getPassName() const {
return "DSA Type-Safety Analysis";
}
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired<DataLayout>();
AU.addRequired<dsa>();
AU.setPreservesAll();
}
virtual void releaseMemory () {
TypeSafeNodes.clear();
return;
}
// Methods for clients to use
virtual bool isTypeSafe (const Value * V, const Function * F);
virtual bool isTypeSafe (const GlobalValue * V);
};
}
#endif