//===-- EHContGuardCatchret.cpp - Catchret target symbols -------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
///
/// \file
/// This file contains a machine function pass to insert a symbol before each
/// valid catchret target and store this in the MachineFunction's
/// CatchRetTargets vector. This will be used to emit the table of valid targets
/// used by EHCont Guard.
///
//===----------------------------------------------------------------------===//

#include "llvm/ADT/Statistic.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineInstr.h"
#include "llvm/CodeGen/MachineModuleInfo.h"
#include "llvm/CodeGen/MachineOperand.h"
#include "llvm/CodeGen/Passes.h"
#include "llvm/InitializePasses.h"

using namespace llvm;

#define DEBUG_TYPE "ehcontguard-catchret"

STATISTIC(EHContGuardCatchretTargets,
          "Number of EHCont Guard catchret targets");

namespace {

/// MachineFunction pass to insert a symbol before each valid catchret target
/// and store these in the MachineFunction's CatchRetTargets vector.
class EHContGuardCatchret : public MachineFunctionPass {
public:
  static char ID;

  EHContGuardCatchret() : MachineFunctionPass(ID) {
    initializeEHContGuardCatchretPass(*PassRegistry::getPassRegistry());
  }

  StringRef getPassName() const override {
    return "EH Cont Guard catchret targets";
  }

  bool runOnMachineFunction(MachineFunction &MF) override;
};

} // end anonymous namespace

char EHContGuardCatchret::ID = 0;

INITIALIZE_PASS(EHContGuardCatchret, "EHContGuardCatchret",
                "Insert symbols at valid catchret targets for /guard:ehcont",
                false, false)
FunctionPass *llvm::createEHContGuardCatchretPass() {
  return new EHContGuardCatchret();
}

bool EHContGuardCatchret::runOnMachineFunction(MachineFunction &MF) {

  // Skip modules for which the ehcontguard flag is not set.
  if (!MF.getMMI().getModule()->getModuleFlag("ehcontguard"))
    return false;

  // Skip functions that do not have catchret
  if (!MF.hasEHCatchret())
    return false;

  bool Result = false;

  for (MachineBasicBlock &MBB : MF) {
    if (MBB.isEHCatchretTarget()) {
      MF.addCatchretTarget(MBB.getEHCatchretSymbol());
      EHContGuardCatchretTargets++;
      Result = true;
    }
  }

  return Result;
}
