forked from OSchip/llvm-project
[MS] Implement the __fastfail intrinsic as a builtin
__fastfail terminates the process immediately with a special system call. It does not run any process shutdown code or exception recovery logic. Fixes PR31854 llvm-svn: 294606
This commit is contained in:
parent
7e320c2485
commit
04f9f91da6
|
@ -773,6 +773,7 @@ LANGBUILTIN(_rotr, "UiUii", "n", ALL_MS_LANGUAGES)
|
|||
LANGBUILTIN(_lrotr, "ULiULii", "n", ALL_MS_LANGUAGES)
|
||||
LANGBUILTIN(_rotr64, "ULLiULLii", "n", ALL_MS_LANGUAGES)
|
||||
LANGBUILTIN(__va_start, "vc**.", "nt", ALL_MS_LANGUAGES)
|
||||
LANGBUILTIN(__fastfail, "vUi", "nr", ALL_MS_LANGUAGES)
|
||||
|
||||
// Microsoft library builtins.
|
||||
LIBBUILTIN(_setjmpex, "iJ", "fj", "setjmpex.h", ALL_MS_LANGUAGES)
|
||||
|
|
|
@ -482,10 +482,11 @@ enum class CodeGenFunction::MSVCIntrin {
|
|||
_InterlockedIncrement,
|
||||
_InterlockedOr,
|
||||
_InterlockedXor,
|
||||
__fastfail,
|
||||
};
|
||||
|
||||
Value *CodeGenFunction::EmitMSVCBuiltinExpr(MSVCIntrin BuiltinID,
|
||||
const CallExpr *E) {
|
||||
const CallExpr *E) {
|
||||
switch (BuiltinID) {
|
||||
case MSVCIntrin::_BitScanForward:
|
||||
case MSVCIntrin::_BitScanReverse: {
|
||||
|
@ -566,6 +567,37 @@ Value *CodeGenFunction::EmitMSVCBuiltinExpr(MSVCIntrin BuiltinID,
|
|||
llvm::AtomicOrdering::SequentiallyConsistent);
|
||||
return Builder.CreateAdd(RMWI, ConstantInt::get(IntTy, 1));
|
||||
}
|
||||
|
||||
case MSVCIntrin::__fastfail: {
|
||||
// Request immediate process termination from the kernel. The instruction
|
||||
// sequences to do this are documented on MSDN:
|
||||
// https://msdn.microsoft.com/en-us/library/dn774154.aspx
|
||||
llvm::Triple::ArchType ISA = getTarget().getTriple().getArch();
|
||||
StringRef Asm, Constraints;
|
||||
switch (ISA) {
|
||||
default:
|
||||
ErrorUnsupported(E, "__fastfail call for this architecture");
|
||||
break;
|
||||
case llvm::Triple::x86:
|
||||
case llvm::Triple::x86_64:
|
||||
Asm = "int $$0x29";
|
||||
Constraints = "{cx}";
|
||||
break;
|
||||
case llvm::Triple::thumb:
|
||||
Asm = "udf #251";
|
||||
Constraints = "{r0}";
|
||||
break;
|
||||
}
|
||||
llvm::FunctionType *FTy = llvm::FunctionType::get(VoidTy, {Int32Ty}, false);
|
||||
llvm::InlineAsm *IA =
|
||||
llvm::InlineAsm::get(FTy, Asm, Constraints, /*SideEffects=*/true);
|
||||
llvm::AttributeSet NoReturnAttr =
|
||||
AttributeSet::get(getLLVMContext(), llvm::AttributeSet::FunctionIndex,
|
||||
llvm::Attribute::NoReturn);
|
||||
CallSite CS = Builder.CreateCall(IA, EmitScalarExpr(E->getArg(0)));
|
||||
CS.setAttributes(NoReturnAttr);
|
||||
return CS.getInstruction();
|
||||
}
|
||||
}
|
||||
llvm_unreachable("Incorrect MSVC intrinsic!");
|
||||
}
|
||||
|
@ -2276,6 +2308,11 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
|
|||
break;
|
||||
}
|
||||
|
||||
case Builtin::BI__fastfail: {
|
||||
return RValue::get(EmitMSVCBuiltinExpr(MSVCIntrin::__fastfail, E));
|
||||
break;
|
||||
}
|
||||
|
||||
case Builtin::BI__builtin_coro_size: {
|
||||
auto & Context = getContext();
|
||||
auto SizeTy = Context.getSizeType();
|
||||
|
|
|
@ -69,7 +69,6 @@ static __inline__
|
|||
__int64 __emul(int, int);
|
||||
static __inline__
|
||||
unsigned __int64 __emulu(unsigned int, unsigned int);
|
||||
void __cdecl __fastfail(unsigned int);
|
||||
unsigned int __getcallerseflags(void);
|
||||
static __inline__
|
||||
void __halt(void);
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
// RUN: | FileCheck %s -check-prefixes CHECK,CHECK-I386,CHECK-INTEL
|
||||
// RUN: %clang_cc1 -ffreestanding -fms-extensions -fms-compatibility -fms-compatibility-version=17.00 \
|
||||
// RUN: -triple thumbv7--windows -Oz -emit-llvm %s -o - \
|
||||
// RUN: | FileCheck %s --check-prefixes CHECK,CHECK-ARM-X64
|
||||
// RUN: | FileCheck %s --check-prefixes CHECK,CHECK-ARM,CHECK-ARM-X64
|
||||
// RUN: %clang_cc1 -ffreestanding -fms-extensions -fms-compatibility -fms-compatibility-version=17.00 \
|
||||
// RUN: -triple x86_64--windows -Oz -emit-llvm %s -o - \
|
||||
// RUN: | FileCheck %s --check-prefixes CHECK,CHECK-X64,CHECK-ARM-X64,CHECK-INTEL
|
||||
|
@ -419,3 +419,15 @@ __int64 test_InterlockedDecrement64(__int64 volatile *Addend) {
|
|||
// CHECK-ARM-X64: }
|
||||
|
||||
#endif
|
||||
|
||||
void test__fastfail() {
|
||||
__fastfail(42);
|
||||
}
|
||||
// CHECK-LABEL: define{{.*}} void @test__fastfail()
|
||||
// CHECK-ARM: call void asm sideeffect "udf #251", "{r0}"(i32 42) #[[NORETURN:[0-9]+]]
|
||||
// CHECK-INTEL: call void asm sideeffect "int $$0x29", "{cx}"(i32 42) #[[NORETURN:[0-9]+]]
|
||||
|
||||
// Attributes come last.
|
||||
|
||||
// CHECK: attributes #[[NORETURN]] = { noreturn{{.*}} }
|
||||
|
||||
|
|
Loading…
Reference in New Issue