dbghelp/pdb: Handle a block in DEBUG_S_LINES subsection spreading across several symbols.
Signed-off-by: Eric Pouech <eric.pouech@gmail.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
cab92c90e0
commit
bfc0edb8cf
|
@ -1480,7 +1480,6 @@ static void codeview_snarf_linetab(const struct msc_debug_info* msc_dbg, const B
|
||||||
static void codeview_snarf_linetab2(const struct msc_debug_info* msc_dbg, const struct cv_module_snarf* cvmod)
|
static void codeview_snarf_linetab2(const struct msc_debug_info* msc_dbg, const struct cv_module_snarf* cvmod)
|
||||||
{
|
{
|
||||||
unsigned i;
|
unsigned i;
|
||||||
DWORD_PTR addr;
|
|
||||||
const void* hdr_last = (const char*)cvmod->dbgsubsect + cvmod->dbgsubsect_size;
|
const void* hdr_last = (const char*)cvmod->dbgsubsect + cvmod->dbgsubsect_size;
|
||||||
const struct CV_DebugSSubsectionHeader_t* hdr;
|
const struct CV_DebugSSubsectionHeader_t* hdr;
|
||||||
const struct CV_DebugSSubsectionHeader_t* hdr_next;
|
const struct CV_DebugSSubsectionHeader_t* hdr_next;
|
||||||
|
@ -1512,6 +1511,7 @@ static void codeview_snarf_linetab2(const struct msc_debug_info* msc_dbg, const
|
||||||
hdr_next = CV_RECORD_GAP(hdr, hdr->cbLen);
|
hdr_next = CV_RECORD_GAP(hdr, hdr->cbLen);
|
||||||
if (!(hdr->type & DEBUG_S_IGNORE))
|
if (!(hdr->type & DEBUG_S_IGNORE))
|
||||||
{
|
{
|
||||||
|
ULONG_PTR lineblk_base;
|
||||||
/* FIXME: should also check that whole lines_blk fits in linetab + size */
|
/* FIXME: should also check that whole lines_blk fits in linetab + size */
|
||||||
switch (hdr->type)
|
switch (hdr->type)
|
||||||
{
|
{
|
||||||
|
@ -1520,7 +1520,6 @@ static void codeview_snarf_linetab2(const struct msc_debug_info* msc_dbg, const
|
||||||
files_hdr = CV_RECORD_AFTER(lines_hdr);
|
files_hdr = CV_RECORD_AFTER(lines_hdr);
|
||||||
/* Skip blocks that are too small - Intel C Compiler generates these. */
|
/* Skip blocks that are too small - Intel C Compiler generates these. */
|
||||||
if (!CV_IS_INSIDE(files_hdr, hdr_next)) break;
|
if (!CV_IS_INSIDE(files_hdr, hdr_next)) break;
|
||||||
addr = codeview_get_address(msc_dbg, lines_hdr->segCon, lines_hdr->offCon);
|
|
||||||
TRACE("block from %04x:%08x #%x\n",
|
TRACE("block from %04x:%08x #%x\n",
|
||||||
lines_hdr->segCon, lines_hdr->offCon, lines_hdr->cbCon);
|
lines_hdr->segCon, lines_hdr->offCon, lines_hdr->cbCon);
|
||||||
chksms = CV_RECORD_GAP(hdr_files, files_hdr->offFile);
|
chksms = CV_RECORD_GAP(hdr_files, files_hdr->offFile);
|
||||||
|
@ -1531,20 +1530,20 @@ static void codeview_snarf_linetab2(const struct msc_debug_info* msc_dbg, const
|
||||||
}
|
}
|
||||||
source = source_new(msc_dbg->module, NULL,
|
source = source_new(msc_dbg->module, NULL,
|
||||||
(chksms->strOffset < cvmod->strsize) ? cvmod->strimage + chksms->strOffset : "<<stroutofbounds>>");
|
(chksms->strOffset < cvmod->strsize) ? cvmod->strimage + chksms->strOffset : "<<stroutofbounds>>");
|
||||||
func = (struct symt_function*)symt_find_nearest(msc_dbg->module, addr);
|
lineblk_base = codeview_get_address(msc_dbg, lines_hdr->segCon, lines_hdr->offCon);
|
||||||
/* FIXME: at least labels support line numbers */
|
|
||||||
if (!symt_check_tag(&func->symt, SymTagFunction) && !symt_check_tag(&func->symt, SymTagInlineSite))
|
|
||||||
{
|
|
||||||
WARN("--not a func at %04x:%08x %Ix tag=%d\n",
|
|
||||||
lines_hdr->segCon, lines_hdr->offCon, addr, func ? func->symt.tag : -1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
lines = CV_RECORD_AFTER(files_hdr);
|
lines = CV_RECORD_AFTER(files_hdr);
|
||||||
for (i = 0; i < files_hdr->nLines; i++)
|
for (i = 0; i < files_hdr->nLines; i++)
|
||||||
{
|
{
|
||||||
|
func = (struct symt_function*)symt_find_nearest(msc_dbg->module, lineblk_base + lines[i].offset);
|
||||||
|
/* FIXME: at least labels support line numbers */
|
||||||
|
if (!symt_check_tag(&func->symt, SymTagFunction) && !symt_check_tag(&func->symt, SymTagInlineSite))
|
||||||
|
{
|
||||||
|
WARN("--not a func at %04x:%08x %Ix tag=%d\n",
|
||||||
|
lines_hdr->segCon, lines_hdr->offCon + lines[i].offset, lineblk_base + lines[i].offset, func ? func->symt.tag : -1);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
symt_add_func_line(msc_dbg->module, func, source,
|
symt_add_func_line(msc_dbg->module, func, source,
|
||||||
lines[i].linenumStart,
|
lines[i].linenumStart, lineblk_base + lines[i].offset);
|
||||||
func->address + lines[i].offset);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DEBUG_S_FILECHKSMS: /* skip */
|
case DEBUG_S_FILECHKSMS: /* skip */
|
||||||
|
|
Loading…
Reference in New Issue