diff options
author | Pengxuan Zheng <pzheng@quicinc.com> | 2022-04-15 14:57:40 -0700 |
---|---|---|
committer | Pengxuan Zheng <pzheng@quicinc.com> | 2022-04-20 11:20:26 -0700 |
commit | 8a9b4fb4aa6d2dde026d9ae08459aa9e7a1edb05 (patch) | |
tree | ddd7c03307a53bd4e51ac087d0aba1b336ebce9a /clang/lib | |
parent | c79e6007edef4b0044be93c4ffff64dc806ac687 (diff) | |
download | llvm-8a9b4fb4aa6d2dde026d9ae08459aa9e7a1edb05.zip llvm-8a9b4fb4aa6d2dde026d9ae08459aa9e7a1edb05.tar.gz llvm-8a9b4fb4aa6d2dde026d9ae08459aa9e7a1edb05.tar.bz2 |
[COFF, ARM64] Add __break intrinsic
https://docs.microsoft.com/en-us/cpp/intrinsics/arm64-intrinsics?view=msvc-170
Reviewed By: rnk, mstorsjo
Differential Revision: https://reviews.llvm.org/D124032
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/CodeGen/CGBuiltin.cpp | 9 | ||||
-rw-r--r-- | clang/lib/Headers/intrin.h | 2 | ||||
-rw-r--r-- | clang/lib/Sema/SemaChecking.cpp | 3 |
3 files changed, 14 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 464dcc2..fc2d32f 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -9823,6 +9823,15 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID, return Builder.CreateCall(F, Metadata); } + if (BuiltinID == AArch64::BI__break) { + Expr::EvalResult Result; + if (!E->getArg(0)->EvaluateAsInt(Result, CGM.getContext())) + llvm_unreachable("Sema will ensure that the parameter is constant"); + + llvm::Function *F = CGM.getIntrinsic(llvm::Intrinsic::aarch64_break); + return Builder.CreateCall(F, {EmitScalarExpr(E->getArg(0))}); + } + if (BuiltinID == AArch64::BI__builtin_arm_clrex) { Function *F = CGM.getIntrinsic(Intrinsic::aarch64_clrex); return Builder.CreateCall(F); diff --git a/clang/lib/Headers/intrin.h b/clang/lib/Headers/intrin.h index 741b21e..07fcae3 100644 --- a/clang/lib/Headers/intrin.h +++ b/clang/lib/Headers/intrin.h @@ -560,6 +560,8 @@ unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64 val); __int64 __mulh(__int64 __a, __int64 __b); unsigned __int64 __umulh(unsigned __int64 __a, unsigned __int64 __b); + +void __break(int); #endif /*----------------------------------------------------------------------------*\ diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index f575c07..467edd3 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -2948,6 +2948,9 @@ bool Sema::CheckAArch64BuiltinFunctionCall(const TargetInfo &TI, if (BuiltinID == AArch64::BI__getReg) return SemaBuiltinConstantArgRange(TheCall, 0, 0, 31); + if (BuiltinID == AArch64::BI__break) + return SemaBuiltinConstantArgRange(TheCall, 0, 0, 0xffff); + if (CheckNeonBuiltinFunctionCall(TI, BuiltinID, TheCall)) return true; |