AArch64: emit @llvm.debugtrap as `brk #0xf000` on all platforms
authorTim Northover <t.p.northover@gmail.com>
Fri, 17 Jul 2020 10:25:59 +0000 (11:25 +0100)
committerTim Northover <t.p.northover@gmail.com>
Mon, 20 Jul 2020 09:31:26 +0000 (10:31 +0100)
It's useful for a debugger to be able to distinguish an @llvm.debugtrap
from a (noreturn) @llvm.trap, so this extends the existing Windows
behaviour to other platforms.

llvm/lib/Target/AArch64/AArch64FastISel.cpp
llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
llvm/lib/Target/AArch64/AArch64InstrInfo.td
llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp
llvm/test/CodeGen/AArch64/debugtrap.ll [moved from llvm/test/CodeGen/AArch64/windows-trap1.ll with 65% similarity]

index 0f63f4c..f0b35c2 100644 (file)
@@ -3652,14 +3652,10 @@ bool AArch64FastISel::fastLowerIntrinsicCall(const IntrinsicInst *II) {
     BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, TII.get(AArch64::BRK))
         .addImm(1);
     return true;
-  case Intrinsic::debugtrap: {
-    if (Subtarget->isTargetWindows()) {
-      BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, TII.get(AArch64::BRK))
-          .addImm(0xF000);
-      return true;
-    }
-    break;
-  }
+  case Intrinsic::debugtrap:
+    BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, TII.get(AArch64::BRK))
+        .addImm(0xF000);
+    return true;
 
   case Intrinsic::sqrt: {
     Type *RetTy = II->getCalledFunction()->getReturnType();
index dae347c..118eb26 100644 (file)
@@ -677,8 +677,7 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
 
   // Trap.
   setOperationAction(ISD::TRAP, MVT::Other, Legal);
-  if (Subtarget->isTargetWindows())
-    setOperationAction(ISD::DEBUGTRAP, MVT::Other, Legal);
+  setOperationAction(ISD::DEBUGTRAP, MVT::Other, Legal);
 
   // We combine OR nodes for bitfield operations.
   setTargetDAGCombine(ISD::OR);
index f4a5f63..b351662 100644 (file)
@@ -6663,7 +6663,7 @@ def : Pat<(i32 (trunc GPR64sp:$src)),
 
 // __builtin_trap() uses the BRK instruction on AArch64.
 def : Pat<(trap), (BRK 1)>;
-def : Pat<(debugtrap), (BRK 0xF000)>, Requires<[IsWindows]>;
+def : Pat<(debugtrap), (BRK 0xF000)>;
 
 // Multiply high patterns which multiply the lower subvector using smull/umull
 // and the upper subvector with smull2/umull2. Then shuffle the high the high
index 408f0cb..8a6f798 100644 (file)
@@ -4633,8 +4633,6 @@ bool AArch64InstructionSelector::selectIntrinsicWithSideEffects(
     MIRBuilder.buildInstr(AArch64::BRK, {}, {}).addImm(1);
     break;
   case Intrinsic::debugtrap:
-    if (!STI.isTargetWindows())
-      return false;
     MIRBuilder.buildInstr(AArch64::BRK, {}, {}).addImm(0xF000);
     break;
   }
similarity index 65%
rename from llvm/test/CodeGen/AArch64/windows-trap1.ll
rename to llvm/test/CodeGen/AArch64/debugtrap.ll
index 6f6fa3a..ec90272 100644 (file)
@@ -1,6 +1,9 @@
 ; RUN: llc -mtriple=aarch64-windows %s -o -| FileCheck %s
 ; RUN: llc -mtriple=aarch64-windows -fast-isel %s -o - | FileCheck %s
 ; RUN: llc -mtriple=aarch64-windows -global-isel %s -o - | FileCheck %s
+; RUN: llc -mtriple=aarch64-linux-gnu %s -o -| FileCheck %s
+; RUN: llc -mtriple=arm64-apple-ios -global-isel %s -o - | FileCheck %s
+; RUN: llc -mtriple=arm64-apple-macosx -fast-isel %s -o - | FileCheck %s
 
 ; CHECK-LABEL: test1:
 ; CHECK: brk #0xf000