1a7c041d1SNirav Dave //===-- FEntryInsertion.cpp - Patchable prologues for LLVM -------------===// 2a7c041d1SNirav Dave // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6a7c041d1SNirav Dave // 7a7c041d1SNirav Dave //===----------------------------------------------------------------------===// 8a7c041d1SNirav Dave // 9a7c041d1SNirav Dave // This file edits function bodies to insert fentry calls. 10a7c041d1SNirav Dave // 11a7c041d1SNirav Dave //===----------------------------------------------------------------------===// 12a7c041d1SNirav Dave 13a7c041d1SNirav Dave #include "llvm/CodeGen/MachineFunction.h" 14a7c041d1SNirav Dave #include "llvm/CodeGen/MachineFunctionPass.h" 15a7c041d1SNirav Dave #include "llvm/CodeGen/MachineInstrBuilder.h" 163f833edcSDavid Blaikie #include "llvm/CodeGen/TargetInstrInfo.h" 17b3bde2eaSDavid Blaikie #include "llvm/CodeGen/TargetSubtargetInfo.h" 18a7c041d1SNirav Dave #include "llvm/IR/Function.h" 1905da2fe5SReid Kleckner #include "llvm/InitializePasses.h" 20a7c041d1SNirav Dave 21a7c041d1SNirav Dave using namespace llvm; 22a7c041d1SNirav Dave 23a7c041d1SNirav Dave namespace { 24a7c041d1SNirav Dave struct FEntryInserter : public MachineFunctionPass { 25a7c041d1SNirav Dave static char ID; // Pass identification, replacement for typeid FEntryInserter__anonef8f796b0111::FEntryInserter26a7c041d1SNirav Dave FEntryInserter() : MachineFunctionPass(ID) { 27a7c041d1SNirav Dave initializeFEntryInserterPass(*PassRegistry::getPassRegistry()); 28a7c041d1SNirav Dave } 29a7c041d1SNirav Dave 30a7c041d1SNirav Dave bool runOnMachineFunction(MachineFunction &F) override; 31a7c041d1SNirav Dave }; 32a7c041d1SNirav Dave } 33a7c041d1SNirav Dave runOnMachineFunction(MachineFunction & MF)34a7c041d1SNirav Davebool FEntryInserter::runOnMachineFunction(MachineFunction &MF) { 35*adcd0268SBenjamin Kramer const std::string FEntryName = std::string( 36*adcd0268SBenjamin Kramer MF.getFunction().getFnAttribute("fentry-call").getValueAsString()); 37a7c041d1SNirav Dave if (FEntryName != "true") 38a7c041d1SNirav Dave return false; 39a7c041d1SNirav Dave 40a7c041d1SNirav Dave auto &FirstMBB = *MF.begin(); 41a7c041d1SNirav Dave auto *TII = MF.getSubtarget().getInstrInfo(); 427ebbe655SManoj Gupta BuildMI(FirstMBB, FirstMBB.begin(), DebugLoc(), 43a7c041d1SNirav Dave TII->get(TargetOpcode::FENTRY_CALL)); 44a7c041d1SNirav Dave return true; 45a7c041d1SNirav Dave } 46a7c041d1SNirav Dave 47a7c041d1SNirav Dave char FEntryInserter::ID = 0; 48a7c041d1SNirav Dave char &llvm::FEntryInserterID = FEntryInserter::ID; 49a7c041d1SNirav Dave INITIALIZE_PASS(FEntryInserter, "fentry-insert", "Insert fentry calls", false, 50a7c041d1SNirav Dave false) 51