1a7c041d1SNirav Dave //===-- FEntryInsertion.cpp - Patchable prologues for LLVM -------------===// 2a7c041d1SNirav Dave // 3a7c041d1SNirav Dave // The LLVM Compiler Infrastructure 4a7c041d1SNirav Dave // 5a7c041d1SNirav Dave // This file is distributed under the University of Illinois Open Source 6a7c041d1SNirav Dave // License. See LICENSE.TXT for details. 7a7c041d1SNirav Dave // 8a7c041d1SNirav Dave //===----------------------------------------------------------------------===// 9a7c041d1SNirav Dave // 10a7c041d1SNirav Dave // This file edits function bodies to insert fentry calls. 11a7c041d1SNirav Dave // 12a7c041d1SNirav Dave //===----------------------------------------------------------------------===// 13a7c041d1SNirav Dave 14a7c041d1SNirav Dave #include "llvm/CodeGen/MachineFunction.h" 15a7c041d1SNirav Dave #include "llvm/CodeGen/MachineFunctionPass.h" 16a7c041d1SNirav Dave #include "llvm/CodeGen/MachineInstrBuilder.h" 17a7c041d1SNirav Dave #include "llvm/CodeGen/Passes.h" 183f833edcSDavid Blaikie #include "llvm/CodeGen/TargetFrameLowering.h" 193f833edcSDavid Blaikie #include "llvm/CodeGen/TargetInstrInfo.h" 20*b3bde2eaSDavid Blaikie #include "llvm/CodeGen/TargetSubtargetInfo.h" 21a7c041d1SNirav Dave #include "llvm/IR/Function.h" 22a7c041d1SNirav Dave #include "llvm/IR/Module.h" 23a7c041d1SNirav Dave 24a7c041d1SNirav Dave using namespace llvm; 25a7c041d1SNirav Dave 26a7c041d1SNirav Dave namespace { 27a7c041d1SNirav Dave struct FEntryInserter : public MachineFunctionPass { 28a7c041d1SNirav Dave static char ID; // Pass identification, replacement for typeid 29a7c041d1SNirav Dave FEntryInserter() : MachineFunctionPass(ID) { 30a7c041d1SNirav Dave initializeFEntryInserterPass(*PassRegistry::getPassRegistry()); 31a7c041d1SNirav Dave } 32a7c041d1SNirav Dave 33a7c041d1SNirav Dave bool runOnMachineFunction(MachineFunction &F) override; 34a7c041d1SNirav Dave }; 35a7c041d1SNirav Dave } 36a7c041d1SNirav Dave 37a7c041d1SNirav Dave bool FEntryInserter::runOnMachineFunction(MachineFunction &MF) { 38a7c041d1SNirav Dave const std::string FEntryName = 39a7c041d1SNirav Dave MF.getFunction()->getFnAttribute("fentry-call").getValueAsString(); 40a7c041d1SNirav Dave if (FEntryName != "true") 41a7c041d1SNirav Dave return false; 42a7c041d1SNirav Dave 43a7c041d1SNirav Dave auto &FirstMBB = *MF.begin(); 44a7c041d1SNirav Dave auto *TII = MF.getSubtarget().getInstrInfo(); 457ebbe655SManoj Gupta BuildMI(FirstMBB, FirstMBB.begin(), DebugLoc(), 46a7c041d1SNirav Dave TII->get(TargetOpcode::FENTRY_CALL)); 47a7c041d1SNirav Dave return true; 48a7c041d1SNirav Dave } 49a7c041d1SNirav Dave 50a7c041d1SNirav Dave char FEntryInserter::ID = 0; 51a7c041d1SNirav Dave char &llvm::FEntryInserterID = FEntryInserter::ID; 52a7c041d1SNirav Dave INITIALIZE_PASS(FEntryInserter, "fentry-insert", "Insert fentry calls", false, 53a7c041d1SNirav Dave false) 54