//==- X86ReturnThunks.cpp - Replace rets with thunks or inline thunks --=// // // 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 /// /// Pass that replaces ret instructions with a jmp to __x86_return_thunk. /// /// This corresponds to -mfunction-return=thunk-extern or /// __attribute__((function_return("thunk-extern"). /// /// This pass is a minimal implementation necessary to help mitigate /// RetBleed for the Linux kernel. /// /// Should support for thunk or thunk-inline be necessary in the future, then /// this pass should be combined with x86-retpoline-thunks which already has /// machinery to emit thunks. Until then, YAGNI. /// /// This pass is very similar to x86-lvi-ret. /// //===----------------------------------------------------------------------===// #include "X86.h" #include "X86InstrInfo.h" #include "X86Subtarget.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" #include "llvm/CodeGen/MachineBasicBlock.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineInstr.h" #include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/CodeGen/MachineModuleInfo.h" #include "llvm/IR/Module.h" #include "llvm/MC/MCInstrDesc.h" #include "llvm/Support/Debug.h" #include "llvm/TargetParser/Triple.h" usingnamespacellvm; #define PASS_KEY … #define DEBUG_TYPE … namespace { struct X86ReturnThunks final : public MachineFunctionPass { … }; } // namespace char X86ReturnThunks::ID = …; bool X86ReturnThunks::runOnMachineFunction(MachineFunction &MF) { … } INITIALIZE_PASS(…) FunctionPass *llvm::createX86ReturnThunksPass() { … }