Skip to content

Commit

Permalink
Add core::arch::breakpoint and test
Browse files Browse the repository at this point in the history
Approved in [ACP 491](rust-lang/libs-team#491).

Remove the `unsafe` on `core::intrinsics::breakpoint()`, since it's a
safe intrinsic to call and has no prerequisites.
  • Loading branch information
joshtriplett committed Dec 2, 2024
1 parent a522d78 commit 5f8cc9a
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 3 deletions.
26 changes: 26 additions & 0 deletions library/core/src/arch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,3 +42,29 @@ pub macro naked_asm("assembly template", $(operands,)* $(options($(option),*))?)
pub macro global_asm("assembly template", $(operands,)* $(options($(option),*))?) {
/* compiler built-in */
}

/// Compiles to a target-specific software breakpoint instruction or equivalent.
///
/// This will typically abort the program. It may result in a core dump, and/or the system logging
/// debug information. Additional target-specific capabilities may be possible depending on
/// debuggers or other tooling; in particular, a debugger may be able to resume execution.
///
/// If possible, this will produce an instruction sequence that allows a debugger to resume *after*
/// the breakpoint, rather than resuming *at* the breakpoint; however, the exact behavior is
/// target-specific and debugger-specific, and not guaranteed.
///
/// If the target platform does not have any kind of debug breakpoint instruction, this may compile
/// to a trapping instruction (e.g. an undefined instruction) instead, or to some other form of
/// target-specific abort that may or may not support convenient resumption.
///
/// The precise behavior and the precise instruction generated are not guaranteed, except that in
/// normal execution with no debug tooling involved this will not continue executing.
///
/// - On x86 targets, this produces an `int3` instruction.
/// - On aarch64 targets, this produces a `brk #0xf000` instruction.
// When stabilizing this, update the comment on `core::intrinsics::breakpoint`.
#[unstable(feature = "breakpoint", issue = "133724")]
#[inline(always)]
pub fn breakpoint() {
core::intrinsics::breakpoint();
}
6 changes: 3 additions & 3 deletions library/core/src/intrinsics/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1375,13 +1375,13 @@ pub unsafe fn prefetch_write_instruction<T>(_data: *const T, _locality: i32) {
unreachable!()
}

/// Executes a breakpoint trap, for inspection by a debugger.
/// Compiles to a target-specific software breakpoint instruction or equivalent.
///
/// This intrinsic does not have a stable counterpart.
/// The (future) stabilized version of this intrinsic is [`core::arch::breakpoint`].
#[rustc_intrinsic]
#[rustc_intrinsic_must_be_overridden]
#[rustc_nounwind]
pub unsafe fn breakpoint() {
pub fn breakpoint() {
unreachable!()
}

Expand Down
16 changes: 16 additions & 0 deletions tests/assembly/breakpoint.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//@ revisions: aarch64 x86_64
//@ assembly-output: emit-asm
//@[aarch64] compile-flags: --target aarch64-unknown-linux-gnu
//@[aarch64] needs-llvm-components: aarch64
//@[x86_64] compile-flags: --target x86_64-unknown-linux-gnu -C llvm-args=-x86-asm-syntax=intel
//@[x86_64] needs-llvm-components: x86

#![feature(breakpoint)]
#![crate_type = "lib"]

// CHECK-LABEL: use_bp
// aarch64: brk #0xf000
// x86_64: int3
pub fn use_bp() {
core::arch::breakpoint();
}

0 comments on commit 5f8cc9a

Please sign in to comment.