Skip to content

Commit 1a0917e

Browse files
labathsivan-shani
authored andcommitted
[lldb] Correctly resolve (discontinuous) function offsets when disassembling (llvm#126925)
We need to iterate through the all symbol context ranges returned by (since llvm#126505) SymbolContext::GetAddressRange. This also includes a fix to print the function offsets as signed values. I've also wanted to check that the addresses which are in the middle of the function do *not* resolve to the function, but that's not entirely the case right now. This appears to be a separate issue though, so I've just left a TODO for now.
1 parent 23f26f0 commit 1a0917e

File tree

3 files changed

+25
-14
lines changed

3 files changed

+25
-14
lines changed

lldb/source/Plugins/Disassembler/LLVMC/DisassemblerLLVMC.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131

3232
#include "lldb/Core/Address.h"
3333
#include "lldb/Core/Module.h"
34+
#include "lldb/Symbol/Function.h"
3435
#include "lldb/Symbol/SymbolContext.h"
3536
#include "lldb/Target/ExecutionContext.h"
3637
#include "lldb/Target/Process.h"
@@ -1806,10 +1807,13 @@ const char *DisassemblerLLVMC::SymbolLookup(uint64_t value, uint64_t *type_ptr,
18061807
bool format_omitting_current_func_name = false;
18071808
if (sym_ctx.symbol || sym_ctx.function) {
18081809
AddressRange range;
1809-
if (sym_ctx.GetAddressRange(resolve_scope, 0, false, range) &&
1810-
range.GetBaseAddress().IsValid() &&
1811-
range.ContainsLoadAddress(value_so_addr, target)) {
1812-
format_omitting_current_func_name = true;
1810+
for (uint32_t idx = 0;
1811+
sym_ctx.GetAddressRange(resolve_scope, idx, false, range);
1812+
++idx) {
1813+
if (range.ContainsLoadAddress(value_so_addr, target)) {
1814+
format_omitting_current_func_name = true;
1815+
break;
1816+
}
18131817
}
18141818
}
18151819

lldb/source/Symbol/SymbolContext.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -104,15 +104,19 @@ bool SymbolContext::DumpStopContext(
104104

105105
if (addr_t file_addr = addr.GetFileAddress();
106106
file_addr != LLDB_INVALID_ADDRESS) {
107-
const addr_t function_offset =
108-
file_addr - function->GetAddress().GetFileAddress();
107+
// Avoiding signed arithmetic due to UB in -INT_MAX.
108+
const char sign =
109+
file_addr >= function->GetAddress().GetFileAddress() ? '+' : '-';
110+
addr_t offset = file_addr - function->GetAddress().GetFileAddress();
111+
if (sign == '-')
112+
offset = -offset;
109113
if (!show_function_name) {
110114
// Print +offset even if offset is 0
111115
dumped_something = true;
112-
s->Printf("+%" PRIu64 ">", function_offset);
113-
} else if (function_offset) {
116+
s->Format("{0}{1}>", sign, offset);
117+
} else if (offset) {
114118
dumped_something = true;
115-
s->Printf(" + %" PRIu64, function_offset);
119+
s->Format(" {0} {1}", sign, offset);
116120
}
117121
}
118122

lldb/test/Shell/Commands/command-disassemble.s

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@
8484
# CHECK-NEXT: command-disassemble.s.tmp[0x2044] <+0>: int $0x32
8585
# CHECK-NEXT: warning: Not disassembling a function because it is very large [0x0000000000002046-0x0000000000004046). To disassemble specify an instruction count limit, start/stop addresses or use the --force option.
8686
# CHECK-NEXT: (lldb) disassemble --name case3
87-
# CHECK-NEXT: error: Not disassembling a function because it is very large [0x0000000000006046-0x0000000000007046)[0x0000000000009046-0x000000000000a046). To disassemble specify an instruction count limit, start/stop addresses or use the --force option.
87+
# CHECK-NEXT: error: Not disassembling a function because it is very large [0x0000000000006046-0x0000000000007046)[0x0000000000009046-0x000000000000a050). To disassemble specify an instruction count limit, start/stop addresses or use the --force option.
8888
# CHECK-NEXT: Not disassembling a function because it is very large [0x0000000000004046-0x0000000000006046). To disassemble specify an instruction count limit, start/stop addresses or use the --force option.
8989
# CHECK-NEXT: (lldb) disassemble --name case3 --count 3
9090
# CHECK-NEXT: command-disassemble.s.tmp`n2::case3:
@@ -93,9 +93,10 @@
9393
# CHECK-NEXT: command-disassemble.s.tmp[0x604a] <-12284>: int $0x2a
9494
# CHECK-EMPTY:
9595
# CHECK-NEXT: command-disassemble.s.tmp`n2::case3:
96-
# CHECK-NEXT: command-disassemble.s.tmp[0x9046] <+0>: int $0x2a
97-
# CHECK-NEXT: command-disassemble.s.tmp[0x9048] <+2>: int $0x2a
98-
# CHECK-NEXT: command-disassemble.s.tmp[0x904a] <+4>: int $0x2a
96+
# CHECK-NEXT: command-disassemble.s.tmp[0x9046] <+0>: jmp 0x6046 ; <-12288>
97+
## FIXME: This should resolve to `middle_of_case3`
98+
# CHECK-NEXT: command-disassemble.s.tmp[0x904b] <+5>: jmp 0x7046 ; n2::case3 - 8192
99+
# CHECK-NEXT: command-disassemble.s.tmp[0x9050] <+10>: int $0x2a
99100
# CHECK-EMPTY:
100101
# CHECK-NEXT: command-disassemble.s.tmp`n1::case3:
101102
# CHECK-NEXT: command-disassemble.s.tmp[0x4046] <+0>: int $0x2a
@@ -171,12 +172,14 @@ _ZN2n15case3Ev:
171172
.endr
172173
.L_ZN2n25case3Ev.__part.1_end:
173174

174-
.Lpadding:
175+
middle_of_case3:
175176
.rept 0x1000
176177
int $42
177178
.endr
178179

179180
_ZN2n25case3Ev:
181+
jmp .L_ZN2n25case3Ev.__part.1
182+
jmp middle_of_case3
180183
.rept 0x800
181184
int $42
182185
.endr

0 commit comments

Comments
 (0)