aboutsummaryrefslogtreecommitdiff
path: root/lldb/include
AgeCommit message (Collapse)AuthorFilesLines
2026-01-12[lldb] Change SBSymbol::GetID() to return LLDB_INVALID_SYMBOL_ID for invalid ↵Ebuka Ezike3-3/+5
symbols (#175545) Return UINT32_MAX instead of 0 when SBSymbol has no underlying symbol, since 0 is a valid symbol ID. This makes it possible to distinguish between a valid symbol with ID 0 and an invalid/uninitialised symbol. From https://github.com/llvm/llvm-project/pull/172687#discussion_r2628319927
2026-01-10[lldb-dap] Add clipboard context support (#170644)Sergei Druzhkov1-0/+3
This patch introduces support for `clipboard` context from [DAP](https://microsoft.github.io/debug-adapter-protocol/specification#Types_Capabilities). This feature is very useful when you want to copy all nested values from a structure or a container instead of a summary (e.g. `size = 3` for vector). I added new short mode for description generation to reduce output verbosity, which is particularly useful for primitive types.
2026-01-08[NFC][lldb][windows] extract the InitializeProcThreadAttributeList logic ↵Charles Zablit1-0/+46
(#175016)
2026-01-08[lldb][Format] Reject recursive format entities (#174750)Michael Buch1-0/+20
Depends on: * https://github.com/llvm/llvm-project/pull/174618 If a format entity calls back into `Format` and passes it a format entity type that we're already in the process of parsing, we are likely going to run into infinite recursion and blow the stack. I think this is only an issue when a format entity calls Format on a format string provided by the user (otherwise we're in control of the recursion). An example of this can be seen in the test-case adjusted by this patch. This seems to be causing actual crashes in the field, so this patch adds basic tracking to `Formatter::Format` that checks whether we're recursively parsing the same entity. This may very well be intended by some entities (e.g., `Root` and `Scope`), so there is an escape hatch for those. There's also a special case where `Variable` causes a recursive format (which I pointed out in a source comment). We could narrow the scope of what kind of recursion is allowed by adding a `UserProvidedFormatChild` (or similar) flag to `Entry`, and only disallow recursing on those kinds of entries. For now I just use an exemption list in `IsInvalidRecursiveFormat`. Adding a unit-test for this is unfortunately tricky because the only format entity that currently suffers from this is `${function.name-with-args}`, which requires a language plugin and valid target. If we really wanted to we could probably mock all of those, but the shell test provides test coverage for the previously crashing case. rdar://166890120
2026-01-07[LLDB] Add type casting to DIL, part 2 or 3 (#170332)cmtice2-3/+19
This PR implements the actual type casting part. With this, type casting to builtin types should work. The third PR, which will be put up after this one is merged, will expand the type name parsing to allow casting to user-defined types.
2026-01-07[lldb][Format] Introduce a `FormatEntity::Formatter` class and move the ↵Michael Buch1-8/+25
`Format` API into it (#174618) This patch creates a new `FormatEntity::Formatter` class and moves `FormatEntity::Format` (and related APIs) into it. Most of the parameters to `Format` are immutable across all recursive calls, so I made them `const` member variables of `Formatter`. The main changes are just mechanical renaming of: ``` FormatEntity::Format(...) ``` to ``` FormatEntity::Formatter(...).Format(stream, entry, valobj) ``` and making use of the member variables from inside `Format`. We can probably make most of the parameters to the `Formatter` constructor defaulted, but I chose not to in this patch to keep the diff smaller. The motivation for this is that I'm planning on adding logic to detect recursive format entities (which would crash LLDB). That requires some state, which in my opinion is best kept inside the `Formatter` class instead of another parameter to `Format`. The patch should be entirely NFC.
2026-01-03[lldb] Avoid unnecessary vector copy for StringList::AppendList (#173779)Henry1-1/+1
2025-12-23[lldb][NFC] Assert ASTNodeUPs and pass ASTNodes by reference in DIL (#173240)Ilia Kuklin2-49/+49
1. Every `ASTNodeUP` is asserted before being used in creating another `ASTNodeUP`. 2. Removed returning `nullptr` in `ParseIntegerLiteral` and `ParseFloatingPointLiteral` to avoid confusion. 3. All `ASTNodes` are now passed by reference instead of pointer.
2025-12-22[lldb] Add ReadCStrings API to Process (#172026)Felipe de Azevedo Piovezan1-0/+3
This commit uses Process::ReadMemoryRanges to create an efficient method for reading multiple strings at once. This method works like the single-string version, reading 256 bytes at a time, but instead doing it for _every_ string requested at the same time.
2025-12-19[lldb][API] Make SB-API functions const if possible. (#172687)Ebuka Ezike7-10/+10
Only applied to functions that were added after 22.x tag.
2025-12-18[lldb] Add priority support to synthetic frame providers (#172848)Med Ismail Bennani2-0/+37
This patch adds `get_priority()` support to synthetic frame providers to enable priority-based selection when multiple providers match a thread. This is the first step toward supporting frame provider chaining for visualizing coroutines, Swift async tasks, and et al. Priority ordering follows Unix nice convention where lower numbers indicate higher priority (0 = highest). Providers without explicit priority return `std::nullopt`, which maps to UINT32_MAX (lowest priority), ensuring backward compatibility with existing providers. The implementation adds `GetPriority()` as a virtual method to `SyntheticFrameProvider` base class, implements it through the scripting interface hierarchy (`ScriptedFrameProviderInterface` and `ScriptedFrameProviderPythonInterface`), and updates `Thread::GetStackFrameList()` to sort applicable providers by priority before attempting to load them. Python frame providers can now specify priority: ```python @staticmethod def get_priority(): return 10 # Or return None for default priority. ``` Signed-off-by: Med Ismail Bennani <ismail@bennani.ma>
2025-12-18[lldb] Use AST nodes as Subscript and BitExtraction arguments in DIL (#169363)Ilia Kuklin3-13/+19
Use AST nodes as Subscript and BitExtraction arguments instead of bare integers. This enables using any supported expression as an array or bit index.
2025-12-18[lldb][windows] add Windows Virtual Console support (#168729)Charles Zablit3-2/+101
2025-12-17Revert "Make result variables obey their dynamic values in subsequent ↵Dave Lee1-45/+19
expressions (#168611)" (#172780) [Green Dragon's lldb incremental tests (x86_64)](https://green.lab.llvm.org/job/llvm.org/view/LLDB/job/lldb-cmake/) are failing beginning with https://github.com/llvm/llvm-project/pull/168611. This commit reverts that change. If the job continues to fail after committing this revert, then I will recommit the original. rdar://166741668 This reverts commit 6344e3aa8106dfdfb30cac36c8ca02bc4c52ce24.
2025-12-17[lldb][NFCI] Remove unused field in BreakpointResolverName (#172574)Alex Langford1-1/+0
2025-12-17[lldb][ObjC][NFCI] Replace StringLexer with llvm::StringRef (#172466)Michael Buch2-67/+7
We had a dedicated `StringLexer` class that pretty much just replicates the `llvm::StringRef` interface. This patch removes the `StringLexer` in favour of just using `llvm::StringRef`. Much of the string parsing can be cleaned up, but I tried to keep the changes a small as possible so just kept the logic and replaced the APIs calls. The only awkward side-effect of this is that we have to pass a `llvm::StringRef &` around. There were some gaps in the API, so added two helper methods to consume/pop off characters from the front of the StringRef (maybe those can be added to `llvm::StringRef` in the future). The `StringLexer` also had a roll-back mechanism used in two places. That can be handled by just saving a copy of the `StringRef`.
2025-12-15[lldb][NFCI] Make LookupInfo const (#171901)Alex Langford1-11/+13
Instead of changing an existing LookupInfo after creation, let's make them constant.
2025-12-15[NFC][lldb] fix PseudoTerminal documentation (#172318)Charles Zablit1-10/+10
This NFC patch improves removes documentation references to methods that have been removed in the PseudoTerminal class and adds some `\see` references.
2025-12-13[lldb] Add unit tests for NonNullSharedPtr (#172173)Jonas Devlieghere1-0/+1
I was investigating a crash yesterday that implicated NonNullSharedPtr which made me realize I didn't add unit tests for my new class.
2025-12-12[lldb] improve the heuristics for checking if a terminal supports Unicode ↵Charles Zablit2-1/+30
(#171832) This patch improves the way lldb checks if the terminal it's opened in (if any) supports Unicode or not. On POSIX systems, we check if `LANG` contains `UTF-8`. On Windows, we always return `true` since we use the `WriteToConsoleW` api. This is a relanding of https://github.com/llvm/llvm-project/pull/168603. The tests failed because the bots support Unicode but the tests expect ASCII. To avoid different outputs depending on the environment the tests are running in, this patch always force ASCII in the tests.
2025-12-11Make result variables obey their dynamic values in subsequent expressions ↵jimingham1-19/+45
(#168611) When you run an expression and the result has a dynamic type that is different from the expression's static result type, we print the result variable using the dynamic type, but at present when you use the result variable in an expression later on, we only give you access to the static type. For instance: ``` (lldb) expr MakeADerivedReportABase() (Derived *) $0 = 0x00000001007e93e0 (lldb) expr $0->method_from_derived() ^ error: no member named 'method_from_derived' in 'Base' (lldb) ``` The static return type of that function is `Base *`, but we printed that the result was a `Derived *` and then only used the `Base *` part of it in subsequent expressions. That's not very helpful, and forces you to guess and then cast the result types to their dynamic type in order to be able to access the full type you were returned, which is inconvenient. This patch makes lldb retain the dynamic type of the result variable (and ditto for persistent result variables). It also adds more testing of expression result variables with various types of dynamic values, to ensure we can access both the ivars and methods of the type we print the result as.
2025-12-11[lldb][NFC] Change ObjectFile argument type (#171574)Jason Molenda5-21/+35
The ObjectFile plugin interface accepts an optional DataBufferSP argument. If the caller has the contents of the binary, it can provide this in that DataBufferSP. The ObjectFile subclasses in their CreateInstance methods will fill in the DataBufferSP with the actual binary contents if it is not set. ObjectFile base class creates an ivar DataExtractor from the DataBufferSP passed in. My next patch will be a caller that creates a VirtualDataExtractor with the binary data, and needs to pass that in to the ObjectFile plugin, instead of the bag-of-bytes DataBufferSP. It builds on the previous patch changing ObjectFile's ivar from DataExtractor to DataExtractorSP so I could pass in a subclass in the shared ptr. And it will be using the VirtualDataExtractor that Jonas added in https://github.com/llvm/llvm-project/pull/168802 No behavior is changed by the patch; we're simply moving the creation of the DataExtractor to the caller, instead of a DataBuffer that is immediately used to set up the ObjectFile DataExtractor. The patch is a bit complicated because all of the ObjectFile subclasses have to initialize their DataExtractor to pass in to the base class. I ran the testsuite on macOS and on AArch64 Ubutnu. (btw David, I ran it under qemu on my M4 mac with SME-no-SVE again, Ubuntu 25.10, checked lshw(1) cpu capabilities, and qemu doesn't seem to be virtualizing the SME, that explains why the testsuite passes) rdar://148939795 --------- Co-authored-by: Jonas Devlieghere <jonas@devlieghere.com>
2025-12-11[lldb] Correct use_editline check in IOHandlerEditline (#171733)Jonas Devlieghere1-1/+4
Correct the use_editline check in IOHandlerEditline to prevent a crash when we have an output and/or error file, but no stream. This fixes a regression introduced by 58279d1 that results in a crash when calling el_init with a NULL stream. The original code was checking the stream: GetOutputFILE and GetErrorFILE. ``` use_editline = GetInputFILE() && GetOutputFILE() && GetErrorFILE() && m_input_sp && m_input_sp->GetIsRealTerminal(); ``` The new code is checking the file: `m_output_sp` and `m_error_sp`. ``` use_editline = m_input_sp && m_output_sp && m_error_sp && m_input_sp->GetIsRealTerminal(); ``` The correct check is: ``` use_editline = m_input_sp && m_input_sp->GetIsRealTerminal() && m_output_sp && m_output_sp->GetUnlockedFile().GetStream() && m_error_sp && m_error_sp->GetUnlockedFile().GetStream(); ``` We don't need to update the check for the input, because we're handling the missing stream there correctly in the call to the constructor: ``` m_editline_up = std::make_unique<Editline>( editline_name, m_input_sp ? m_input_sp->GetStream() : nullptr, m_output_sp, m_error_sp, m_color); ``` We can't do the same for the output and error because we need to pass the file, not the stream (to do proper locking). As I was debugging this I added some more assertions. They're generally useful so I'm keeping them. Fixes #170891
2025-12-11Revert "[lldb] fix failing tests due to CI diagnostics rendering (#171791)Charles Zablit2-30/+1
2025-12-10[lldb] improve the heuristics for checking if a terminal supports Unicode ↵Charles Zablit2-1/+30
(#171491)
2025-12-10[lldb] Document the behaviour of IsValid for SBError (#170862)David Spickett1-0/+9
This reverts commit d20d84fec5945fcc16aa6f63879e1458d4af9ea6. Fixes #169788, but in a different way. In which I changed an SBError use so that when the function succeeded, IsValid on the SBError would be true. This seemed to make sense but SBError acts differently to other SB classes in this respect. For something like SBMemoryRegionInfo, if IsValid() is false, you can't do anything with it. However for SBError, IsValid() true only means there's some underlying error object in there. If the SBError represents a success, there's no need to put anything in there. You can see this intent from a lot of its methods, many have handling for IsValid() false. This is not a bug but a misunderstanding of what IsValid means. Yes it does function the way I expected for most classes, but it does not for SBError and though that's not intuitive, it is consistent with how we describe IsValid in the documentation. So instead of changing that method's use of SBError I'm documenting this initially counterintuitive behaviour in the SBError header and on the website (https://lldb.llvm.org/resources/sbapi.html).
2025-12-09[lldb] Remove CommandReturnObject::AppendRawError (#171517)Jonas Devlieghere1-2/+0
Remove `CommandReturnObject::AppendRawError` and replace its two uses with `AppendError`, which correctly prefixes the message with `error:`. The comment for the method is outdated and the prefixing is clearly desired in both situations.
2025-12-08[lldb] Dump build configuration with `version -v` (#170772)Jonas Devlieghere1-0/+3
Add a verbose option to the version command and include the "build configuration" in the command output. This allows users to quickly identify if their version of LLDB was built with support for xml/curl/python/lua etc. This data is already available through the SB API using SBDebugger::GetBuildConfiguration, but this makes it more discoverable. ``` (lldb) version -v lldb version 22.0.0git (git@github.com:llvm/llvm-project.git revision 21a2aac5e5456f9181384406f3b3fcad621a7076) clang revision 21a2aac5e5456f9181384406f3b3fcad621a7076 llvm revision 21a2aac5e5456f9181384406f3b3fcad621a7076 editline_wchar: yes lzma: yes curses: yes editline: yes fbsdvmcore: yes xml: yes lua: yes python: yes targets: [AArch64, AMDGPU, ARM, AVR, BPF, Hexagon, Lanai, LoongArch, Mips, MSP430, NVPTX, PowerPC, RISCV, Sparc, SPIRV, SystemZ, VE, WebAssembly, X86, XCore] curl: yes ``` Resolves #170727
2025-12-08[lldb][NFC] Replace const std::vector& with ArrayRef in APIs (#170834)Felipe de Azevedo Piovezan2-22/+4
Inside the LLVM codebase, const vector& should just be ArrayRef, as this more general API works both with vectors, SmallVectors and SmallVectorImpl, as well as with single elements. This commit replaces two uses introduced in https://github.com/llvm/llvm-project/pull/168797 .
2025-12-05[lldb] Add support for PC-less scripted frames (#170805)Med Ismail Bennani1-0/+1
Scripted frames that materialize Python functions or other non-native code are PC-less by design, meaning they don't have valid program counter values. Previously, these frames would display invalid addresses (`0xffffffffffffffff`) in backtrace output. This patch updates `FormatEntity` to detect and suppress invalid address display for PC-less frames, adds fallback to frame methods when symbol context is unavailable, and modifies `StackFrame::GetSymbolContext` to skip PC-based symbol resolution for invalid addresses. The changes enable PC-less frames to display cleanly with proper function names, file paths, and line numbers, and allow for source display of foreign sources (like Python). Includes comprehensive test coverage demonstrating frames pointing to Python source files. Signed-off-by: Med Ismail Bennani <ismail@bennani.ma>
2025-12-05[lldb][NFCI] Remove FileAction::GetPath (#170764)Alex Langford1-2/+0
This method puts strings into the ConstString pool and vends them as llvm::StringRefs. Most of the uses only require a `std::string` or a `const char *`. This can be achieved without wasting memory.
2025-12-04Add a `breakpoint add` command to fix the option-madness that is `breakpoint ↵jimingham4-0/+47
set` (#156067) Someone came up with a clever idea for a new breakpoint type, but we couldn't figure out how to add it in an ergonomic way because `breakpoint set` has used up all the short-option characters. And even if they did find a way to add it, the help for `break set` is so confusing - because of the way it is implemented - that very few people would detect the addition. The basic problem is that `break set` distinguishes amongst the fundamental breakpoint types it offers by which "required option" you provide. If you pass a `-a` you are setting an address breakpoint, if `-n`, `-F`, etc. a symbol name based breakpoint. And so forth. That is however pretty hard to discern from the option grouping printing from `help break set`. `break set` also suffers from the problem that it uses common options in different ways depending on which "required" option is present, which makes documenting the various behaviors difficult. And as we run out of single letters it makes extending it difficult to impossible. This PR fixes that situation by adding a new command for adding breakpoints - `break add`. The new command specifies the "breakpoint types" as subcommands of `break add` rather than distinguishing them by their being one of the "required" options the way `break set` does. That both makes it much clearer what the breakpoint types actually are, and means that the option set can be dedicated to that particular breakpoint type, and so the help for each is less cluttered, and can be documented properly for each usage. Instead of trying to parse the meaning of: ``` (lldb) help break set Sets a breakpoint or set of breakpoints in the executable. Syntax: breakpoint set <cmd-options> Command Options Usage: breakpoint set [-DHd] -l <linenum> [-G <boolean>] [-C <command>] [-c <expr>] [-Y <source-language>] [-i <count>] [-o <boolean>] [-q <queue-name>] [-t <thread-id>] [-x <thread-index>] [-T <thread-name>] [-R <address>] [-N <breakpoint-name>] [-u <column>] [-f <filename>] [-m <boolean>] [-s <shlib-name>] [-K <boolean>] breakpoint set [-DHd] -a <address-expression> [-G <boolean>] [-C <command>] [-c <expr>] [-Y <source-language>] [-i <count>] [-o <boolean>] [-q <queue-name>] [-t <thread-id>] [-x <thread-index>] [-T <thread-name>] [-N <breakpoint-name>] [-s <shlib-name>] breakpoint set [-DHd] -n <function-name> [-G <boolean>] [-C <command>] [-c <expr>] [-Y <source-language>] [-i <count>] [-o <boolean>] [-q <queue-name>] [-t <thread-id>] [-x <thread-index>] [-T <thread-name>] [-R <address>] [-N <breakpoint-name>] [-f <filename>] [-L <source-language>] [-s <shlib-name>] [-K <boolean>] breakpoint set [-DHd] -F <fullname> [-G <boolean>] [-C <command>] [-c <expr>] [-Y <source-language>] [-i <count>] [-o <boolean>] [-q <queue-name>] [-t <thread-id>] [-x <thread-index>] [-T <thread-name>] [-R <address>] [-N <breakpoint-name>] [-f <filename>] [-L <source-language>] [-s <shlib-name>] [-K <boolean>] breakpoint set [-DHd] -S <selector> [-G <boolean>] [-C <command>] [-c <expr>] [-Y <source-language>] [-i <count>] [-o <boolean>] [-q <queue-name>] [-t <thread-id>] [-x <thread-index>] [-T <thread-name>] [-R <address>] [-N <breakpoint-name>] [-f <filename>] [-L <source-language>] [-s <shlib-name>] [-K <boolean>] breakpoint set [-DHd] -M <method> [-G <boolean>] [-C <command>] [-c <expr>] [-Y <source-language>] [-i <count>] [-o <boolean>] [-q <queue-name>] [-t <thread-id>] [-x <thread-index>] [-T <thread-name>] [-R <address>] [-N <breakpoint-name>] [-f <filename>] [-L <source-language>] [-s <shlib-name>] [-K <boolean>] breakpoint set [-DHd] -r <regular-expression> [-G <boolean>] [-C <command>] [-c <expr>] [-Y <source-language>] [-i <count>] [-o <boolean>] [-q <queue-name>] [-t <thread-id>] [-x <thread-index>] [-T <thread-name>] [-R <address>] [-N <breakpoint-name>] [-f <filename>] [-L <source-language>] [-s <shlib-name>] [-K <boolean>] breakpoint set [-DHd] -b <function-name> [-G <boolean>] [-C <command>] [-c <expr>] [-Y <source-language>] [-i <count>] [-o <boolean>] [-q <queue-name>] [-t <thread-id>] [-x <thread-index>] [-T <thread-name>] [-R <address>] [-N <breakpoint-name>] [-f <filename>] [-L <source-language>] [-s <shlib-name>] [-K <boolean>] breakpoint set [-ADHd] -p <regular-expression> [-G <boolean>] [-C <command>] [-c <expr>] [-Y <source-language>] [-i <count>] [-o <boolean>] [-q <queue-name>] [-t <thread-id>] [-x <thread-index>] [-T <thread-name>] [-N <breakpoint-name>] [-f <filename>] [-m <boolean>] [-s <shlib-name>] [-X <function-name>] breakpoint set [-DHd] -E <source-language> [-G <boolean>] [-C <command>] [-c <expr>] [-Y <source-language>] [-i <count>] [-o <boolean>] [-q <queue-name>] [-t <thread-id>] [-x <thread-index>] [-T <thread-name>] [-N <breakpoint-name>] [-h <boolean>] [-w <boolean>] breakpoint set [-DHd] -P <python-class> [-k <none>] [-v <none>] [-G <boolean>] [-C <command>] [-c <expr>] [-Y <source-language>] [-i <count>] [-o <boolean>] [-q <queue-name>] [-t <thread-id>] [-x <thread-index>] [-T <thread-name>] [-N <breakpoint-name>] [-f <filename>] [-s <shlib-name>] breakpoint set [-DHd] -y <linespec> [-G <boolean>] [-C <command>] [-c <expr>] [-Y <source-language>] [-i <count>] [-o <boolean>] [-q <queue-name>] [-t <thread-id>] [-x <thread-index>] [-T <thread-name>] [-R <address>] [-N <breakpoint-name>] [-m <boolean>] [-s <shlib-name>] [-K <boolean>] ``` We instead offer: ``` (lldb) help break add Commands to add breakpoints of various types Syntax: breakpoint add Access the breakpoint search kernels built into lldb. Along with specifying the search kernel, each breakpoint add operation can specify a common set of "reaction" options for each breakpoint. The reaction options can also be modified after breakpoint creation using the "breakpoint modify" command. The following subcommands are supported: address -- Add breakpoints by raw address exception -- Add breakpoints on language exceptions. If no language is specified, break on exceptions for all supported languages file -- Add breakpoints on lines in specified source files name -- Add breakpoints matching function or symbol names pattern -- Add breakpoints matching patterns in the source text Expects 'raw' input (see 'help raw-input'.) scripted -- Add breakpoints using a scripted breakpoint resolver. For more help on any particular subcommand, type 'help <command> <subcommand>'. ``` The individual subcommand helps are also easier to read. They are still a little too verbose because they all repeat the options for the `reactions`. A general fix for our help system would be when a command incorporates an OptionGroup whole into the command options, help would show the option group name - which you could separately look up. But even without that: ``` (lldb) help br a a Add breakpoints by raw address Syntax: breakpoint add address <cmd-options> <address> [<address> [...]] Command Options Usage: breakpoint add address [-DHde] [-G <boolean>] [-C <command>] [-c <expr>] [-Y <source-language>] [-i <count>] [-o <boolean>] [-q <queue-name>] [-t <thread-id>] [-x <thread-index>] [-T <thread-name>] [-N <breakpoint-name>] [-s <shlib-name>] <address> [<address> [...]] -C <command> ( --command <command> ) A command to run when the breakpoint is hit, can be provided more than once, the commands will be run in left-to-right order. -D ( --dummy-breakpoints ) Act on Dummy breakpoints - i.e. breakpoints set before a file is provided, which prime new targets. -G <boolean> ( --auto-continue <boolean> ) The breakpoint will auto-continue after running its commands. -H ( --hardware ) Require the breakpoint to use hardware breakpoints. -N <breakpoint-name> ( --breakpoint-name <breakpoint-name> ) Adds this name to the list of names for this breakpoint. Can be specified more than once. -T <thread-name> ( --thread-name <thread-name> ) The breakpoint stops only for the thread whose thread name matches this argument. -Y <source-language> ( --condition-language <source-language> ) Specifies the Language to use when executing the breakpoint's condition expression. -c <expr> ( --condition <expr> ) The breakpoint stops only if this condition expression evaluates to true. -d ( --disable ) Disable the breakpoint. -e ( --enable ) Enable the breakpoint. -i <count> ( --ignore-count <count> ) Set the number of times this breakpoint is skipped before stopping. -o <boolean> ( --one-shot <boolean> ) The breakpoint is deleted the first time it stop causes a stop. -q <queue-name> ( --queue-name <queue-name> ) The breakpoint stops only for threads in the queue whose name is given by this argument. -s <shlib-name> ( --shlib <shlib-name> ) Set the breakpoint at an address relative to sections in this shared library. -t <thread-id> ( --thread-id <thread-id> ) The breakpoint stops only for the thread whose TID matches this argument. The token 'current' resolves to the current thread's ID. -x <thread-index> ( --thread-index <thread-index> ) The breakpoint stops only for the thread whose index matches this argument. This command takes options and free-form arguments. If your arguments resemble option specifiers (i.e., they start with a - or --), you must use ' -- ' between the end of the command options and the beginning of the arguments. ``` is pretty readable.
2025-12-04[lldb] [disassembler] chore: enhance VariableAnnotator to return structured ↵n2h91-7/+23
data: introduce VariableAnnotator::AnnotateStructured method (#169408) ## Description Contribution to this topic [Rich Disassembler for LLDB](https://discourse.llvm.org/t/rich-disassembler-for-lldb/76952), this part. ``` The rich disassembler output should be exposed as structured data and made available through LLDB’s scripting API so more tooling could be built on top of this ``` ---- This pr introduces new method `AnnotateStructured` in `VariableAnnotator` class, which returns the result as a vector of `VariableAnnotation` structured data, compared to original `Annotate`. Additionally structured data is enhanced with information inferred from `DWARFExpressionEntry` and variable declaration data. I have moved this part of functionality form a bigger pr https://github.com/llvm/llvm-project/pull/165163 to make it easier to review, deliver smaller chunk faster in an incremental way. ## Testing Run test with ```sh ./build/bin/lldb-dotest -v -p TestVariableAnnotationsDisassembler.py lldb/test/API/functionalities/disassembler-variables ``` all tests (9 existing) are passing. <details> <summary>screenshot 2025-11-24</summary> <img width="1344" height="875" alt="screenshot" src="https://github.com/user-attachments/assets/863e0fca-1e3e-43dc-bfa3-4b78ce287ae6" /> </details> <details> <summary>screenshot 2025-11-26</summary> <img width="1851" height="865" alt="image" src="https://github.com/user-attachments/assets/d47dacee-a679-4a49-ab22-efb5a16fe29c" /> </details> <details> <summary>screenshot 2025-12-03</summary> <img width="1592" height="922" alt="Screenshot From 2025-12-03 22-11-30" src="https://github.com/user-attachments/assets/957ded3d-bea1-43d0-8241-d342dfc2c7b0" /> </details> --------- Signed-off-by: Nikita B <n2h9z4@gmail.com> Co-authored-by: Jonas Devlieghere <jonas@devlieghere.com>
2025-12-04[lldb] Add support for synthetic LineEntry objects without valid address ↵Med Ismail Bennani1-0/+4
ranges (#158811) Scripted frames that materialize Python functions are PC-less by design, meaning they don't have valid address ranges. Previously, LineEntry::IsValid() required both a valid address range and a line number, preventing scripted frames from creating valid line entries for these synthetic stack frames. Relaxing this requirement is necessary since `SBSymbolContext::SetLineEntry` will first check if the LineEntry is valid and discard it otherwise. This change introduces an `synthetic` flag that gets set when LineEntry objects are created or modified through the SBAPI (specifically via SetLine). When this flag is set, IsValid() no longer requires a valid address range, only a valid line number. This is risk-free because the flag is only set for LineEntry objects created through the SBAPI, which are primarily used by scripted processes and frames. Regular debug information-derived line entries continue to require valid address ranges. Signed-off-by: Med Ismail Bennani <ismail@bennani.ma>
2025-12-04Revert "[lldb] improve the heuristics for checking if a terminal supports ↵Charles Zablit1-12/+0
Unicode (#168603) (#170711) This reverts commit 64e19916f9518709562ef41e236c1dba6c421782. https://github.com/llvm/llvm-project/pull/168603 breaks the CI because the bots support Unicode but the tests expect non Unicode characters.
2025-12-04[lldb] improve the heuristics for checking if a terminal supports Unicode ↵Charles Zablit1-0/+12
(#168603) This patch improves the way lldb checks if the terminal it's opened in (if any) supports Unicode or not. On POSIX systems, we check if `LANG` contains `UTF-8`. On Windows, we always return `true` since we use the `WriteToConsoleW` api.
2025-12-03[lldb] Refactor LookupInfo object to be per-language (#168797)Augusto Noronha3-2/+54
Some months ago, the LookupInfo constructor logic was refactored to not depend on language specific logic, and use languages plugins instead. In this refactor, when the language type is unknown, a single LookupInfo object will handle multiple languages. This doesn't work well, as multiple languages might want to configure the LookupInfo object in different ways. For example, different languages might want to set the m_lookup_name differently from each other, but the previous implementation would pick the first name a language provided, and effectively ignored every other language. Other fields of the LookupInfo object are also configured in incompatible ways. This approach doesn't seem to be a problem upstream, since only the C++/Objective-C language plugins are available, but it broke downstream on the Swift fork, as adding Swift to the list of default languages when the language type is unknown breaks C++ tests. This patch makes it so instead of building a single LookupInfo object for multiple languages, one LookupInfo object is built per language instead. rdar://159531216
2025-12-03[LLDB] Fix deadlock in module callback when running in parallel (#168425)Jacob Lalonde1-0/+5
When the target is being created, the target list acquires the mutex for the duration of the target creation process. However if a module callback is enabled and is being called in parallel there exists an opportunity to deadlock if the callback calls into targetlist. I've created a minimum repro [here](https://gist.github.com/Jlalond/2557e06fa09825f338eca08b1d21884f). ``` command script import dead-lock-example (from above gist) ... target create a.out [hangs] ``` This looks like a straight forward fix, where `CreateTargetInternal` doesn't access any state directly, and instead calls methods which they themselves are thread-safe. So I've moved the lock to when we update the list with the created target. I'm not sure if this is a comprehensive fix, but it does fix my above example and in my (albeit limited) testing, doesn't cause any strange change in behavior.
2025-12-03[NFC][lldb][windows] refactor the creation of inherited handles (#170301)Charles Zablit1-0/+31
Co-authored-by: Saleem Abdulrasool <compnerd@compnerd.org>
2025-12-03[lldb] Fix ThreadPlanStepOut::DoPlanExplainsStop inspection of ↵Felipe de Azevedo Piovezan1-0/+4
BreakpointSite (#169799) Suppose two threads are performing the exact same step out plan. They will both have an internal breakpoint set at their parent frame. Now supposed both of those breakpoints are in the same address (i.e. the same BreakpointSite). At the end of `ThreadPlanStepOut::DoPlanExplainsStop`, we see this: ``` // If there was only one owner, then we're done. But if we also hit // some user breakpoint on our way out, we should mark ourselves as // done, but also not claim to explain the stop, since it is more // important to report the user breakpoint than the step out // completion. if (site_sp->GetNumberOfConstituents() == 1) return true; ``` In other words, the plan looks at the name number of constituents of the site to decide whether it explains the stop, the logic being that a _user_ might have put a breakpoint there. However, the implementation is not correct; in particular, it will fail in the situation described above. We should only care about non-internal breakpoints that would stop for the current thread. It is tricky to test this, as it depends on the timing of threads, but I was able to consistently reproduce the issue with a swift program using concurrency. rdar://165481473
2025-12-03[lldb] Add DisassemblerLLVMC::IsBarrier API (#169632)Felipe de Azevedo Piovezan1-0/+4
This will allow the instruction emulation unwinder to reason about instructions that prevent the subsequent instruction from executing. Part of a sequence of PRs: [lldb][NFCI] Rewrite UnwindAssemblyInstEmulation in terms of a CFG visit #169630 [lldb][NFC] Rename forward_branch_offset to branch_offset in UnwindAssemblyInstEmulation #169631 [lldb] Add DisassemblerLLVMC::IsBarrier API #169632 [lldb] Handle backwards branches in UnwindAssemblyInstEmulation #169633 commit-id:bb5df4aa
2025-12-02[lldb] Fix Doxygen warning in SBTrace.h (#170394)Zachary Fogg1-1/+1
Remove errant `\a` command before `<directory>` in `SaveToDisk` documentation. The `\a` Doxygen command expects a word argument, but `<directory>` starts with `<` which Doxygen interprets as HTML. This fixes: ``` llvm-project/lldb/include/lldb/API/SBTrace.h:60: Warning 564: Error parsing Doxygen command a: No word followed the command. Command ignored. ```
2025-12-02Reland "[lldb] Introduce ScriptedFrameProvider for real threads (#161870)" ↵Med Ismail Bennani13-13/+190
(#170236) This patch re-lands #161870 with fixes to the previous test failures. rdar://161834688 Signed-off-by: Med Ismail Bennani <ismail@bennani.ma>
2025-12-02[lldb/Target] Add BorrowedStackFrame and make StackFrame methods virtual ↵Med Ismail Bennani3-35/+193
(#170191) This change makes StackFrame methods virtual to enable subclass overrides and introduces BorrowedStackFrame, a wrapper that presents an existing StackFrame with a different frame index. This enables creating synthetic frame views or renumbering frames without copying the underlying frame data, which is useful for frame manipulation scenarios. This also adds a new borrowed-info format entity to show what was the original frame index of the borrowed frame. Signed-off-by: Med Ismail Bennani <ismail@bennani.ma>
2025-12-02[lldb] Fix GetExpressionPath for vector registers (#169210)Ebuka Ezike1-0/+5
Vector registers have synthetic values for display purposes. This causes SBValue::GetExpressionPath to dispatch to ValueObjectSynthetic instead of ValueObjectRegister, producing incorrect results. Fixes #147144
2025-12-01[LLDB] Add type casting to DIL, part 1 of 3. (#165199)cmtice3-0/+40
This is an alternative to https://github.com/llvm/llvm-project/pull/159500, breaking that PR down into three separate PRs, to make it easier to review. This first PR of the three adds the basic framework for doing type casing to the DIL code, but it does not actually do any casting: In this PR the DIL parser only recognizes builtin type names, and the DIL interpreter does not do anything except return the original operand (no casting). The second and third PRs will add most of the type parsing, and do the actual type casting, respectively.
2025-12-01[lldb/Target] Track containing StackFrameList to avoid circular dependencies ↵Med Ismail Bennani4-3/+28
(#170226) This change adds tracking of the StackFrameList that produced each frame by storing a weak pointer (m_frame_list_wp) in both `StackFrame` and `ExecutionContextRef`. When resolving frames through `ExecutionContextRef::GetFrameSP`, the code now first attempts to use the remembered frame list instead of immediately calling `Thread::GetStackFrameList`. This breaks circular dependencies that can occur during frame provider initialization, where creating a frame provider might trigger `ExecutionContext` resolution, which would then call back into `Thread::GetStackFrameList()`, creating an infinite loop. The `StackFrameList` now sets m_frame_list_wp on every frame it creates, and a new virtual method `GetOriginatingStackFrameList` allows frames to expose their originating list. Signed-off-by: Med Ismail Bennani <ismail@bennani.ma>
2025-12-01[BoundsSafety][LLDB] Implement instrumentation plugin for -fbounds-safety ↵Dan Liew1-0/+1
soft traps (#169117) This patch tries to upstream code landed downstream in https://github.com/swiftlang/llvm-project/pull/11835. This patch implements an instrumentation plugin for the `-fbounds-safety` soft trap mode first implemented in https://github.com/swiftlang/llvm-project/pull/11645 (rdar://158088757). That functionality isn't supported in upstream Clang yet, however the instrumented plugin can be compiled without issue so this patch tries to upstream it. The included tests are all disabled when the clang used for testing doesn't support `-fbounds-safety`. This means the tests will be skipped. However, it's fairly easy to point LLDB at a clang that does support `-fbounds-safety. I've done this and confirmed the tests pass. To use a custom clang the following can be done: * For API tests set the `LLDB_TEST_COMPILER` CMake cache variable to point to appropriate compiler. * For shell tests applying a patch like this can be used to set the appropriate compiler: ``` --- a/lldb/test/Shell/helper/toolchain.py +++ b/lldb/test/Shell/helper/toolchain.py @@ -271,6 +271,7 @@ def use_support_substitutions(config): if config.lldb_lit_tools_dir: additional_tool_dirs.append(config.lldb_lit_tools_dir) + config.environment['CLANG'] = '/path/to/clang' llvm_config.use_clang( ``` The current implementation of -fbounds-safety traps works by emitting calls to runtime functions intended to log the occurrence of a soft trap. While the user could just set a breakpoint of these functions the instrumentation plugin sets it automatically and provides several additional features: When debug info is available: * It adjusts the stop reason to be the reason for trapping. This is extracted from the artificial frame in the debug info (similar to -fbounds-safety hard traps). * It adjusts the selected frame to be the frame where the soft trap occurred. When debug info is not available: * For the `call-with-str` soft trap mode the soft trap reason is read from the first argument register. * For the `call-minimal` soft trap mode the stop reason is adjusted to note its a bounds check failure but does not give further information because none is available. * In this situation the selected frame is not adjusted because in this mode the user will be looking at assembly and adjusting the frame makes things confusing. This patch includes shell and api tests. The shell tests seemed like the best way to test behavior when debug info is missing because those tests make it easy to disable building with debug info completely. rdar://163230807
2025-12-01[lldb/ScriptInterpreter] Add a way to retrieve script module file path (#170202)Med Ismail Bennani1-0/+4
This adds a new virtual method `GetScriptedModulePath()` to `ScriptedInterface` that allows retrieving the file path of the Python module containing the scripted object implementation. The Python implementation acquires the GIL and walks through the object's `__class__.__module__` to find the module's `__file__` attribute. This will be used by ScriptedFrame to populate the module and compile unit for frames pointing to Python source files. Signed-off-by: Med Ismail Bennani <ismail@bennani.ma>
2025-12-01[lldb][NFC] Change ObjectFile's DataExtractor to a shared ptr (#170066)Jason Molenda2-3/+9
ObjectFile has an m_data DataExtractor ivar which may be default constructed initially, or initialized with a DataBuffer passed in to its ctor. If the DataExtractor does not get a DataBuffer source passed in, the subclass will initialize it with access to the object file's data. When a DataBuffer is passed in to the base class ctor, the DataExtractor only has its buffer initialized; ObjectFile doesn't yet know the address size and endianness to fully initialize the DataExtractor. This patch changes ObjectFile to instead have a DataExtractorSP ivar which is always initialized with at least a default-constructed DataExtractor object in the base class ctor. The next patch I will be writing is to change the ObjectFile ctor to take an optional DataExtractorSP, so the caller can pass a DataExtractor subclass -- the VirtualizeDataExtractor being added via https://github.com/llvm/llvm-project/pull/168802 instead of a DataBuffer which is trivially saved into the DataExtractor. The change is otherwise mechanical; all `m_data.` changed to `m_data_sp->` and all the places where `m_data` was passed in for a by-ref call were changed to `*m_data_sp.get()`. The shared pointer is always initialized to contain an object. I built & ran the testsuite on macOS and on aarch64-Ubuntu (thanks for getting the Linux testsuite to run on SME-only systems David). All of the ObjectFile subclasses I modifed compile cleanly, but I haven't tested them beyond any unit tests they may have (prob breakpad). rdar://148939795