[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