171d5a254SDimitry Andric //===-- FEntryInsertion.cpp - Patchable prologues for LLVM -------------===// 271d5a254SDimitry Andric // 3e6d15924SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e6d15924SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5e6d15924SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 671d5a254SDimitry Andric // 771d5a254SDimitry Andric //===----------------------------------------------------------------------===// 871d5a254SDimitry Andric // 971d5a254SDimitry Andric // This file edits function bodies to insert fentry calls. 1071d5a254SDimitry Andric // 1171d5a254SDimitry Andric //===----------------------------------------------------------------------===// 1271d5a254SDimitry Andric 1371d5a254SDimitry Andric #include "llvm/CodeGen/MachineFunction.h" 1471d5a254SDimitry Andric #include "llvm/CodeGen/MachineFunctionPass.h" 1571d5a254SDimitry Andric #include "llvm/CodeGen/MachineInstrBuilder.h" 16044eb2f6SDimitry Andric #include "llvm/CodeGen/TargetInstrInfo.h" 17044eb2f6SDimitry Andric #include "llvm/CodeGen/TargetSubtargetInfo.h" 1871d5a254SDimitry Andric #include "llvm/IR/Function.h" 19706b4fc4SDimitry Andric #include "llvm/InitializePasses.h" 2071d5a254SDimitry Andric 2171d5a254SDimitry Andric using namespace llvm; 2271d5a254SDimitry Andric 2371d5a254SDimitry Andric namespace { 2471d5a254SDimitry Andric struct FEntryInserter : public MachineFunctionPass { 2571d5a254SDimitry Andric static char ID; // Pass identification, replacement for typeid FEntryInserter__anonfb933b4d0111::FEntryInserter2671d5a254SDimitry Andric FEntryInserter() : MachineFunctionPass(ID) { 2771d5a254SDimitry Andric initializeFEntryInserterPass(*PassRegistry::getPassRegistry()); 2871d5a254SDimitry Andric } 2971d5a254SDimitry Andric 3071d5a254SDimitry Andric bool runOnMachineFunction(MachineFunction &F) override; 3171d5a254SDimitry Andric }; 3271d5a254SDimitry Andric } 3371d5a254SDimitry Andric runOnMachineFunction(MachineFunction & MF)3471d5a254SDimitry Andricbool FEntryInserter::runOnMachineFunction(MachineFunction &MF) { 35cfca06d7SDimitry Andric const std::string FEntryName = std::string( 36cfca06d7SDimitry Andric MF.getFunction().getFnAttribute("fentry-call").getValueAsString()); 3771d5a254SDimitry Andric if (FEntryName != "true") 3871d5a254SDimitry Andric return false; 3971d5a254SDimitry Andric 4071d5a254SDimitry Andric auto &FirstMBB = *MF.begin(); 4171d5a254SDimitry Andric auto *TII = MF.getSubtarget().getInstrInfo(); 42044eb2f6SDimitry Andric BuildMI(FirstMBB, FirstMBB.begin(), DebugLoc(), 4371d5a254SDimitry Andric TII->get(TargetOpcode::FENTRY_CALL)); 4471d5a254SDimitry Andric return true; 4571d5a254SDimitry Andric } 4671d5a254SDimitry Andric 4771d5a254SDimitry Andric char FEntryInserter::ID = 0; 4871d5a254SDimitry Andric char &llvm::FEntryInserterID = FEntryInserter::ID; 4971d5a254SDimitry Andric INITIALIZE_PASS(FEntryInserter, "fentry-insert", "Insert fentry calls", false, 5071d5a254SDimitry Andric false) 51