mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +01:00
6ca59da244
From a user prospective, it forces the use of an annoying nullptr to mark the end of the vararg, and there's not type checking on the arguments. The variadic template is an obvious solution to both issues. Differential Revision: https://reviews.llvm.org/D31070 llvm-svn: 299949
63 lines
2.1 KiB
C++
63 lines
2.1 KiB
C++
//===- 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 =
|
|
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)
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// CountingFunctionInserter - Give any unnamed non-void instructions "tmp" names.
|
|
//
|
|
FunctionPass *llvm::createCountingFunctionInserterPass() {
|
|
return new CountingFunctionInserter();
|
|
}
|