[lldb] Step over non-lldb breakpoints (#190622) Note: this is a second attempt at 304c680 / #174348, hopefully fixing the post-commit Mac testing failures. The main differences from the previous commit are: * Fixing the incorrect masks in ArchitectureArm.cpp * Declining to step in StopInfoMachException if the PC and exception exc_sub_code don't match - implies fixup already applied * Change to reflect explicit Address constructor - I assume this is correct, essentially explicitly making a temporary Address object of the pc address in SkipOverTrapInstruction * Removing the debugserver code to step over the trap instruction as it interacts badly with this change (without the check mentioned previously). --- Several languages support some sort of "breakpoint" function, which adds ISA-specific instructions to generate an interrupt at runtime. However, on some platforms, these instructions don't increment the program counter. When LLDB sets these instructions it isn't a problem, as we remove them before continuing, then re-add them after stepping over the location. However, for breakpoint sequences that are part of the inferior process, this doesn't happen - and so users might be left unable to continue past the breakpoint without manually interfering with the program counter. This patch adds logic to LLDB to intercept SIGTRAPs, inspect the bytes of the inferior at the program counter, and if the instruction looks like a BRK or BKPT or similar, increment the pc by the size of the instruction we found. This unifies platform behaviour (e.g. on x86_64, LLDB debug sessions already look like this) and improves UX (in my opinion, but I think it beats messing with the PC every time). Some ISAs (like AArch64) require slightly different handling, as while there are multiple possible instructions, we should be careful only to find the ones likely to have been emitted by a compiler backend, and not those inserted from (for example) the UB sanitizer, or any others. There is an existing builtin-debugtrap test which was under the macos folder before. This was moved that to "functionalities", made it pure C only, and updated it a little bit so that it works regardless of platform. The corresponding Mac-specific logic has been removed, as it does not work with the new functionality, however a check has been added to check the exception address against the program counter and not step if these addresses do not match (as might happen when mixing a system debugserver and lldb as of this patch). --------- Co-authored-by: Jonas Devlieghere <jonas@devlieghere.com>
Welcome to the LLVM project!
This repository contains the source code for LLVM, a toolkit for the construction of highly optimized compilers, optimizers, and run-time environments.
The LLVM project has multiple components. The core of the project is itself called “LLVM”. This contains all of the tools, libraries, and header files needed to process intermediate representations and convert them into object files. Tools include an assembler, disassembler, bitcode analyzer, and bitcode optimizer.
C-like languages use the Clang frontend. This component compiles C, C++, Objective-C, and Objective-C++ code into LLVM bitcode -- and from there into object files, using LLVM.
Other components include: the libc++ C++ standard library, the LLD linker, and more.
Consult the Getting Started with LLVM page for information on building and running LLVM.
For information on how to contribute to the LLVM project, please take a look at the Contributing to LLVM guide.
Join the LLVM Discourse forums, Discord chat, LLVM Office Hours or Regular sync-ups.
The LLVM project has adopted a code of conduct for participants to all modes of communication within the project.