[llvm] a79060e - Revert "KCFI sanitizer"
Sami Tolvanen via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 24 12:32:00 PDT 2022
Author: Sami Tolvanen
Date: 2022-08-24T19:30:13Z
New Revision: a79060e275440ccd8d403d5af5fb5b9395ea3fac
URL: https://github.com/llvm/llvm-project/commit/a79060e275440ccd8d403d5af5fb5b9395ea3fac
DIFF: https://github.com/llvm/llvm-project/commit/a79060e275440ccd8d403d5af5fb5b9395ea3fac.diff
LOG: Revert "KCFI sanitizer"
This reverts commit 67504c95494ff05be2a613129110c9bcf17f6c13 as using
PointerEmbeddedInt to store 32 bits breaks 32-bit arm builds.
Added:
Modified:
clang/docs/ControlFlowIntegrity.rst
clang/docs/UsersManual.rst
clang/include/clang/Basic/Features.def
clang/include/clang/Basic/Sanitizers.def
clang/lib/CodeGen/CGCall.cpp
clang/lib/CodeGen/CodeGenFunction.cpp
clang/lib/CodeGen/CodeGenFunction.h
clang/lib/CodeGen/CodeGenModule.cpp
clang/lib/CodeGen/CodeGenModule.h
clang/lib/Driver/SanitizerArgs.cpp
clang/lib/Driver/ToolChain.cpp
clang/test/Driver/fsanitize.c
llvm/docs/LangRef.rst
llvm/include/llvm/CodeGen/AsmPrinter.h
llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h
llvm/include/llvm/CodeGen/MachineFunction.h
llvm/include/llvm/CodeGen/MachineInstr.h
llvm/include/llvm/CodeGen/SelectionDAGNodes.h
llvm/include/llvm/CodeGen/TargetLowering.h
llvm/include/llvm/IR/FixedMetadataKinds.def
llvm/include/llvm/IR/InstrTypes.h
llvm/include/llvm/IR/LLVMContext.h
llvm/include/llvm/MC/MCObjectFileInfo.h
llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
llvm/lib/CodeGen/GlobalISel/CallLowering.cpp
llvm/lib/CodeGen/MIRParser/MILexer.cpp
llvm/lib/CodeGen/MIRParser/MILexer.h
llvm/lib/CodeGen/MIRParser/MIParser.cpp
llvm/lib/CodeGen/MIRPrinter.cpp
llvm/lib/CodeGen/MachineFunction.cpp
llvm/lib/CodeGen/MachineInstr.cpp
llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp
llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
llvm/lib/IR/Instructions.cpp
llvm/lib/IR/LLVMContext.cpp
llvm/lib/IR/Verifier.cpp
llvm/lib/MC/MCObjectFileInfo.cpp
llvm/lib/Target/AArch64/AArch64.h
llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp
llvm/lib/Target/AArch64/AArch64ExpandPseudoInsts.cpp
llvm/lib/Target/AArch64/AArch64FastISel.cpp
llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
llvm/lib/Target/AArch64/AArch64ISelLowering.h
llvm/lib/Target/AArch64/AArch64InstrInfo.td
llvm/lib/Target/AArch64/AArch64TargetMachine.cpp
llvm/lib/Target/AArch64/CMakeLists.txt
llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp
llvm/lib/Target/X86/CMakeLists.txt
llvm/lib/Target/X86/X86.h
llvm/lib/Target/X86/X86AsmPrinter.cpp
llvm/lib/Target/X86/X86AsmPrinter.h
llvm/lib/Target/X86/X86ExpandPseudo.cpp
llvm/lib/Target/X86/X86FastISel.cpp
llvm/lib/Target/X86/X86ISelLowering.cpp
llvm/lib/Target/X86/X86ISelLowering.h
llvm/lib/Target/X86/X86InstrCompiler.td
llvm/lib/Target/X86/X86MCInstLower.cpp
llvm/lib/Target/X86/X86TargetMachine.cpp
llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp
llvm/lib/Transforms/Utils/InlineFunction.cpp
llvm/test/Bitcode/operand-bundles-bc-analyzer.ll
llvm/test/CodeGen/AArch64/O0-pipeline.ll
llvm/test/CodeGen/AArch64/O3-pipeline.ll
llvm/test/CodeGen/X86/O0-pipeline.ll
llvm/test/CodeGen/X86/opt-pipeline.ll
llvm/utils/gn/secondary/llvm/lib/Target/AArch64/BUILD.gn
llvm/utils/gn/secondary/llvm/lib/Target/X86/BUILD.gn
Removed:
clang/test/CodeGen/kcfi.c
llvm/lib/Target/AArch64/AArch64KCFI.cpp
llvm/lib/Target/X86/X86KCFI.cpp
llvm/test/CodeGen/AArch64/kcfi-bti.ll
llvm/test/CodeGen/AArch64/kcfi-patchable-function-prefix.ll
llvm/test/CodeGen/AArch64/kcfi.ll
llvm/test/CodeGen/MIR/X86/instr-cfi-type.mir
llvm/test/CodeGen/X86/kcfi-patchable-function-prefix.ll
llvm/test/CodeGen/X86/kcfi.ll
llvm/test/Transforms/InstCombine/kcfi-operand-bundles.ll
llvm/test/Transforms/TailCallElim/kcfi-bundle.ll
llvm/test/Verifier/kcfi-operand-bundles.ll
llvm/test/Verifier/metadata-function-kcfi-type.ll
################################################################################
diff --git a/clang/docs/ControlFlowIntegrity.rst b/clang/docs/ControlFlowIntegrity.rst
index ef47b1c5b4b2b..eaf870456b956 100644
--- a/clang/docs/ControlFlowIntegrity.rst
+++ b/clang/docs/ControlFlowIntegrity.rst
@@ -306,19 +306,6 @@ the identity of function pointers is maintained, and calls across shared
library boundaries are no
diff erent from calls within a single program or
shared library.
-.. _kcfi:
-
-``-fsanitize=kcfi``
--------------------
-
-This is an alternative indirect call control-flow integrity scheme designed
-for low-level system software, such as operating system kernels. Unlike
-``-fsanitize=cfi-icall``, it doesn't require ``-flto``, won't result in
-function pointers being replaced with jump table references, and never breaks
-cross-DSO function address equality. These properties make KCFI easier to
-adopt in low-level software. KCFI is limited to checking only function
-pointers, and isn't compatible with executable-only memory.
-
Member Function Pointer Call Checking
=====================================
diff --git a/clang/docs/UsersManual.rst b/clang/docs/UsersManual.rst
index bf17677274e0c..883a0df329927 100644
--- a/clang/docs/UsersManual.rst
+++ b/clang/docs/UsersManual.rst
@@ -1720,8 +1720,6 @@ are listed below.
flow analysis.
- ``-fsanitize=cfi``: :doc:`control flow integrity <ControlFlowIntegrity>`
checks. Requires ``-flto``.
- - ``-fsanitize=kcfi``: kernel indirect call forward-edge control flow
- integrity.
- ``-fsanitize=safe-stack``: :doc:`safe stack <SafeStack>`
protection against stack-based memory corruption errors.
diff --git a/clang/include/clang/Basic/Features.def b/clang/include/clang/Basic/Features.def
index 0581c61dcba3b..7151e923ae9cf 100644
--- a/clang/include/clang/Basic/Features.def
+++ b/clang/include/clang/Basic/Features.def
@@ -228,7 +228,6 @@ FEATURE(is_trivially_assignable, LangOpts.CPlusPlus)
FEATURE(is_trivially_constructible, LangOpts.CPlusPlus)
FEATURE(is_trivially_copyable, LangOpts.CPlusPlus)
FEATURE(is_union, LangOpts.CPlusPlus)
-FEATURE(kcfi, LangOpts.Sanitize.has(SanitizerKind::KCFI))
FEATURE(modules, LangOpts.Modules)
FEATURE(safe_stack, LangOpts.Sanitize.has(SanitizerKind::SafeStack))
FEATURE(shadow_call_stack,
diff --git a/clang/include/clang/Basic/Sanitizers.def b/clang/include/clang/Basic/Sanitizers.def
index c2137e3f61f64..8e7b6cd0a7e29 100644
--- a/clang/include/clang/Basic/Sanitizers.def
+++ b/clang/include/clang/Basic/Sanitizers.def
@@ -127,9 +127,6 @@ SANITIZER_GROUP("cfi", CFI,
CFIDerivedCast | CFIICall | CFIMFCall | CFIUnrelatedCast |
CFINVCall | CFIVCall)
-// Kernel Control Flow Integrity
-SANITIZER("kcfi", KCFI)
-
// Safe Stack
SANITIZER("safe-stack", SafeStack)
diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp
index 90b1270dc8abc..125d680ccf962 100644
--- a/clang/lib/CodeGen/CGCall.cpp
+++ b/clang/lib/CodeGen/CGCall.cpp
@@ -5368,10 +5368,6 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
SmallVector<llvm::OperandBundleDef, 1> BundleList =
getBundlesForFunclet(CalleePtr);
- if (SanOpts.has(SanitizerKind::KCFI) &&
- !isa_and_nonnull<FunctionDecl>(TargetDecl))
- EmitKCFIOperandBundle(ConcreteCallee, BundleList);
-
if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(CurFuncDecl))
if (FD->hasAttr<StrictFPAttr>())
// All calls within a strictfp function are marked strictfp
diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp
index 061e0bf14d8fa..7997a07ebe1d7 100644
--- a/clang/lib/CodeGen/CodeGenFunction.cpp
+++ b/clang/lib/CodeGen/CodeGenFunction.cpp
@@ -2606,14 +2606,6 @@ void CodeGenFunction::EmitSanitizerStatReport(llvm::SanitizerStatKind SSK) {
CGM.getSanStats().create(IRB, SSK);
}
-void CodeGenFunction::EmitKCFIOperandBundle(
- const CGCallee &Callee, SmallVectorImpl<llvm::OperandBundleDef> &Bundles) {
- const FunctionProtoType *FP =
- Callee.getAbstractInfo().getCalleeFunctionProtoType();
- if (FP)
- Bundles.emplace_back("kcfi", CGM.CreateKCFITypeId(FP->desugar()));
-}
-
llvm::Value *
CodeGenFunction::FormResolverCondition(const MultiVersionResolverOption &RO) {
llvm::Value *Condition = nullptr;
diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h
index cfa7e33401f49..efd09d9f8b293 100644
--- a/clang/lib/CodeGen/CodeGenFunction.h
+++ b/clang/lib/CodeGen/CodeGenFunction.h
@@ -4612,9 +4612,6 @@ class CodeGenFunction : public CodeGenTypeCache {
/// passing to a runtime sanitizer handler.
llvm::Constant *EmitCheckSourceLocation(SourceLocation Loc);
- void EmitKCFIOperandBundle(const CGCallee &Callee,
- SmallVectorImpl<llvm::OperandBundleDef> &Bundles);
-
/// Create a basic block that will either trap or call a handler function in
/// the UBSan runtime with the provided arguments, and create a conditional
/// branch to it.
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index 6238a289978d0..74c14fed6575e 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -48,7 +48,6 @@
#include "clang/CodeGen/ConstantInitBuilder.h"
#include "clang/Frontend/FrontendDiagnostic.h"
#include "llvm/ADT/STLExtras.h"
-#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/ADT/Triple.h"
#include "llvm/Analysis/TargetLibraryInfo.h"
@@ -68,7 +67,6 @@
#include "llvm/Support/MD5.h"
#include "llvm/Support/TimeProfiler.h"
#include "llvm/Support/X86TargetParser.h"
-#include "llvm/Support/xxhash.h"
using namespace clang;
using namespace CodeGen;
@@ -579,8 +577,6 @@ void CodeGenModule::Release() {
CodeGenFunction(*this).EmitCfiCheckFail();
CodeGenFunction(*this).EmitCfiCheckStub();
}
- if (LangOpts.Sanitize.has(SanitizerKind::KCFI))
- finalizeKCFITypes();
emitAtAvailableLinkGuard();
if (Context.getTargetInfo().getTriple().isWasm())
EmitMainVoidAlias();
@@ -763,9 +759,6 @@ void CodeGenModule::Release() {
CodeGenOpts.SanitizeCfiCanonicalJumpTables);
}
- if (LangOpts.Sanitize.has(SanitizerKind::KCFI))
- getModule().addModuleFlag(llvm::Module::Override, "kcfi", 1);
-
if (CodeGenOpts.CFProtectionReturn &&
Target.checkCFProtectionReturnSupported(getDiags())) {
// Indicate that we want to instrument return control flow protection.
@@ -1676,20 +1669,6 @@ llvm::ConstantInt *CodeGenModule::CreateCrossDsoCfiTypeId(llvm::Metadata *MD) {
return llvm::ConstantInt::get(Int64Ty, llvm::MD5Hash(MDS->getString()));
}
-llvm::ConstantInt *CodeGenModule::CreateKCFITypeId(QualType T) {
- if (auto *FnType = T->getAs<FunctionProtoType>())
- T = getContext().getFunctionType(
- FnType->getReturnType(), FnType->getParamTypes(),
- FnType->getExtProtoInfo().withExceptionSpec(EST_None));
-
- std::string OutName;
- llvm::raw_string_ostream Out(OutName);
- getCXXABI().getMangleContext().mangleTypeName(T, Out);
-
- return llvm::ConstantInt::get(Int32Ty,
- static_cast<uint32_t>(llvm::xxHash64(OutName)));
-}
-
void CodeGenModule::SetLLVMFunctionAttributes(GlobalDecl GD,
const CGFunctionInfo &Info,
llvm::Function *F, bool IsThunk) {
@@ -2308,57 +2287,6 @@ void CodeGenModule::CreateFunctionTypeMetadataForIcall(const FunctionDecl *FD,
F->addTypeMetadata(0, llvm::ConstantAsMetadata::get(CrossDsoTypeId));
}
-void CodeGenModule::setKCFIType(const FunctionDecl *FD, llvm::Function *F) {
- if (isa<CXXMethodDecl>(FD) && !cast<CXXMethodDecl>(FD)->isStatic())
- return;
-
- llvm::LLVMContext &Ctx = F->getContext();
- llvm::MDBuilder MDB(Ctx);
- F->setMetadata(llvm::LLVMContext::MD_kcfi_type,
- llvm::MDNode::get(
- Ctx, MDB.createConstant(CreateKCFITypeId(FD->getType()))));
-}
-
-static bool allowKCFIIdentifier(StringRef Name) {
- // KCFI type identifier constants are only necessary for external assembly
- // functions, which means it's safe to skip unusual names. Subset of
- // MCAsmInfo::isAcceptableChar() and MCAsmInfoXCOFF::isAcceptableChar().
- return llvm::all_of(Name, [](const char &C) {
- return llvm::isAlnum(C) || C == '_' || C == '.';
- });
-}
-
-void CodeGenModule::finalizeKCFITypes() {
- llvm::Module &M = getModule();
- for (auto &F : M.functions()) {
- // Remove KCFI type metadata from non-address-taken local functions.
- bool AddressTaken = F.hasAddressTaken();
- if (!AddressTaken && F.hasLocalLinkage())
- F.eraseMetadata(llvm::LLVMContext::MD_kcfi_type);
-
- // Generate a constant with the expected KCFI type identifier for all
- // address-taken function declarations to support annotating indirectly
- // called assembly functions.
- if (!AddressTaken || !F.isDeclaration())
- continue;
-
- const llvm::ConstantInt *Type;
- if (const llvm::MDNode *MD = F.getMetadata(llvm::LLVMContext::MD_kcfi_type))
- Type = llvm::mdconst::extract<llvm::ConstantInt>(MD->getOperand(0));
- else
- continue;
-
- StringRef Name = F.getName();
- if (!allowKCFIIdentifier(Name))
- continue;
-
- std::string Asm = (".weak __kcfi_typeid_" + Name + "\n.set __kcfi_typeid_" +
- Name + ", " + Twine(Type->getZExtValue()) + "\n")
- .str();
- M.appendModuleInlineAsm(Asm);
- }
-}
-
void CodeGenModule::SetFunctionAttributes(GlobalDecl GD, llvm::Function *F,
bool IsIncompleteFunction,
bool IsThunk) {
@@ -2441,9 +2369,6 @@ void CodeGenModule::SetFunctionAttributes(GlobalDecl GD, llvm::Function *F,
!CodeGenOpts.SanitizeCfiCanonicalJumpTables)
CreateFunctionTypeMetadataForIcall(FD, F);
- if (LangOpts.Sanitize.has(SanitizerKind::KCFI))
- setKCFIType(FD, F);
-
if (getLangOpts().OpenMP && FD->hasAttr<OMPDeclareSimdDeclAttr>())
getOpenMPRuntime().emitDeclareSimdFunction(FD, F);
diff --git a/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h
index 1c23ffedb6171..f57afdca49429 100644
--- a/clang/lib/CodeGen/CodeGenModule.h
+++ b/clang/lib/CodeGen/CodeGenModule.h
@@ -1440,9 +1440,6 @@ class CodeGenModule : public CodeGenTypeCache {
/// Generate a cross-DSO type identifier for MD.
llvm::ConstantInt *CreateCrossDsoCfiTypeId(llvm::Metadata *MD);
- /// Generate a KCFI type identifier for T.
- llvm::ConstantInt *CreateKCFITypeId(QualType T);
-
/// Create a metadata identifier for the given type. This may either be an
/// MDString (for external identifiers) or a distinct unnamed MDNode (for
/// internal identifiers).
@@ -1461,12 +1458,6 @@ class CodeGenModule : public CodeGenTypeCache {
void CreateFunctionTypeMetadataForIcall(const FunctionDecl *FD,
llvm::Function *F);
- /// Set type metadata to the given function.
- void setKCFIType(const FunctionDecl *FD, llvm::Function *F);
-
- /// Emit KCFI type identifier constants and remove unused identifiers.
- void finalizeKCFITypes();
-
/// Whether this function's return type has no side effects, and thus may
/// be trivially discarded if it is unused.
bool MayDropFunctionReturn(const ASTContext &Context, QualType ReturnType);
diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp
index b6ebc8ad1842b..68fe90c7a69d9 100644
--- a/clang/lib/Driver/SanitizerArgs.cpp
+++ b/clang/lib/Driver/SanitizerArgs.cpp
@@ -37,8 +37,7 @@ static const SanitizerMask NotAllowedWithTrap = SanitizerKind::Vptr;
static const SanitizerMask NotAllowedWithMinimalRuntime =
SanitizerKind::Function | SanitizerKind::Vptr;
static const SanitizerMask RequiresPIE =
- SanitizerKind::DataFlow | SanitizerKind::HWAddress | SanitizerKind::Scudo |
- SanitizerKind::KCFI;
+ SanitizerKind::DataFlow | SanitizerKind::HWAddress | SanitizerKind::Scudo;
static const SanitizerMask NeedsUnwindTables =
SanitizerKind::Address | SanitizerKind::HWAddress | SanitizerKind::Thread |
SanitizerKind::Memory | SanitizerKind::DataFlow;
@@ -60,9 +59,8 @@ static const SanitizerMask RecoverableByDefault =
SanitizerKind::FloatDivideByZero | SanitizerKind::ObjCCast;
static const SanitizerMask Unrecoverable =
SanitizerKind::Unreachable | SanitizerKind::Return;
-static const SanitizerMask AlwaysRecoverable = SanitizerKind::KernelAddress |
- SanitizerKind::KernelHWAddress |
- SanitizerKind::KCFI;
+static const SanitizerMask AlwaysRecoverable =
+ SanitizerKind::KernelAddress | SanitizerKind::KernelHWAddress;
static const SanitizerMask NeedsLTO = SanitizerKind::CFI;
static const SanitizerMask TrappingSupported =
(SanitizerKind::Undefined & ~SanitizerKind::Vptr) | SanitizerKind::Integer |
@@ -714,13 +712,6 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
options::OPT_fno_sanitize_cfi_canonical_jump_tables, true);
}
- if (AllAddedKinds & SanitizerKind::KCFI && DiagnoseErrors) {
- if (AllAddedKinds & SanitizerKind::CFI)
- D.Diag(diag::err_drv_argument_not_allowed_with)
- << "-fsanitize=kcfi"
- << lastArgumentForMask(D, Args, SanitizerKind::CFI);
- }
-
Stats = Args.hasFlag(options::OPT_fsanitize_stats,
options::OPT_fno_sanitize_stats, false);
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index 812ead369e959..3434b5c199892 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -1089,9 +1089,6 @@ SanitizerMask ToolChain::getSupportedSanitizers() const {
getTriple().getArch() == llvm::Triple::arm || getTriple().isWasm() ||
getTriple().isAArch64() || getTriple().isRISCV())
Res |= SanitizerKind::CFIICall;
- if (getTriple().getArch() == llvm::Triple::x86_64 ||
- getTriple().isAArch64(64))
- Res |= SanitizerKind::KCFI;
if (getTriple().getArch() == llvm::Triple::x86_64 ||
getTriple().isAArch64(64) || getTriple().isRISCV())
Res |= SanitizerKind::ShadowCallStack;
diff --git a/clang/test/CodeGen/kcfi.c b/clang/test/CodeGen/kcfi.c
deleted file mode 100644
index b0368d59fc744..0000000000000
--- a/clang/test/CodeGen/kcfi.c
+++ /dev/null
@@ -1,58 +0,0 @@
-// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -fsanitize=kcfi -o - %s | FileCheck %s
-// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -fsanitize=kcfi -x c++ -o - %s | FileCheck %s
-#if !__has_feature(kcfi)
-#error Missing kcfi?
-#endif
-
-/// Must emit __kcfi_typeid symbols for address-taken function declarations
-// CHECK: module asm ".weak __kcfi_typeid_[[F4:[a-zA-Z0-9_]+]]"
-// CHECK: module asm ".set __kcfi_typeid_[[F4]], [[#%d,HASH:]]"
-/// Must not __kcfi_typeid symbols for non-address-taken declarations
-// CHECK-NOT: module asm ".weak __kcfi_typeid_{{f6|_Z2f6v}}"
-typedef int (*fn_t)(void);
-
-// CHECK: define dso_local{{.*}} i32 @{{f1|_Z2f1v}}(){{.*}} !kcfi_type ![[#TYPE:]]
-int f1(void) { return 0; }
-
-// CHECK: define dso_local{{.*}} i32 @{{f2|_Z2f2v}}(){{.*}} !kcfi_type ![[#TYPE2:]]
-unsigned int f2(void) { return 2; }
-
-// CHECK-LABEL: define dso_local{{.*}} i32 @{{__call|_Z6__callPFivE}}(ptr{{.*}} %f)
-int __call(fn_t f) __attribute__((__no_sanitize__("kcfi"))) {
- // CHECK-NOT: call{{.*}} i32 %{{.}}(){{.*}} [ "kcfi"
- return f();
-}
-
-// CHECK: define dso_local{{.*}} i32 @{{call|_Z4callPFivE}}(ptr{{.*}} %f){{.*}}
-int call(fn_t f) {
- // CHECK: call{{.*}} i32 %{{.}}(){{.*}} [ "kcfi"(i32 [[#HASH]]) ]
- return f();
-}
-
-// CHECK-DAG: define internal{{.*}} i32 @{{f3|_ZL2f3v}}(){{.*}} !kcfi_type ![[#TYPE]]
-static int f3(void) { return 1; }
-
-// CHECK-DAG: declare !kcfi_type ![[#TYPE]]{{.*}} i32 @[[F4]]()
-extern int f4(void);
-
-/// Must not emit !kcfi_type for non-address-taken local functions
-// CHECK: define internal{{.*}} i32 @{{f5|_ZL2f5v}}()
-// CHECK-NOT: !kcfi_type
-// CHECK-SAME: {
-static int f5(void) { return 2; }
-
-// CHECK-DAG: declare !kcfi_type ![[#TYPE]]{{.*}} i32 @{{f6|_Z2f6v}}()
-extern int f6(void);
-
-int test(void) {
- return call(f1) +
- __call((fn_t)f2) +
- call(f3) +
- call(f4) +
- f5() +
- f6();
-}
-
-// CHECK-DAG: ![[#]] = !{i32 4, !"kcfi", i32 1}
-// CHECK-DAG: ![[#TYPE]] = !{i32 [[#HASH]]}
-// CHECK-DAG: ![[#TYPE2]] = !{i32 [[#%d,HASH2:]]}
diff --git a/clang/test/Driver/fsanitize.c b/clang/test/Driver/fsanitize.c
index 16e269e20baf2..d496f48d8560e 100644
--- a/clang/test/Driver/fsanitize.c
+++ b/clang/test/Driver/fsanitize.c
@@ -649,18 +649,6 @@
// RUN: %clang -target x86_64-linux-gnu -fsanitize=cfi -fsanitize-stats -flto -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI-STATS
// CHECK-CFI-STATS: -fsanitize-stats
-// RUN: %clang -target x86_64-linux-gnu -fsanitize=kcfi -fsanitize=cfi -flto -fvisibility=hidden %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-KCFI-NOCFI
-// CHECK-KCFI-NOCFI: error: invalid argument '-fsanitize=kcfi' not allowed with '-fsanitize=cfi'
-
-// RUN: %clang -target x86_64-linux-gnu -fsanitize=kcfi -fsanitize-trap=kcfi %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-KCFI-NOTRAP
-// CHECK-KCFI-NOTRAP: error: unsupported argument 'kcfi' to option '-fsanitize-trap='
-
-// RUN: %clang -target x86_64-linux-gnu -fsanitize=kcfi %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-KCFI
-// CHECK-KCFI: "-fsanitize=kcfi"
-
-// RUN: %clang -target x86_64-linux-gnu -fsanitize=kcfi -fno-sanitize-recover=kcfi %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-KCFI-RECOVER
-// CHECK-KCFI-RECOVER: error: unsupported argument 'kcfi' to option '-fno-sanitize-recover='
-
// RUN: %clang_cl -fsanitize=address -c -MDd -### -- %s 2>&1 | FileCheck %s -check-prefix=CHECK-ASAN-DEBUGRTL
// RUN: %clang_cl -fsanitize=address -c -MTd -### -- %s 2>&1 | FileCheck %s -check-prefix=CHECK-ASAN-DEBUGRTL
// RUN: %clang_cl -fsanitize=address -c -LDd -### -- %s 2>&1 | FileCheck %s -check-prefix=CHECK-ASAN-DEBUGRTL
diff --git a/llvm/docs/LangRef.rst b/llvm/docs/LangRef.rst
index 858cce03dabf9..c60abadf39d81 100644
--- a/llvm/docs/LangRef.rst
+++ b/llvm/docs/LangRef.rst
@@ -2651,23 +2651,6 @@ Pointer Authentication operand bundles are characterized by the
``"ptrauth"`` operand bundle tag. They are described in the
`Pointer Authentication <PointerAuth.html#operand-bundle>`__ document.
-.. _ob_kcfi:
-
-KCFI Operand Bundles
-^^^^^^^^^^^^^^^^^^^^
-
-A ``"kcfi"`` operand bundle on an indirect call indicates that the call will
-be preceded by a runtime type check, which validates that the call target is
-prefixed with a :ref:`type identifier<md_kcfi_type>` that matches the operand
-bundle attribute. For example:
-
-.. code-block:: llvm
-
- call void %0() ["kcfi"(i32 1234)]
-
-Clang emits KCFI operand bundles and the necessary metadata with
-``-fsanitize=kcfi``.
-
.. _moduleasm:
Module-Level Inline Assembly
@@ -7230,29 +7213,6 @@ Example:
}
!0 = !{i32 846595819, ptr @__llvm_rtti_proxy}
-.. _md_kcfi_type:
-
-'``kcfi_type``' Metadata
-^^^^^^^^^^^^^^^^^^^^^^^^
-
-The ``kcfi_type`` metadata can be used to attach a type identifier to
-functions that can be called indirectly. The type data is emitted before the
-function entry in the assembly. Indirect calls with the :ref:`kcfi operand
-bundle<ob_kcfi>` will emit a check that compares the type identifier to the
-metadata.
-
-Example:
-
-.. code-block:: text
-
- define dso_local i32 @f() !kcfi_type !0 {
- ret i32 0
- }
- !0 = !{i32 12345678}
-
-Clang emits ``kcfi_type`` metadata nodes for address-taken functions with
-``-fsanitize=kcfi``.
-
Module Flags Metadata
=====================
diff --git a/llvm/include/llvm/CodeGen/AsmPrinter.h b/llvm/include/llvm/CodeGen/AsmPrinter.h
index d5b844b706b2f..5e900e9162d8e 100644
--- a/llvm/include/llvm/CodeGen/AsmPrinter.h
+++ b/llvm/include/llvm/CodeGen/AsmPrinter.h
@@ -401,9 +401,6 @@ class AsmPrinter : public MachineFunctionPass {
void emitBBAddrMapSection(const MachineFunction &MF);
- void emitKCFITrapEntry(const MachineFunction &MF, const MCSymbol *Symbol);
- virtual void emitKCFITypeId(const MachineFunction &MF);
-
void emitPseudoProbe(const MachineInstr &MI);
void emitRemarksSection(remarks::RemarkStreamer &RS);
diff --git a/llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h b/llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h
index 997bd966cd22e..9bf1c134618c6 100644
--- a/llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h
+++ b/llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h
@@ -144,9 +144,6 @@ class CallLowering {
/// The stack index for sret demotion.
int DemoteStackIndex;
-
- /// Expected type identifier for indirect calls with a CFI check.
- const ConstantInt *CFIType = nullptr;
};
/// Argument handling is mostly uniform between the four places that
diff --git a/llvm/include/llvm/CodeGen/MachineFunction.h b/llvm/include/llvm/CodeGen/MachineFunction.h
index 4601cde932188..d0ca7733633bc 100644
--- a/llvm/include/llvm/CodeGen/MachineFunction.h
+++ b/llvm/include/llvm/CodeGen/MachineFunction.h
@@ -1028,11 +1028,9 @@ class LLVM_EXTERNAL_VISIBILITY MachineFunction {
///
/// This is allocated on the function's allocator and so lives the life of
/// the function.
- MachineInstr::ExtraInfo *
- createMIExtraInfo(ArrayRef<MachineMemOperand *> MMOs,
- MCSymbol *PreInstrSymbol = nullptr,
- MCSymbol *PostInstrSymbol = nullptr,
- MDNode *HeapAllocMarker = nullptr, uint32_t CFIType = 0);
+ MachineInstr::ExtraInfo *createMIExtraInfo(
+ ArrayRef<MachineMemOperand *> MMOs, MCSymbol *PreInstrSymbol = nullptr,
+ MCSymbol *PostInstrSymbol = nullptr, MDNode *HeapAllocMarker = nullptr);
/// Allocate a string and populate it with the given external symbol name.
const char *createExternalSymbolName(StringRef Name);
diff --git a/llvm/include/llvm/CodeGen/MachineInstr.h b/llvm/include/llvm/CodeGen/MachineInstr.h
index 64337286725cb..11e4817a87b8c 100644
--- a/llvm/include/llvm/CodeGen/MachineInstr.h
+++ b/llvm/include/llvm/CodeGen/MachineInstr.h
@@ -16,7 +16,6 @@
#define LLVM_CODEGEN_MACHINEINSTR_H
#include "llvm/ADT/DenseMapInfo.h"
-#include "llvm/ADT/PointerEmbeddedInt.h"
#include "llvm/ADT/PointerSumType.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/ilist.h"
@@ -145,26 +144,24 @@ class MachineInstr
///
/// This has to be defined eagerly due to the implementation constraints of
/// `PointerSumType` where it is used.
- class ExtraInfo final : TrailingObjects<ExtraInfo, MachineMemOperand *,
- MCSymbol *, MDNode *, uint32_t> {
+ class ExtraInfo final
+ : TrailingObjects<ExtraInfo, MachineMemOperand *, MCSymbol *, MDNode *> {
public:
static ExtraInfo *create(BumpPtrAllocator &Allocator,
ArrayRef<MachineMemOperand *> MMOs,
MCSymbol *PreInstrSymbol = nullptr,
MCSymbol *PostInstrSymbol = nullptr,
- MDNode *HeapAllocMarker = nullptr,
- uint32_t CFIType = 0) {
+ MDNode *HeapAllocMarker = nullptr) {
bool HasPreInstrSymbol = PreInstrSymbol != nullptr;
bool HasPostInstrSymbol = PostInstrSymbol != nullptr;
bool HasHeapAllocMarker = HeapAllocMarker != nullptr;
- bool HasCFIType = CFIType != 0;
auto *Result = new (Allocator.Allocate(
- totalSizeToAlloc<MachineMemOperand *, MCSymbol *, MDNode *, uint32_t>(
+ totalSizeToAlloc<MachineMemOperand *, MCSymbol *, MDNode *>(
MMOs.size(), HasPreInstrSymbol + HasPostInstrSymbol,
- HasHeapAllocMarker, HasCFIType),
+ HasHeapAllocMarker),
alignof(ExtraInfo)))
ExtraInfo(MMOs.size(), HasPreInstrSymbol, HasPostInstrSymbol,
- HasHeapAllocMarker, HasCFIType);
+ HasHeapAllocMarker);
// Copy the actual data into the trailing objects.
std::copy(MMOs.begin(), MMOs.end(),
@@ -177,8 +174,6 @@ class MachineInstr
PostInstrSymbol;
if (HasHeapAllocMarker)
Result->getTrailingObjects<MDNode *>()[0] = HeapAllocMarker;
- if (HasCFIType)
- Result->getTrailingObjects<uint32_t>()[0] = CFIType;
return Result;
}
@@ -201,10 +196,6 @@ class MachineInstr
return HasHeapAllocMarker ? getTrailingObjects<MDNode *>()[0] : nullptr;
}
- uint32_t getCFIType() const {
- return HasCFIType ? getTrailingObjects<uint32_t>()[0] : 0;
- }
-
private:
friend TrailingObjects;
@@ -217,7 +208,6 @@ class MachineInstr
const bool HasPreInstrSymbol;
const bool HasPostInstrSymbol;
const bool HasHeapAllocMarker;
- const bool HasCFIType;
// Implement the `TrailingObjects` internal API.
size_t numTrailingObjects(OverloadToken<MachineMemOperand *>) const {
@@ -229,17 +219,14 @@ class MachineInstr
size_t numTrailingObjects(OverloadToken<MDNode *>) const {
return HasHeapAllocMarker;
}
- size_t numTrailingObjects(OverloadToken<uint32_t>) const {
- return HasCFIType;
- }
// Just a boring constructor to allow us to initialize the sizes. Always use
// the `create` routine above.
ExtraInfo(int NumMMOs, bool HasPreInstrSymbol, bool HasPostInstrSymbol,
- bool HasHeapAllocMarker, bool HasCFIType)
+ bool HasHeapAllocMarker)
: NumMMOs(NumMMOs), HasPreInstrSymbol(HasPreInstrSymbol),
HasPostInstrSymbol(HasPostInstrSymbol),
- HasHeapAllocMarker(HasHeapAllocMarker), HasCFIType(HasCFIType) {}
+ HasHeapAllocMarker(HasHeapAllocMarker) {}
};
/// Enumeration of the kinds of inline extra info available. It is important
@@ -249,7 +236,6 @@ class MachineInstr
EIIK_MMO = 0,
EIIK_PreInstrSymbol,
EIIK_PostInstrSymbol,
- EIIK_CFIType,
EIIK_OutOfLine
};
@@ -258,12 +244,11 @@ class MachineInstr
// We work to optimize this common case by storing it inline here rather than
// requiring a separate allocation, but we fall back to an allocation when
// multiple pointers are needed.
- PointerSumType<
- ExtraInfoInlineKinds, PointerSumTypeMember<EIIK_MMO, MachineMemOperand *>,
- PointerSumTypeMember<EIIK_PreInstrSymbol, MCSymbol *>,
- PointerSumTypeMember<EIIK_PostInstrSymbol, MCSymbol *>,
- PointerSumTypeMember<EIIK_CFIType, PointerEmbeddedInt<uint32_t, 32>>,
- PointerSumTypeMember<EIIK_OutOfLine, ExtraInfo *>>
+ PointerSumType<ExtraInfoInlineKinds,
+ PointerSumTypeMember<EIIK_MMO, MachineMemOperand *>,
+ PointerSumTypeMember<EIIK_PreInstrSymbol, MCSymbol *>,
+ PointerSumTypeMember<EIIK_PostInstrSymbol, MCSymbol *>,
+ PointerSumTypeMember<EIIK_OutOfLine, ExtraInfo *>>
Info;
DebugLoc DbgLoc; // Source line information.
@@ -772,18 +757,6 @@ class MachineInstr
return nullptr;
}
- /// Helper to extract a CFI type hash if one has been added.
- uint32_t getCFIType() const {
- if (!Info)
- return 0;
- if (uint32_t Type = Info.get<EIIK_CFIType>())
- return Type;
- if (ExtraInfo *EI = Info.get<EIIK_OutOfLine>())
- return EI->getCFIType();
-
- return 0;
- }
-
/// API for querying MachineInstr properties. They are the same as MCInstrDesc
/// queries but they are bundle aware.
@@ -1815,9 +1788,6 @@ class MachineInstr
/// instruction is removed or duplicated.
void setHeapAllocMarker(MachineFunction &MF, MDNode *MD);
- /// Set the CFI type for the instruction.
- void setCFIType(MachineFunction &MF, uint32_t Type);
-
/// Return the MIFlags which represent both MachineInstrs. This
/// should be used when merging two MachineInstrs into one. This routine does
/// not modify the MIFlags of this MachineInstr.
@@ -1896,7 +1866,7 @@ class MachineInstr
/// based on the number of pointers.
void setExtraInfo(MachineFunction &MF, ArrayRef<MachineMemOperand *> MMOs,
MCSymbol *PreInstrSymbol, MCSymbol *PostInstrSymbol,
- MDNode *HeapAllocMarker, uint32_t CFIType);
+ MDNode *HeapAllocMarker);
};
/// Special DenseMapInfo traits to compare MachineInstr* by *value* of the
diff --git a/llvm/include/llvm/CodeGen/SelectionDAGNodes.h b/llvm/include/llvm/CodeGen/SelectionDAGNodes.h
index 063f88fe6c560..7ebbc4895d7c9 100644
--- a/llvm/include/llvm/CodeGen/SelectionDAGNodes.h
+++ b/llvm/include/llvm/CodeGen/SelectionDAGNodes.h
@@ -622,8 +622,6 @@ END_TWO_BYTE_PACK()
SDNodeFlags Flags;
- uint32_t CFIType = 0;
-
public:
/// Unique and persistent id per SDNode in the DAG. Used for debug printing.
/// We do not place that under `#if LLVM_ENABLE_ABI_BREAKING_CHECKS`
@@ -973,9 +971,6 @@ END_TWO_BYTE_PACK()
/// If Flags is not in a defined state then this has no effect.
void intersectFlagsWith(const SDNodeFlags Flags);
- void setCFIType(uint32_t Type) { CFIType = Type; }
- uint32_t getCFIType() const { return CFIType; }
-
/// Return the number of values defined/returned by this operator.
unsigned getNumValues() const { return NumValues; }
diff --git a/llvm/include/llvm/CodeGen/TargetLowering.h b/llvm/include/llvm/CodeGen/TargetLowering.h
index 75d3fa68bd13e..bf4e85881e778 100644
--- a/llvm/include/llvm/CodeGen/TargetLowering.h
+++ b/llvm/include/llvm/CodeGen/TargetLowering.h
@@ -3933,9 +3933,6 @@ class TargetLowering : public TargetLoweringBase {
return false;
}
- /// Return true if the target supports kcfi operand bundles.
- virtual bool supportKCFIBundles() const { return false; }
-
/// Perform necessary initialization to handle a subset of CSRs explicitly
/// via copies. This function is called at the beginning of instruction
/// selection.
@@ -4055,7 +4052,6 @@ class TargetLowering : public TargetLoweringBase {
SmallVector<SDValue, 32> OutVals;
SmallVector<ISD::InputArg, 32> Ins;
SmallVector<SDValue, 4> InVals;
- const ConstantInt *CFIType = nullptr;
CallLoweringInfo(SelectionDAG &DAG)
: RetSExt(false), RetZExt(false), IsVarArg(false), IsInReg(false),
@@ -4178,11 +4174,6 @@ class TargetLowering : public TargetLoweringBase {
return *this;
}
- CallLoweringInfo &setCFIType(const ConstantInt *Type) {
- CFIType = Type;
- return *this;
- }
-
ArgListTy &getArgs() {
return Args;
}
diff --git a/llvm/include/llvm/IR/FixedMetadataKinds.def b/llvm/include/llvm/IR/FixedMetadataKinds.def
index 09810662cfea4..c7cb59b130505 100644
--- a/llvm/include/llvm/IR/FixedMetadataKinds.def
+++ b/llvm/include/llvm/IR/FixedMetadataKinds.def
@@ -47,4 +47,3 @@ LLVM_FIXED_MD_KIND(MD_func_sanitize, "func_sanitize", 32)
LLVM_FIXED_MD_KIND(MD_exclude, "exclude", 33)
LLVM_FIXED_MD_KIND(MD_memprof, "memprof", 34)
LLVM_FIXED_MD_KIND(MD_callsite, "callsite", 35)
-LLVM_FIXED_MD_KIND(MD_kcfi_type, "kcfi_type", 36)
diff --git a/llvm/include/llvm/IR/InstrTypes.h b/llvm/include/llvm/IR/InstrTypes.h
index 67d4a8c5b9568..bca243cd91f9f 100644
--- a/llvm/include/llvm/IR/InstrTypes.h
+++ b/llvm/include/llvm/IR/InstrTypes.h
@@ -2079,8 +2079,7 @@ class CallBase : public Instruction {
for (const auto &BOI : bundle_op_infos()) {
if (BOI.Tag->second == LLVMContext::OB_deopt ||
BOI.Tag->second == LLVMContext::OB_funclet ||
- BOI.Tag->second == LLVMContext::OB_ptrauth ||
- BOI.Tag->second == LLVMContext::OB_kcfi)
+ BOI.Tag->second == LLVMContext::OB_ptrauth)
continue;
// This instruction has an operand bundle that is not known to us.
diff --git a/llvm/include/llvm/IR/LLVMContext.h b/llvm/include/llvm/IR/LLVMContext.h
index a40158e9aec97..0caddad25bfe0 100644
--- a/llvm/include/llvm/IR/LLVMContext.h
+++ b/llvm/include/llvm/IR/LLVMContext.h
@@ -94,7 +94,6 @@ class LLVMContext {
OB_gc_live = 5, // "gc-live"
OB_clang_arc_attachedcall = 6, // "clang.arc.attachedcall"
OB_ptrauth = 7, // "ptrauth"
- OB_kcfi = 8, // "kcfi"
};
/// getMDKindID - Return a unique non-zero ID for the specified metadata kind.
diff --git a/llvm/include/llvm/MC/MCObjectFileInfo.h b/llvm/include/llvm/MC/MCObjectFileInfo.h
index c1c7dd30a648d..ebc9b95d6d4e0 100644
--- a/llvm/include/llvm/MC/MCObjectFileInfo.h
+++ b/llvm/include/llvm/MC/MCObjectFileInfo.h
@@ -16,7 +16,6 @@
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/Triple.h"
#include "llvm/BinaryFormat/Swift.h"
-#include "llvm/MC/MCSection.h"
#include "llvm/Support/VersionTuple.h"
#include <array>
@@ -360,8 +359,6 @@ class MCObjectFileInfo {
MCSection *getBBAddrMapSection(const MCSection &TextSec) const;
- MCSection *getKCFITrapSection(const MCSection &TextSec) const;
-
MCSection *getPseudoProbeSection(const MCSection *TextSec) const;
MCSection *getPseudoProbeDescSection(StringRef FuncName) const;
diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
index c335577df4b5a..f3100cc49e1bc 100644
--- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -941,9 +941,6 @@ void AsmPrinter::emitFunctionHeader() {
}
}
- // Emit KCFI type information before patchable-function-prefix nops.
- emitKCFITypeId(*MF);
-
// Emit M NOPs for -fpatchable-function-entry=N,M where M>0. We arbitrarily
// place prefix data before NOPs.
unsigned PatchableFunctionPrefix = 0;
@@ -1355,30 +1352,6 @@ void AsmPrinter::emitBBAddrMapSection(const MachineFunction &MF) {
OutStreamer->popSection();
}
-void AsmPrinter::emitKCFITrapEntry(const MachineFunction &MF,
- const MCSymbol *Symbol) {
- MCSection *Section =
- getObjFileLowering().getKCFITrapSection(*MF.getSection());
- if (!Section)
- return;
-
- OutStreamer->pushSection();
- OutStreamer->switchSection(Section);
-
- MCSymbol *Loc = OutContext.createLinkerPrivateTempSymbol();
- OutStreamer->emitLabel(Loc);
- OutStreamer->emitAbsoluteSymbolDiff(Symbol, Loc, 4);
-
- OutStreamer->popSection();
-}
-
-void AsmPrinter::emitKCFITypeId(const MachineFunction &MF) {
- const Function &F = MF.getFunction();
- if (const MDNode *MD = F.getMetadata(LLVMContext::MD_kcfi_type))
- emitGlobalConstant(F.getParent()->getDataLayout(),
- mdconst::extract<ConstantInt>(MD->getOperand(0)));
-}
-
void AsmPrinter::emitPseudoProbe(const MachineInstr &MI) {
if (PP) {
auto GUID = MI.getOperand(0).getImm();
diff --git a/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp b/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp
index 41ffa6473323e..6c36c6445c659 100644
--- a/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp
@@ -155,12 +155,6 @@ bool CallLowering::lowerCall(MachineIRBuilder &MIRBuilder, const CallBase &CB,
}
}
- auto Bundle = CB.getOperandBundle(LLVMContext::OB_kcfi);
- if (Bundle && CB.isIndirectCall()) {
- Info.CFIType = cast<ConstantInt>(Bundle->Inputs[0]);
- assert(Info.CFIType->getType()->isIntegerTy(32) && "Invalid CFI type");
- }
-
Info.CB = &CB;
Info.KnownCallees = CB.getMetadata(LLVMContext::MD_callees);
Info.CallConv = CallConv;
diff --git a/llvm/lib/CodeGen/MIRParser/MILexer.cpp b/llvm/lib/CodeGen/MIRParser/MILexer.cpp
index a4b5aa99deafb..99de3328df1b5 100644
--- a/llvm/lib/CodeGen/MIRParser/MILexer.cpp
+++ b/llvm/lib/CodeGen/MIRParser/MILexer.cpp
@@ -270,7 +270,6 @@ static MIToken::TokenKind getIdentifierKind(StringRef Identifier) {
.Case("pre-instr-symbol", MIToken::kw_pre_instr_symbol)
.Case("post-instr-symbol", MIToken::kw_post_instr_symbol)
.Case("heap-alloc-marker", MIToken::kw_heap_alloc_marker)
- .Case("cfi-type", MIToken::kw_cfi_type)
.Case("bbsections", MIToken::kw_bbsections)
.Case("unknown-size", MIToken::kw_unknown_size)
.Case("unknown-address", MIToken::kw_unknown_address)
diff --git a/llvm/lib/CodeGen/MIRParser/MILexer.h b/llvm/lib/CodeGen/MIRParser/MILexer.h
index f6d6ac2fd8f47..9ba0e7c720169 100644
--- a/llvm/lib/CodeGen/MIRParser/MILexer.h
+++ b/llvm/lib/CodeGen/MIRParser/MILexer.h
@@ -125,7 +125,6 @@ struct MIToken {
kw_pre_instr_symbol,
kw_post_instr_symbol,
kw_heap_alloc_marker,
- kw_cfi_type,
kw_bbsections,
kw_unknown_size,
kw_unknown_address,
diff --git a/llvm/lib/CodeGen/MIRParser/MIParser.cpp b/llvm/lib/CodeGen/MIRParser/MIParser.cpp
index 1f9e95f791f1a..d58e3a8b71571 100644
--- a/llvm/lib/CodeGen/MIRParser/MIParser.cpp
+++ b/llvm/lib/CodeGen/MIRParser/MIParser.cpp
@@ -1016,7 +1016,6 @@ bool MIParser::parse(MachineInstr *&MI) {
while (!Token.isNewlineOrEOF() && Token.isNot(MIToken::kw_pre_instr_symbol) &&
Token.isNot(MIToken::kw_post_instr_symbol) &&
Token.isNot(MIToken::kw_heap_alloc_marker) &&
- Token.isNot(MIToken::kw_cfi_type) &&
Token.isNot(MIToken::kw_debug_location) &&
Token.isNot(MIToken::kw_debug_instr_number) &&
Token.isNot(MIToken::coloncolon) && Token.isNot(MIToken::lbrace)) {
@@ -1047,20 +1046,6 @@ bool MIParser::parse(MachineInstr *&MI) {
if (parseHeapAllocMarker(HeapAllocMarker))
return true;
- unsigned CFIType = 0;
- if (Token.is(MIToken::kw_cfi_type)) {
- lex();
- if (Token.isNot(MIToken::IntegerLiteral))
- return error("expected an integer literal after 'cfi-type'");
- // getUnsigned is sufficient for 32-bit integers.
- if (getUnsigned(CFIType))
- return true;
- lex();
- // Lex past trailing comma if present.
- if (Token.is(MIToken::comma))
- lex();
- }
-
unsigned InstrNum = 0;
if (Token.is(MIToken::kw_debug_instr_number)) {
lex();
@@ -1140,8 +1125,6 @@ bool MIParser::parse(MachineInstr *&MI) {
MI->setPostInstrSymbol(MF, PostInstrSymbol);
if (HeapAllocMarker)
MI->setHeapAllocMarker(MF, HeapAllocMarker);
- if (CFIType)
- MI->setCFIType(MF, CFIType);
if (!MemOperands.empty())
MI->setMemRefs(MF, MemOperands);
if (InstrNum)
diff --git a/llvm/lib/CodeGen/MIRPrinter.cpp b/llvm/lib/CodeGen/MIRPrinter.cpp
index 5fc1e680509cd..0054e165f3f1e 100644
--- a/llvm/lib/CodeGen/MIRPrinter.cpp
+++ b/llvm/lib/CodeGen/MIRPrinter.cpp
@@ -819,12 +819,6 @@ void MIPrinter::print(const MachineInstr &MI) {
HeapAllocMarker->printAsOperand(OS, MST);
NeedComma = true;
}
- if (uint32_t CFIType = MI.getCFIType()) {
- if (NeedComma)
- OS << ',';
- OS << " cfi-type " << CFIType;
- NeedComma = true;
- }
if (auto Num = MI.peekDebugInstrNum()) {
if (NeedComma)
diff --git a/llvm/lib/CodeGen/MachineFunction.cpp b/llvm/lib/CodeGen/MachineFunction.cpp
index 299eadbe17c7d..d2c224898fe23 100644
--- a/llvm/lib/CodeGen/MachineFunction.cpp
+++ b/llvm/lib/CodeGen/MachineFunction.cpp
@@ -530,10 +530,9 @@ MachineFunction::getMachineMemOperand(const MachineMemOperand *MMO,
MachineInstr::ExtraInfo *MachineFunction::createMIExtraInfo(
ArrayRef<MachineMemOperand *> MMOs, MCSymbol *PreInstrSymbol,
- MCSymbol *PostInstrSymbol, MDNode *HeapAllocMarker, uint32_t CFIType) {
+ MCSymbol *PostInstrSymbol, MDNode *HeapAllocMarker) {
return MachineInstr::ExtraInfo::create(Allocator, MMOs, PreInstrSymbol,
- PostInstrSymbol, HeapAllocMarker,
- CFIType);
+ PostInstrSymbol, HeapAllocMarker);
}
const char *MachineFunction::createExternalSymbolName(StringRef Name) {
diff --git a/llvm/lib/CodeGen/MachineInstr.cpp b/llvm/lib/CodeGen/MachineInstr.cpp
index 1e48ba92da1bc..2321a273c030c 100644
--- a/llvm/lib/CodeGen/MachineInstr.cpp
+++ b/llvm/lib/CodeGen/MachineInstr.cpp
@@ -301,13 +301,12 @@ void MachineInstr::setExtraInfo(MachineFunction &MF,
ArrayRef<MachineMemOperand *> MMOs,
MCSymbol *PreInstrSymbol,
MCSymbol *PostInstrSymbol,
- MDNode *HeapAllocMarker, uint32_t CFIType) {
+ MDNode *HeapAllocMarker) {
bool HasPreInstrSymbol = PreInstrSymbol != nullptr;
bool HasPostInstrSymbol = PostInstrSymbol != nullptr;
bool HasHeapAllocMarker = HeapAllocMarker != nullptr;
- bool HasCFIType = CFIType != 0;
- int NumPointers = MMOs.size() + HasPreInstrSymbol + HasPostInstrSymbol +
- HasHeapAllocMarker + HasCFIType;
+ int NumPointers =
+ MMOs.size() + HasPreInstrSymbol + HasPostInstrSymbol + HasHeapAllocMarker;
// Drop all extra info if there is none.
if (NumPointers <= 0) {
@@ -321,7 +320,7 @@ void MachineInstr::setExtraInfo(MachineFunction &MF,
// FIXME: Maybe we should make the symbols in the extra info mutable?
else if (NumPointers > 1 || HasHeapAllocMarker) {
Info.set<EIIK_OutOfLine>(MF.createMIExtraInfo(
- MMOs, PreInstrSymbol, PostInstrSymbol, HeapAllocMarker, CFIType));
+ MMOs, PreInstrSymbol, PostInstrSymbol, HeapAllocMarker));
return;
}
@@ -330,8 +329,6 @@ void MachineInstr::setExtraInfo(MachineFunction &MF,
Info.set<EIIK_PreInstrSymbol>(PreInstrSymbol);
else if (HasPostInstrSymbol)
Info.set<EIIK_PostInstrSymbol>(PostInstrSymbol);
- else if (HasCFIType)
- Info.set<EIIK_CFIType>(CFIType);
else
Info.set<EIIK_MMO>(MMOs[0]);
}
@@ -341,7 +338,7 @@ void MachineInstr::dropMemRefs(MachineFunction &MF) {
return;
setExtraInfo(MF, {}, getPreInstrSymbol(), getPostInstrSymbol(),
- getHeapAllocMarker(), getCFIType());
+ getHeapAllocMarker());
}
void MachineInstr::setMemRefs(MachineFunction &MF,
@@ -352,7 +349,7 @@ void MachineInstr::setMemRefs(MachineFunction &MF,
}
setExtraInfo(MF, MMOs, getPreInstrSymbol(), getPostInstrSymbol(),
- getHeapAllocMarker(), getCFIType());
+ getHeapAllocMarker());
}
void MachineInstr::addMemOperand(MachineFunction &MF,
@@ -460,7 +457,7 @@ void MachineInstr::setPreInstrSymbol(MachineFunction &MF, MCSymbol *Symbol) {
}
setExtraInfo(MF, memoperands(), Symbol, getPostInstrSymbol(),
- getHeapAllocMarker(), getCFIType());
+ getHeapAllocMarker());
}
void MachineInstr::setPostInstrSymbol(MachineFunction &MF, MCSymbol *Symbol) {
@@ -475,7 +472,7 @@ void MachineInstr::setPostInstrSymbol(MachineFunction &MF, MCSymbol *Symbol) {
}
setExtraInfo(MF, memoperands(), getPreInstrSymbol(), Symbol,
- getHeapAllocMarker(), getCFIType());
+ getHeapAllocMarker());
}
void MachineInstr::setHeapAllocMarker(MachineFunction &MF, MDNode *Marker) {
@@ -484,16 +481,7 @@ void MachineInstr::setHeapAllocMarker(MachineFunction &MF, MDNode *Marker) {
return;
setExtraInfo(MF, memoperands(), getPreInstrSymbol(), getPostInstrSymbol(),
- Marker, getCFIType());
-}
-
-void MachineInstr::setCFIType(MachineFunction &MF, uint32_t Type) {
- // Do nothing if old and new types are the same.
- if (Type == getCFIType())
- return;
-
- setExtraInfo(MF, memoperands(), getPreInstrSymbol(), getPostInstrSymbol(),
- getHeapAllocMarker(), Type);
+ Marker);
}
void MachineInstr::cloneInstrSymbols(MachineFunction &MF,
@@ -647,10 +635,6 @@ bool MachineInstr::isIdenticalTo(const MachineInstr &Other,
if (getPreInstrSymbol() != Other.getPreInstrSymbol() ||
getPostInstrSymbol() != Other.getPostInstrSymbol())
return false;
- // Call instructions with
diff erent CFI types are not identical.
- if (isCall() && getCFIType() != Other.getCFIType())
- return false;
-
return true;
}
@@ -1769,11 +1753,6 @@ void MachineInstr::print(raw_ostream &OS, ModuleSlotTracker &MST,
OS << " heap-alloc-marker ";
HeapAllocMarker->printAsOperand(OS, MST);
}
- if (uint32_t CFIType = getCFIType()) {
- if (!FirstOp)
- OS << ',';
- OS << " cfi-type " << CFIType;
- }
if (DebugInstrNum) {
if (!FirstOp)
diff --git a/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp b/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp
index 99a63236d6029..3d3b504c6abd8 100644
--- a/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp
@@ -1063,9 +1063,6 @@ EmitMachineNode(SDNode *Node, bool IsClone, bool IsCloned,
// part of the function.
MIB.setMemRefs(cast<MachineSDNode>(Node)->memoperands());
- // Set the CFI type.
- MIB->setCFIType(*MF, Node->getCFIType());
-
// Insert the instruction into position in the block. This needs to
// happen before any custom inserter hook is called so that the
// hook knows where in the block to insert the replacement code.
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
index 4c21dfc4392a5..f244aafb1da8c 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
@@ -7833,17 +7833,6 @@ void SelectionDAGBuilder::LowerCallTo(const CallBase &CB, SDValue Callee,
if (TLI.supportSwiftError() && SwiftErrorVal)
isTailCall = false;
- ConstantInt *CFIType = nullptr;
- if (CB.isIndirectCall()) {
- if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_kcfi)) {
- if (!TLI.supportKCFIBundles())
- report_fatal_error(
- "Target doesn't support calls with kcfi operand bundles.");
- CFIType = cast<ConstantInt>(Bundle->Inputs[0]);
- assert(CFIType->getType()->isIntegerTy(32) && "Invalid CFI type");
- }
- }
-
TargetLowering::CallLoweringInfo CLI(DAG);
CLI.setDebugLoc(getCurSDLoc())
.setChain(getRoot())
@@ -7851,8 +7840,7 @@ void SelectionDAGBuilder::LowerCallTo(const CallBase &CB, SDValue Callee,
.setTailCall(isTailCall)
.setConvergent(CB.isConvergent())
.setIsPreallocated(
- CB.countOperandBundlesOfType(LLVMContext::OB_preallocated) != 0)
- .setCFIType(CFIType);
+ CB.countOperandBundlesOfType(LLVMContext::OB_preallocated) != 0);
std::pair<SDValue, SDValue> Result = lowerInvokable(CLI, EHPadBB);
if (Result.first.getNode()) {
@@ -8396,7 +8384,7 @@ void SelectionDAGBuilder::visitCall(const CallInst &I) {
assert(!I.hasOperandBundlesOtherThan(
{LLVMContext::OB_deopt, LLVMContext::OB_funclet,
LLVMContext::OB_cfguardtarget, LLVMContext::OB_preallocated,
- LLVMContext::OB_clang_arc_attachedcall, LLVMContext::OB_kcfi}) &&
+ LLVMContext::OB_clang_arc_attachedcall}) &&
"Cannot lower calls with arbitrary operand bundles!");
SDValue Callee = getValue(I.getCalledOperand());
diff --git a/llvm/lib/IR/Instructions.cpp b/llvm/lib/IR/Instructions.cpp
index 6a79d2b1e3676..f24e97353035a 100644
--- a/llvm/lib/IR/Instructions.cpp
+++ b/llvm/lib/IR/Instructions.cpp
@@ -505,8 +505,7 @@ bool CallBase::hasReadingOperandBundles() const {
// Implementation note: this is a conservative implementation of operand
// bundle semantics, where *any* non-assume operand bundle (other than
// ptrauth) forces a callsite to be at least readonly.
- return hasOperandBundlesOtherThan(
- {LLVMContext::OB_ptrauth, LLVMContext::OB_kcfi}) &&
+ return hasOperandBundlesOtherThan(LLVMContext::OB_ptrauth) &&
getIntrinsicID() != Intrinsic::assume;
}
diff --git a/llvm/lib/IR/LLVMContext.cpp b/llvm/lib/IR/LLVMContext.cpp
index f2da7a1cdddde..993bfffff006b 100644
--- a/llvm/lib/IR/LLVMContext.cpp
+++ b/llvm/lib/IR/LLVMContext.cpp
@@ -87,11 +87,6 @@ LLVMContext::LLVMContext() : pImpl(new LLVMContextImpl(*this)) {
"ptrauth operand bundle id drifted!");
(void)PtrauthEntry;
- auto *KCFIEntry = pImpl->getOrInsertBundleTag("kcfi");
- assert(KCFIEntry->second == LLVMContext::OB_kcfi &&
- "kcfi operand bundle id drifted!");
- (void)KCFIEntry;
-
SyncScope::ID SingleThreadSSID =
pImpl->getOrInsertSyncScopeID("singlethread");
assert(SingleThreadSSID == SyncScope::SingleThread &&
diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index 2e208a0868203..15f0a80b68dc5 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -2151,20 +2151,6 @@ void Verifier::verifyFunctionMetadata(
MD);
Check(isa<ConstantAsMetadata>(MD->getOperand(1)),
"expected integer argument to function_entry_count", MD);
- } else if (Pair.first == LLVMContext::MD_kcfi_type) {
- MDNode *MD = Pair.second;
- Check(MD->getNumOperands() == 1,
- "!kcfi_type must have exactly one operand", MD);
- Check(MD->getOperand(0) != nullptr, "!kcfi_type operand must not be null",
- MD);
- Check(isa<ConstantAsMetadata>(MD->getOperand(0)),
- "expected a constant operand for !kcfi_type", MD);
- Constant *C = cast<ConstantAsMetadata>(MD->getOperand(0))->getValue();
- Check(isa<ConstantInt>(C),
- "expected a constant integer operand for !kcfi_type", MD);
- IntegerType *Type = cast<ConstantInt>(C)->getType();
- Check(Type->getBitWidth() == 32,
- "expected a 32-bit integer constant operand for !kcfi_type", MD);
}
}
}
@@ -2631,8 +2617,7 @@ void Verifier::visitFunction(const Function &F) {
"blockaddress may not be used with the entry block!", Entry);
}
- unsigned NumDebugAttachments = 0, NumProfAttachments = 0,
- NumKCFIAttachments = 0;
+ unsigned NumDebugAttachments = 0, NumProfAttachments = 0;
// Visit metadata attachments.
for (const auto &I : MDs) {
// Verify that the attachment is legal.
@@ -2663,12 +2648,6 @@ void Verifier::visitFunction(const Function &F) {
Check(NumProfAttachments == 1,
"function must have a single !prof attachment", &F, I.second);
break;
- case LLVMContext::MD_kcfi_type:
- ++NumKCFIAttachments;
- Check(NumKCFIAttachments == 1,
- "function must have a single !kcfi_type attachment", &F,
- I.second);
- break;
}
// Verify the metadata itself.
@@ -3370,7 +3349,7 @@ void Verifier::visitCallBase(CallBase &Call) {
bool FoundDeoptBundle = false, FoundFuncletBundle = false,
FoundGCTransitionBundle = false, FoundCFGuardTargetBundle = false,
FoundPreallocatedBundle = false, FoundGCLiveBundle = false,
- FoundPtrauthBundle = false, FoundKCFIBundle = false,
+ FoundPtrauthBundle = false,
FoundAttachedCallBundle = false;
for (unsigned i = 0, e = Call.getNumOperandBundles(); i < e; ++i) {
OperandBundleUse BU = Call.getOperandBundleAt(i);
@@ -3406,14 +3385,6 @@ void Verifier::visitCallBase(CallBase &Call) {
"Ptrauth bundle key operand must be an i32 constant", Call);
Check(BU.Inputs[1]->getType()->isIntegerTy(64),
"Ptrauth bundle discriminator operand must be an i64", Call);
- } else if (Tag == LLVMContext::OB_kcfi) {
- Check(!FoundKCFIBundle, "Multiple kcfi operand bundles", Call);
- FoundKCFIBundle = true;
- Check(BU.Inputs.size() == 1, "Expected exactly one kcfi bundle operand",
- Call);
- Check(isa<ConstantInt>(BU.Inputs[0]) &&
- BU.Inputs[0]->getType()->isIntegerTy(32),
- "Kcfi bundle operand must be an i32 constant", Call);
} else if (Tag == LLVMContext::OB_preallocated) {
Check(!FoundPreallocatedBundle, "Multiple preallocated operand bundles",
Call);
diff --git a/llvm/lib/MC/MCObjectFileInfo.cpp b/llvm/lib/MC/MCObjectFileInfo.cpp
index 03ee0c0e32faa..a7655c9e49e56 100644
--- a/llvm/lib/MC/MCObjectFileInfo.cpp
+++ b/llvm/lib/MC/MCObjectFileInfo.cpp
@@ -1140,25 +1140,6 @@ MCObjectFileInfo::getBBAddrMapSection(const MCSection &TextSec) const {
cast<MCSymbolELF>(TextSec.getBeginSymbol()));
}
-MCSection *
-MCObjectFileInfo::getKCFITrapSection(const MCSection &TextSec) const {
- if (Ctx->getObjectFileType() != MCContext::IsELF)
- return nullptr;
-
- const MCSectionELF &ElfSec = static_cast<const MCSectionELF &>(TextSec);
- unsigned Flags = ELF::SHF_LINK_ORDER | ELF::SHF_ALLOC;
- StringRef GroupName;
- if (const MCSymbol *Group = ElfSec.getGroup()) {
- GroupName = Group->getName();
- Flags |= ELF::SHF_GROUP;
- }
-
- return Ctx->getELFSection(".kcfi_traps", ELF::SHT_PROGBITS, Flags, 0,
- GroupName,
- /*IsComdat=*/true, ElfSec.getUniqueID(),
- cast<MCSymbolELF>(TextSec.getBeginSymbol()));
-}
-
MCSection *
MCObjectFileInfo::getPseudoProbeSection(const MCSection *TextSec) const {
if (Ctx->getObjectFileType() == MCContext::IsELF) {
diff --git a/llvm/lib/Target/AArch64/AArch64.h b/llvm/lib/Target/AArch64/AArch64.h
index 476da087a70a4..a6065d4ed9ec3 100644
--- a/llvm/lib/Target/AArch64/AArch64.h
+++ b/llvm/lib/Target/AArch64/AArch64.h
@@ -42,7 +42,6 @@ FunctionPass *createAArch64ExpandPseudoPass();
FunctionPass *createAArch64SLSHardeningPass();
FunctionPass *createAArch64IndirectThunks();
FunctionPass *createAArch64SpeculationHardeningPass();
-FunctionPass *createAArch64KCFIPass();
FunctionPass *createAArch64LoadStoreOptimizationPass();
ModulePass *createAArch64LowerHomogeneousPrologEpilogPass();
FunctionPass *createAArch64SIMDInstrOptPass();
@@ -84,7 +83,6 @@ void initializeAArch64DeadRegisterDefinitionsPass(PassRegistry&);
void initializeAArch64ExpandPseudoPass(PassRegistry&);
void initializeAArch64SLSHardeningPass(PassRegistry&);
void initializeAArch64SpeculationHardeningPass(PassRegistry&);
-void initializeAArch64KCFIPass(PassRegistry &);
void initializeAArch64LoadStoreOptPass(PassRegistry&);
void initializeAArch64LowerHomogeneousPrologEpilogPass(PassRegistry &);
void initializeAArch64MIPeepholeOptPass(PassRegistry &);
diff --git a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp
index 32d2f79456468..f0d2b02c77512 100644
--- a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp
+++ b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp
@@ -111,7 +111,6 @@ class AArch64AsmPrinter : public AsmPrinter {
typedef std::tuple<unsigned, bool, uint32_t> HwasanMemaccessTuple;
std::map<HwasanMemaccessTuple, MCSymbol *> HwasanMemaccessSymbols;
- void LowerKCFI_CHECK(const MachineInstr &MI);
void LowerHWASAN_CHECK_MEMACCESS(const MachineInstr &MI);
void emitHwasanMemaccessSymbols(Module &M);
@@ -318,107 +317,6 @@ void AArch64AsmPrinter::emitSled(const MachineInstr &MI, SledKind Kind) {
recordSled(CurSled, MI, Kind, 2);
}
-void AArch64AsmPrinter::LowerKCFI_CHECK(const MachineInstr &MI) {
- Register AddrReg = MI.getOperand(0).getReg();
- assert(std::next(MI.getIterator())->isCall() &&
- "KCFI_CHECK not followed by a call instruction");
- assert(std::next(MI.getIterator())->getOperand(0).getReg() == AddrReg &&
- "KCFI_CHECK call target doesn't match call operand");
-
- // Default to using the intra-procedure-call temporary registers for
- // comparing the hashes.
- unsigned ScratchRegs[] = {AArch64::W16, AArch64::W17};
- if (AddrReg == AArch64::XZR) {
- // Checking XZR makes no sense. Instead of emitting a load, zero
- // ScratchRegs[0] and use it for the ESR AddrIndex below.
- AddrReg = getXRegFromWReg(ScratchRegs[0]);
- EmitToStreamer(*OutStreamer, MCInstBuilder(AArch64::ORRXrs)
- .addReg(AddrReg)
- .addReg(AArch64::XZR)
- .addReg(AArch64::XZR)
- .addImm(0));
- } else {
- // If one of the scratch registers is used for the call target (e.g.
- // with AArch64::TCRETURNriBTI), we can clobber another caller-saved
- // temporary register instead (in this case, AArch64::W9) as the check
- // is immediately followed by the call instruction.
- for (auto &Reg : ScratchRegs) {
- if (Reg == getWRegFromXReg(AddrReg)) {
- Reg = AArch64::W9;
- break;
- }
- }
- assert(ScratchRegs[0] != AddrReg && ScratchRegs[1] != AddrReg &&
- "Invalid scratch registers for KCFI_CHECK");
-
- // Adjust the offset for patchable-function-prefix. This assumes that
- // patchable-function-prefix is the same for all functions.
- int64_t PrefixNops = 0;
- (void)MI.getMF()
- ->getFunction()
- .getFnAttribute("patchable-function-prefix")
- .getValueAsString()
- .getAsInteger(10, PrefixNops);
-
- // Load the target function type hash.
- EmitToStreamer(*OutStreamer, MCInstBuilder(AArch64::LDURWi)
- .addReg(ScratchRegs[0])
- .addReg(AddrReg)
- .addImm(-(PrefixNops * 4 + 4)));
- }
-
- // Load the expected type hash.
- const int64_t Type = MI.getOperand(1).getImm();
- EmitToStreamer(*OutStreamer, MCInstBuilder(AArch64::MOVKWi)
- .addReg(ScratchRegs[1])
- .addReg(ScratchRegs[1])
- .addImm(Type & 0xFFFF)
- .addImm(0));
- EmitToStreamer(*OutStreamer, MCInstBuilder(AArch64::MOVKWi)
- .addReg(ScratchRegs[1])
- .addReg(ScratchRegs[1])
- .addImm((Type >> 16) & 0xFFFF)
- .addImm(16));
-
- // Compare the hashes and trap if there's a mismatch.
- EmitToStreamer(*OutStreamer, MCInstBuilder(AArch64::SUBSWrs)
- .addReg(AArch64::WZR)
- .addReg(ScratchRegs[0])
- .addReg(ScratchRegs[1])
- .addImm(0));
-
- MCSymbol *Pass = OutContext.createTempSymbol();
- EmitToStreamer(*OutStreamer,
- MCInstBuilder(AArch64::Bcc)
- .addImm(AArch64CC::EQ)
- .addExpr(MCSymbolRefExpr::create(Pass, OutContext)));
-
- // The base ESR is 0x8000 and the register information is encoded in bits
- // 0-9 as follows:
- // - 0-4: n, where the register Xn contains the target address
- // - 5-9: m, where the register Wm contains the expected type hash
- // Where n, m are in [0, 30].
- unsigned TypeIndex = ScratchRegs[1] - AArch64::W0;
- unsigned AddrIndex;
- switch (AddrReg) {
- default:
- AddrIndex = AddrReg - AArch64::X0;
- break;
- case AArch64::FP:
- AddrIndex = 29;
- break;
- case AArch64::LR:
- AddrIndex = 30;
- break;
- }
-
- assert(AddrIndex < 31 && TypeIndex < 31);
-
- unsigned ESR = 0x8000 | ((TypeIndex & 31) << 5) | (AddrIndex & 31);
- EmitToStreamer(*OutStreamer, MCInstBuilder(AArch64::BRK).addImm(ESR));
- OutStreamer->emitLabel(Pass);
-}
-
void AArch64AsmPrinter::LowerHWASAN_CHECK_MEMACCESS(const MachineInstr &MI) {
Register Reg = MI.getOperand(0).getReg();
bool IsShort =
@@ -1547,10 +1445,6 @@ void AArch64AsmPrinter::emitInstruction(const MachineInstr *MI) {
LowerPATCHABLE_TAIL_CALL(*MI);
return;
- case AArch64::KCFI_CHECK:
- LowerKCFI_CHECK(*MI);
- return;
-
case AArch64::HWASAN_CHECK_MEMACCESS:
case AArch64::HWASAN_CHECK_MEMACCESS_SHORTGRANULES:
LowerHWASAN_CHECK_MEMACCESS(*MI);
diff --git a/llvm/lib/Target/AArch64/AArch64ExpandPseudoInsts.cpp b/llvm/lib/Target/AArch64/AArch64ExpandPseudoInsts.cpp
index f7e2b19f8a8f7..0922a1926c605 100644
--- a/llvm/lib/Target/AArch64/AArch64ExpandPseudoInsts.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ExpandPseudoInsts.cpp
@@ -776,7 +776,6 @@ bool AArch64ExpandPseudo::expandCALL_BTI(MachineBasicBlock &MBB,
MachineInstr *Call =
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(Opc)).getInstr();
Call->addOperand(CallTarget);
- Call->setCFIType(*MBB.getParent(), MI.getCFIType());
MachineInstr *BTI =
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(AArch64::HINT))
diff --git a/llvm/lib/Target/AArch64/AArch64FastISel.cpp b/llvm/lib/Target/AArch64/AArch64FastISel.cpp
index 04119aa8b3e4f..8c88e2a8d108c 100644
--- a/llvm/lib/Target/AArch64/AArch64FastISel.cpp
+++ b/llvm/lib/Target/AArch64/AArch64FastISel.cpp
@@ -3134,11 +3134,6 @@ bool AArch64FastISel::fastLowerCall(CallLoweringInfo &CLI) {
MF->getInfo<AArch64FunctionInfo>()->branchTargetEnforcement())
return false;
- // Allow SelectionDAG isel to handle indirect calls with KCFI checks.
- if (CLI.CB && CLI.CB->isIndirectCall() &&
- CLI.CB->getOperandBundle(LLVMContext::OB_kcfi))
- return false;
-
// Allow SelectionDAG isel to handle tail calls.
if (IsTailCall)
return false;
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index 1fa724d34b15f..95720611de176 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -6586,7 +6586,6 @@ AArch64TargetLowering::LowerCall(CallLoweringInfo &CLI,
AArch64FunctionInfo *FuncInfo = MF.getInfo<AArch64FunctionInfo>();
bool TailCallOpt = MF.getTarget().Options.GuaranteedTailCallOpt;
- bool IsCFICall = CLI.CB && CLI.CB->isIndirectCall() && CLI.CFIType;
bool IsSibCall = false;
bool GuardWithBTI = false;
@@ -7010,10 +7009,6 @@ AArch64TargetLowering::LowerCall(CallLoweringInfo &CLI,
if (IsTailCall) {
MF.getFrameInfo().setHasTailCall();
SDValue Ret = DAG.getNode(AArch64ISD::TC_RETURN, DL, NodeTys, Ops);
-
- if (IsCFICall)
- Ret.getNode()->setCFIType(CLI.CFIType->getZExtValue());
-
DAG.addCallSiteInfo(Ret.getNode(), std::move(CSInfo));
return Ret;
}
@@ -7037,10 +7032,6 @@ AArch64TargetLowering::LowerCall(CallLoweringInfo &CLI,
// Returns a chain and a flag for retval copy to use.
Chain = DAG.getNode(CallOpc, DL, NodeTys, Ops);
-
- if (IsCFICall)
- Chain.getNode()->setCFIType(CLI.CFIType->getZExtValue());
-
DAG.addNoMergeSiteInfo(Chain.getNode(), CLI.NoMerge);
InFlag = Chain.getValue(1);
DAG.addCallSiteInfo(Chain.getNode(), std::move(CSInfo));
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.h b/llvm/lib/Target/AArch64/AArch64ISelLowering.h
index 82e05790dd08f..673c151619faa 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.h
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.h
@@ -814,8 +814,6 @@ class AArch64TargetLowering : public TargetLowering {
return true;
}
- bool supportKCFIBundles() const override { return true; }
-
/// Enable aggressive FMA fusion on targets that want it.
bool enableAggressiveFMAFusion(EVT VT) const override;
diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.td b/llvm/lib/Target/AArch64/AArch64InstrInfo.td
index f6ec38a072793..58c23a1a813f4 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrInfo.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.td
@@ -1450,11 +1450,6 @@ def : Pat<(AArch64mrs imm:$id),
def MOVbaseTLS : Pseudo<(outs GPR64:$dst), (ins),
[(set GPR64:$dst, AArch64threadpointer)]>, Sched<[WriteSys]>;
-let Defs = [ X9, X16, X17, NZCV ] in {
-def KCFI_CHECK : Pseudo<
- (outs), (ins GPR64:$ptr, i32imm:$type), []>, Sched<[]>;
-}
-
let Uses = [ X9 ], Defs = [ X16, X17, LR, NZCV ] in {
def HWASAN_CHECK_MEMACCESS : Pseudo<
(outs), (ins GPR64noip:$ptr, i32imm:$accessinfo),
diff --git a/llvm/lib/Target/AArch64/AArch64KCFI.cpp b/llvm/lib/Target/AArch64/AArch64KCFI.cpp
deleted file mode 100644
index 271001cb71a69..0000000000000
--- a/llvm/lib/Target/AArch64/AArch64KCFI.cpp
+++ /dev/null
@@ -1,115 +0,0 @@
-//===---- AArch64KCFI.cpp - Implements KCFI -------------------------------===//
-//
-// 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
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements KCFI indirect call checking.
-//
-//===----------------------------------------------------------------------===//
-
-#include "AArch64.h"
-#include "AArch64InstrInfo.h"
-#include "AArch64Subtarget.h"
-#include "AArch64TargetMachine.h"
-#include "llvm/ADT/Statistic.h"
-#include "llvm/CodeGen/MachineFunctionPass.h"
-#include "llvm/CodeGen/MachineInstrBuilder.h"
-#include "llvm/CodeGen/MachineInstrBundle.h"
-#include "llvm/CodeGen/MachineModuleInfo.h"
-
-using namespace llvm;
-
-#define DEBUG_TYPE "aarch64-kcfi"
-#define AARCH64_KCFI_PASS_NAME "Insert KCFI indirect call checks"
-
-STATISTIC(NumKCFIChecksAdded, "Number of indirect call checks added");
-
-namespace {
-class AArch64KCFI : public MachineFunctionPass {
-public:
- static char ID;
-
- AArch64KCFI() : MachineFunctionPass(ID) {}
-
- StringRef getPassName() const override { return AARCH64_KCFI_PASS_NAME; }
- bool runOnMachineFunction(MachineFunction &MF) override;
-
-private:
- /// Machine instruction info used throughout the class.
- const AArch64InstrInfo *TII = nullptr;
-
- /// Emits a KCFI check before an indirect call.
- /// \returns true if the check was added and false otherwise.
- bool emitCheck(MachineBasicBlock &MBB,
- MachineBasicBlock::instr_iterator I) const;
-};
-
-char AArch64KCFI::ID = 0;
-} // end anonymous namespace
-
-INITIALIZE_PASS(AArch64KCFI, DEBUG_TYPE, AARCH64_KCFI_PASS_NAME, false, false)
-
-FunctionPass *llvm::createAArch64KCFIPass() { return new AArch64KCFI(); }
-
-bool AArch64KCFI::emitCheck(MachineBasicBlock &MBB,
- MachineBasicBlock::instr_iterator MBBI) const {
- assert(TII && "Target instruction info was not initialized");
-
- // If the call instruction is bundled, we can only emit a check safely if
- // it's the first instruction in the bundle.
- if (MBBI->isBundled() && !std::prev(MBBI)->isBundle())
- report_fatal_error("Cannot emit a KCFI check for a bundled call");
-
- switch (MBBI->getOpcode()) {
- case AArch64::BLR:
- case AArch64::BLRNoIP:
- case AArch64::TCRETURNri:
- case AArch64::TCRETURNriBTI:
- break;
- default:
- llvm_unreachable("Unexpected CFI call opcode");
- }
-
- MachineOperand &Target = MBBI->getOperand(0);
- assert(Target.isReg() && "Invalid target operand for an indirect call");
- Target.setIsRenamable(false);
-
- MachineInstr *Check =
- BuildMI(MBB, MBBI, MBBI->getDebugLoc(), TII->get(AArch64::KCFI_CHECK))
- .addReg(Target.getReg())
- .addImm(MBBI->getCFIType())
- .getInstr();
- MBBI->setCFIType(*MBB.getParent(), 0);
-
- // If not already bundled, bundle the check and the call to prevent
- // further changes.
- if (!MBBI->isBundled())
- finalizeBundle(MBB, Check->getIterator(), std::next(MBBI->getIterator()));
-
- ++NumKCFIChecksAdded;
- return true;
-}
-
-bool AArch64KCFI::runOnMachineFunction(MachineFunction &MF) {
- const Module *M = MF.getMMI().getModule();
- if (!M->getModuleFlag("kcfi"))
- return false;
-
- const auto &SubTarget = MF.getSubtarget<AArch64Subtarget>();
- TII = SubTarget.getInstrInfo();
-
- bool Changed = false;
- for (MachineBasicBlock &MBB : MF) {
- for (MachineBasicBlock::instr_iterator MII = MBB.instr_begin(),
- MIE = MBB.instr_end();
- MII != MIE; ++MII) {
- if (MII->isCall() && MII->getCFIType())
- Changed |= emitCheck(MBB, MII);
- }
- }
-
- return Changed;
-}
diff --git a/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp b/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp
index c48643aaaca03..47e4c6589c26c 100644
--- a/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp
+++ b/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp
@@ -209,7 +209,6 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeAArch64Target() {
initializeAArch64ConditionOptimizerPass(*PR);
initializeAArch64DeadRegisterDefinitionsPass(*PR);
initializeAArch64ExpandPseudoPass(*PR);
- initializeAArch64KCFIPass(*PR);
initializeAArch64LoadStoreOptPass(*PR);
initializeAArch64MIPeepholeOptPass(*PR);
initializeAArch64SIMDInstrOptPass(*PR);
@@ -755,8 +754,6 @@ void AArch64PassConfig::addPreSched2() {
if (EnableLoadStoreOpt)
addPass(createAArch64LoadStoreOptimizationPass());
}
- // Emit KCFI checks for indirect calls.
- addPass(createAArch64KCFIPass());
// The AArch64SpeculationHardeningPass destroys dominator tree and natural
// loop info, which is needed for the FalkorHWPFFixPass and also later on.
diff --git a/llvm/lib/Target/AArch64/CMakeLists.txt b/llvm/lib/Target/AArch64/CMakeLists.txt
index 898bf1aa57fca..ca7d53dce2bb0 100644
--- a/llvm/lib/Target/AArch64/CMakeLists.txt
+++ b/llvm/lib/Target/AArch64/CMakeLists.txt
@@ -62,7 +62,6 @@ add_llvm_target(AArch64CodeGen
AArch64ISelDAGToDAG.cpp
AArch64ISelLowering.cpp
AArch64InstrInfo.cpp
- AArch64KCFI.cpp
AArch64LoadStoreOptimizer.cpp
AArch64LowerHomogeneousPrologEpilog.cpp
AArch64MachineFunctionInfo.cpp
diff --git a/llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp b/llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp
index a45221273dc49..aaef363e9b8dc 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp
@@ -979,9 +979,6 @@ bool AArch64CallLowering::lowerTailCall(
TRI->UpdateCustomCallPreservedMask(MF, &Mask);
MIB.addRegMask(Mask);
- if (Info.CFIType)
- MIB->setCFIType(MF, Info.CFIType->getZExtValue());
-
if (TRI->isAnyArgRegReserved(MF))
TRI->emitReservedArgRegCallError(MF);
@@ -1179,8 +1176,6 @@ bool AArch64CallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
Function *ARCFn = *objcarc::getAttachedARCFunction(Info.CB);
MIB.addGlobalAddress(ARCFn);
++CalleeOpNo;
- } else if (Info.CFIType) {
- MIB->setCFIType(MF, Info.CFIType->getZExtValue());
}
MIB.add(Info.Callee);
diff --git a/llvm/lib/Target/X86/CMakeLists.txt b/llvm/lib/Target/X86/CMakeLists.txt
index ada4897d7a56a..33a6f1b0820dd 100644
--- a/llvm/lib/Target/X86/CMakeLists.txt
+++ b/llvm/lib/Target/X86/CMakeLists.txt
@@ -64,7 +64,6 @@ set(sources
X86InstrFoldTables.cpp
X86InstrInfo.cpp
X86EvexToVex.cpp
- X86KCFI.cpp
X86LegalizerInfo.cpp
X86LoadValueInjectionLoadHardening.cpp
X86LoadValueInjectionRetHardening.cpp
diff --git a/llvm/lib/Target/X86/X86.h b/llvm/lib/Target/X86/X86.h
index 5d048f2ffa090..0ac9165274956 100644
--- a/llvm/lib/Target/X86/X86.h
+++ b/llvm/lib/Target/X86/X86.h
@@ -51,9 +51,6 @@ FunctionPass *createX86IssueVZeroUpperPass();
/// destinations as part of CET IBT mechanism.
FunctionPass *createX86IndirectBranchTrackingPass();
-/// This pass inserts KCFI checks before indirect calls.
-FunctionPass *createX86KCFIPass();
-
/// Return a pass that pads short functions with NOOPs.
/// This will prevent a stall when returning on the Atom.
FunctionPass *createX86PadShortFunctions();
@@ -177,7 +174,6 @@ void initializeX86ExecutionDomainFixPass(PassRegistry &);
void initializeX86ExpandPseudoPass(PassRegistry &);
void initializeX86FixupSetCCPassPass(PassRegistry &);
void initializeX86FlagsCopyLoweringPassPass(PassRegistry &);
-void initializeX86KCFIPass(PassRegistry &);
void initializeX86LoadValueInjectionLoadHardeningPassPass(PassRegistry &);
void initializeX86LoadValueInjectionRetHardeningPassPass(PassRegistry &);
void initializeX86OptimizeLEAPassPass(PassRegistry &);
diff --git a/llvm/lib/Target/X86/X86AsmPrinter.cpp b/llvm/lib/Target/X86/X86AsmPrinter.cpp
index 834b626dbb151..d0db28dc9219e 100644
--- a/llvm/lib/Target/X86/X86AsmPrinter.cpp
+++ b/llvm/lib/Target/X86/X86AsmPrinter.cpp
@@ -33,7 +33,6 @@
#include "llvm/MC/MCCodeEmitter.h"
#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCExpr.h"
-#include "llvm/MC/MCInstBuilder.h"
#include "llvm/MC/MCSectionCOFF.h"
#include "llvm/MC/MCSectionELF.h"
#include "llvm/MC/MCSectionMachO.h"
@@ -114,86 +113,6 @@ void X86AsmPrinter::emitFunctionBodyEnd() {
}
}
-uint32_t X86AsmPrinter::MaskKCFIType(uint32_t Value) {
- // If the type hash matches an invalid pattern, mask the value.
- const uint32_t InvalidValues[] = {
- 0xFA1E0FF3, /* ENDBR64 */
- 0xFB1E0FF3, /* ENDBR32 */
- };
- for (uint32_t N : InvalidValues) {
- // LowerKCFI_CHECK emits -Value for indirect call checks, so we must also
- // mask that. Note that -(Value + 1) == ~Value.
- if (N == Value || -N == Value)
- return Value + 1;
- }
- return Value;
-}
-
-void X86AsmPrinter::EmitKCFITypePadding(const MachineFunction &MF,
- bool HasType) {
- // Keep the function entry aligned, taking patchable-function-prefix into
- // account if set.
- int64_t PrefixBytes = 0;
- (void)MF.getFunction()
- .getFnAttribute("patchable-function-prefix")
- .getValueAsString()
- .getAsInteger(10, PrefixBytes);
-
- // Also take the type identifier into account if we're emitting
- // one. Otherwise, just pad with nops. The X86::MOV32ri instruction emitted
- // in X86AsmPrinter::emitKCFITypeId is 5 bytes long.
- if (HasType)
- PrefixBytes += 5;
-
- emitNops(offsetToAlignment(PrefixBytes, MF.getAlignment()));
-}
-
-/// emitKCFITypeId - Emit the KCFI type information in architecture specific
-/// format.
-void X86AsmPrinter::emitKCFITypeId(const MachineFunction &MF) {
- const Function &F = MF.getFunction();
- if (!F.getParent()->getModuleFlag("kcfi"))
- return;
-
- ConstantInt *Type = nullptr;
- if (const MDNode *MD = F.getMetadata(LLVMContext::MD_kcfi_type))
- Type = mdconst::extract<ConstantInt>(MD->getOperand(0));
-
- // If we don't have a type to emit, just emit padding if needed to maintain
- // the same alignment for all functions.
- if (!Type) {
- EmitKCFITypePadding(MF, /*HasType=*/false);
- return;
- }
-
- // Emit a function symbol for the type data to avoid unreachable instruction
- // warnings from binary validation tools, and use the same linkage as the
- // parent function. Note that using local linkage would result in duplicate
- // symbols for weak parent functions.
- MCSymbol *FnSym = OutContext.getOrCreateSymbol("__cfi_" + MF.getName());
- emitLinkage(&MF.getFunction(), FnSym);
- if (MAI->hasDotTypeDotSizeDirective())
- OutStreamer->emitSymbolAttribute(FnSym, MCSA_ELF_TypeFunction);
- OutStreamer->emitLabel(FnSym);
-
- // Embed the type hash in the X86::MOV32ri instruction to avoid special
- // casing object file parsers.
- EmitKCFITypePadding(MF);
- EmitAndCountInstruction(MCInstBuilder(X86::MOV32ri)
- .addReg(X86::EAX)
- .addImm(MaskKCFIType(Type->getZExtValue())));
-
- if (MAI->hasDotTypeDotSizeDirective()) {
- MCSymbol *EndSym = OutContext.createTempSymbol("cfi_func_end");
- OutStreamer->emitLabel(EndSym);
-
- const MCExpr *SizeExp = MCBinaryExpr::createSub(
- MCSymbolRefExpr::create(EndSym, OutContext),
- MCSymbolRefExpr::create(FnSym, OutContext), OutContext);
- OutStreamer->emitELFSize(FnSym, SizeExp);
- }
-}
-
/// PrintSymbolOperand - Print a raw symbol reference operand. This handles
/// jump tables, constant pools, global address and external symbols, all of
/// which print to a label with various suffixes for relocation types etc.
diff --git a/llvm/lib/Target/X86/X86AsmPrinter.h b/llvm/lib/Target/X86/X86AsmPrinter.h
index b9aefe4e96aaf..043c4b855475d 100644
--- a/llvm/lib/Target/X86/X86AsmPrinter.h
+++ b/llvm/lib/Target/X86/X86AsmPrinter.h
@@ -99,11 +99,6 @@ class LLVM_LIBRARY_VISIBILITY X86AsmPrinter : public AsmPrinter {
void LowerFENTRY_CALL(const MachineInstr &MI, X86MCInstLower &MCIL);
- // KCFI specific lowering for X86.
- uint32_t MaskKCFIType(uint32_t Value);
- void EmitKCFITypePadding(const MachineFunction &MF, bool HasType = true);
- void LowerKCFI_CHECK(const MachineInstr &MI);
-
// Address sanitizer specific lowering for X86.
void LowerASAN_CHECK_MEMACCESS(const MachineInstr &MI);
@@ -154,7 +149,6 @@ class LLVM_LIBRARY_VISIBILITY X86AsmPrinter : public AsmPrinter {
bool runOnMachineFunction(MachineFunction &MF) override;
void emitFunctionBodyStart() override;
void emitFunctionBodyEnd() override;
- void emitKCFITypeId(const MachineFunction &MF) override;
bool shouldEmitWeakSwiftAsyncExtendedFramePointerFlags() const override {
return ShouldEmitWeakSwiftAsyncExtendedFramePointerFlags;
diff --git a/llvm/lib/Target/X86/X86ExpandPseudo.cpp b/llvm/lib/Target/X86/X86ExpandPseudo.cpp
index 1dd7f285ab74f..aebeec5a6d274 100644
--- a/llvm/lib/Target/X86/X86ExpandPseudo.cpp
+++ b/llvm/lib/Target/X86/X86ExpandPseudo.cpp
@@ -356,7 +356,6 @@ bool X86ExpandPseudo::ExpandMI(MachineBasicBlock &MBB,
MachineInstr &NewMI = *std::prev(MBBI);
NewMI.copyImplicitOps(*MBBI->getParent()->getParent(), *MBBI);
- NewMI.setCFIType(*MBB.getParent(), MI.getCFIType());
// Update the call site info.
if (MBBI->isCandidateForCallSiteEntry())
diff --git a/llvm/lib/Target/X86/X86FastISel.cpp b/llvm/lib/Target/X86/X86FastISel.cpp
index f12e978069d5f..7c307300b4ed8 100644
--- a/llvm/lib/Target/X86/X86FastISel.cpp
+++ b/llvm/lib/Target/X86/X86FastISel.cpp
@@ -3182,10 +3182,6 @@ bool X86FastISel::fastLowerCall(CallLoweringInfo &CLI) {
if ((CB && CB->hasFnAttr("no_callee_saved_registers")))
return false;
- // Indirect calls with CFI checks need special handling.
- if (CB && CB->isIndirectCall() && CB->getOperandBundle(LLVMContext::OB_kcfi))
- return false;
-
// Functions using thunks for indirect calls need to use SDISel.
if (Subtarget->useIndirectThunkCalls())
return false;
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 3490734184b22..69f25d19f49bc 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -4347,7 +4347,6 @@ X86TargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
CB->hasFnAttr("no_caller_saved_registers"));
bool HasNoCfCheck = (CB && CB->doesNoCfCheck());
bool IsIndirectCall = (CB && isa<CallInst>(CB) && CB->isIndirectCall());
- bool IsCFICall = IsIndirectCall && CLI.CFIType;
const Module *M = MF.getMMI().getModule();
Metadata *IsCFProtectionSupported = M->getModuleFlag("cf-protection-branch");
@@ -4839,10 +4838,6 @@ X86TargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
// function making a tail call to a function returning int.
MF.getFrameInfo().setHasTailCall();
SDValue Ret = DAG.getNode(X86ISD::TC_RETURN, dl, NodeTys, Ops);
-
- if (IsCFICall)
- Ret.getNode()->setCFIType(CLI.CFIType->getZExtValue());
-
DAG.addCallSiteInfo(Ret.getNode(), std::move(CSInfo));
return Ret;
}
@@ -4868,9 +4863,6 @@ X86TargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
Chain = DAG.getNode(X86ISD::CALL, dl, NodeTys, Ops);
}
- if (IsCFICall)
- Chain.getNode()->setCFIType(CLI.CFIType->getZExtValue());
-
InFlag = Chain.getValue(1);
DAG.addNoMergeSiteInfo(Chain.getNode(), CLI.NoMerge);
DAG.addCallSiteInfo(Chain.getNode(), std::move(CSInfo));
diff --git a/llvm/lib/Target/X86/X86ISelLowering.h b/llvm/lib/Target/X86/X86ISelLowering.h
index d7cdf431871f6..184f53a721035 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.h
+++ b/llvm/lib/Target/X86/X86ISelLowering.h
@@ -1451,8 +1451,6 @@ namespace llvm {
bool supportSwiftError() const override;
- bool supportKCFIBundles() const override { return true; }
-
bool hasStackProbeSymbol(MachineFunction &MF) const override;
bool hasInlineStackProbe(MachineFunction &MF) const override;
StringRef getStackProbeSymbolName(MachineFunction &MF) const override;
diff --git a/llvm/lib/Target/X86/X86InstrCompiler.td b/llvm/lib/Target/X86/X86InstrCompiler.td
index ab3abe8faca7c..6124755ca5390 100644
--- a/llvm/lib/Target/X86/X86InstrCompiler.td
+++ b/llvm/lib/Target/X86/X86InstrCompiler.td
@@ -256,15 +256,6 @@ let isPseudo = 1, SchedRW = [WriteSystem] in {
"#SEH_Epilogue", []>;
}
-//===----------------------------------------------------------------------===//
-// Pseudo instructions used by KCFI.
-//===----------------------------------------------------------------------===//
-let
- Defs = [R10, EFLAGS] in {
-def KCFI_CHECK : PseudoI<
- (outs), (ins GR64:$ptr, i32imm:$type), []>, Sched<[]>;
-}
-
//===----------------------------------------------------------------------===//
// Pseudo instructions used by address sanitizer.
//===----------------------------------------------------------------------===//
diff --git a/llvm/lib/Target/X86/X86KCFI.cpp b/llvm/lib/Target/X86/X86KCFI.cpp
deleted file mode 100644
index b4bced17048a1..0000000000000
--- a/llvm/lib/Target/X86/X86KCFI.cpp
+++ /dev/null
@@ -1,126 +0,0 @@
-//===---- X86KCFI.cpp - Implements KCFI -----------------------------------===//
-//
-// 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
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements KCFI indirect call checking.
-//
-//===----------------------------------------------------------------------===//
-
-#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"
-#include "llvm/CodeGen/MachineInstrBundle.h"
-#include "llvm/CodeGen/MachineModuleInfo.h"
-
-using namespace llvm;
-
-#define DEBUG_TYPE "x86-kcfi"
-#define X86_KCFI_PASS_NAME "Insert KCFI indirect call checks"
-
-STATISTIC(NumKCFIChecksAdded, "Number of indirect call checks added");
-
-namespace {
-class X86KCFI : public MachineFunctionPass {
-public:
- static char ID;
-
- X86KCFI() : MachineFunctionPass(ID) {}
-
- StringRef getPassName() const override { return X86_KCFI_PASS_NAME; }
- bool runOnMachineFunction(MachineFunction &MF) override;
-
-private:
- /// Machine instruction info used throughout the class.
- const X86InstrInfo *TII = nullptr;
-
- /// Emits a KCFI check before an indirect call.
- /// \returns true if the check was added and false otherwise.
- bool emitCheck(MachineBasicBlock &MBB,
- MachineBasicBlock::instr_iterator I) const;
-};
-
-char X86KCFI::ID = 0;
-} // end anonymous namespace
-
-INITIALIZE_PASS(X86KCFI, DEBUG_TYPE, X86_KCFI_PASS_NAME, false, false)
-
-FunctionPass *llvm::createX86KCFIPass() { return new X86KCFI(); }
-
-bool X86KCFI::emitCheck(MachineBasicBlock &MBB,
- MachineBasicBlock::instr_iterator MBBI) const {
- assert(TII && "Target instruction info was not initialized");
-
- // If the call instruction is bundled, we can only emit a check safely if
- // it's the first instruction in the bundle.
- if (MBBI->isBundled() && !std::prev(MBBI)->isBundle())
- report_fatal_error("Cannot emit a KCFI check for a bundled call");
-
- MachineInstr *Check =
- BuildMI(MBB, MBBI, MBBI->getDebugLoc(), TII->get(X86::KCFI_CHECK))
- .getInstr();
- MachineOperand &Target = MBBI->getOperand(0);
- switch (MBBI->getOpcode()) {
- case X86::CALL64r:
- case X86::CALL64r_NT:
- case X86::TAILJMPr64:
- case X86::TAILJMPr64_REX:
- assert(Target.isReg() && "Unexpected target operand for an indirect call");
- // KCFI_CHECK uses r10 as a temporary register.
- assert(Target.getReg() != X86::R10 &&
- "Unsupported target register for a KCFI call");
- Check->addOperand(MachineOperand::CreateReg(Target.getReg(), false));
- Target.setIsRenamable(false);
- break;
- case X86::CALL64pcrel32:
- case X86::TAILJMPd64:
- assert(Target.isSymbol() && "Unexpected target operand for a direct call");
- // X86TargetLowering::EmitLoweredIndirectThunk always uses r11 for
- // 64-bit indirect thunk calls.
- assert(StringRef(Target.getSymbolName()).endswith("_r11") &&
- "Unexpected register for an indirect thunk call");
- Check->addOperand(MachineOperand::CreateReg(X86::R11, false));
- break;
- default:
- llvm_unreachable("Unexpected CFI call opcode");
- }
-
- Check->addOperand(MachineOperand::CreateImm(MBBI->getCFIType()));
- MBBI->setCFIType(*MBB.getParent(), 0);
-
- // If not already bundled, bundle the check and the call to prevent
- // further changes.
- if (!MBBI->isBundled())
- finalizeBundle(MBB, Check->getIterator(), std::next(MBBI->getIterator()));
-
- ++NumKCFIChecksAdded;
- return true;
-}
-
-bool X86KCFI::runOnMachineFunction(MachineFunction &MF) {
- const Module *M = MF.getMMI().getModule();
- if (!M->getModuleFlag("kcfi"))
- return false;
-
- const auto &SubTarget = MF.getSubtarget<X86Subtarget>();
- TII = SubTarget.getInstrInfo();
-
- bool Changed = false;
- for (MachineBasicBlock &MBB : MF) {
- for (MachineBasicBlock::instr_iterator MII = MBB.instr_begin(),
- MIE = MBB.instr_end();
- MII != MIE; ++MII) {
- if (MII->isCall() && MII->getCFIType())
- Changed |= emitCheck(MBB, MII);
- }
- }
-
- return Changed;
-}
diff --git a/llvm/lib/Target/X86/X86MCInstLower.cpp b/llvm/lib/Target/X86/X86MCInstLower.cpp
index 157ec3631ed08..8488dc6ed2a1e 100644
--- a/llvm/lib/Target/X86/X86MCInstLower.cpp
+++ b/llvm/lib/Target/X86/X86MCInstLower.cpp
@@ -1344,52 +1344,6 @@ void X86AsmPrinter::LowerFENTRY_CALL(const MachineInstr &MI,
.addExpr(Op));
}
-void X86AsmPrinter::LowerKCFI_CHECK(const MachineInstr &MI) {
- assert(std::next(MI.getIterator())->isCall() &&
- "KCFI_CHECK not followed by a call instruction");
-
- // Adjust the offset for patchable-function-prefix. X86InstrInfo::getNop()
- // returns a 1-byte X86::NOOP, which means the offset is the same in
- // bytes. This assumes that patchable-function-prefix is the same for all
- // functions.
- const MachineFunction &MF = *MI.getMF();
- int64_t PrefixNops = 0;
- (void)MF.getFunction()
- .getFnAttribute("patchable-function-prefix")
- .getValueAsString()
- .getAsInteger(10, PrefixNops);
-
- // KCFI allows indirect calls to any location that's preceded by a valid
- // type identifier. To avoid encoding the full constant into an instruction,
- // and thus emitting potential call target gadgets at each indirect call
- // site, load a negated constant to a register and compare that to the
- // expected value at the call target.
- const uint32_t Type = MI.getOperand(1).getImm();
- EmitAndCountInstruction(MCInstBuilder(X86::MOV32ri)
- .addReg(X86::R10D)
- .addImm(-MaskKCFIType(Type)));
- EmitAndCountInstruction(MCInstBuilder(X86::ADD32rm)
- .addReg(X86::NoRegister)
- .addReg(X86::R10D)
- .addReg(MI.getOperand(0).getReg())
- .addImm(1)
- .addReg(X86::NoRegister)
- .addImm(-(PrefixNops + 4))
- .addReg(X86::NoRegister));
-
- MCSymbol *Pass = OutContext.createTempSymbol();
- EmitAndCountInstruction(
- MCInstBuilder(X86::JCC_1)
- .addExpr(MCSymbolRefExpr::create(Pass, OutContext))
- .addImm(X86::COND_E));
-
- MCSymbol *Trap = OutContext.createTempSymbol();
- OutStreamer->emitLabel(Trap);
- EmitAndCountInstruction(MCInstBuilder(X86::TRAP));
- emitKCFITrapEntry(MF, Trap);
- OutStreamer->emitLabel(Pass);
-}
-
void X86AsmPrinter::LowerASAN_CHECK_MEMACCESS(const MachineInstr &MI) {
// FIXME: Make this work on non-ELF.
if (!TM.getTargetTriple().isOSBinFormatELF()) {
@@ -2679,9 +2633,6 @@ void X86AsmPrinter::emitInstruction(const MachineInstr *MI) {
EmitAndCountInstruction(MCInstBuilder(getRetOpcode(*Subtarget)));
return;
- case X86::KCFI_CHECK:
- return LowerKCFI_CHECK(*MI);
-
case X86::ASAN_CHECK_MEMACCESS:
return LowerASAN_CHECK_MEMACCESS(*MI);
diff --git a/llvm/lib/Target/X86/X86TargetMachine.cpp b/llvm/lib/Target/X86/X86TargetMachine.cpp
index 47bad07e122b7..1de2a17259543 100644
--- a/llvm/lib/Target/X86/X86TargetMachine.cpp
+++ b/llvm/lib/Target/X86/X86TargetMachine.cpp
@@ -86,7 +86,6 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeX86Target() {
initializeX86TileConfigPass(PR);
initializeX86FastPreTileConfigPass(PR);
initializeX86FastTileConfigPass(PR);
- initializeX86KCFIPass(PR);
initializeX86LowerTileCopyPass(PR);
initializeX86ExpandPseudoPass(PR);
initializeX86ExecutionDomainFixPass(PR);
@@ -543,10 +542,7 @@ void X86PassConfig::addPostRegAlloc() {
addPass(createX86LoadValueInjectionLoadHardeningPass());
}
-void X86PassConfig::addPreSched2() {
- addPass(createX86ExpandPseudoPass());
- addPass(createX86KCFIPass());
-}
+void X86PassConfig::addPreSched2() { addPass(createX86ExpandPseudoPass()); }
void X86PassConfig::addPreEmitPass() {
if (getOptLevel() != CodeGenOpt::None) {
@@ -610,18 +606,17 @@ void X86PassConfig::addPreEmitPass2() {
// Insert pseudo probe annotation for callsite profiling
addPass(createPseudoProbeInserter());
- // KCFI indirect call checks are lowered to a bundle, and on Darwin platforms,
- // also CALL_RVMARKER.
- addPass(createUnpackMachineBundles([&TT](const MachineFunction &MF) {
- // Only run bundle expansion if the module uses kcfi, or there are relevant
- // ObjC runtime functions present in the module.
- const Function &F = MF.getFunction();
- const Module *M = F.getParent();
- return M->getModuleFlag("kcfi") ||
- (TT.isOSDarwin() &&
- (M->getFunction("objc_retainAutoreleasedReturnValue") ||
- M->getFunction("objc_unsafeClaimAutoreleasedReturnValue")));
- }));
+ // On Darwin platforms, BLR_RVMARKER pseudo instructions are lowered to
+ // bundles.
+ if (TT.isOSDarwin())
+ addPass(createUnpackMachineBundles([](const MachineFunction &MF) {
+ // Only run bundle expansion if there are relevant ObjC runtime functions
+ // present in the module.
+ const Function &F = MF.getFunction();
+ const Module *M = F.getParent();
+ return M->getFunction("objc_retainAutoreleasedReturnValue") ||
+ M->getFunction("objc_unsafeClaimAutoreleasedReturnValue");
+ }));
}
bool X86PassConfig::addPostFastRegAllocRewrite() {
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
index 64f539ade0ff4..06db948cafcbf 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
@@ -3102,31 +3102,6 @@ Instruction *InstCombinerImpl::visitCallBase(CallBase &Call) {
Call, Builder.CreateBitOrPointerCast(ReturnedArg, CallTy));
}
- // Drop unnecessary kcfi operand bundles from calls that were converted
- // into direct calls.
- auto Bundle = Call.getOperandBundle(LLVMContext::OB_kcfi);
- if (Bundle && !Call.isIndirectCall()) {
- DEBUG_WITH_TYPE(DEBUG_TYPE "-kcfi", {
- if (CalleeF) {
- ConstantInt *FunctionType = nullptr;
- ConstantInt *ExpectedType = cast<ConstantInt>(Bundle->Inputs[0]);
-
- if (MDNode *MD = CalleeF->getMetadata(LLVMContext::MD_kcfi_type))
- FunctionType = mdconst::extract<ConstantInt>(MD->getOperand(0));
-
- if (FunctionType &&
- FunctionType->getZExtValue() != ExpectedType->getZExtValue())
- dbgs() << Call.getModule()->getName() << ":"
- << Call.getDebugLoc().getLine()
- << ": warning: kcfi: " << Call.getCaller()->getName()
- << ": call to " << CalleeF->getName()
- << " using a mismatching function pointer type\n";
- }
- });
-
- return CallBase::removeOperandBundle(&Call, LLVMContext::OB_kcfi);
- }
-
if (isRemovableAlloc(&Call, &TLI))
return visitAllocSite(Call);
diff --git a/llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp b/llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp
index ad90c961267c5..27c04177e894d 100644
--- a/llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp
+++ b/llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp
@@ -243,12 +243,10 @@ static bool markTails(Function &F, OptimizationRemarkEmitter *ORE) {
isa<PseudoProbeInst>(&I))
continue;
- // Special-case operand bundles "clang.arc.attachedcall", "ptrauth", and
- // "kcfi".
- bool IsNoTail = CI->isNoTailCall() ||
- CI->hasOperandBundlesOtherThan(
- {LLVMContext::OB_clang_arc_attachedcall,
- LLVMContext::OB_ptrauth, LLVMContext::OB_kcfi});
+ // Special-case operand bundles "clang.arc.attachedcall" and "ptrauth".
+ bool IsNoTail =
+ CI->isNoTailCall() || CI->hasOperandBundlesOtherThan(
+ {LLVMContext::OB_clang_arc_attachedcall, LLVMContext::OB_ptrauth});
if (!IsNoTail && CI->doesNotAccessMemory()) {
// A call to a readnone function whose arguments are all things computed
diff --git a/llvm/lib/Transforms/Utils/InlineFunction.cpp b/llvm/lib/Transforms/Utils/InlineFunction.cpp
index c9b5a1b10293c..878f9477a29dd 100644
--- a/llvm/lib/Transforms/Utils/InlineFunction.cpp
+++ b/llvm/lib/Transforms/Utils/InlineFunction.cpp
@@ -1814,8 +1814,6 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI,
continue;
if (Tag == LLVMContext::OB_clang_arc_attachedcall)
continue;
- if (Tag == LLVMContext::OB_kcfi)
- continue;
return InlineResult::failure("unsupported operand bundle");
}
diff --git a/llvm/test/Bitcode/operand-bundles-bc-analyzer.ll b/llvm/test/Bitcode/operand-bundles-bc-analyzer.ll
index 0ee9ee1ebe8ab..1504f5b525dba 100644
--- a/llvm/test/Bitcode/operand-bundles-bc-analyzer.ll
+++ b/llvm/test/Bitcode/operand-bundles-bc-analyzer.ll
@@ -11,7 +11,6 @@
; CHECK-NEXT: <OPERAND_BUNDLE_TAG
; CHECK-NEXT: <OPERAND_BUNDLE_TAG
; CHECK-NEXT: <OPERAND_BUNDLE_TAG
-; CHECK-NEXT: <OPERAND_BUNDLE_TAG
; CHECK-NEXT: </OPERAND_BUNDLE_TAGS_BLOCK
; CHECK: <FUNCTION_BLOCK
diff --git a/llvm/test/CodeGen/AArch64/O0-pipeline.ll b/llvm/test/CodeGen/AArch64/O0-pipeline.ll
index a3e0943c70149..74a28778dbf0a 100644
--- a/llvm/test/CodeGen/AArch64/O0-pipeline.ll
+++ b/llvm/test/CodeGen/AArch64/O0-pipeline.ll
@@ -54,7 +54,6 @@
; CHECK-NEXT: Prologue/Epilogue Insertion & Frame Finalization
; CHECK-NEXT: Post-RA pseudo instruction expansion pass
; CHECK-NEXT: AArch64 pseudo instruction expansion pass
-; CHECK-NEXT: Insert KCFI indirect call checks
; CHECK-NEXT: AArch64 speculation hardening pass
; CHECK-NEXT: AArch64 Indirect Thunks
; CHECK-NEXT: AArch64 sls hardening pass
diff --git a/llvm/test/CodeGen/AArch64/O3-pipeline.ll b/llvm/test/CodeGen/AArch64/O3-pipeline.ll
index 70ffa2640475d..514627bbb3206 100644
--- a/llvm/test/CodeGen/AArch64/O3-pipeline.ll
+++ b/llvm/test/CodeGen/AArch64/O3-pipeline.ll
@@ -196,7 +196,6 @@
; CHECK-NEXT: Post-RA pseudo instruction expansion pass
; CHECK-NEXT: AArch64 pseudo instruction expansion pass
; CHECK-NEXT: AArch64 load / store optimization pass
-; CHECK-NEXT: Insert KCFI indirect call checks
; CHECK-NEXT: AArch64 speculation hardening pass
; CHECK-NEXT: AArch64 Indirect Thunks
; CHECK-NEXT: AArch64 sls hardening pass
diff --git a/llvm/test/CodeGen/AArch64/kcfi-bti.ll b/llvm/test/CodeGen/AArch64/kcfi-bti.ll
deleted file mode 100644
index 62e2fdcebee35..0000000000000
--- a/llvm/test/CodeGen/AArch64/kcfi-bti.ll
+++ /dev/null
@@ -1,92 +0,0 @@
-; RUN: llc -mtriple=aarch64-- -verify-machineinstrs < %s | FileCheck %s --check-prefix=ASM
-; RUN: llc -mtriple=aarch64-- -verify-machineinstrs -stop-after=finalize-isel < %s | FileCheck %s --check-prefixes=MIR,ISEL
-; RUN: llc -mtriple=aarch64-- -verify-machineinstrs -stop-after=aarch64-kcfi < %s | FileCheck %s --check-prefixes=MIR,KCFI
-
-; ASM: .word 12345678
-define void @f1(ptr noundef %x) !kcfi_type !2 {
-; ASM-LABEL: f1:
-; ASM: // %bb.0:
-; ASM: ldur w16, [x0, #-4]
-; ASM-NEXT: movk w17, #24910
-; ASM-NEXT: movk w17, #188, lsl #16
-; ASM-NEXT: cmp w16, w17
-; ASM-NEXT: b.eq .Ltmp0
-; ASM-NEXT: brk #0x8220
-; ASM-NEXT: .Ltmp0:
-; ASM-NEXT: blr x0
-
-; MIR-LABEL: name: f1
-; MIR: body:
-
-; ISEL: BLR %0, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp, cfi-type 12345678
-
-; KCFI: BUNDLE{{.*}} {
-; KCFI-NEXT: KCFI_CHECK $x0, 12345678, implicit-def $x9, implicit-def $x16, implicit-def $x17, implicit-def $nzcv
-; KCFI-NEXT: BLR killed $x0, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp
-; KCFI-NEXT: }
-
- call void %x() [ "kcfi"(i32 12345678) ]
- ret void
-}
-
-; ASM: .word 12345678
-define void @f2(ptr noundef %x) !kcfi_type !2 {
-; ASM-LABEL: f2:
-; ASM: // %bb.0:
-; ASM: ldur w16, [x0, #-4]
-; ASM-NEXT: movk w17, #24910
-; ASM-NEXT: movk w17, #188, lsl #16
-; ASM-NEXT: cmp w16, w17
-; ASM-NEXT: b.eq .Ltmp1
-; ASM-NEXT: brk #0x8220
-; ASM-NEXT: .Ltmp1:
-; ASM-NEXT: blr x0
-
-; MIR-LABEL: name: f2
-; MIR: body:
-
-; ISEL: BLR_BTI %0, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp, cfi-type 12345678
-
-; KCFI: BUNDLE{{.*}} {
-; KCFI-NEXT: KCFI_CHECK $x0, 12345678, implicit-def $x9, implicit-def $x16, implicit-def $x17, implicit-def $nzcv
-; KCFI-NEXT: BLR killed $x0, implicit-def $lr, implicit $sp
-; KCFI-NEXT: HINT 36
-; KCFI-NEXT: }
-
- call void %x() #0 [ "kcfi"(i32 12345678) ]
- ret void
-}
-
-; ASM-NOT: .word:
-define void @f3(ptr noundef %x) {
-; ASM-LABEL: f3:
-; ASM: // %bb.0:
-; ASM: ldur w9, [x16, #-4]
-; ASM-NEXT: movk w17, #24910
-; ASM-NEXT: movk w17, #188, lsl #16
-; ASM-NEXT: cmp w9, w17
-; ASM-NEXT: b.eq .Ltmp2
-; ASM-NEXT: brk #0x8230
-; ASM-NEXT: .Ltmp2:
-; ASM-NEXT: br x16
-
-; MIR-LABEL: name: f3
-; MIR: body:
-
-; ISEL: TCRETURNriBTI %1, 0, csr_aarch64_aapcs, implicit $sp, cfi-type 12345678
-
-; KCFI: BUNDLE{{.*}} {
-; KCFI-NEXT: KCFI_CHECK $x16, 12345678, implicit-def $x9, implicit-def $x16, implicit-def $x17, implicit-def $nzcv
-; KCFI-NEXT: TCRETURNriBTI internal killed $x16, 0, csr_aarch64_aapcs, implicit $sp
-; KCFI-NEXT: }
-
- tail call void %x() [ "kcfi"(i32 12345678) ]
- ret void
-}
-
-attributes #0 = { returns_twice }
-
-!llvm.module.flags = !{!0, !1}
-!0 = !{i32 8, !"branch-target-enforcement", i32 1}
-!1 = !{i32 4, !"kcfi", i32 1}
-!2 = !{i32 12345678}
diff --git a/llvm/test/CodeGen/AArch64/kcfi-patchable-function-prefix.ll b/llvm/test/CodeGen/AArch64/kcfi-patchable-function-prefix.ll
deleted file mode 100644
index fe9036e8d8908..0000000000000
--- a/llvm/test/CodeGen/AArch64/kcfi-patchable-function-prefix.ll
+++ /dev/null
@@ -1,47 +0,0 @@
-; RUN: llc -mtriple=aarch64-- -verify-machineinstrs < %s | FileCheck %s
-
-; CHECK: .p2align 2
-; CHECK-NOT: nop
-; CHECK: .word 12345678
-; CHECK-LABEL: f1:
-define void @f1(ptr noundef %x) !kcfi_type !1 {
-; CHECK: ldur w16, [x0, #-4]
- call void %x() [ "kcfi"(i32 12345678) ]
- ret void
-}
-
-; CHECK: .p2align 2
-; CHECK-NOT .word
-; CHECK-NOT: nop
-; CHECK-LABEL: f2:
-define void @f2(ptr noundef %x) {
-; CHECK: ldur w16, [x0, #-4]
- call void %x() [ "kcfi"(i32 12345678) ]
- ret void
-}
-
-; CHECK: .p2align 2
-; CHECK: .word 12345678
-; CHECK-COUNT-11: nop
-; CHECK-LABEL: f3:
-define void @f3(ptr noundef %x) #0 !kcfi_type !1 {
-; CHECK: ldur w16, [x0, #-48]
- call void %x() [ "kcfi"(i32 12345678) ]
- ret void
-}
-
-; CHECK: .p2align 2
-; CHECK-NOT: .word
-; CHECK-COUNT-11: nop
-; CHECK-LABEL: f4:
-define void @f4(ptr noundef %x) #0 {
-; CHECK: ldur w16, [x0, #-48]
- call void %x() [ "kcfi"(i32 12345678) ]
- ret void
-}
-
-attributes #0 = { "patchable-function-prefix"="11" }
-
-!llvm.module.flags = !{!0}
-!0 = !{i32 4, !"kcfi", i32 1}
-!1 = !{i32 12345678}
diff --git a/llvm/test/CodeGen/AArch64/kcfi.ll b/llvm/test/CodeGen/AArch64/kcfi.ll
deleted file mode 100644
index 088c93645cc09..0000000000000
--- a/llvm/test/CodeGen/AArch64/kcfi.ll
+++ /dev/null
@@ -1,79 +0,0 @@
-; RUN: llc -mtriple=aarch64-- -verify-machineinstrs < %s | FileCheck %s --check-prefix=ASM
-; RUN: llc -mtriple=aarch64-- -verify-machineinstrs -global-isel < %s | FileCheck %s --check-prefix=ASM
-
-; RUN: llc -mtriple=aarch64-- -verify-machineinstrs -stop-after=finalize-isel < %s | FileCheck %s --check-prefixes=MIR,ISEL
-; RUN: llc -mtriple=aarch64-- -verify-machineinstrs -stop-after=finalize-isel -global-isel < %s | FileCheck %s --check-prefixes=MIR,ISEL
-
-; RUN: llc -mtriple=aarch64-- -verify-machineinstrs -mattr=harden-sls-blr -stop-after=finalize-isel < %s | FileCheck %s --check-prefixes=MIR,ISEL-SLS
-; RUN: llc -mtriple=aarch64-- -verify-machineinstrs -mattr=harden-sls-blr -stop-after=finalize-isel -global-isel < %s | FileCheck %s --check-prefixes=MIR,ISEL-SLS
-
-; RUN: llc -mtriple=aarch64-- -verify-machineinstrs -stop-after=aarch64-kcfi < %s | FileCheck %s --check-prefixes=MIR,KCFI
-; RUN: llc -mtriple=aarch64-- -verify-machineinstrs -mattr=harden-sls-blr -stop-after=aarch64-kcfi < %s | FileCheck %s --check-prefixes=MIR,KCFI-SLS
-
-; ASM: .word 12345678
-define void @f1(ptr noundef %x) !kcfi_type !1 {
-; ASM-LABEL: f1:
-; ASM: // %bb.0:
-; ASM: ldur w16, [x0, #-4]
-; ASM-NEXT: movk w17, #24910
-; ASM-NEXT: movk w17, #188, lsl #16
-; ASM-NEXT: cmp w16, w17
-; ASM-NEXT: b.eq .Ltmp0
-; ASM-NEXT: brk #0x8220
-; ASM-NEXT: .Ltmp0:
-; ASM-NEXT: blr x0
-
-; MIR-LABEL: name: f1
-; MIR: body:
-
-; ISEL: BLR %0, csr_aarch64_aapcs,{{.*}} cfi-type 12345678
-; ISEL-SLS: BLRNoIP %0, csr_aarch64_aapcs,{{.*}} cfi-type 12345678
-
-; KCFI: BUNDLE{{.*}} {
-; KCFI-NEXT: KCFI_CHECK $x0, 12345678, implicit-def $x9, implicit-def $x16, implicit-def $x17, implicit-def $nzcv
-; KCFI-NEXT: BLR killed $x0, csr_aarch64_aapcs,{{.*}}
-; KCFI-NEXT: }
-
-; KCFI-SLS: BUNDLE{{.*}} {
-; KCFI-SLS-NEXT: KCFI_CHECK $x0, 12345678, implicit-def $x9, implicit-def $x16, implicit-def $x17, implicit-def $nzcv
-; KCFI-SLS-NEXT: BLRNoIP killed $x0, csr_aarch64_aapcs,{{.*}}
-; KCFI-SLS-NEXT: }
-
- call void %x() [ "kcfi"(i32 12345678) ]
- ret void
-}
-
-; ASM-NOT: .word:
-define void @f2(ptr noundef %x) #0 {
-; ASM-LABEL: f2:
-; ASM: // %bb.0:
-; ASM-NEXT: nop
-; ASM-NEXT: nop
-; ASM: ldur w16, [x0, #-4]
-; ASM-NEXT: movk w17, #24910
-; ASM-NEXT: movk w17, #188, lsl #16
-; ASM-NEXT: cmp w16, w17
-; ASM-NEXT: b.eq .Ltmp1
-; ASM-NEXT: brk #0x8220
-; ASM-NEXT: .Ltmp1:
-; ASM-NEXT: br x0
-
-; MIR-LABEL: name: f2
-; MIR: body:
-
-; ISEL: TCRETURNri %0, 0, csr_aarch64_aapcs, implicit $sp, cfi-type 12345678
-
-; KCFI: BUNDLE{{.*}} {
-; KCFI-NEXT: KCFI_CHECK $x0, 12345678, implicit-def $x9, implicit-def $x16, implicit-def $x17, implicit-def $nzcv
-; KCFI-NEXT: TCRETURNri killed $x0, 0, csr_aarch64_aapcs, implicit $sp
-; KCFI-NEXT: }
-
- tail call void %x() [ "kcfi"(i32 12345678) ]
- ret void
-}
-
-attributes #0 = { "patchable-function-entry"="2" }
-
-!llvm.module.flags = !{!0}
-!0 = !{i32 4, !"kcfi", i32 1}
-!1 = !{i32 12345678}
diff --git a/llvm/test/CodeGen/MIR/X86/instr-cfi-type.mir b/llvm/test/CodeGen/MIR/X86/instr-cfi-type.mir
deleted file mode 100644
index 136e491a2e3b0..0000000000000
--- a/llvm/test/CodeGen/MIR/X86/instr-cfi-type.mir
+++ /dev/null
@@ -1,42 +0,0 @@
-# RUN: llc -march=x86-64 -run-pass none -o - %s | FileCheck %s
-# This test ensures that the MIR parser parses cfi-type correctly.
-
---- |
- define void @test(ptr noundef %x) {
- call void %x() [ "kcfi"(i32 12345678) ]
- ret void
- }
-
- !llvm.module.flags = !{!0}
-
- !0 = !{i32 4, !"kcfi", i32 1}
-
-...
----
-name: test
-# CHECK-LABEL: name: test
-alignment: 16
-tracksRegLiveness: true
-tracksDebugUserValues: true
-liveins:
- - { reg: '$rdi' }
-frameInfo:
- stackSize: 8
- offsetAdjustment: -8
- maxAlignment: 1
- adjustsStack: true
- hasCalls: true
- maxCallFrameSize: 0
-machineFunctionInfo: {}
-body: |
- bb.0 (%ir-block.0):
- liveins: $rdi
-
- frame-setup PUSH64r undef $rax, implicit-def $rsp, implicit $rsp
- frame-setup CFI_INSTRUCTION def_cfa_offset 16
- CALL64r killed renamable $rdi, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, cfi-type 12345678
- $rax = frame-destroy POP64r implicit-def $rsp, implicit $rsp
- frame-destroy CFI_INSTRUCTION def_cfa_offset 8
- RET64
-
-...
diff --git a/llvm/test/CodeGen/X86/O0-pipeline.ll b/llvm/test/CodeGen/X86/O0-pipeline.ll
index 1c80d677f78f6..cf0e0d401df2e 100644
--- a/llvm/test/CodeGen/X86/O0-pipeline.ll
+++ b/llvm/test/CodeGen/X86/O0-pipeline.ll
@@ -56,7 +56,6 @@
; CHECK-NEXT: Prologue/Epilogue Insertion & Frame Finalization
; CHECK-NEXT: Post-RA pseudo instruction expansion pass
; CHECK-NEXT: X86 pseudo instruction expansion pass
-; CHECK-NEXT: Insert KCFI indirect call checks
; CHECK-NEXT: Analyze Machine Code For Garbage Collection
; CHECK-NEXT: Insert fentry calls
; CHECK-NEXT: Insert XRay ops
@@ -76,7 +75,6 @@
; CHECK-NEXT: Check CFA info and insert CFI instructions if needed
; CHECK-NEXT: X86 Load Value Injection (LVI) Ret-Hardening
; CHECK-NEXT: Pseudo Probe Inserter
-; CHECK-NEXT: Unpack machine instruction bundles
; CHECK-NEXT: Lazy Machine Block Frequency Analysis
; CHECK-NEXT: Machine Optimization Remark Emitter
; CHECK-NEXT: X86 Assembly Printer
diff --git a/llvm/test/CodeGen/X86/kcfi-patchable-function-prefix.ll b/llvm/test/CodeGen/X86/kcfi-patchable-function-prefix.ll
deleted file mode 100644
index e5d541f8ed9d9..0000000000000
--- a/llvm/test/CodeGen/X86/kcfi-patchable-function-prefix.ll
+++ /dev/null
@@ -1,52 +0,0 @@
-; RUN: llc -mtriple=x86_64-unknown-linux-gnu -verify-machineinstrs < %s | FileCheck %s
-
-; CHECK: .p2align 4, 0x90
-; CHECK-LABEL: __cfi_f1:
-; CHECK-COUNT-11: nop
-; CHECK-NEXT: movl $12345678, %eax
-; CHECK-LABEL: .Lcfi_func_end0:
-; CHECK-NEXT: .size __cfi_f1, .Lcfi_func_end0-__cfi_f1
-; CHECK-LABEL: f1:
-define void @f1(ptr noundef %x) !kcfi_type !1 {
-; CHECK: addl -4(%r{{..}}), %r10d
- call void %x() [ "kcfi"(i32 12345678) ]
- ret void
-}
-
-; CHECK: .p2align 4, 0x90
-; CHECK-NOT: __cfi_f2:
-; CHECK-NOT: nop
-; CHECK-LABEL: f2:
-define void @f2(ptr noundef %x) {
-; CHECK: addl -4(%r{{..}}), %r10d
- call void %x() [ "kcfi"(i32 12345678) ]
- ret void
-}
-
-; CHECK: .p2align 4, 0x90
-; CHECK-LABEL: __cfi_f3:
-; CHECK-NOT: nop
-; CHECK-NEXT: movl $12345678, %eax
-; CHECK-COUNT-11: nop
-; CHECK-LABEL: f3:
-define void @f3(ptr noundef %x) #0 !kcfi_type !1 {
-; CHECK: addl -15(%r{{..}}), %r10d
- call void %x() [ "kcfi"(i32 12345678) ]
- ret void
-}
-
-; CHECK: .p2align 4, 0x90
-; CHECK-NOT: __cfi_f4:
-; CHECK-COUNT-16: nop
-; CHECK-LABEL: f4:
-define void @f4(ptr noundef %x) #0 {
-; CHECK: addl -15(%r{{..}}), %r10d
- call void %x() [ "kcfi"(i32 12345678) ]
- ret void
-}
-
-attributes #0 = { "patchable-function-prefix"="11" }
-
-!llvm.module.flags = !{!0}
-!0 = !{i32 4, !"kcfi", i32 1}
-!1 = !{i32 12345678}
diff --git a/llvm/test/CodeGen/X86/kcfi.ll b/llvm/test/CodeGen/X86/kcfi.ll
deleted file mode 100644
index 362df82a5b20b..0000000000000
--- a/llvm/test/CodeGen/X86/kcfi.ll
+++ /dev/null
@@ -1,117 +0,0 @@
-; RUN: llc -mtriple=x86_64-unknown-linux-gnu -verify-machineinstrs < %s | FileCheck %s --check-prefix=ASM
-; RUN: llc -mtriple=x86_64-unknown-linux-gnu -verify-machineinstrs -stop-after=finalize-isel < %s | FileCheck %s --check-prefixes=MIR,ISEL
-; RUN: llc -mtriple=x86_64-unknown-linux-gnu -verify-machineinstrs -stop-after=x86-kcfi < %s | FileCheck %s --check-prefixes=MIR,KCFI
-
-; ASM: .p2align 4, 0x90
-; ASM: .type __cfi_f1, at function
-; ASM-LABEL: __cfi_f1:
-; ASM-NEXT: nop
-; ASM-NEXT: nop
-; ASM-NEXT: nop
-; ASM-NEXT: nop
-; ASM-NEXT: nop
-; ASM-NEXT: nop
-; ASM-NEXT: nop
-; ASM-NEXT: nop
-; ASM-NEXT: nop
-; ASM-NEXT: nop
-; ASM-NEXT: nop
-; ASM-NEXT: movl $12345678, %eax
-; ASM-LABEL: .Lcfi_func_end0:
-; ASM-NEXT: .size __cfi_f1, .Lcfi_func_end0-__cfi_f1
-define void @f1(ptr noundef %x) !kcfi_type !1 {
-; ASM-LABEL: f1:
-; ASM: # %bb.0:
-; ASM: movl $4282621618, %r10d # imm = 0xFF439EB2
-; ASM-NEXT: addl -4(%rdi), %r10d
-; ASM-NEXT: je .Ltmp0
-; ASM-NEXT: .Ltmp1:
-; ASM-NEXT: ud2
-; ASM-NEXT: .section .kcfi_traps,"ao", at progbits,.text
-; ASM-NEXT: .Ltmp2:
-; ASM-NEXT: .long .Ltmp1-.Ltmp2
-; ASM-NEXT: .text
-; ASM-NEXT: .Ltmp0:
-; ASM-NEXT: callq *%rdi
-
-; MIR-LABEL: name: f1
-; MIR: body:
-; ISEL: CALL64r %0, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, cfi-type 12345678
-; KCFI: BUNDLE implicit-def $r10, implicit-def $r10d, implicit-def $r10w, implicit-def $r10b, implicit-def $r10bh, implicit-def $r10wh, implicit-def $eflags, implicit-def $rsp, implicit-def $esp, implicit-def $sp, implicit-def $spl, implicit-def $sph, implicit-def $hsp, implicit-def $ssp, implicit killed $rdi, implicit $rsp, implicit $ssp {
-; KCFI-NEXT: KCFI_CHECK $rdi, 12345678, implicit-def $r10, implicit-def $eflags
-; KCFI-NEXT: CALL64r killed $rdi, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp
-; KCFI-NEXT: }
- call void %x() [ "kcfi"(i32 12345678) ]
- ret void
-}
-
-; ASM-NOT: __cfi_f2:
-define void @f2(ptr noundef %x) {
-; ASM-LABEL: f2:
-
-; MIR-LABEL: name: f2
-; MIR: body:
-; ISEL: TCRETURNri64 %0, 0, csr_64, implicit $rsp, implicit $ssp, cfi-type 12345678
-; KCFI: BUNDLE implicit-def $r10, implicit-def $r10d, implicit-def $r10w, implicit-def $r10b, implicit-def $r10bh, implicit-def $r10wh, implicit-def $eflags, implicit killed $rdi, implicit $rsp, implicit $ssp {
-; KCFI-NEXT: KCFI_CHECK $rdi, 12345678, implicit-def $r10, implicit-def $eflags
-; KCFI-NEXT: TAILJMPr64 killed $rdi, csr_64, implicit $rsp, implicit $ssp, implicit $rsp, implicit $ssp
-; KCFI-NEXT: }
- tail call void %x() [ "kcfi"(i32 12345678) ]
- ret void
-}
-
-; ASM-NOT: __cfi_f3:
-define void @f3(ptr noundef %x) #0 {
-; ASM-LABEL: f3:
-; MIR-LABEL: name: f3
-; MIR: body:
-; ISEL: CALL64pcrel32 &__llvm_retpoline_r11, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit killed $r11, cfi-type 12345678
-; KCFI: BUNDLE implicit-def $r10, implicit-def $r10d, implicit-def $r10w, implicit-def $r10b, implicit-def $r10bh, implicit-def $r10wh, implicit-def $eflags, implicit-def $rsp, implicit-def $esp, implicit-def $sp, implicit-def $spl, implicit-def $sph, implicit-def $hsp, implicit-def $ssp, implicit killed $r11, implicit $rsp, implicit $ssp {
-; KCFI-NEXT: KCFI_CHECK $r11, 12345678, implicit-def $r10, implicit-def $eflags
-; KCFI-NEXT: CALL64pcrel32 &__llvm_retpoline_r11, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit killed $r11
-; KCFI-NEXT: }
- call void %x() [ "kcfi"(i32 12345678) ]
- ret void
-}
-
-; ASM-NOT: __cfi_f4:
-define void @f4(ptr noundef %x) #0 {
-; ASM-LABEL: f4:
-; MIR-LABEL: name: f4
-; MIR: body:
-; ISEL: TCRETURNdi64 &__llvm_retpoline_r11, 0, csr_64, implicit $rsp, implicit $ssp, implicit killed $r11, cfi-type 12345678
-; KCFI: BUNDLE implicit-def $r10, implicit-def $r10d, implicit-def $r10w, implicit-def $r10b, implicit-def $r10bh, implicit-def $r10wh, implicit-def $eflags, implicit killed $r11, implicit $rsp, implicit $ssp {
-; KCFI-NEXT: KCFI_CHECK $r11, 12345678, implicit-def $r10, implicit-def $eflags
-; KCFI-NEXT: TAILJMPd64 &__llvm_retpoline_r11, csr_64, implicit $rsp, implicit $ssp, implicit $rsp, implicit $ssp, implicit killed $r11
-; KCFI-NEXT: }
- tail call void %x() [ "kcfi"(i32 12345678) ]
- ret void
-}
-
-;; Ensure we emit Value + 1 for unwanted values (e.g. endbr64 == 4196274163).
-; ASM-LABEL: __cfi_f5:
-; ASM: movl $4196274164, %eax # imm = 0xFA1E0FF4
-define void @f5(ptr noundef %x) !kcfi_type !2 {
-; ASM-LABEL: f5:
-; ASM: movl $98693132, %r10d # imm = 0x5E1F00C
- tail call void %x() [ "kcfi"(i32 4196274163) ]
- ret void
-}
-
-;; Ensure we emit Value + 1 for unwanted values (e.g. -endbr64 == 98693133).
-; ASM-LABEL: __cfi_f6:
-; ASM: movl $98693134, %eax # imm = 0x5E1F00E
-define void @f6(ptr noundef %x) !kcfi_type !3 {
-; ASM-LABEL: f6:
-; ASM: movl $4196274162, %r10d # imm = 0xFA1E0FF2
- tail call void %x() [ "kcfi"(i32 98693133) ]
- ret void
-}
-
-attributes #0 = { "target-features"="+retpoline-indirect-branches,+retpoline-indirect-calls" }
-
-!llvm.module.flags = !{!0}
-!0 = !{i32 4, !"kcfi", i32 1}
-!1 = !{i32 12345678}
-!2 = !{i32 4196274163}
-!3 = !{i32 98693133}
diff --git a/llvm/test/CodeGen/X86/opt-pipeline.ll b/llvm/test/CodeGen/X86/opt-pipeline.ll
index 3f9acba27810f..6f2cfaaa3f8e3 100644
--- a/llvm/test/CodeGen/X86/opt-pipeline.ll
+++ b/llvm/test/CodeGen/X86/opt-pipeline.ll
@@ -173,7 +173,6 @@
; CHECK-NEXT: Machine Copy Propagation Pass
; CHECK-NEXT: Post-RA pseudo instruction expansion pass
; CHECK-NEXT: X86 pseudo instruction expansion pass
-; CHECK-NEXT: Insert KCFI indirect call checks
; CHECK-NEXT: MachineDominator Tree Construction
; CHECK-NEXT: Machine Natural Loop Construction
; CHECK-NEXT: Post RA top-down list latency scheduler
@@ -209,7 +208,6 @@
; CHECK-NEXT: Check CFA info and insert CFI instructions if needed
; CHECK-NEXT: X86 Load Value Injection (LVI) Ret-Hardening
; CHECK-NEXT: Pseudo Probe Inserter
-; CHECK-NEXT: Unpack machine instruction bundles
; CHECK-NEXT: Lazy Machine Block Frequency Analysis
; CHECK-NEXT: Machine Optimization Remark Emitter
; CHECK-NEXT: X86 Assembly Printer
diff --git a/llvm/test/Transforms/InstCombine/kcfi-operand-bundles.ll b/llvm/test/Transforms/InstCombine/kcfi-operand-bundles.ll
deleted file mode 100644
index 78831d66750fe..0000000000000
--- a/llvm/test/Transforms/InstCombine/kcfi-operand-bundles.ll
+++ /dev/null
@@ -1,25 +0,0 @@
-; RUN: opt < %s -passes=instcombine -S | FileCheck %s
-
-define void @f1() #0 prefix i32 10 {
- ret void
-}
-
-declare void @f2() #0 prefix i32 11
-
-; CHECK-LABEL: define void @g(ptr noundef %x) #0
-define void @g(ptr noundef %x) #0 {
- ; CHECK: call void %x() [ "kcfi"(i32 10) ]
- call void %x() [ "kcfi"(i32 10) ]
-
- ; COM: Must drop the kcfi operand bundle from direct calls.
- ; CHECK: call void @f1()
- ; CHECK-NOT: [ "kcfi"(i32 10) ]
- call void @f1() [ "kcfi"(i32 10) ]
-
- ; CHECK: call void @f2()
- ; CHECK-NOT: [ "kcfi"(i32 10) ]
- call void @f2() [ "kcfi"(i32 10) ]
- ret void
-}
-
-attributes #0 = { "kcfi-target" }
diff --git a/llvm/test/Transforms/TailCallElim/kcfi-bundle.ll b/llvm/test/Transforms/TailCallElim/kcfi-bundle.ll
deleted file mode 100644
index f43b9fae0ab6b..0000000000000
--- a/llvm/test/Transforms/TailCallElim/kcfi-bundle.ll
+++ /dev/null
@@ -1,10 +0,0 @@
-; RUN: opt < %s -tailcallelim -verify-dom-info -S | FileCheck %s
-; Check that the "kcfi" operand bundle doesn't prevent tail calls.
-
-define i64 @f_1(i64 %x, i64(i64)* %f_0) {
-; CHECK-LABEL: @f_1(
-entry:
-; CHECK: tail call i64 %f_0(i64 %x) [ "kcfi"(i32 42) ]
- %tmp = call i64 %f_0(i64 %x) [ "kcfi"(i32 42) ]
- ret i64 0
-}
diff --git a/llvm/test/Verifier/kcfi-operand-bundles.ll b/llvm/test/Verifier/kcfi-operand-bundles.ll
deleted file mode 100644
index 90933be4f3ce1..0000000000000
--- a/llvm/test/Verifier/kcfi-operand-bundles.ll
+++ /dev/null
@@ -1,16 +0,0 @@
-; RUN: not opt -verify < %s 2>&1 | FileCheck %s
-
-define void @test_kcfi_bundle(i64 %arg0, i32 %arg1, void()* %arg2) {
-; CHECK: Multiple kcfi operand bundles
-; CHECK-NEXT: call void %arg2() [ "kcfi"(i32 42), "kcfi"(i32 42) ]
- call void %arg2() [ "kcfi"(i32 42), "kcfi"(i32 42) ]
-
-; CHECK: Kcfi bundle operand must be an i32 constant
-; CHECK-NEXT: call void %arg2() [ "kcfi"(i64 42) ]
- call void %arg2() [ "kcfi"(i64 42) ]
-
-; CHECK-NOT: call
- call void %arg2() [ "kcfi"(i32 42) ] ; OK
- call void %arg2() [ "kcfi"(i32 42) ] ; OK
- ret void
-}
diff --git a/llvm/test/Verifier/metadata-function-kcfi-type.ll b/llvm/test/Verifier/metadata-function-kcfi-type.ll
deleted file mode 100644
index 93bac98e11937..0000000000000
--- a/llvm/test/Verifier/metadata-function-kcfi-type.ll
+++ /dev/null
@@ -1,39 +0,0 @@
-; RUN: not llvm-as %s -disable-output 2>&1 | FileCheck %s
-
-define void @a() {
- unreachable
-}
-
-define void @b() !kcfi_type !0 {
- unreachable
-}
-
-; CHECK: function must have a single !kcfi_type attachment
-define void @f0() !kcfi_type !0 !kcfi_type !0 {
- unreachable
-}
-!0 = !{i32 10}
-
-; CHECK: !kcfi_type must have exactly one operand
-define void @f1() !kcfi_type !1 {
- unreachable
-}
-!1 = !{!"string", i32 0}
-
-; CHECK: expected a constant operand for !kcfi_type
-define void @f2() !kcfi_type !2 {
- unreachable
-}
-!2 = !{!"string"}
-
-; CHECK: expected a constant integer operand for !kcfi_type
-define void @f3() !kcfi_type !3 {
- unreachable
-}
-!3 = !{ptr @f3}
-
-; CHECK: expected a 32-bit integer constant operand for !kcfi_type
-define void @f4() !kcfi_type !4 {
- unreachable
-}
-!4 = !{i64 10}
diff --git a/llvm/utils/gn/secondary/llvm/lib/Target/AArch64/BUILD.gn b/llvm/utils/gn/secondary/llvm/lib/Target/AArch64/BUILD.gn
index 868029f2c39e4..76b564822c76a 100644
--- a/llvm/utils/gn/secondary/llvm/lib/Target/AArch64/BUILD.gn
+++ b/llvm/utils/gn/secondary/llvm/lib/Target/AArch64/BUILD.gn
@@ -126,7 +126,6 @@ static_library("LLVMAArch64CodeGen") {
"AArch64ISelDAGToDAG.cpp",
"AArch64ISelLowering.cpp",
"AArch64InstrInfo.cpp",
- "AArch64KCFI.cpp",
"AArch64LoadStoreOptimizer.cpp",
"AArch64LowerHomogeneousPrologEpilog.cpp",
"AArch64MCInstLower.cpp",
diff --git a/llvm/utils/gn/secondary/llvm/lib/Target/X86/BUILD.gn b/llvm/utils/gn/secondary/llvm/lib/Target/X86/BUILD.gn
index af9716313433f..28d1b499b3037 100644
--- a/llvm/utils/gn/secondary/llvm/lib/Target/X86/BUILD.gn
+++ b/llvm/utils/gn/secondary/llvm/lib/Target/X86/BUILD.gn
@@ -109,7 +109,6 @@ static_library("LLVMX86CodeGen") {
"X86InstrInfo.cpp",
"X86InstructionSelector.cpp",
"X86InterleavedAccess.cpp",
- "X86KCFI.cpp",
"X86LegalizerInfo.cpp",
"X86LoadValueInjectionLoadHardening.cpp",
"X86LoadValueInjectionRetHardening.cpp",
More information about the llvm-commits
mailing list