mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-05 13:28:40 +00:00
intersect line voff ranges across all overlapping line tables when mapping voffs to line info; fixes inline stepping
This commit is contained in:
+1
-1
@@ -57,7 +57,7 @@ commands =
|
|||||||
},
|
},
|
||||||
.rjf_f2 =
|
.rjf_f2 =
|
||||||
{
|
{
|
||||||
.win = "build rdi_from_pdb rdi_dump && pushd build && rdi_from_pdb --pdb:mule_main.pdb --out:mule_main.rdi && rdi_dump mule_main.rdi > mule_main.dump",
|
.win = "build rdi_from_pdb rdi_dump && pushd build && rdi_from_pdb --pdb:mule_main.pdb --out:mule_main.rdi && rdi_dump mule_main.rdi > mule_main.dump && popd",
|
||||||
.linux = "",
|
.linux = "",
|
||||||
.out = "*compilation*",
|
.out = "*compilation*",
|
||||||
.footer_panel = true,
|
.footer_panel = true,
|
||||||
|
|||||||
+28
-4
@@ -3328,7 +3328,16 @@ df_text_line_dasm2src_info_from_dbgi_key_voff(DI_Key *dbgi_key, U64 voff, U64 in
|
|||||||
result.file = &df_g_nil_entity;
|
result.file = &df_g_nil_entity;
|
||||||
{
|
{
|
||||||
RDI_Unit *unit = rdi_unit_from_voff(rdi, voff);
|
RDI_Unit *unit = rdi_unit_from_voff(rdi, voff);
|
||||||
RDI_LineTable *line_table = rdi_line_table_from_unit(rdi, unit);
|
RDI_LineTable *unit_line_table = rdi_line_table_from_unit(rdi, unit);
|
||||||
|
typedef struct LineTableNode LineTableNode;
|
||||||
|
struct LineTableNode
|
||||||
|
{
|
||||||
|
LineTableNode *next;
|
||||||
|
RDI_ParsedLineTable parsed_line_table;
|
||||||
|
};
|
||||||
|
LineTableNode start_line_table = {0};
|
||||||
|
rdi_parsed_from_line_table(rdi, unit_line_table, &start_line_table.parsed_line_table);
|
||||||
|
LineTableNode *top_line_table = &start_line_table;
|
||||||
RDI_Scope *scope = rdi_scope_from_voff(rdi, voff);
|
RDI_Scope *scope = rdi_scope_from_voff(rdi, voff);
|
||||||
{
|
{
|
||||||
U64 idx = 0;
|
U64 idx = 0;
|
||||||
@@ -3341,14 +3350,18 @@ df_text_line_dasm2src_info_from_dbgi_key_voff(DI_Key *dbgi_key, U64 voff, U64 in
|
|||||||
RDI_InlineSite *inline_site = rdi_element_from_name_idx(rdi, InlineSites, s->inline_site_idx);
|
RDI_InlineSite *inline_site = rdi_element_from_name_idx(rdi, InlineSites, s->inline_site_idx);
|
||||||
if(inline_site->line_table_idx != 0)
|
if(inline_site->line_table_idx != 0)
|
||||||
{
|
{
|
||||||
line_table = rdi_element_from_name_idx(rdi, LineTables, inline_site->line_table_idx);
|
LineTableNode *n = push_array(scratch.arena, LineTableNode, 1);
|
||||||
|
SLLStackPush(top_line_table, n);
|
||||||
|
RDI_LineTable *line_table = rdi_element_from_name_idx(rdi, LineTables, inline_site->line_table_idx);
|
||||||
|
rdi_parsed_from_line_table(rdi, line_table, &n->parsed_line_table);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
RDI_ParsedLineTable parsed_line_table = {0};
|
for(LineTableNode *n = top_line_table; n == top_line_table; n = n->next)
|
||||||
rdi_parsed_from_line_table(rdi, line_table, &parsed_line_table);
|
{
|
||||||
|
RDI_ParsedLineTable parsed_line_table = n->parsed_line_table;
|
||||||
U64 line_info_idx = rdi_line_info_idx_from_voff(&parsed_line_table, voff);
|
U64 line_info_idx = rdi_line_info_idx_from_voff(&parsed_line_table, voff);
|
||||||
if(line_info_idx < parsed_line_table.count)
|
if(line_info_idx < parsed_line_table.count)
|
||||||
{
|
{
|
||||||
@@ -3366,6 +3379,17 @@ df_text_line_dasm2src_info_from_dbgi_key_voff(DI_Key *dbgi_key, U64 voff, U64 in
|
|||||||
result.voff_range = r1u64(parsed_line_table.voffs[line_info_idx], parsed_line_table.voffs[line_info_idx+1]);
|
result.voff_range = r1u64(parsed_line_table.voffs[line_info_idx], parsed_line_table.voffs[line_info_idx+1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for(LineTableNode *n = top_line_table->next; n != 0; n = n->next)
|
||||||
|
{
|
||||||
|
RDI_ParsedLineTable parsed_line_table = n->parsed_line_table;
|
||||||
|
U64 line_info_idx = rdi_line_info_idx_from_voff(&parsed_line_table, voff);
|
||||||
|
if(line_info_idx < parsed_line_table.count)
|
||||||
|
{
|
||||||
|
Rng1U64 voff_range = r1u64(parsed_line_table.voffs[line_info_idx], parsed_line_table.voffs[line_info_idx+1]);
|
||||||
|
result.voff_range = intersect_1u64(result.voff_range, voff_range);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
di_scope_close(scope);
|
di_scope_close(scope);
|
||||||
scratch_end(scratch);
|
scratch_end(scratch);
|
||||||
return result;
|
return result;
|
||||||
|
|||||||
Reference in New Issue
Block a user