//===- SAFECodeRuntime.h -- Runtime interface of SAFECode ------*- C++ -*-===//
// 
//                     The LLVM Compiler Infrast`ructure
//
// 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 the interface of SAFECode runtime library.
//
//===----------------------------------------------------------------------===//

#ifndef _SAFECODE_RUNTIME_H_
#define _SAFECODE_RUNTIME_H_

#include "BitmapAllocator.h"
#include "SplayTree.h"

#include <iosfwd>
#include <stdint.h>

namespace llvm {

//
// Enumerated Type: allocType
//
// Description:
//  This enumerated type lists the different types of allocations that can be
//  made.
//
enum allocType {
  Global,   // Global object
  Stack,    // Stack-allocated object
  Heap      // Heap-allocated object
};

//
// Structure: DebugMetaData
//
// Description:
//  This structure contains information on the error to be reported.
//
// Fields:
//  allocID    : The ID number of the allocation of the object.
//  freeID     : The ID number of the deallocation of the object.
//  allocPC    : The program counter at which the object was last allocated.
//  freePC     : The program counter at which the object was last deallocated.
//  canonAddr  : The canonical address of the memory reference.
//  SourceFile : A string containing the source file to which the erring
//               instruction is found.
//  lineno     : The line number in the source file to which the erring
//               instruction is found.
//
typedef struct DebugMetaData {
  unsigned allocID;
  unsigned freeID;
  void * allocPC;
  void * freePC;
  void * canonAddr;

  // Allocation type (global, stack, or heap object)
  allocType allocationType;

  // Source filename
  const void * SourceFile;

  // Source filename for deallocation
  const void * FreeSourceFile;

  // Line number
  unsigned lineno;

  // Line number for deallocation
  unsigned Freelineno;

  void print(std::ostream & OS) const;
} DebugMetaData;
typedef DebugMetaData * PDebugMetaData;

struct DebugPoolTy : public BitmapPoolTy {
  // Splay tree used for object registration
  RangeSplaySet<> Objects;

  // Splay tree used for out of bound objects
  RangeSplayMap<void *> OOB;

  // Splay tree used by dangling pointer runtime
  RangeSplayMap<PDebugMetaData> DPTree;

  // Cache of recently found memory objects
  struct {
    void * lower;
    void * upper;
  } objectCache[2];

  unsigned char cacheIndex;
};

void * rewrite_ptr (DebugPoolTy * Pool, const void * p, void * ObjStart,
void * ObjEnd, const char * SourceFile, unsigned lineno);
void installAllocHooks (void);

}

// Use macros so that I won't polluate the namespace

#define PPOOL llvm::DebugPoolTy*
#define TAG unsigned
#define SRC_INFO const char *, unsigned int

extern "C" {
  void pool_init_runtime(unsigned Dangling,
                         unsigned RewriteOOB,
                         unsigned Terminate);
  void * __sc_dbg_newpool(unsigned NodeSize);
  void __sc_dbg_pooldestroy(PPOOL);

  void * __sc_dbg_poolinit(PPOOL, unsigned NodeSize, unsigned);
  void * __sc_dbg_poolalloc(PPOOL, unsigned NumBytes);
  void * __sc_dbg_src_poolalloc (PPOOL, unsigned Size, TAG, SRC_INFO);

  void * poolargvregister (int argc, char ** argv);

  void pool_register       (PPOOL, void *allocaptr, unsigned NumBytes);
  void pool_register_debug (PPOOL, void * p, unsigned size, TAG, SRC_INFO);
  void pool_register_stack      (PPOOL, void * p, unsigned size);
  void pool_register_stack_debug(PPOOL, void * p, unsigned size, TAG, SRC_INFO);
  void pool_register_global (PPOOL, void * p, unsigned size);
  void pool_register_global_debug(PPOOL, void * p, unsigned size, TAG, SRC_INFO);

  void pool_reregister (PPOOL, void * p, void * q, unsigned size);
  void pool_reregister_debug (PPOOL, void * p, void * q, unsigned size, TAG, SRC_INFO);

  void pool_unregister(PPOOL, void *allocaptr);
  void pool_unregister_debug(PPOOL, void *allocaptr, TAG, SRC_INFO);
  void pool_unregister_stack(PPOOL, void *allocaptr);
  void pool_unregister_stack_debug(PPOOL, void *allocaptr, TAG, SRC_INFO);
  void __sc_dbg_poolfree(PPOOL, void *Node);
  void __sc_dbg_src_poolfree (PPOOL, void *, TAG, SRC_INFO);

  void * __sc_dbg_poolcalloc (PPOOL, unsigned Number, unsigned NumBytes);
  void * __sc_dbg_src_poolcalloc (PPOOL,
                                unsigned Number, unsigned NumBytes,
                                  TAG, SRC_INFO);

  void * __sc_dbg_poolrealloc(PPOOL, void *Node, unsigned NumBytes);
  void * __sc_dbg_poolrealloc_debug(PPOOL, void *Node, unsigned NumBytes, TAG, SRC_INFO);
  void * __sc_dbg_poolstrdup (PPOOL, const char * Node);
  void * __sc_dbg_poolstrdup_debug (PPOOL, const char * Node, TAG, SRC_INFO);
  void * __sc_dbg_poolmemalign(PPOOL, unsigned Alignment, unsigned NumBytes);

  void poolcheck(PPOOL, void *Node);
  void poolcheckui(PPOOL, void *Node);
  void poolcheck_debug (PPOOL, void * Node, TAG, SRC_INFO);
  void poolcheckui_debug (PPOOL, void * Node, TAG, SRC_INFO);

  void poolcheckalign(PPOOL, void *Node, unsigned Offset);
  void poolcheckalign_debug (PPOOL, void *Node, unsigned Offset, TAG, SRC_INFO);

  void * boundscheck   (PPOOL, void * Source, void * Dest);
  void * boundscheckui (PPOOL, void * Source, void * Dest);
  void * boundscheckui_debug (PPOOL, void * S, void * D, TAG, SRC_INFO);
  void * boundscheck_debug (PPOOL, void * S, void * D, TAG, SRC_INFO);

  // Exact checks
  void * exactcheck2 (char *base, char *result, unsigned size);
  void * exactcheck2_debug (char *base, char *result, unsigned size,
                            TAG, SRC_INFO);
  void fastlscheck (const char *base, const char *result, unsigned size);
  void fastlscheck_debug (const char *base, const char *result, unsigned size,
                          unsigned tag,
                          const char * SourceFile,
                          unsigned lineno);

  void * pchk_getActualValue (PPOOL, void * src);

  // Indirect function call checks
  void funccheck   (void *f, void * targets[]);
  void funccheckui (void *f, void * targets[]);
  void funccheck_debug   (void *f, void * targets[], TAG, SRC_INFO);
  void funccheckui_debug (void *f, void * targets[], TAG, SRC_INFO);

  // Change memory protections to detect dangling pointers
  void * pool_shadow (void * Node, unsigned NumBytes);
  void * pool_unshadow (void * Node);
}

#undef PPOOL
#undef TAG
#undef SRC_INFO
#endif
