108086647SArlo Siemsen //===-- EHContGuardCatchret.cpp - Catchret target symbols -------*- C++ -*-===// 208086647SArlo Siemsen // 308086647SArlo Siemsen // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 408086647SArlo Siemsen // See https://llvm.org/LICENSE.txt for license information. 508086647SArlo Siemsen // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 608086647SArlo Siemsen // 708086647SArlo Siemsen //===----------------------------------------------------------------------===// 808086647SArlo Siemsen /// 908086647SArlo Siemsen /// \file 1008086647SArlo Siemsen /// This file contains a machine function pass to insert a symbol before each 1108086647SArlo Siemsen /// valid catchret target and store this in the MachineFunction's 1208086647SArlo Siemsen /// CatchRetTargets vector. This will be used to emit the table of valid targets 1308086647SArlo Siemsen /// used by EHCont Guard. 1408086647SArlo Siemsen /// 1508086647SArlo Siemsen //===----------------------------------------------------------------------===// 1608086647SArlo Siemsen 1708086647SArlo Siemsen #include "llvm/ADT/Statistic.h" 1808086647SArlo Siemsen #include "llvm/CodeGen/MachineBasicBlock.h" 1908086647SArlo Siemsen #include "llvm/CodeGen/MachineFunctionPass.h" 2008086647SArlo Siemsen #include "llvm/CodeGen/MachineModuleInfo.h" 2108086647SArlo Siemsen #include "llvm/CodeGen/Passes.h" 224169338eSNikita Popov #include "llvm/IR/Module.h" 2308086647SArlo Siemsen #include "llvm/InitializePasses.h" 2408086647SArlo Siemsen 2508086647SArlo Siemsen using namespace llvm; 2608086647SArlo Siemsen 2708086647SArlo Siemsen #define DEBUG_TYPE "ehcontguard-catchret" 2808086647SArlo Siemsen 2908086647SArlo Siemsen STATISTIC(EHContGuardCatchretTargets, 3008086647SArlo Siemsen "Number of EHCont Guard catchret targets"); 3108086647SArlo Siemsen 3208086647SArlo Siemsen namespace { 3308086647SArlo Siemsen 3408086647SArlo Siemsen /// MachineFunction pass to insert a symbol before each valid catchret target 3508086647SArlo Siemsen /// and store these in the MachineFunction's CatchRetTargets vector. 3608086647SArlo Siemsen class EHContGuardCatchret : public MachineFunctionPass { 3708086647SArlo Siemsen public: 3808086647SArlo Siemsen static char ID; 3908086647SArlo Siemsen 4008086647SArlo Siemsen EHContGuardCatchret() : MachineFunctionPass(ID) { 4108086647SArlo Siemsen initializeEHContGuardCatchretPass(*PassRegistry::getPassRegistry()); 4208086647SArlo Siemsen } 4308086647SArlo Siemsen 4408086647SArlo Siemsen StringRef getPassName() const override { 4508086647SArlo Siemsen return "EH Cont Guard catchret targets"; 4608086647SArlo Siemsen } 4708086647SArlo Siemsen 4808086647SArlo Siemsen bool runOnMachineFunction(MachineFunction &MF) override; 4908086647SArlo Siemsen }; 5008086647SArlo Siemsen 5108086647SArlo Siemsen } // end anonymous namespace 5208086647SArlo Siemsen 5308086647SArlo Siemsen char EHContGuardCatchret::ID = 0; 5408086647SArlo Siemsen 5508086647SArlo Siemsen INITIALIZE_PASS(EHContGuardCatchret, "EHContGuardCatchret", 5608086647SArlo Siemsen "Insert symbols at valid catchret targets for /guard:ehcont", 5708086647SArlo Siemsen false, false) 5808086647SArlo Siemsen FunctionPass *llvm::createEHContGuardCatchretPass() { 5908086647SArlo Siemsen return new EHContGuardCatchret(); 6008086647SArlo Siemsen } 6108086647SArlo Siemsen 6208086647SArlo Siemsen bool EHContGuardCatchret::runOnMachineFunction(MachineFunction &MF) { 6308086647SArlo Siemsen 6408086647SArlo Siemsen // Skip modules for which the ehcontguard flag is not set. 65*7d80ee5bSMatt Arsenault if (!MF.getFunction().getParent()->getModuleFlag("ehcontguard")) 6608086647SArlo Siemsen return false; 6708086647SArlo Siemsen 6808086647SArlo Siemsen // Skip functions that do not have catchret 6908086647SArlo Siemsen if (!MF.hasEHCatchret()) 7008086647SArlo Siemsen return false; 7108086647SArlo Siemsen 7208086647SArlo Siemsen bool Result = false; 7308086647SArlo Siemsen 7408086647SArlo Siemsen for (MachineBasicBlock &MBB : MF) { 7508086647SArlo Siemsen if (MBB.isEHCatchretTarget()) { 7608086647SArlo Siemsen MF.addCatchretTarget(MBB.getEHCatchretSymbol()); 7708086647SArlo Siemsen EHContGuardCatchretTargets++; 7808086647SArlo Siemsen Result = true; 7908086647SArlo Siemsen } 8008086647SArlo Siemsen } 8108086647SArlo Siemsen 8208086647SArlo Siemsen return Result; 8308086647SArlo Siemsen } 84