if (cu_ctx.ptr != cu_ctx.end
&& !check_zero_padding (&cu_ctx, mc_die_other, &where))
wr_message_padding_n0 (mc_die_other, &where,
- read_ctx_get_offset (&ctx), size);
+ read_ctx_get_offset (&ctx),
+ read_ctx_get_offset (&ctx) + size - 1);
}
if (!read_ctx_skip (&ctx, size))
{
wr_message_padding_n0 (mc_pubtables | mc_error,
&WHERE (where.section, NULL),
- read_ctx_get_offset (&sub_ctx), size);
+ read_ctx_get_offset (&sub_ctx),
+ read_ctx_get_offset (&sub_ctx) + size - 1);
retval = false;
}
{
wr_message_padding_n0 (mc_pubtables | mc_error,
&WHERE (sec, NULL),
- read_ctx_get_offset (&sub_ctx), size);
+ read_ctx_get_offset (&sub_ctx),
+ read_ctx_get_offset (&sub_ctx) + size - 1);
retval = false;
}
return false;
}
sub_ctx.ptr = ctx.ptr;
+ sub_ctx.begin = ctx.begin;
{
/* Version. */
if (*name == 0)
break;
- // XXX high-level check for filename?
REALLOC (&include_directories, dirs);
include_directories.dirs[include_directories.size++] =
(struct include_directory_t){name, false};
}
if (*name == 0)
break;
- // XXX high-level check for filename?
uint64_t dir_idx;
if (!read_directory_index (name, &dir_idx))
else if (sub_ctx.ptr < program_start)
{
if (!check_zero_padding (&sub_ctx, mc_line, &where))
- wr_message_padding_n0 (mc_line, &where,
+ wr_message_padding_n0 (mc_line, &WHERE (sec_line, NULL),
read_ctx_get_offset (&sub_ctx),
- program_start - sub_ctx.ptr);
+ program_start - sub_ctx.begin - 1);
sub_ctx.ptr = program_start;
}
bool first_file = true;
while (!read_ctx_eof (&sub_ctx))
{
- where_reset_2 (&where, read_ctx_get_offset (&sub_ctx)
- + read_ctx_get_offset (&ctx));
+ where_reset_2 (&where, read_ctx_get_offset (&sub_ctx));
uint8_t opcode;
if (!read_ctx_read_ubyte (&sub_ctx, &opcode))
{
void use_file (uint64_t file_idx)
{
- if (file_idx == 0
- || file_idx > files.size)
+ if (file_idx == 0 || file_idx > files.size)
{
wr_error (&where,
": DW_LNS_set_file: invalid file index %" PRId64 ".\n",
{
if (handled
&& !check_zero_padding (&sub_ctx, mc_line, &where))
- wr_message_padding_n0 (mc_line, &where,
+ wr_message_padding_n0 (mc_line, &WHERE (sec_line, NULL),
read_ctx_get_offset (&sub_ctx),
- next - sub_ctx.ptr);
+ next - sub_ctx.begin - 1);
sub_ctx.ptr = next;
}
break;
if (!terminated)
wr_error (&where,
": sequence of opcodes not terminated with DW_LNE_end_sequence.\n");
+ else if (sub_ctx.ptr != sub_ctx.end
+ && !check_zero_padding (&sub_ctx, mc_line,
+ &WHERE (sec_line, NULL)))
+ wr_message_padding_n0 (mc_line, &WHERE (sec_line, NULL),
+ read_ctx_get_offset (&sub_ctx),
+ sub_ctx.end - sub_ctx.begin - 1);
}
/* XXX overlaps in defined addresses are probably OK, one