[PATCH] D63617: [COFF, ARM64] Fix encoding of __debugbreak
Tom Tan via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Jun 20 12:25:21 PDT 2019
TomTan created this revision.
TomTan added reviewers: efriedma, rnk.
Herald added subscribers: cfe-commits, kristof.beyls, javed.absar.
Herald added a project: clang.
On Windows ARM64, intrinsic `__debugbreak` should be compiled into `brk #0xF000` which is different from llvm intrinsic `debugtrap` as `brk #0`. This change fixes this by transforming `__debugbreak` to the expected inline assembly in Clang.
Repository:
rC Clang
https://reviews.llvm.org/D63617
Files:
lib/CodeGen/CGBuiltin.cpp
test/CodeGen/ms-intrinsics.c
Index: test/CodeGen/ms-intrinsics.c
===================================================================
--- test/CodeGen/ms-intrinsics.c
+++ test/CodeGen/ms-intrinsics.c
@@ -1379,6 +1379,14 @@
// CHECK-INTEL: call void asm sideeffect "int $$0x29", "{cx}"(i32 42) #[[NORETURN]]
// CHECK-ARM64: call void asm sideeffect "brk #0xF003", "{w0}"(i32 42) #[[NORETURN:[0-9]+]]
+void test__debugbreak() {
+ __debugbreak();
+}
+// CHECK_LABEL: define{{.*}} void @test__debugbreak() {
+// CHECK-INTEL: call void @llvm.debugtrap()
+// CHECK-ARM: call void @llvm.debugtrap()
+// CHECK-ARM64: call void asm sideeffect "brk #0xF000", ""()
+
// Attributes come last.
// CHECK: attributes #[[NORETURN]] = { noreturn{{.*}} }
Index: lib/CodeGen/CGBuiltin.cpp
===================================================================
--- lib/CodeGen/CGBuiltin.cpp
+++ lib/CodeGen/CGBuiltin.cpp
@@ -2125,8 +2125,20 @@
}
case Builtin::BI__builtin_trap:
return RValue::get(EmitTrapCall(Intrinsic::trap));
- case Builtin::BI__debugbreak:
- return RValue::get(EmitTrapCall(Intrinsic::debugtrap));
+ case Builtin::BI__debugbreak: {
+ llvm::Triple::ArchType ISA = getTarget().getTriple().getArch();
+ switch (ISA) {
+ default:
+ return RValue::get(EmitTrapCall(Intrinsic::debugtrap));
+ case llvm::Triple::aarch64: {
+ llvm::FunctionType *FTy = llvm::FunctionType::get(VoidTy, false);
+ llvm::InlineAsm *IA =
+ llvm::InlineAsm::get(FTy, "brk #0xF000", "", /*SideEffects=*/true);
+ llvm::CallInst *CI = Builder.CreateCall(IA);
+ return RValue::get(CI);
+ }
+ }
+ }
case Builtin::BI__builtin_unreachable: {
EmitUnreachable(E->getExprLoc());
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D63617.205872.patch
Type: text/x-patch
Size: 1692 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190620/0ee3eaf6/attachment.bin>
More information about the cfe-commits
mailing list