10b57cec5SDimitry Andric //===-- FEntryInsertion.cpp - Patchable prologues for LLVM -------------===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric // 90b57cec5SDimitry Andric // This file edits function bodies to insert fentry calls. 100b57cec5SDimitry Andric // 110b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric #include "llvm/CodeGen/MachineFunction.h" 140b57cec5SDimitry Andric #include "llvm/CodeGen/MachineFunctionPass.h" 150b57cec5SDimitry Andric #include "llvm/CodeGen/MachineInstrBuilder.h" 160b57cec5SDimitry Andric #include "llvm/CodeGen/TargetInstrInfo.h" 170b57cec5SDimitry Andric #include "llvm/CodeGen/TargetSubtargetInfo.h" 180b57cec5SDimitry Andric #include "llvm/IR/Function.h" 19480093f4SDimitry Andric #include "llvm/InitializePasses.h" 200b57cec5SDimitry Andric 210b57cec5SDimitry Andric using namespace llvm; 220b57cec5SDimitry Andric 230b57cec5SDimitry Andric namespace { 240b57cec5SDimitry Andric struct FEntryInserter : public MachineFunctionPass { 250b57cec5SDimitry Andric static char ID; // Pass identification, replacement for typeid FEntryInserter__anonbd8df84a0111::FEntryInserter260b57cec5SDimitry Andric FEntryInserter() : MachineFunctionPass(ID) { 270b57cec5SDimitry Andric initializeFEntryInserterPass(*PassRegistry::getPassRegistry()); 280b57cec5SDimitry Andric } 290b57cec5SDimitry Andric 300b57cec5SDimitry Andric bool runOnMachineFunction(MachineFunction &F) override; 310b57cec5SDimitry Andric }; 320b57cec5SDimitry Andric } 330b57cec5SDimitry Andric runOnMachineFunction(MachineFunction & MF)340b57cec5SDimitry Andricbool FEntryInserter::runOnMachineFunction(MachineFunction &MF) { 35*5ffd83dbSDimitry Andric const std::string FEntryName = std::string( 36*5ffd83dbSDimitry Andric MF.getFunction().getFnAttribute("fentry-call").getValueAsString()); 370b57cec5SDimitry Andric if (FEntryName != "true") 380b57cec5SDimitry Andric return false; 390b57cec5SDimitry Andric 400b57cec5SDimitry Andric auto &FirstMBB = *MF.begin(); 410b57cec5SDimitry Andric auto *TII = MF.getSubtarget().getInstrInfo(); 420b57cec5SDimitry Andric BuildMI(FirstMBB, FirstMBB.begin(), DebugLoc(), 430b57cec5SDimitry Andric TII->get(TargetOpcode::FENTRY_CALL)); 440b57cec5SDimitry Andric return true; 450b57cec5SDimitry Andric } 460b57cec5SDimitry Andric 470b57cec5SDimitry Andric char FEntryInserter::ID = 0; 480b57cec5SDimitry Andric char &llvm::FEntryInserterID = FEntryInserter::ID; 490b57cec5SDimitry Andric INITIALIZE_PASS(FEntryInserter, "fentry-insert", "Insert fentry calls", false, 500b57cec5SDimitry Andric false) 51