diff options
| author | Reid Kleckner <rnk@google.com> | 2017-03-06 19:43:16 +0000 |
|---|---|---|
| committer | Reid Kleckner <rnk@google.com> | 2017-03-06 19:43:16 +0000 |
| commit | b04cb9ab7a2aa138ca46920687c1504765bb80d8 (patch) | |
| tree | a1e9949cb5474c7f5724a3269baa3db03d0114c6 /clang/lib | |
| parent | a175512b18478848bdbe203f2d25dc417860e3c5 (diff) | |
| download | bcm5719-llvm-b04cb9ab7a2aa138ca46920687c1504765bb80d8.tar.gz bcm5719-llvm-b04cb9ab7a2aa138ca46920687c1504765bb80d8.zip | |
[MS] Add support for __ud2 and __int2c MSVC intrinsics
This was requested in PR31958 and elsewhere.
llvm-svn: 297057
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/CodeGen/CGBuiltin.cpp | 15 | ||||
| -rw-r--r-- | clang/lib/Headers/intrin.h | 2 |
2 files changed, 15 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 19b9c9b1d59..1c7ee2e6d49 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -7982,6 +7982,21 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID, // instruction, but it will create a memset that won't be optimized away. return Builder.CreateMemSet(Ops[0], Ops[1], Ops[2], 1, true); } + case X86::BI__ud2: + // llvm.trap makes a ud2a instruction on x86. + return EmitTrapCall(Intrinsic::trap); + case X86::BI__int2c: { + // This syscall signals a driver assertion failure in x86 NT kernels. + llvm::FunctionType *FTy = llvm::FunctionType::get(VoidTy, false); + llvm::InlineAsm *IA = + llvm::InlineAsm::get(FTy, "int $$0x2c", "", /*SideEffects=*/true); + llvm::AttributeSet NoReturnAttr = + AttributeSet::get(getLLVMContext(), llvm::AttributeSet::FunctionIndex, + llvm::Attribute::NoReturn); + CallSite CS = Builder.CreateCall(IA); + CS.setAttributes(NoReturnAttr); + return CS.getInstruction(); + } } } diff --git a/clang/lib/Headers/intrin.h b/clang/lib/Headers/intrin.h index 930d46552f4..af87914a9a0 100644 --- a/clang/lib/Headers/intrin.h +++ b/clang/lib/Headers/intrin.h @@ -79,7 +79,6 @@ void __incfsdword(unsigned long); void __incfsword(unsigned long); unsigned long __indword(unsigned short); void __indwordstring(unsigned short, unsigned long *, unsigned long); -void __int2c(void); void __invlpg(void *); unsigned short __inword(unsigned short); void __inwordstring(unsigned short, unsigned short *, unsigned long); @@ -141,7 +140,6 @@ void __svm_stgi(void); void __svm_vmload(size_t); void __svm_vmrun(size_t); void __svm_vmsave(size_t); -void __ud2(void); unsigned __int64 __ull_rshift(unsigned __int64, int); void __vmx_off(void); void __vmx_vmptrst(unsigned __int64 *); |

