2018-01-10 07:49:30 +08:00
|
|
|
//===-- WinCFGuard.h - Windows Control Flow Guard Handling ----*- C++ -*--===//
|
|
|
|
//
|
2019-01-19 16:50:56 +08:00
|
|
|
// 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
|
2018-01-10 07:49:30 +08:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
Add Windows Control Flow Guard checks (/guard:cf).
Summary:
A new function pass (Transforms/CFGuard/CFGuard.cpp) inserts CFGuard checks on
indirect function calls, using either the check mechanism (X86, ARM, AArch64) or
or the dispatch mechanism (X86-64). The check mechanism requires a new calling
convention for the supported targets. The dispatch mechanism adds the target as
an operand bundle, which is processed by SelectionDAG. Another pass
(CodeGen/CFGuardLongjmp.cpp) identifies and emits valid longjmp targets, as
required by /guard:cf. This feature is enabled using the `cfguard` CC1 option.
Reviewers: thakis, rnk, theraven, pcc
Subscribers: ychen, hans, metalcanine, dmajor, tomrittervg, alex, mehdi_amini, mgorny, javed.absar, kristof.beyls, hiraditya, steven_wu, dexonsmith, cfe-commits, llvm-commits
Tags: #clang, #llvm
Differential Revision: https://reviews.llvm.org/D65761
2019-10-28 21:22:19 +08:00
|
|
|
// This file contains support for writing the metadata for Windows Control Flow
|
|
|
|
// Guard, including address-taken functions, and valid longjmp targets.
|
2018-01-10 07:49:30 +08:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#ifndef LLVM_LIB_CODEGEN_ASMPRINTER_WINCFGUARD_H
|
|
|
|
#define LLVM_LIB_CODEGEN_ASMPRINTER_WINCFGUARD_H
|
|
|
|
|
2018-12-19 07:10:17 +08:00
|
|
|
#include "llvm/CodeGen/AsmPrinterHandler.h"
|
2018-01-10 07:49:30 +08:00
|
|
|
#include "llvm/Support/Compiler.h"
|
Add Windows Control Flow Guard checks (/guard:cf).
Summary:
A new function pass (Transforms/CFGuard/CFGuard.cpp) inserts CFGuard checks on
indirect function calls, using either the check mechanism (X86, ARM, AArch64) or
or the dispatch mechanism (X86-64). The check mechanism requires a new calling
convention for the supported targets. The dispatch mechanism adds the target as
an operand bundle, which is processed by SelectionDAG. Another pass
(CodeGen/CFGuardLongjmp.cpp) identifies and emits valid longjmp targets, as
required by /guard:cf. This feature is enabled using the `cfguard` CC1 option.
Reviewers: thakis, rnk, theraven, pcc
Subscribers: ychen, hans, metalcanine, dmajor, tomrittervg, alex, mehdi_amini, mgorny, javed.absar, kristof.beyls, hiraditya, steven_wu, dexonsmith, cfe-commits, llvm-commits
Tags: #clang, #llvm
Differential Revision: https://reviews.llvm.org/D65761
2019-10-28 21:22:19 +08:00
|
|
|
#include <vector>
|
2018-01-10 07:49:30 +08:00
|
|
|
|
|
|
|
namespace llvm {
|
|
|
|
|
|
|
|
class LLVM_LIBRARY_VISIBILITY WinCFGuard : public AsmPrinterHandler {
|
|
|
|
/// Target of directive emission.
|
|
|
|
AsmPrinter *Asm;
|
Add Windows Control Flow Guard checks (/guard:cf).
Summary:
A new function pass (Transforms/CFGuard/CFGuard.cpp) inserts CFGuard checks on
indirect function calls, using either the check mechanism (X86, ARM, AArch64) or
or the dispatch mechanism (X86-64). The check mechanism requires a new calling
convention for the supported targets. The dispatch mechanism adds the target as
an operand bundle, which is processed by SelectionDAG. Another pass
(CodeGen/CFGuardLongjmp.cpp) identifies and emits valid longjmp targets, as
required by /guard:cf. This feature is enabled using the `cfguard` CC1 option.
Reviewers: thakis, rnk, theraven, pcc
Subscribers: ychen, hans, metalcanine, dmajor, tomrittervg, alex, mehdi_amini, mgorny, javed.absar, kristof.beyls, hiraditya, steven_wu, dexonsmith, cfe-commits, llvm-commits
Tags: #clang, #llvm
Differential Revision: https://reviews.llvm.org/D65761
2019-10-28 21:22:19 +08:00
|
|
|
std::vector<const MCSymbol *> LongjmpTargets;
|
2020-11-18 10:02:13 +08:00
|
|
|
MCSymbol *lookupImpSymbol(const MCSymbol *Sym);
|
2018-01-10 07:49:30 +08:00
|
|
|
|
|
|
|
public:
|
|
|
|
WinCFGuard(AsmPrinter *A);
|
|
|
|
~WinCFGuard() override;
|
|
|
|
|
|
|
|
void setSymbolSize(const MCSymbol *Sym, uint64_t Size) override {}
|
|
|
|
|
Add Windows Control Flow Guard checks (/guard:cf).
Summary:
A new function pass (Transforms/CFGuard/CFGuard.cpp) inserts CFGuard checks on
indirect function calls, using either the check mechanism (X86, ARM, AArch64) or
or the dispatch mechanism (X86-64). The check mechanism requires a new calling
convention for the supported targets. The dispatch mechanism adds the target as
an operand bundle, which is processed by SelectionDAG. Another pass
(CodeGen/CFGuardLongjmp.cpp) identifies and emits valid longjmp targets, as
required by /guard:cf. This feature is enabled using the `cfguard` CC1 option.
Reviewers: thakis, rnk, theraven, pcc
Subscribers: ychen, hans, metalcanine, dmajor, tomrittervg, alex, mehdi_amini, mgorny, javed.absar, kristof.beyls, hiraditya, steven_wu, dexonsmith, cfe-commits, llvm-commits
Tags: #clang, #llvm
Differential Revision: https://reviews.llvm.org/D65761
2019-10-28 21:22:19 +08:00
|
|
|
/// Emit the Control Flow Guard function ID table.
|
2018-01-10 07:49:30 +08:00
|
|
|
void endModule() override;
|
|
|
|
|
2018-05-01 23:54:18 +08:00
|
|
|
/// Gather pre-function debug information.
|
2018-01-10 07:49:30 +08:00
|
|
|
/// Every beginFunction(MF) call should be followed by an endFunction(MF)
|
|
|
|
/// call.
|
|
|
|
void beginFunction(const MachineFunction *MF) override {}
|
|
|
|
|
2018-05-01 23:54:18 +08:00
|
|
|
/// Gather post-function debug information.
|
2018-01-10 07:49:30 +08:00
|
|
|
/// Please note that some AsmPrinter implementations may not call
|
|
|
|
/// beginFunction at all.
|
Add Windows Control Flow Guard checks (/guard:cf).
Summary:
A new function pass (Transforms/CFGuard/CFGuard.cpp) inserts CFGuard checks on
indirect function calls, using either the check mechanism (X86, ARM, AArch64) or
or the dispatch mechanism (X86-64). The check mechanism requires a new calling
convention for the supported targets. The dispatch mechanism adds the target as
an operand bundle, which is processed by SelectionDAG. Another pass
(CodeGen/CFGuardLongjmp.cpp) identifies and emits valid longjmp targets, as
required by /guard:cf. This feature is enabled using the `cfguard` CC1 option.
Reviewers: thakis, rnk, theraven, pcc
Subscribers: ychen, hans, metalcanine, dmajor, tomrittervg, alex, mehdi_amini, mgorny, javed.absar, kristof.beyls, hiraditya, steven_wu, dexonsmith, cfe-commits, llvm-commits
Tags: #clang, #llvm
Differential Revision: https://reviews.llvm.org/D65761
2019-10-28 21:22:19 +08:00
|
|
|
void endFunction(const MachineFunction *MF) override;
|
2018-01-10 07:49:30 +08:00
|
|
|
|
2018-05-01 23:54:18 +08:00
|
|
|
/// Process beginning of an instruction.
|
2018-01-10 07:49:30 +08:00
|
|
|
void beginInstruction(const MachineInstr *MI) override {}
|
|
|
|
|
2018-05-01 23:54:18 +08:00
|
|
|
/// Process end of an instruction.
|
2018-01-10 07:49:30 +08:00
|
|
|
void endInstruction() override {}
|
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace llvm
|
|
|
|
|
|
|
|
#endif
|