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()); 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{{.*}} }