1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- //===- 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();
- }
|