//===-- CFGuardLongjmp.cpp - Longjmp symbols for CFGuard --------*- 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 after each /// call to _setjmp and store this in the MachineFunction's LongjmpTargets /// vector. This will be used to emit the table of valid longjmp targets used /// by Control Flow 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/IR/Module.h" #include "llvm/InitializePasses.h" usingnamespacellvm; #define DEBUG_TYPE … STATISTIC(CFGuardLongjmpTargets, "Number of Control Flow Guard longjmp targets"); namespace { /// MachineFunction pass to insert a symbol after each call to _setjmp and store /// this in the MachineFunction's LongjmpTargets vector. class CFGuardLongjmp : public MachineFunctionPass { … }; } // end anonymous namespace char CFGuardLongjmp::ID = …; INITIALIZE_PASS(…) FunctionPass *llvm::createCFGuardLongjmpPass() { … } bool CFGuardLongjmp::runOnMachineFunction(MachineFunction &MF) { … }