1*08086647SArlo Siemsen //===-- EHContGuardCatchret.cpp - Catchret target symbols -------*- C++ -*-===// 2*08086647SArlo Siemsen // 3*08086647SArlo Siemsen // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*08086647SArlo Siemsen // See https://llvm.org/LICENSE.txt for license information. 5*08086647SArlo Siemsen // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*08086647SArlo Siemsen // 7*08086647SArlo Siemsen //===----------------------------------------------------------------------===// 8*08086647SArlo Siemsen /// 9*08086647SArlo Siemsen /// \file 10*08086647SArlo Siemsen /// This file contains a machine function pass to insert a symbol before each 11*08086647SArlo Siemsen /// valid catchret target and store this in the MachineFunction's 12*08086647SArlo Siemsen /// CatchRetTargets vector. This will be used to emit the table of valid targets 13*08086647SArlo Siemsen /// used by EHCont Guard. 14*08086647SArlo Siemsen /// 15*08086647SArlo Siemsen //===----------------------------------------------------------------------===// 16*08086647SArlo Siemsen 17*08086647SArlo Siemsen #include "llvm/ADT/Statistic.h" 18*08086647SArlo Siemsen #include "llvm/CodeGen/MachineBasicBlock.h" 19*08086647SArlo Siemsen #include "llvm/CodeGen/MachineFunctionPass.h" 20*08086647SArlo Siemsen #include "llvm/CodeGen/MachineModuleInfo.h" 21*08086647SArlo Siemsen #include "llvm/CodeGen/Passes.h" 22*08086647SArlo Siemsen #include "llvm/InitializePasses.h" 23*08086647SArlo Siemsen 24*08086647SArlo Siemsen using namespace llvm; 25*08086647SArlo Siemsen 26*08086647SArlo Siemsen #define DEBUG_TYPE "ehcontguard-catchret" 27*08086647SArlo Siemsen 28*08086647SArlo Siemsen STATISTIC(EHContGuardCatchretTargets, 29*08086647SArlo Siemsen "Number of EHCont Guard catchret targets"); 30*08086647SArlo Siemsen 31*08086647SArlo Siemsen namespace { 32*08086647SArlo Siemsen 33*08086647SArlo Siemsen /// MachineFunction pass to insert a symbol before each valid catchret target 34*08086647SArlo Siemsen /// and store these in the MachineFunction's CatchRetTargets vector. 35*08086647SArlo Siemsen class EHContGuardCatchret : public MachineFunctionPass { 36*08086647SArlo Siemsen public: 37*08086647SArlo Siemsen static char ID; 38*08086647SArlo Siemsen EHContGuardCatchret()39*08086647SArlo Siemsen EHContGuardCatchret() : MachineFunctionPass(ID) { 40*08086647SArlo Siemsen initializeEHContGuardCatchretPass(*PassRegistry::getPassRegistry()); 41*08086647SArlo Siemsen } 42*08086647SArlo Siemsen getPassName() const43*08086647SArlo Siemsen StringRef getPassName() const override { 44*08086647SArlo Siemsen return "EH Cont Guard catchret targets"; 45*08086647SArlo Siemsen } 46*08086647SArlo Siemsen 47*08086647SArlo Siemsen bool runOnMachineFunction(MachineFunction &MF) override; 48*08086647SArlo Siemsen }; 49*08086647SArlo Siemsen 50*08086647SArlo Siemsen } // end anonymous namespace 51*08086647SArlo Siemsen 52*08086647SArlo Siemsen char EHContGuardCatchret::ID = 0; 53*08086647SArlo Siemsen 54*08086647SArlo Siemsen INITIALIZE_PASS(EHContGuardCatchret, "EHContGuardCatchret", 55*08086647SArlo Siemsen "Insert symbols at valid catchret targets for /guard:ehcont", 56*08086647SArlo Siemsen false, false) createEHContGuardCatchretPass()57*08086647SArlo SiemsenFunctionPass *llvm::createEHContGuardCatchretPass() { 58*08086647SArlo Siemsen return new EHContGuardCatchret(); 59*08086647SArlo Siemsen } 60*08086647SArlo Siemsen runOnMachineFunction(MachineFunction & MF)61*08086647SArlo Siemsenbool EHContGuardCatchret::runOnMachineFunction(MachineFunction &MF) { 62*08086647SArlo Siemsen 63*08086647SArlo Siemsen // Skip modules for which the ehcontguard flag is not set. 64*08086647SArlo Siemsen if (!MF.getMMI().getModule()->getModuleFlag("ehcontguard")) 65*08086647SArlo Siemsen return false; 66*08086647SArlo Siemsen 67*08086647SArlo Siemsen // Skip functions that do not have catchret 68*08086647SArlo Siemsen if (!MF.hasEHCatchret()) 69*08086647SArlo Siemsen return false; 70*08086647SArlo Siemsen 71*08086647SArlo Siemsen bool Result = false; 72*08086647SArlo Siemsen 73*08086647SArlo Siemsen for (MachineBasicBlock &MBB : MF) { 74*08086647SArlo Siemsen if (MBB.isEHCatchretTarget()) { 75*08086647SArlo Siemsen MF.addCatchretTarget(MBB.getEHCatchretSymbol()); 76*08086647SArlo Siemsen EHContGuardCatchretTargets++; 77*08086647SArlo Siemsen Result = true; 78*08086647SArlo Siemsen } 79*08086647SArlo Siemsen } 80*08086647SArlo Siemsen 81*08086647SArlo Siemsen return Result; 82*08086647SArlo Siemsen } 83