#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"
// 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<const X86TargetMachine *>(&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.
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();
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;
}
}
}
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()) {
class X86TargetMachine final : public LLVMTargetMachine {
std::unique_ptr<TargetLoweringObjectFile> TLOF;
mutable StringMap<std::unique_ptr<X86Subtarget>> SubtargetMap;
- // True if this is used in JIT.
- bool IsJIT;
public:
X86TargetMachine(const Target &T, const Triple &TT, StringRef CPU,
TargetLoweringObjectFile *getObjFileLowering() const override {
return TLOF.get();
}
-
- bool isJIT() const { return IsJIT; }
};
} // end namespace llvm
+++ /dev/null
-; 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}
+++ /dev/null
-; 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}