xref: /llvm-project/llvm/lib/CodeGen/EHContGuardCatchret.cpp (revision 7d80ee5bdabbcb25b15fe54297d3f13793e4d8c2)
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