//===- BaggyBoundsChecks.h - Modify code for baggy bounds checks --------------//
// 
//                          The SAFECode Compiler 
//
// 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 file defines a pass that modifies global and stack allocations to
// allocate memory objects with a power-of-two size and with the alignment
// needed for baggy bounds checking.
//
//===----------------------------------------------------------------------===//

#ifndef _BAGGY_BOUNDS_CHECKS_H_
#define _BAGGY_BOUNDS_CHECKS_H_

#include "llvm/Pass.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/Instructions.h"
#include "llvm/Transforms/Utils/ValueMapper.h"
#include "llvm/Transforms/Utils/Cloning.h"


#include "safecode/SAFECode.h"

namespace llvm {

//
// Pass:InsertBaggyBoundsChecks 
//
// Description:
//  This pass aligns all globals and allocas.
//
struct InsertBaggyBoundsChecks : public ModulePass {
  public:
    static char ID;
    InsertBaggyBoundsChecks () : ModulePass (ID) { }
    const char *getPassName() const { return "Insert BaggyBounds Checks"; }
    virtual bool runOnModule(Module &M);
    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
      // Required passes
      AU.addRequired<DataLayout>();
    };

  protected:
    // Pointers to required passes
    DataLayout * TD;

    // Protected methods
    void adjustGlobalValue (GlobalValue * GV);
    void adjustAlloca (AllocaInst * AI);
    void adjustAllocasFor (Function * F);
    void adjustArgv(Function *F);
    void cloneFunctionInto(Function *NewFunc, 
                           const Function *OldFunc,
                           ValueToValueMapTy &VMap,
                           bool ModuleLevelChanges,
                           SmallVectorImpl<ReturnInst*> &Returns,
                           const char *NameSuffix = "",
                           ClonedCodeInfo *CodeInfo = 0,
                           ValueMapTypeRemapper *TypeMapper = 0);

    Function * cloneFunction(Function * F);
    void callClonedFunction(Function * F, Function * NewF);
};

}
#endif
