//===- CountingFunctionInserter.cpp - Insert mcount-like function calls ---===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// Insert calls to counter functions, such as mcount, intended to be called
// once per function, at the beginning of each function.
//
//===----------------------------------------------------------------------===//

#include "llvm/Analysis/GlobalsModRef.h"
#include "llvm/CodeGen/Passes.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Type.h"
#include "llvm/Pass.h"
using namespace llvm;

namespace {
  struct CountingFunctionInserter : public FunctionPass {
    static char ID; // Pass identification, replacement for typeid
    CountingFunctionInserter() : FunctionPass(ID) {
      initializeCountingFunctionInserterPass(*PassRegistry::getPassRegistry());
    }

    void getAnalysisUsage(AnalysisUsage &AU) const override {
      AU.addPreserved<GlobalsAAWrapperPass>();
    }

    bool runOnFunction(Function &F) override {
      StringRef CountingFunctionName =
        F.getFnAttribute("counting-function").getValueAsString();
      if (CountingFunctionName.empty())
        return false;

      Type *VoidTy = Type::getVoidTy(F.getContext());
      Constant *CountingFn =
        F.getParent()->getOrInsertFunction(CountingFunctionName,
                                           VoidTy);
      CallInst::Create(CountingFn, "", &*F.begin()->getFirstInsertionPt());
      return true;
    }
  };

  char CountingFunctionInserter::ID = 0;
}

INITIALIZE_PASS(CountingFunctionInserter, "cfinserter",
                "Inserts calls to mcount-like functions", false, false)

FunctionPass *llvm::createCountingFunctionInserterPass() {
  return new CountingFunctionInserter();
}
