2016-09-01 09:42:39 +00:00
|
|
|
//===- 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 {
|
|
|
|
std::string CountingFunctionName =
|
|
|
|
F.getFnAttribute("counting-function").getValueAsString();
|
|
|
|
if (CountingFunctionName.empty())
|
|
|
|
return false;
|
|
|
|
|
|
|
|
Type *VoidTy = Type::getVoidTy(F.getContext());
|
|
|
|
Constant *CountingFn =
|
2017-04-06 20:23:57 +00:00
|
|
|
F.getParent()->getOrInsertFunction(CountingFunctionName,
|
2017-04-11 15:01:18 +00:00
|
|
|
VoidTy);
|
2016-09-01 09:42:39 +00:00
|
|
|
CallInst::Create(CountingFn, "", &*F.begin()->getFirstInsertionPt());
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
char CountingFunctionInserter::ID = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
INITIALIZE_PASS(CountingFunctionInserter, "cfinserter",
|
|
|
|
"Inserts calls to mcount-like functions", false, false)
|
|
|
|
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// CountingFunctionInserter - Give any unnamed non-void instructions "tmp" names.
|
|
|
|
//
|
|
|
|
FunctionPass *llvm::createCountingFunctionInserterPass() {
|
|
|
|
return new CountingFunctionInserter();
|
|
|
|
}
|