blob: d1955acd53d4c8804061e8cf21866279ed9b5c64 [file] [log] [blame]
#ifndef CONVERT_ALLOCA_H
#define CONVERT_ALLOCA_H
#include "dsa/DataStructure.h"
#include "llvm/Pass.h"
#include "ArrayBoundsCheck.h"
#include "StackSafety.h"
#include "llvm/Target/TargetData.h"
#include "safecode/Config/config.h"
#include <set>
namespace llvm {
ModulePass *createConvertUnsafeAllocas();
using namespace ABC;
using namespace CSS;
struct MallocPass : public FunctionPass
{
private:
// Private data
Constant * memsetF;
DominatorTree * domTree;
// Private methods
inline bool changeType (DSGraph & TDG, Instruction * Inst);
inline bool TypeContainsPointer(const Type *Ty);
public:
static char ID;
MallocPass() : FunctionPass((intptr_t)(&ID)) {}
const char *getPassName() const { return "Malloc Pass"; }
virtual bool runOnFunction (Function &F);
virtual bool doInitialization (Module &M);
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired<TargetData>();
AU.addRequired<TDDataStructures>();
#ifdef LLVA_KERNEL
AU.setPreservesAll();
#else
//AU.setPreservesAll();
#endif
}
};
namespace CUA {
struct ConvertUnsafeAllocas : public ModulePass {
public :
static char ID;
ConvertUnsafeAllocas () : ModulePass ((intptr_t)(&ID)) {}
const char *getPassName() const { return "Convert Unsafe Allocas"; }
virtual bool runOnModule(Module &M);
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired<ArrayBoundsCheck>();
AU.addRequired<checkStackSafety>();
AU.addRequired<CompleteBUDataStructures>();
AU.addRequired<TDDataStructures>();
AU.addRequired<TargetData>();
AU.addPreserved<ArrayBoundsCheck>();
// Does not preserve the BU or TD graphs
#ifdef LLVA_KERNEL
AU.setPreservesAll();
#else
//AU.setPreservesAll();
#endif
}
DSNode * getDSNode(const Value *I, Function *F);
DSNode * getTDDSNode(const Value *I, Function *F);
std::map<BasicBlock*,std::set<Instruction *>*> & getUnsafeGetElementPtrsFromABC() {
assert(abcPass != 0 && "First run the array bounds pass correctly");
return abcPass->UnsafeGetElemPtrs;
}
std::set<Instruction *> * getUnsafeGetElementPtrsFromABC(BasicBlock * BB) {
assert(abcPass != 0 && "First run the array bounds pass correctly");
return abcPass->getUnsafeGEPs (BB);
}
// The set of Malloc Instructions that are a result of conversion from
// alloca's due to static array bounds detection failure
std::set<const MallocInst *> ArrayMallocs;
private :
TDDataStructures * tddsPass;
BUDataStructures * budsPass;
ArrayBoundsCheck * abcPass;
checkStackSafety * cssPass;
TargetData *TD;
#ifdef LLVA_KERNEL
Constant *kmalloc;
Constant *StackPromote;
#endif
std::list<DSNode *> unsafeAllocaNodes;
std::set<DSNode *> reachableAllocaNodes;
bool markReachableAllocas(DSNode *DSN);
bool markReachableAllocasInt(DSNode *DSN);
void TransformAllocasToMallocs(std::list<DSNode *> & unsafeAllocaNodes);
void TransformCSSAllocasToMallocs(std::vector<DSNode *> & cssAllocaNodes);
void getUnsafeAllocsFromABC();
void TransformCollapsedAllocas(Module &M);
void InsertFreesAtEnd(MallocInst *MI);
};
}
}
#endif