From: Hans Wennborg Date: Mon, 6 Apr 2020 13:05:08 +0000 (+0200) Subject: Revert 43f031d3126 "Enable IBT(Indirect Branch Tracking) in JIT with CET(Control... X-Git-Tag: llvmorg-12-init~9972 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=64c231275082f3b21a2839dcbbec8fc6548f50dd;p=platform%2Fupstream%2Fllvm.git Revert 43f031d3126 "Enable IBT(Indirect Branch Tracking) in JIT with CET(Control-flow Enforcement Technology)" ExecutionEngine/MCJIT/cet-code-model-lager.ll is failing on 32-bit windows, see llvm-commits thread for fef2dab. This reverts commit 43f031d31264d20cfb8f1ebd606c66e57c231d4d and the follow-ups fef2dab100dfc7c49ccf0ce2bacea409324b54ba and 6a800f6f622a7ade275fa6cb1ef07803460d8bb3. --- diff --git a/llvm/lib/Target/X86/X86IndirectBranchTracking.cpp b/llvm/lib/Target/X86/X86IndirectBranchTracking.cpp index 0a79b79..743df41 100644 --- a/llvm/lib/Target/X86/X86IndirectBranchTracking.cpp +++ b/llvm/lib/Target/X86/X86IndirectBranchTracking.cpp @@ -18,7 +18,6 @@ #include "X86.h" #include "X86InstrInfo.h" #include "X86Subtarget.h" -#include "X86TargetMachine.h" #include "llvm/ADT/Statistic.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineInstrBuilder.h" @@ -103,16 +102,7 @@ bool X86IndirectBranchTrackingPass::runOnMachineFunction(MachineFunction &MF) { // Check that the cf-protection-branch is enabled. Metadata *isCFProtectionSupported = MF.getMMI().getModule()->getModuleFlag("cf-protection-branch"); - // NB: We need to enable IBT in jitted code if JIT compiler is CET - // enabled. - const X86TargetMachine *TM = - static_cast(&MF.getTarget()); -#ifdef __CET__ - bool isJITwithCET = TM->isJIT(); -#else - bool isJITwithCET = false; -#endif - if (!isCFProtectionSupported && !IndirectBranchTracking && !isJITwithCET) + if (!isCFProtectionSupported && !IndirectBranchTracking) return false; // True if the current MF was changed and false otherwise. @@ -121,11 +111,10 @@ bool X86IndirectBranchTrackingPass::runOnMachineFunction(MachineFunction &MF) { TII = SubTarget.getInstrInfo(); EndbrOpcode = SubTarget.is64Bit() ? X86::ENDBR64 : X86::ENDBR32; - // Large code model, non-internal function or function whose address - // was taken, can be accessed through indirect calls. Mark the first - // BB with ENDBR instruction unless nocf_check attribute is used. - if ((TM->getCodeModel() == CodeModel::Large || - MF.getFunction().hasAddressTaken() || + // Non-internal function or function whose address was taken, can be + // accessed through indirect calls. Mark the first BB with ENDBR instruction + // unless nocf_check attribute is used. + if ((MF.getFunction().hasAddressTaken() || !MF.getFunction().hasLocalLinkage()) && !MF.getFunction().doesNoCfCheck()) { auto MBB = MF.begin(); @@ -147,8 +136,8 @@ bool X86IndirectBranchTrackingPass::runOnMachineFunction(MachineFunction &MF) { Changed |= addENDBR(MBB, std::next(I)); if (EHPadIBTNeeded && I->isEHLabel()) { - Changed |= addENDBR(MBB, std::next(I)); - EHPadIBTNeeded = false; + Changed |= addENDBR(MBB, std::next(I)); + EHPadIBTNeeded = false; } } } diff --git a/llvm/lib/Target/X86/X86TargetMachine.cpp b/llvm/lib/Target/X86/X86TargetMachine.cpp index b2551b6..d723ee5 100644 --- a/llvm/lib/Target/X86/X86TargetMachine.cpp +++ b/llvm/lib/Target/X86/X86TargetMachine.cpp @@ -215,7 +215,7 @@ X86TargetMachine::X86TargetMachine(const Target &T, const Triple &TT, getEffectiveRelocModel(TT, JIT, RM), getEffectiveX86CodeModel(CM, JIT, TT.getArch() == Triple::x86_64), OL), - TLOF(createTLOF(getTargetTriple())), IsJIT(JIT) { + TLOF(createTLOF(getTargetTriple())) { // On PS4, the "return address" of a 'noreturn' call must still be within // the calling function, and TrapUnreachable is an easy way to get that. if (TT.isPS4() || TT.isOSBinFormatMachO()) { diff --git a/llvm/lib/Target/X86/X86TargetMachine.h b/llvm/lib/Target/X86/X86TargetMachine.h index 757ce8b..ec3db7b 100644 --- a/llvm/lib/Target/X86/X86TargetMachine.h +++ b/llvm/lib/Target/X86/X86TargetMachine.h @@ -30,8 +30,6 @@ class TargetTransformInfo; class X86TargetMachine final : public LLVMTargetMachine { std::unique_ptr TLOF; mutable StringMap> SubtargetMap; - // True if this is used in JIT. - bool IsJIT; public: X86TargetMachine(const Target &T, const Triple &TT, StringRef CPU, @@ -54,8 +52,6 @@ public: TargetLoweringObjectFile *getObjFileLowering() const override { return TLOF.get(); } - - bool isJIT() const { return IsJIT; } }; } // end namespace llvm diff --git a/llvm/test/CodeGen/X86/indirect-branch-tracking-cm-lager.ll b/llvm/test/CodeGen/X86/indirect-branch-tracking-cm-lager.ll deleted file mode 100644 index f515c1a..0000000 --- a/llvm/test/CodeGen/X86/indirect-branch-tracking-cm-lager.ll +++ /dev/null @@ -1,36 +0,0 @@ -; RUN: llc -mtriple=x86_64-unknown-unknown -code-model=large < %s | FileCheck %s - -; In large code model indirect branches are needed when branching to addresses -; whose offset from the current instruction pointer is unknown. -;CHECK-COUNT-3: endbr - -@a = dso_local local_unnamed_addr global i32 1, align 4 - -; Function Attrs: nofree noinline norecurse nounwind uwtable writeonly -define dso_local void @ext() local_unnamed_addr #0 { -entry: - store i32 0, i32* @a, align 4 - ret void -} - -; Function Attrs: nofree norecurse nounwind uwtable -define dso_local i32 @main() local_unnamed_addr #1 { -entry: - tail call fastcc void @foo() - %0 = load i32, i32* @a, align 4 - ret i32 %0 -} - -; Function Attrs: nofree noinline norecurse nounwind uwtable writeonly -define internal fastcc void @foo() unnamed_addr #0 { -entry: - tail call void @ext() - ret void -} - -!llvm.module.flags = !{!0, !1, !2, !3} - -!0 = !{i32 1, !"wchar_size", i32 4} -!1 = !{i32 4, !"cf-protection-return", i32 1} -!2 = !{i32 4, !"cf-protection-branch", i32 1} -!3 = !{i32 1, !"Code Model", i32 4} diff --git a/llvm/test/ExecutionEngine/MCJIT/cet-code-model-lager.ll b/llvm/test/ExecutionEngine/MCJIT/cet-code-model-lager.ll deleted file mode 100644 index 3fe14cf..0000000 --- a/llvm/test/ExecutionEngine/MCJIT/cet-code-model-lager.ll +++ /dev/null @@ -1,32 +0,0 @@ -; RUN: %lli -mtriple=x86_64-unknown-unknown -code-model=large %s > /dev/null - -@a = dso_local local_unnamed_addr global i32 1, align 4 - -; Function Attrs: nofree noinline norecurse nounwind uwtable writeonly -define dso_local void @ext() local_unnamed_addr #0 { -entry: - store i32 0, i32* @a, align 4 - ret void -} - -; Function Attrs: nofree norecurse nounwind uwtable -define dso_local i32 @main() local_unnamed_addr #1 { -entry: - tail call fastcc void @foo() - %0 = load i32, i32* @a, align 4 - ret i32 %0 -} - -; Function Attrs: nofree noinline norecurse nounwind uwtable writeonly -define internal fastcc void @foo() unnamed_addr #0 { -entry: - tail call void @ext() - ret void -} - -!llvm.module.flags = !{!0, !1, !2, !3} - -!0 = !{i32 1, !"wchar_size", i32 4} -!1 = !{i32 4, !"cf-protection-return", i32 1} -!2 = !{i32 4, !"cf-protection-branch", i32 1} -!3 = !{i32 1, !"Code Model", i32 4}