85 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
//===-- 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;
 | 
						|
}
 |