<feed xmlns='http://www.w3.org/2005/Atom'>
<title>llvm-project.git/lldb/source/Commands/CommandObjectDisassemble.cpp, branch main</title>
<subtitle>Unnamed repository; edit this file 'description' to name the repository.
</subtitle>
<link rel='alternate' type='text/html' href='https://git.belthelziquor.com/llvm-project.git/'/>
<entry>
<title>Stateful variable-location annotations in Disassembler::PrintInstructions() (follow-up to #147460) (#152887)</title>
<updated>2025-08-28T17:41:38+00:00</updated>
<author>
<name>Abdullah Mohammad Amin</name>
<email>67847674+UltimateForce21@users.noreply.github.com</email>
</author>
<published>2025-08-28T17:41:38+00:00</published>
<link rel='alternate' type='text/html' href='https://git.belthelziquor.com/llvm-project.git/commit/?id=8ec4db5e17f654670cd0d5e43e3a57a9b39b4f9d'/>
<id>8ec4db5e17f654670cd0d5e43e3a57a9b39b4f9d</id>
<content type='text'>
**Context**  
Follow-up to
[#147460](https://github.com/llvm/llvm-project/pull/147460), which added
the ability to surface register-resident variable locations.
This PR moves the annotation logic out of `Instruction::Dump()` and into
`Disassembler::PrintInstructions()`, and adds lightweight state tracking
so we only print changes at range starts and when variables go out of
scope.

---

## What this does

While iterating the instructions for a function, we maintain a “live
variable map” keyed by `lldb::user_id_t` (the `Variable`’s ID) to
remember each variable’s last emitted location string. For each
instruction:

- **New (or newly visible) variable** → print `name = &lt;location&gt;` once
at the start of its DWARF location range, cache it.
- **Location changed** (e.g., DWARF range switched to a different
register/const) → print the updated mapping.
- **Out of scope** (was tracked previously but not found for the current
PC) → print `name = &lt;undef&gt;` and drop it.

This produces **concise, stateful annotations** that highlight variable
lifetime transitions without spamming every line.

---

## Why in `PrintInstructions()`?

- Keeps `Instruction` stateless and avoids changing the
`Instruction::Dump()` virtual API.
- Makes it straightforward to diff state across instructions (`prev →
current`) inside the single driver loop.

---

## How it works (high-level)

1. For the current PC, get in-scope variables via
`StackFrame::GetInScopeVariableList(/*get_parent=*/true)`.
2. For each `Variable`, query
`DWARFExpressionList::GetExpressionEntryAtAddress(func_load_addr,
current_pc)` (added in #144238).
3. If the entry exists, call `DumpLocation(..., eDescriptionLevelBrief,
abi)` to get a short, ABI-aware location string (e.g., `DW_OP_reg3 RBX →
RBX`).
4. Compare against the last emitted location in the live map:
   - If not present → emit `name = &lt;location&gt;` and record it.
   - If different → emit updated mapping and record it.
5. After processing current in-scope variables, compute the set
difference vs. the previous map and emit `name = &lt;undef&gt;` for any that
disappeared.

Internally:
- We respect file↔load address translation already provided by
`DWARFExpressionList`.
- We reuse the ABI to map LLVM register numbers to arch register names.

---

## Example output (x86_64, simplified)

```
-&gt;  0x55c6f5f6a140 &lt;+0&gt;:  cmpl   $0x2, %edi                                                         ; argc = RDI, argv = RSI
    0x55c6f5f6a143 &lt;+3&gt;:  jl     0x55c6f5f6a176            ; &lt;+54&gt; at d_original_example.c:6:3
    0x55c6f5f6a145 &lt;+5&gt;:  pushq  %r15
    0x55c6f5f6a147 &lt;+7&gt;:  pushq  %r14
    0x55c6f5f6a149 &lt;+9&gt;:  pushq  %rbx
    0x55c6f5f6a14a &lt;+10&gt;: movq   %rsi, %rbx
    0x55c6f5f6a14d &lt;+13&gt;: movl   %edi, %r14d
    0x55c6f5f6a150 &lt;+16&gt;: movl   $0x1, %r15d                                                        ; argc = R14
    0x55c6f5f6a156 &lt;+22&gt;: nopw   %cs:(%rax,%rax)                                                    ; i = R15, argv = RBX
    0x55c6f5f6a160 &lt;+32&gt;: movq   (%rbx,%r15,8), %rdi
    0x55c6f5f6a164 &lt;+36&gt;: callq  0x55c6f5f6a030            ; symbol stub for: puts
    0x55c6f5f6a169 &lt;+41&gt;: incq   %r15
    0x55c6f5f6a16c &lt;+44&gt;: cmpq   %r15, %r14
    0x55c6f5f6a16f &lt;+47&gt;: jne    0x55c6f5f6a160            ; &lt;+32&gt; at d_original_example.c:5:10
    0x55c6f5f6a171 &lt;+49&gt;: popq   %rbx                                                               ; i = &lt;undef&gt;
    0x55c6f5f6a172 &lt;+50&gt;: popq   %r14                                                               ; argv = RSI
    0x55c6f5f6a174 &lt;+52&gt;: popq   %r15                                                               ; argc = RDI
    0x55c6f5f6a176 &lt;+54&gt;: xorl   %eax, %eax
    0x55c6f5f6a178 &lt;+56&gt;: retq  
```

Only transitions are shown: the start of a location, changes, and
end-of-lifetime.

---

## Scope &amp; limitations (by design)

- Handles **simple locations** first (registers, const-in-register cases
surfaced by `DumpLocation`).
- **Memory/composite locations** are out of scope for this PR.
- Annotations appear **only at range boundaries** (start/change/end) to
minimize noise.
- Output is **target-independent**; register names come from the target
ABI.

## Implementation notes

- All annotation printing now happens in
`Disassembler::PrintInstructions()`.
- Uses `std::unordered_map&lt;lldb::user_id_t, std::string&gt;` as the live
map.
- No persistent state across calls; the map is rebuilt while walking
instruction by instruction.
- **No changes** to the `Instruction` interface.

---

## Requested feedback

- Placement and wording of the `&lt;undef&gt;` marker.
- Whether we should optionally gate this behind a setting (currently
always on when disassembling with an `ExecutionContext`).
- Preference for immediate inclusion of tests vs. follow-up patch.

---

Thanks for reviewing! Happy to adjust behavior/format based on feedback.

---------

Co-authored-by: Jonas Devlieghere &lt;jonas@devlieghere.com&gt;
Co-authored-by: Adrian Prantl &lt;adrian.prantl@gmail.com&gt;</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
**Context**  
Follow-up to
[#147460](https://github.com/llvm/llvm-project/pull/147460), which added
the ability to surface register-resident variable locations.
This PR moves the annotation logic out of `Instruction::Dump()` and into
`Disassembler::PrintInstructions()`, and adds lightweight state tracking
so we only print changes at range starts and when variables go out of
scope.

---

## What this does

While iterating the instructions for a function, we maintain a “live
variable map” keyed by `lldb::user_id_t` (the `Variable`’s ID) to
remember each variable’s last emitted location string. For each
instruction:

- **New (or newly visible) variable** → print `name = &lt;location&gt;` once
at the start of its DWARF location range, cache it.
- **Location changed** (e.g., DWARF range switched to a different
register/const) → print the updated mapping.
- **Out of scope** (was tracked previously but not found for the current
PC) → print `name = &lt;undef&gt;` and drop it.

This produces **concise, stateful annotations** that highlight variable
lifetime transitions without spamming every line.

---

## Why in `PrintInstructions()`?

- Keeps `Instruction` stateless and avoids changing the
`Instruction::Dump()` virtual API.
- Makes it straightforward to diff state across instructions (`prev →
current`) inside the single driver loop.

---

## How it works (high-level)

1. For the current PC, get in-scope variables via
`StackFrame::GetInScopeVariableList(/*get_parent=*/true)`.
2. For each `Variable`, query
`DWARFExpressionList::GetExpressionEntryAtAddress(func_load_addr,
current_pc)` (added in #144238).
3. If the entry exists, call `DumpLocation(..., eDescriptionLevelBrief,
abi)` to get a short, ABI-aware location string (e.g., `DW_OP_reg3 RBX →
RBX`).
4. Compare against the last emitted location in the live map:
   - If not present → emit `name = &lt;location&gt;` and record it.
   - If different → emit updated mapping and record it.
5. After processing current in-scope variables, compute the set
difference vs. the previous map and emit `name = &lt;undef&gt;` for any that
disappeared.

Internally:
- We respect file↔load address translation already provided by
`DWARFExpressionList`.
- We reuse the ABI to map LLVM register numbers to arch register names.

---

## Example output (x86_64, simplified)

```
-&gt;  0x55c6f5f6a140 &lt;+0&gt;:  cmpl   $0x2, %edi                                                         ; argc = RDI, argv = RSI
    0x55c6f5f6a143 &lt;+3&gt;:  jl     0x55c6f5f6a176            ; &lt;+54&gt; at d_original_example.c:6:3
    0x55c6f5f6a145 &lt;+5&gt;:  pushq  %r15
    0x55c6f5f6a147 &lt;+7&gt;:  pushq  %r14
    0x55c6f5f6a149 &lt;+9&gt;:  pushq  %rbx
    0x55c6f5f6a14a &lt;+10&gt;: movq   %rsi, %rbx
    0x55c6f5f6a14d &lt;+13&gt;: movl   %edi, %r14d
    0x55c6f5f6a150 &lt;+16&gt;: movl   $0x1, %r15d                                                        ; argc = R14
    0x55c6f5f6a156 &lt;+22&gt;: nopw   %cs:(%rax,%rax)                                                    ; i = R15, argv = RBX
    0x55c6f5f6a160 &lt;+32&gt;: movq   (%rbx,%r15,8), %rdi
    0x55c6f5f6a164 &lt;+36&gt;: callq  0x55c6f5f6a030            ; symbol stub for: puts
    0x55c6f5f6a169 &lt;+41&gt;: incq   %r15
    0x55c6f5f6a16c &lt;+44&gt;: cmpq   %r15, %r14
    0x55c6f5f6a16f &lt;+47&gt;: jne    0x55c6f5f6a160            ; &lt;+32&gt; at d_original_example.c:5:10
    0x55c6f5f6a171 &lt;+49&gt;: popq   %rbx                                                               ; i = &lt;undef&gt;
    0x55c6f5f6a172 &lt;+50&gt;: popq   %r14                                                               ; argv = RSI
    0x55c6f5f6a174 &lt;+52&gt;: popq   %r15                                                               ; argc = RDI
    0x55c6f5f6a176 &lt;+54&gt;: xorl   %eax, %eax
    0x55c6f5f6a178 &lt;+56&gt;: retq  
```

Only transitions are shown: the start of a location, changes, and
end-of-lifetime.

---

## Scope &amp; limitations (by design)

- Handles **simple locations** first (registers, const-in-register cases
surfaced by `DumpLocation`).
- **Memory/composite locations** are out of scope for this PR.
- Annotations appear **only at range boundaries** (start/change/end) to
minimize noise.
- Output is **target-independent**; register names come from the target
ABI.

## Implementation notes

- All annotation printing now happens in
`Disassembler::PrintInstructions()`.
- Uses `std::unordered_map&lt;lldb::user_id_t, std::string&gt;` as the live
map.
- No persistent state across calls; the map is rebuilt while walking
instruction by instruction.
- **No changes** to the `Instruction` interface.

---

## Requested feedback

- Placement and wording of the `&lt;undef&gt;` marker.
- Whether we should optionally gate this behind a setting (currently
always on when disassembling with an `ExecutionContext`).
- Preference for immediate inclusion of tests vs. follow-up patch.

---

Thanks for reviewing! Happy to adjust behavior/format based on feedback.

---------

Co-authored-by: Jonas Devlieghere &lt;jonas@devlieghere.com&gt;
Co-authored-by: Adrian Prantl &lt;adrian.prantl@gmail.com&gt;</pre>
</div>
</content>
</entry>
<entry>
<title>[lldb] Underline short option letters as mnemonics (#153695)</title>
<updated>2025-08-26T15:07:24+00:00</updated>
<author>
<name>Jonas Devlieghere</name>
<email>jonas@devlieghere.com</email>
</author>
<published>2025-08-26T15:07:24+00:00</published>
<link rel='alternate' type='text/html' href='https://git.belthelziquor.com/llvm-project.git/commit/?id=26777283e6cb952ba9242c6299b0948dcc3253a5'/>
<id>26777283e6cb952ba9242c6299b0948dcc3253a5</id>
<content type='text'>
Whenever an option would use something other than the first letter of
the long option as the short option, Jim would capitalized the letter we
picked as a mnemonic. This has often been mistaken for a typo and Jim
wondered if we should stop doing this.

During the discussion, David mentioned how this reminds him of the
underline in menu bars when holding down alt. I suggested we do
something similar in LLDB by underlying the letter in the description.

https://discourse.llvm.org/t/should-we-remove-the-capital-letter-in-option-helps/87816</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Whenever an option would use something other than the first letter of
the long option as the short option, Jim would capitalized the letter we
picked as a mnemonic. This has often been mistaken for a typo and Jim
wondered if we should stop doing this.

During the discussion, David mentioned how this reminds him of the
underline in menu bars when holding down alt. I suggested we do
something similar in LLDB by underlying the letter in the description.

https://discourse.llvm.org/t/should-we-remove-the-capital-letter-in-option-helps/87816</pre>
</div>
</content>
</entry>
<entry>
<title>[lldb][lldb-dap] Use the default disassembly flavour if none is provided. (#141424)</title>
<updated>2025-05-30T12:13:42+00:00</updated>
<author>
<name>Ebuka Ezike</name>
<email>yerimyah1@gmail.com</email>
</author>
<published>2025-05-30T12:13:42+00:00</published>
<link rel='alternate' type='text/html' href='https://git.belthelziquor.com/llvm-project.git/commit/?id=af163a1c7f9d9c24521460a24b1d41a9b4b75ce8'/>
<id>af163a1c7f9d9c24521460a24b1d41a9b4b75ce8</id>
<content type='text'>
This is the currently the default for
`SBTarget::ReadInstructions(SBAddress, uint32_t)`. But not for others,
to make it consistent used the user assigned instruction flavour.</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This is the currently the default for
`SBTarget::ReadInstructions(SBAddress, uint32_t)`. But not for others,
to make it consistent used the user assigned instruction flavour.</pre>
</div>
</content>
</entry>
<entry>
<title>[lldb][lldb-dap] Respect x86 disassembly flavor setting (#134722)</title>
<updated>2025-04-27T11:13:38+00:00</updated>
<author>
<name>Ebuka Ezike</name>
<email>yerimyah1@gmail.com</email>
</author>
<published>2025-04-27T11:13:38+00:00</published>
<link rel='alternate' type='text/html' href='https://git.belthelziquor.com/llvm-project.git/commit/?id=7670af5a274b801adf83fcc0c7c4011e0be0bc91'/>
<id>7670af5a274b801adf83fcc0c7c4011e0be0bc91</id>
<content type='text'>
Ensure the disassembly respects the "target.x86-disassembly-flavor"
setting for x86 and x86_64 targets.

Depends on #134626

---------

Signed-off-by: Ebuka Ezike &lt;yerimyah1@gmail.com&gt;
Co-authored-by: Jonas Devlieghere &lt;jonas@devlieghere.com&gt;</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Ensure the disassembly respects the "target.x86-disassembly-flavor"
setting for x86 and x86_64 targets.

Depends on #134626

---------

Signed-off-by: Ebuka Ezike &lt;yerimyah1@gmail.com&gt;
Co-authored-by: Jonas Devlieghere &lt;jonas@devlieghere.com&gt;</pre>
</div>
</content>
</entry>
<entry>
<title>[lldb] Support disassembling discontinuous functions (#126505)</title>
<updated>2025-02-12T09:47:22+00:00</updated>
<author>
<name>Pavel Labath</name>
<email>pavel@labath.sk</email>
</author>
<published>2025-02-12T09:47:22+00:00</published>
<link rel='alternate' type='text/html' href='https://git.belthelziquor.com/llvm-project.git/commit/?id=37f36cbffb890a0c144211dec0c3589bd17f2a36'/>
<id>37f36cbffb890a0c144211dec0c3589bd17f2a36</id>
<content type='text'>
The command already supported disassembling multiple ranges, among other
reasons because inline functions can be discontinuous. The main thing
that was missing was being able to retrieve the function ranges from the
top level function object.

The output of the command for the case where the function entry point is
not its lowest address is somewhat confusing (we're showing negative
offsets), but it is correct.</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The command already supported disassembling multiple ranges, among other
reasons because inline functions can be discontinuous. The main thing
that was missing was being able to retrieve the function ranges from the
top level function object.

The output of the command for the case where the function entry point is
not its lowest address is somewhat confusing (we're showing negative
offsets), but it is correct.</pre>
</div>
</content>
</entry>
<entry>
<title>[lldb][NFC] Make the target's SectionLoadList private. (#113278)</title>
<updated>2025-01-15T04:12:46+00:00</updated>
<author>
<name>Greg Clayton</name>
<email>gclayton@fb.com</email>
</author>
<published>2025-01-15T04:12:46+00:00</published>
<link rel='alternate' type='text/html' href='https://git.belthelziquor.com/llvm-project.git/commit/?id=c4fb7180cbbe977f1ab1ce945a691550f8fdd1fb'/>
<id>c4fb7180cbbe977f1ab1ce945a691550f8fdd1fb</id>
<content type='text'>
Lots of code around LLDB was directly accessing the target's section
load list. This NFC patch makes the section load list private so the
Target class can access it, but everyone else now uses accessor
functions. This allows us to control the resolving of addresses and will
allow for functionality in LLDB which can lazily resolve addresses in
JIT plug-ins with a future patch.</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Lots of code around LLDB was directly accessing the target's section
load list. This NFC patch makes the section load list private so the
Target class can access it, but everyone else now uses accessor
functions. This allows us to control the resolving of addresses and will
allow for functionality in LLDB which can lazily resolve addresses in
JIT plug-ins with a future patch.</pre>
</div>
</content>
</entry>
<entry>
<title>[lldb] Support overriding the disassembly CPU &amp; features (#115382)</title>
<updated>2024-11-12T00:27:15+00:00</updated>
<author>
<name>Jonas Devlieghere</name>
<email>jonas@devlieghere.com</email>
</author>
<published>2024-11-12T00:27:15+00:00</published>
<link rel='alternate' type='text/html' href='https://git.belthelziquor.com/llvm-project.git/commit/?id=f109517d153609d4a8a3a3d3d3cc06da1b629364'/>
<id>f109517d153609d4a8a3a3d3d3cc06da1b629364</id>
<content type='text'>
Add the ability to override the disassembly CPU and CPU features through
a target setting (`target.disassembly-cpu` and
`target.disassembly-features`) and a `disassemble` command option
(`--cpu` and `--features`).

This is especially relevant for architectures like RISC-V which relies
heavily on CPU extensions.

The majority of this patch is plumbing the options through. I recommend
looking at DisassemblerLLVMC and the test for the observable change in
behavior.</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Add the ability to override the disassembly CPU and CPU features through
a target setting (`target.disassembly-cpu` and
`target.disassembly-features`) and a `disassemble` command option
(`--cpu` and `--features`).

This is especially relevant for architectures like RISC-V which relies
heavily on CPU extensions.

The majority of this patch is plumbing the options through. I recommend
looking at DisassemblerLLVMC and the test for the observable change in
behavior.</pre>
</div>
</content>
</entry>
<entry>
<title>[lldb] Turn lldb_private::Status into a value type. (#106163)</title>
<updated>2024-08-27T17:59:31+00:00</updated>
<author>
<name>Adrian Prantl</name>
<email>aprantl@apple.com</email>
</author>
<published>2024-08-27T17:59:31+00:00</published>
<link rel='alternate' type='text/html' href='https://git.belthelziquor.com/llvm-project.git/commit/?id=0642cd768b80665585c8500bed2933a3b99123dc'/>
<id>0642cd768b80665585c8500bed2933a3b99123dc</id>
<content type='text'>
This patch removes all of the Set.* methods from Status.

This cleanup is part of a series of patches that make it harder use the
anti-pattern of keeping a long-lives Status object around and updating
it while dropping any errors it contains on the floor.

This patch is largely NFC, the more interesting next steps this enables
is to:
1. remove Status.Clear()
2. assert that Status::operator=() never overwrites an error
3. remove Status::operator=()

Note that step (2) will bring 90% of the benefits for users, and step
(3) will dramatically clean up the error handling code in various
places. In the end my goal is to convert all APIs that are of the form

`    ResultTy DoFoo(Status&amp; error)
`
to

`    llvm::Expected&lt;ResultTy&gt; DoFoo()
`
How to read this patch?

The interesting changes are in Status.h and Status.cpp, all other
changes are mostly

` perl -pi -e 's/\.SetErrorString/ = Status::FromErrorString/g' $(git
grep -l SetErrorString lldb/source)
`
plus the occasional manual cleanup.</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This patch removes all of the Set.* methods from Status.

This cleanup is part of a series of patches that make it harder use the
anti-pattern of keeping a long-lives Status object around and updating
it while dropping any errors it contains on the floor.

This patch is largely NFC, the more interesting next steps this enables
is to:
1. remove Status.Clear()
2. assert that Status::operator=() never overwrites an error
3. remove Status::operator=()

Note that step (2) will bring 90% of the benefits for users, and step
(3) will dramatically clean up the error handling code in various
places. In the end my goal is to convert all APIs that are of the form

`    ResultTy DoFoo(Status&amp; error)
`
to

`    llvm::Expected&lt;ResultTy&gt; DoFoo()
`
How to read this patch?

The interesting changes are in Status.h and Status.cpp, all other
changes are mostly

` perl -pi -e 's/\.SetErrorString/ = Status::FromErrorString/g' $(git
grep -l SetErrorString lldb/source)
`
plus the occasional manual cleanup.</pre>
</div>
</content>
</entry>
<entry>
<title>[lldb] Use Target references instead of pointers in CommandObject (NFC)</title>
<updated>2024-08-01T01:06:32+00:00</updated>
<author>
<name>Jonas Devlieghere</name>
<email>jonas@devlieghere.com</email>
</author>
<published>2024-07-31T18:02:18+00:00</published>
<link rel='alternate' type='text/html' href='https://git.belthelziquor.com/llvm-project.git/commit/?id=5dbbc3b14bb04ef4bf2cbf4c23008f94f4253704'/>
<id>5dbbc3b14bb04ef4bf2cbf4c23008f94f4253704</id>
<content type='text'>
The GetTarget helper returns a Target reference so there's reason to
convert it to a pointer and check its validity.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The GetTarget helper returns a Target reference so there's reason to
convert it to a pointer and check its validity.
</pre>
</div>
</content>
</entry>
<entry>
<title>[lldb] Unify the way we get the Target in CommandObject (#101208)</title>
<updated>2024-07-31T16:57:10+00:00</updated>
<author>
<name>Jonas Devlieghere</name>
<email>jonas@devlieghere.com</email>
</author>
<published>2024-07-31T16:57:10+00:00</published>
<link rel='alternate' type='text/html' href='https://git.belthelziquor.com/llvm-project.git/commit/?id=8398ad9cb21736dc57ee4dd766bd0859ef9bd000'/>
<id>8398ad9cb21736dc57ee4dd766bd0859ef9bd000</id>
<content type='text'>
Currently, CommandObjects are obtaining a target in a variety of ways.
Often the command incorrectly operates on the selected target. As an
example, when a breakpoint command is running, the current target is
passed into the command but the target that hit the breakpoint is not
the selected target. In other places we use the CommandObject's
execution context, which is frozen during the execution of the command,
and comes with its own limitations. Finally, we often want to fall back
to the dummy target if no real target is available.

Instead of having to guess how to get the target, this patch introduces
one helper function in CommandObject to get the most relevant target. In
order of priority, that's the target from the command object's execution
context, from the interpreter's execution context, the selected target
or the dummy target.

rdar://110846511</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Currently, CommandObjects are obtaining a target in a variety of ways.
Often the command incorrectly operates on the selected target. As an
example, when a breakpoint command is running, the current target is
passed into the command but the target that hit the breakpoint is not
the selected target. In other places we use the CommandObject's
execution context, which is frozen during the execution of the command,
and comes with its own limitations. Finally, we often want to fall back
to the dummy target if no real target is available.

Instead of having to guess how to get the target, this patch introduces
one helper function in CommandObject to get the most relevant target. In
order of priority, that's the target from the command object's execution
context, from the interpreter's execution context, the selected target
or the dummy target.

rdar://110846511</pre>
</div>
</content>
</entry>
</feed>
