summaryrefslogtreecommitdiff
path: root/lldb/source/Core/DumpRegisterInfo.cpp
AgeCommit message (Collapse)Author
2024-07-01Reland "[lldb] Parse and display register field enums" (#97258)" (#97270)David Spickett
This reverts commit d9e659c538516036e40330b6a98160cbda4ff100. I could not reproduce the Mac OS ASAN failure locally but I narrowed it down to the test `test_many_fields_same_enum`. This test shares an enum between x0, which is 64 bit, and cpsr, which is 32 bit. My theory is that when it does `register read x0`, an enum type is created where the undlerying enumerators are 64 bit, matching the register size. Then it does `register read cpsr` which used the cached enum type, but this register is 32 bit. This caused lldb to try to read an 8 byte value out of a 4 byte allocation: READ of size 8 at 0x60200014b874 thread T0 <...> =>0x60200014b800: fa fa fd fa fa fa fd fa fa fa fd fa fa fa[04]fa To fix this I've added the register's size in bytes to the constructed enum type's name. This means that x0 uses: __lldb_register_fields_enum_some_enum_8 And cpsr uses: __lldb_register_fields_enum_some_enum_4 If any other registers use this enum and are read, they will use the cached type as long as their size matches, otherwise we make a new type.
2024-07-01Revert "[lldb] Parse and display register field enums" (#97258)David Spickett
Reverts llvm/llvm-project#95768 due to a test failure on macOS with ASAN: https://green.lab.llvm.org/job/llvm.org/view/LLDB/job/lldb-cmake-sanitized/425/console
2024-06-27[lldb] Parse and display register field enums (#95768)David Spickett
This teaches lldb to parse the enum XML elements sent by lldb-server, and make use of the information in `register read` and `register info`. The format is described in https://sourceware.org/gdb/current/onlinedocs/gdb.html/Enum-Target-Types.html. The target XML parser will drop any invalid enum or evalue. If we find multiple evalue for the same value, we will use the last one we find. The order of evalues from the XML is preserved as there may be good reason they are not in numerical order.
2023-06-21[lldb] Add register field tables to the "register info" commandDavid Spickett
This teaches DumpRegisterInfo to generate a table from the register flags type. It just calls a method on RegisterFlags. As such, the extra tests are minimal and only show that the intergration works. Exhaustive formatting tests are done with RegisterFlags itself. Example: ``` (lldb) register info cpsr Name: cpsr Size: 4 bytes (32 bits) In sets: general (index 0) | 31 | 30 | 29 | 28 | 27-26 | 25 | 24 | 23 | 22 | 21 | 20 | 19-13 | 12 | 11-10 | 9 | 8 | 7 | 6 | 5 | 4 | 3-2 | 1 | 0 | |----|----|----|----|-------|-----|-----|-----|-----|----|----|-------|------|-------|---|---|---|---|---|-----|-----|---|----| | N | Z | C | V | | TCO | DIT | UAO | PAN | SS | IL | | SSBS | | D | A | I | F | | nRW | EL | | SP | ``` LLDB limits the max terminal width to 80 chars by default. So to get that full width output you will need to change the "term-width" setting to something higher. Reviewed By: jasonmolenda Differential Revision: https://reviews.llvm.org/D152918
2023-06-21[lldb] Add "register info" commandDavid Spickett
This adds a new command that will show all the information lldb knows about a register. ``` (lldb) register info s0 Name: s0 Size: 4 bytes (32 bits) Invalidates: v0, d0 Read from: v0 In sets: Floating Point Registers (index 1) ``` Currently it only allows a single register, and we get the information from the RegisterInfo structure. For those of us who know the architecture well, this information is all pretty obvious. For those who don't, it's nice to have it at a glance without leaving the debugger. I hope to have more in depth information to show here in the future, which will be of wider use. Reviewed By: jasonmolenda Differential Revision: https://reviews.llvm.org/D152916