3428 Commits

Author SHA1 Message Date
Ely Ronnen
6087854472
[lldb] skip unnamed symbol test on windows (#141212)
https://lab.llvm.org/buildbot/#/builders/141/builds/8927/steps/6/logs/stdio
2025-05-23 18:52:42 +02:00
John Harrison
7dc7c15525
[lldb] Adding a new decorator for CMAKE_BUILD_TYPE. (#141159)
In lldb-dap, we have existing tests that are known to be unstable when
lldb and lldb-dap are built in the Debug configuration.

This decorator lets us skip those tests in CI jobs that are to slow with
those configurations.

This was split out from #140777 to make the patches smaller.
2025-05-23 08:46:23 -07:00
cmtice
53d7b1d9e0
[LLDB] Add field member operators to DIL (#138093)
Add the arrow and period operators, allowing DIL to find and access
member fields.
2025-05-23 07:30:10 -07:00
Ely Ronnen
044929d075
[lldb] Change synthetic symbol names to have file address (#138416)
* Changes the default synthetic symbol names to contain their file
address

This is a new PR after the first PR (#137512) was reverted because it
didn't update the way unnamed symbols were searched in the symbol table,
which relied on the index being in the name.

This time also added extra test to make sure the symbol is found as
expected
2025-05-23 08:26:46 +02:00
Hu Jialun
695d725edf
[lldb-dap] Assorted small fixes for runInTerminal (#140908)
- `CreateRunInTerminalReverseRequest` is passed a `StringMap` by value,
whose keys are owned and deallocated after return.
- Target args are wrongly specified as reverse request (launcher) args.
- Test case error message did not catch up with a0aa5f8.

All runInTerminal tests are passing with this applied.
2025-05-22 20:20:35 -07:00
jimingham
8e3f44d68b
Fix a bug where using "thread backtrace unique" would switch you to (#140993)
always using the "frame-format-unique" even when you weren't doing the
unique backtrace mode.
2025-05-22 10:35:35 -07:00
Ilia Kuklin
5df819ffb3
Revert "[LLDB] Add array subscription and integer parsing to DIL" (#141059)
Reverts llvm/llvm-project#138551
2025-05-22 17:33:01 +05:00
Ilia Kuklin
491619a250
[LLDB] Add array subscription and integer parsing to DIL (#138551) 2025-05-22 16:15:11 +05:00
David Spickett
c82b30c134 [lldb][lldb-dap] Disable assembly breakpoint test on Windows
New test added by https://github.com/llvm/llvm-project/pull/139969.

On Windows we need debug information to be able to break on the
function (we don't need it for main, but I assume that's a special case).
So disable the test on Windows.

I tried a few tricks like making a global label in assembly, but
that doesn't show up without debug info either.
2025-05-22 09:48:31 +00:00
Pavel Labath
53a5bea0ad
[lldb] Call Target::ClearAllLoadedSections even earlier (#140228)
This reapplies https://github.com/llvm/llvm-project/pull/138892, which
was reverted in

5fb9dca14a
due to failures on windows.

Windows loads modules from the Process class, and it does that quite
early, and it kinda makes sense which is why I'm moving the clearing
code even earlier.

The original commit message was:

Minidump files contain explicit information about load addresses of
modules, so it can load them itself. This works on other platforms, but
fails on darwin because DynamicLoaderDarwin nukes the loaded module list
on initialization (which happens after the core file plugin has done its
work).

This used to work until
https://github.com/llvm/llvm-project/pull/109477, which enabled the
dynamic loader
plugins for minidump files in order to get them to provide access to
TLS.

Clearing the load list makes sense, but I think we could do it earlier
in the process, so that both Process and DynamicLoader plugins get a
chance to load modules. This patch does that by calling the function
early in the launch/attach/load core flows.

This fixes TestDynamicValue.py:test_from_core_file on darwin.
2025-05-22 08:32:11 +02:00
Jason Molenda
cea82573bb [lldb] Skip TestConsecutiveWatchpoints.py if out of tree debugserver
The GreenDragon CI bots are currently passing because the installed
Xcode is a bit old, and doesn't have the watchpoint handling
bug that was fixed April with this test being added.

But on other CI running newer Xcode debugservers, this test will
fail.  Skip this test if we're using an out of tree debugserver.
2025-05-21 17:38:35 -07:00
Ely Ronnen
e972d8cbbf
[lldb-dap] assembly breakpoints (#139969)
* Support assembly source breakpoints
* Change `sourceReference` to be the symbol load address for simplicity
and consistency across threads/frames

[Screencast From 2025-05-17
23-57-30.webm](https://github.com/user-attachments/assets/2e7c181d-42c1-4121-8f13-b180c19d0e33)
2025-05-21 21:13:32 +02:00
Ebuka Ezike
d219a71849
[lldb][lldb-dap][tests] Make sure evaluate test exists with no errors. (#140788) 2025-05-21 18:17:38 +01:00
Ely Ronnen
2ed8c27d03
add @skipIfWindows to unresolved disassemble test on windows (#140852)
Fix https://lab.llvm.org/buildbot/#/builders/141/builds/8867
2025-05-21 08:10:22 +02:00
Ely Ronnen
9d0614e77a
[lldb-dap] fix disassembly request instruction offset handling (#140486)
Fix the handling of the `instructionOffset` parameter, which resulted in
always returning the wrong disassembly because VSCode always uses
`instructionOffset = -50` and expects 50 instructions before the given
address, instead of 50 bytes before
2025-05-21 06:50:13 +02:00
Igor Kudrin
3f196e0293
[lldb][core] Fix getting summary of a variable pointing to r/o memory (#139196)
Motivation example:

```
> lldb -c altmain2.core
...
(lldb) var F
(const char *) F = 0x0804a000 ""
```

The variable `F` points to a read-only memory page not dumped to the
core file, so `Process::ReadMemory()` cannot read the data. The patch
switches to `Target::ReadMemory()`, which can read data both from the
process memory and the application binary.
2025-05-20 13:50:24 -07:00
Dave Lee
ff127624be
[lldb] Reduce max-children-count default to readable size (#139826)
Change the default from 256 to 24. The argument is that 256 is too large to be scanned
by eye, and too large to print in a terminal which can be only 40-50 lines in height.

When all children must be shown, `frame variable` and `expression` both support the `-A`
(`--show-all-children`) flag.

rdar://145327522
2025-05-20 09:34:42 -07:00
Pavel Labath
6181f4f89d
[lldb] Retcon SBValue::GetChildAtIndex(synthetic=true) (#140065)
The motivation here is being (un)able to treat pointer values as an
array consistently. This works for pointers to simple/scalar values, but
for aggregates, we get a very surprising result:
- GetChildAtIndex(x, ??, true) returns the `x` child of the zeroth array
member (the one you get by dereferencing the pointer/array) for all `x`
which are smaller than the number of children of that value.
- for other values of `x`, we get `v[x]`, where `v` is treated like a
(C) pointer

This patch reimagines this interface so that the value of `true` always
treats (pointer and array) values as pointers. For `false`, we always
dereference pointers, while in the case of arrays, we only return the
values as far as the array bounds will allow.

This has the potential to break existing code, but I have a suspicion
that code was already broken to begin with, which is why I think this
would be better than introducing a new API and keeping the old (and
surprising) behavior. If our own test coverage is any indication,
breakage should be minimal.
2025-05-20 07:44:58 +02:00
Jacob Lalonde
f27cfeae6a
[LLDB][Progress-On-Dap] Have indeterminate progress actually send events. (#140162)
Recently, I got a report how a user 'hung', and come to find out it's
actually because DAP is checking percentage, and on non-deterministic
events, we will effectively never send a progress event to DAP. Here we
short circuit and don't view percentages for DAP messages and solely
depend on the DAP 250ms throttle, which is probably still too
aggressive, but better than no updates.
2025-05-19 15:19:55 -07:00
nerix
3bae8e2ef2
[lldb] Suppport testing with debug-python on Windows (#140443)
When trying to run the LLDB API tests on Windows with a debug
configuration, they fail, because the `_lldb` module won't be found. As
explained in https://github.com/llvm/llvm-project/issues/51272, this is
because lit will run the test with `python.exe` but the module is built
for the debug version of python, `python_d.exe`.

CMake already resolved the debug executable in
`Python3_EXECUTABLE_DEBUG`, so this PR changes the
`config.python_executable` to point to `python_d.exe` on Windows in
debug mode.

The check is equivalent to the one done in the top-level LLDB CMakeLists
[when setting the python
suffix](3ccb15d6ca/lldb/CMakeLists.txt (L79-L86)).
2025-05-19 11:13:49 -07:00
John Harrison
0e0b501bf5
[lldb-dap] Take two at refactoring the startup sequence. (#140331)
This is more straight forward refactor of the startup sequence that
reverts parts of ba29e60f9a2222bd5e883579bb78db13fc5a7588. Unlike my
previous attempt, I ended up removing the pending request queue and not
including an `AsyncReqeustHandler` because I don't think we actually
need that at the moment.

The key is that during the startup flow there are 2 parallel operations
happening in the DAP that have different triggers.

* The `initialize` request is sent and once the response is received the
`launch` or `attach` is sent.
* When the `initialized` event is recieved the `setBreakpionts` and
other config requests are made followed by the `configurationDone`
event.

I moved the `initialized` event back to happen in the `PostRun` of the
`launch` or `attach` request handlers. This ensures that we have a valid
target by the time the configuration calls are made. I added also added
a few extra validations that to the `configurationeDone` handler to
ensure we're in an expected state.

I've also fixed up the tests to match the new flow. With the other
additional test fixes in 087a5d2ec7897cd99d3787820711fec76a8e1792 I
think we've narrowed down the main source of test instability that
motivated the startup sequence change.
2025-05-16 19:28:34 -07:00
John Harrison
087a5d2ec7
[lldb-dap] Adding additional asserts to unit tests. (#140107)
Adding an assert that the 'continue' request succeeds caused a number of
tests to fail. This showed a number of tests that were not specifying if
they should be stopped or not at key points in the test. This is likely
contributing to these tests being flaky since the debugger is not in the
expected state.

Additionally, I spent a little time trying to improve the readability of
the dap_server.py and lldbdap_testcase.py.
2025-05-16 08:47:01 -07:00
Pavel Labath
5fb9dca14a Revert "[lldb] Call Target::ClearAllLoadedSections earlier (#138892)"
This reverts commit 97aa01bef770ec651c86978d137933e09221dd00 and
7e7871d3f58b9da72ca180fcd7f0d2da3f92ec4a due to failures on windows.
2025-05-14 18:22:02 +02:00
Pavel Labath
97aa01bef7
[lldb] Call Target::ClearAllLoadedSections earlier (#138892)
Minidump files contain explicit information about load addresses of
modules, so it can load them itself. This works on other platforms, but
fails on darwin because DynamicLoaderDarwin nukes the loaded module list
on initialization (which happens after the core file plugin has done its
work).

This used to work until #109477, which enabled the dynamic loader
plugins for minidump files in order to get them to provide access to
TLS.

Clearing the load list makes sense, but I think we could do it earlier
in the process, so that both Process and DynamicLoader plugins get a
chance to load modules. This patch does that by calling the function
early in the launch/attach/load core flows.

This fixes TestDynamicValue.py:test_from_core_file on darwin.
2025-05-14 11:16:55 +02:00
John Harrison
1a0b82563f
[lldb-dap] Improving tests logging to understand CI failures. (#139311)
To improve logging this adjusts two properties of the existing tests:

* Forwards stderr from lldb-dap to the process in case errors are
reported to stderr.
* Adjusts `DebugAdapterServer.terminate` to close stdin and wait for the
process to exit instead of sending SIGTERM. Additionally, if we end up
with a non-zero exit status we now raise an error to note the unexpected
exit status.

With these changes, I did find one test case in
`TestDAP_console.test_diagnositcs` that was not waiting to ensure the
expected event had arrived by the time it performed an assert.
2025-05-13 21:21:43 -07:00
Jason Molenda
b8ba9636f0 [lldb] don't run TestUnwindFramelessFaulted.py on Linux
I thought I could call $(CPP) to preprocess the assembly
file, but the aarch64-ubuntu bot runs this as clang -E and
it issues a warning and no output file, apparently,

build/bin/clang -E -o interrupt-and-trap-funcs.s /home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/llvm-project/lldb/test/API/functionalities/unwind/frameless-faulted/interrupt-and-trap-funcs.s
clang: warning: /home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/llvm-project/lldb/test/API/functionalities/unwind/frameless-faulted/interrupt-and-trap-funcs.s: 'assembler' input unused [-Wunused-command-line-argument]

/home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/bin/clang -g -O0     -c -o interrupt-and-trap-funcs.o interrupt-and-trap-funcs.s
clang: error: no such file or directory: 'interrupt-and-trap-funcs.s'
clang: error: no input files
2025-05-13 18:14:57 -07:00
Jason Molenda
30b428aaa8 [lldb] try re-enabling TestUnwindFramelessFaulted.py
on Linux with a small change to the Makefile to make
preprocessing the assembly code work.
2025-05-13 17:45:03 -07:00
jimingham
952b680fd1
Support stepping through Darwin "branch islands" (#139301)
When an intra-module jump doesn't fit in the immediate branch slot, the
Darwin linker inserts "branch island" symbols, and emits code to jump
from branch island to branch island till it makes it to the actual
function.

The previous submissions failed because in that environment the linker
was putting the `foo.island` symbol at the same address as the `padding`
symbol we we emitting to make our faked-up large binary. This submission
jams a byte after the padding symbol so that the other symbols can't
overlap it.
2025-05-13 13:32:53 -07:00
Pavel Labath
91ea494993
[lldb] Move lldb_enable_attach from test_common to a separate header (#139550)
test_common is force-included into every compilation, which causes
problems when we're compiling assembly code, as we were in #138805.

This avoids that as we can include the header only when it's needed.
2025-05-13 17:52:23 +02:00
Jacques Pienaar
c78e65cc98
[lldb][plugin] Use counter directly for number of readers (#139252)
Here we were initializing & locking a shared_mutex in a thread, while
releasing it in the parent which may/often turned out to be a different
thread (shared_mutex::unlock_shared is undefined behavior if called from
a thread that doesn't hold the lock).

Switch to counter to more simply keep track of number of readers and
simply lock/unlock rather than utilizing reader mutex to verify last
freed (and so requiring this matching thread init/destroy behavior).
2025-05-13 01:52:36 -07:00
Ilia Kuklin
3aacd74594
[lldb][TypeSystemClang] Allow arrays to be dereferenced in C/C++. (#135843)
Add a function `GetDereferencedType` to `CompilerType` and allow
`TypeSystemClang` to dereference arrays.
2025-05-12 16:46:58 +05:00
Jason Molenda
48a814c711 Don't run TestUnwindFramelessFaulted.py on Linux
There's something still wrong with how it's building
the test file.
2025-05-11 23:57:53 -07:00
Jason Molenda
b957cc0c7e [lldb] Provide lr value in faulting frame on arm64 (#138805)
Re-landing this patch with small tweaks to address CI bot failures
as it was run on many different configurations.  I think the test
may run on aarch64 Linux systems now.

When a frameless function faults or is interrupted asynchronously, the
UnwindPlan MAY have no register location rule for the return address
register (lr on arm64); the value is simply live in the lr register when
it was interrupted, and the frame below this on the stack -- e.g.
sigtramp on a Unix system -- has the full register context, including
that register.

RegisterContextUnwind::SavedLocationForRegister, when asked to find the
caller's pc value, will first see if there is a pc register location. If
there isn't, on a Return Address Register architecture like
arm/mips/riscv, we rewrite the register request from "pc" to "RA
register", and search for a location.

On frame 0 (the live frame) and an interrupted frame, the UnwindPlan may
have no register location rule for the RA Reg, that is valid. A
frameless function that never calls another may simply keep the return
address in the live register the whole way. Our instruction emulation
unwind plans explicitly add a rule (see Pavel's May 2024 change
https://github.com/llvm/llvm-project/pull/91321 ), but an UnwindPlan
sourced from debug_frame may not.

I've got a case where this exactly happens - clang debug_frame for arm64
where there is no register location for the lr in a frameless function.
There is a fault in the middle of this frameless function and we only
get the lr value from the fault handler below this frame if lr has a
register location of `IsSame`, in line with Pavel's 2024 change.

Similar to how we see a request of the RA Reg from frame 0 after failing
to find an unwind location for the pc register, the same style of
special casing is needed when this is a function that was interrupted.

Without this change, we can find the pc of the frame that was executing
when it was interrupted, but we need $lr to find its caller, and we
don't descend down to the trap handler to get that value, truncating the
stack.

rdar://145614545
2025-05-11 23:39:35 -07:00
Emmanuel Ferdman
2ccfb99d81
[lldb] Fix term settings completion tests (#139447)
# PR Summary
Small PR - Several test functions for `term-width/height` completions
had identical names, causing silent overriding. This gives them distinct
_width/_height suffixes to ensure all tests run.

Signed-off-by: Emmanuel Ferdman <emmanuelferdman@gmail.com>
2025-05-11 14:47:21 -07:00
Jonas Devlieghere
bae77d5b02
[lldb-dap] Skip TestDAP_module_event on Windows 2025-05-10 09:36:07 -07:00
Jonas Devlieghere
b7c449ac0b
[lldb-dap] Don't emit a removed module event for unseen modules (#139324) 2025-05-09 23:34:05 -07:00
Jason Molenda
a230bb0298 Revert "[lldb] Provide lr value in faulting frame on arm64 (#138805)"
This test is failing on the LLDB Incremental bot (arm64), which is
running an older set of tools (Xcode 15.2) and OS (macOS 14.1) and
the CFI directives must not be emitted correctly by either the tools
or the OS.  I will need to reproduce how this is compiling on that
older setup and see what the issue is.  Reverting for now so the
bots are not blocked.

This reverts commit e897cb139ee6ef5c145fed5394c4d96baa658e6b.
2025-05-09 20:41:15 -07:00
Jason Molenda
d2f6ac2c10 Revert "Fix skipIf which was doing || and I need &&"
This reverts commit 05a2b33f7b36d4fc91b7a957aa00100bc8e38f04.
2025-05-09 20:41:08 -07:00
Jason Molenda
f6ca690c43 Revert "Stop running test on Linux for now"
This reverts commit 76f0f4cdf4bf9ebf476af99ad9911c687910d66d.
2025-05-09 20:41:02 -07:00
Jason Molenda
76f0f4cdf4 Stop running test on Linux for now
Failed at compile time lldb-aarch64-ubuntu bot.
It did clang -E -o interrupt-and-trap-funcs.s interrupt-and-trap-funcs.c
and that added a bunch of standard C header typedefs to
the output .s file which then turn into compile errors
when it tries to compile the .s file as assembly.  Never saw
that behavior in my testing on an ubuntu 24.04 system.

It would have been nice to have the test run on Linux as well
as Darwin, but it's not essential.
2025-05-09 20:20:51 -07:00
Jason Molenda
05a2b33f7b Fix skipIf which was doing || and I need &&
only run this test on linux or darwin
when targetting arm64/aarch64.
2025-05-09 20:12:56 -07:00
Jason Molenda
e897cb139e
[lldb] Provide lr value in faulting frame on arm64 (#138805)
When a frameless function faults or is interrupted asynchronously, the
UnwindPlan MAY have no register location rule for the return address
register (lr on arm64); the value is simply live in the lr register when
it was interrupted, and the frame below this on the stack -- e.g.
sigtramp on a Unix system -- has the full register context, including
that register.

RegisterContextUnwind::SavedLocationForRegister, when asked to find the
caller's pc value, will first see if there is a pc register location. If
there isn't, on a Return Address Register architecture like
arm/mips/riscv, we rewrite the register request from "pc" to "RA
register", and search for a location.

On frame 0 (the live frame) and an interrupted frame, the UnwindPlan may
have no register location rule for the RA Reg, that is valid. A
frameless function that never calls another may simply keep the return
address in the live register the whole way. Our instruction emulation
unwind plans explicitly add a rule (see Pavel's May 2024 change
https://github.com/llvm/llvm-project/pull/91321 ), but an UnwindPlan
sourced from debug_frame may not.

I've got a case where this exactly happens - clang debug_frame for arm64
where there is no register location for the lr in a frameless function.
There is a fault in the middle of this frameless function and we only
get the lr value from the fault handler below this frame if lr has a
register location of `IsSame`, in line with Pavel's 2024 change.

Similar to how we see a request of the RA Reg from frame 0 after failing
to find an unwind location for the pc register, the same style of
special casing is needed when this is a function that was interrupted.

Without this change, we can find the pc of the frame that was executing
when it was interrupted, but we need $lr to find its caller, and we
don't descend down to the trap handler to get that value, truncating the
stack.

rdar://145614545
2025-05-09 20:07:12 -07:00
Jacob Lalonde
7517a1bb48
[LLDB][SBSaveCoreOptions] Add new API to expose the expected core size in bytes (#138169)
My current internal work requires some sensitivity to IO usage. I had a
work around to calculate the expected size of a Minidump, but I've added
this PR so an automated system could look at the expected size of an
LLDB generated Minidump and then choose if it has the space or wants to
generate it.

There are some prerequisites to calculating the correct size, so I have
the API take a reference for an SBError, I originally tried to return an
SBError and instead take a uint64_t reference, but this made the API
very difficult to use in python.

Added a test case as well.
2025-05-09 15:49:54 -07:00
David Spickett
c64c64db7b
[lldb][lldb-dap] Disable more tests on Windows (#139251)
These are currently failing on Windows on Arm:
https://lab.llvm.org/buildbot/#/builders/141/builds/8556

```
********************
Unresolved Tests (1):
  lldb-api :: tools/lldb-dap/memory/TestDAP_memory.py
********************
Failed Tests (1):
  lldb-api :: tools/lldb-dap/variables/TestDAP_variables.py
```
2025-05-09 13:19:13 +01:00
jimingham
74120d0a38
Revert branch island experiments (#139192)
This test is failing because when we step to what is the branch island
address and ask for its symbol, we can't resolve the symbol, and just
call it the last padding symbol plus a bajillion.

That has nothing to do with the changes in this patch, but I'll revert
this and keep trying to figure out why symbol reading on this bot is
wrong.
2025-05-08 18:37:43 -07:00
jimingham
803fd732ae
Branch island no dsym (#139191)
When we get to the branch island, we don't see the symbol for
    it.
    
    The only other thing I can think of that would be a dsymutil bug?
Let's try this just with dwarf, and then I'll have to revert all this
    and see if I can reproduce this locally somehow.
2025-05-08 18:22:10 -07:00
jimingham
b80c3c576f
Branch no lld (#139187)
I suspect the test may be failing because lld doesn't behave the same
way the native Darwin linker does. Trying that theory here...
2025-05-08 18:00:52 -07:00
jimingham
b6922b7170
Add more logging so I can figure out why TestBranchIslands.py is (#139178)
failing but only on the bot.
2025-05-08 17:03:21 -07:00
jimingham
6bb3019691
Branch island debug (#139166)
This patch allows lldb to step in across "branch islands" which is the
Darwin linker's way of dealing with immediate branches to targets that
are too far away for the immediate slot to make the jump.

I submitted this a couple days ago and it failed on the arm64 bot. I was
able to match the bot OS and Tool versions (they are a bit old at this
point) and ran the test there but sadly it succeeded. The x86_64 bot
also failed but that was my bad, I did @skipUnlessDarwin when I should
have done @skipUnlessAppleSilicon.

So this resubmission is with the proper decoration for the test, and
with a bunch of debug output printed in case of failure. With any luck,
if this resubmission fails again I'll be able to see what's going on.
2025-05-08 16:22:39 -07:00
John Harrison
03896403d3
[lldb-dap] Migrate attach to typed RequestHandler. (#137911)
This updates the `attach` request to the typed
`RequestHandler<protocol::AttachRequestArguments,
protocol::AttachResponse>`.

Added a few more overlapping configurations to
`lldb_dap::protocol::Configuration` that are shared between launching
and attaching.

There may be some additional code we could clean-up that is no longer
referenced now that this has migrated to use well defined types.
2025-05-08 14:12:49 -07:00