blob: f1199fef48d4df986fcb02449de563a94a2e44d2 [file] [log] [blame]
//===---- LoggingFunctions.h - Register va_lists for securing vprintf() ---===//
//
// 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.
//
//===----------------------------------------------------------------------===//
//
// These passes identify where va_lists are created, and add calls around these
// sites so that the SAFECode vprintf() / vscanf() wrappers can identify the
// contents of these lists.
//
//===----------------------------------------------------------------------===//
#ifndef LOGGING_FUNCTIONS_H
#define LOGGING_FUNCTIONS_H
#include "llvm/IR/Module.h"
#include "llvm/InstVisitor.h"
#include "llvm/Pass.h"
#include "llvm/Support/CallSite.h"
#include "safecode/SAFECode.h"
#include <string>
#include <vector>
#include <map>
using std::string;
using std::vector;
using std::map;
namespace llvm
{
class RegisterVarargCallSites :
public ModulePass, public InstVisitor<RegisterVarargCallSites> {
private:
static const char *ExternalVarargFunctions[];
map<Function *, bool> shouldRegister;
vector<CallSite> toRegister;
Value *registrationFunc, *unregistrationFunc;
void makeRegistrationFunctions(Module &M);
static bool isExternalVarargFunction(const string &name);
void registerCallSite(Module &M, CallSite &CS);
public:
static char ID;
RegisterVarargCallSites() : ModulePass(ID) {}
bool runOnModule(Module &M);
void visitCallInst(CallInst &I);
};
class LoggingFunctions : public ModulePass {
private:
Value *targetCheckFunc, *vaRegisterFunc, *vaCopyRegisterFunc;
map<Function *, Value *> targetCheckCalls;
void registerVaStartCallSite(CallSite &CS);
void registerVaCopyCallSite(CallSite &CS);
public:
static char ID;
LoggingFunctions() : ModulePass(ID) {}
bool runOnModule(Module &M);
};
}
#endif