From ec6acb860642cbf8c8e548617716836f5c039046 Mon Sep 17 00:00:00 2001 From: uz Date: Thu, 18 Aug 2011 10:26:13 +0000 Subject: [PATCH] More changes to account for modules without debug info. git-svn-id: svn://svn.cc65.org/cc65/trunk@5204 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- src/dbginfo/dbginfo.c | 16 +++++++++++++--- src/dbginfo/dbginfo.h | 12 ++++++++---- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/dbginfo/dbginfo.c b/src/dbginfo/dbginfo.c index d0e58d4de..c2179abc1 100644 --- a/src/dbginfo/dbginfo.c +++ b/src/dbginfo/dbginfo.c @@ -1254,8 +1254,12 @@ static void CopyModInfo (cc65_moduledata* D, const ModInfo* M) D->library_id = M->Lib.Info->Id; } else { D->library_id = CC65_INV_ID; + } + if (M->MainScope) { + D->scope_id = M->MainScope->Id; + } else { + D->scope_id = CC65_INV_ID; } - D->scope_id = M->MainScope->Id; } @@ -4313,14 +4317,20 @@ static void ProcessScopeInfo (InputData* D) } } - /* Walk over all modules, check that eacxh one has a main scope assigned, - * then sort the scopes by name + /* Walk over all modules. If a module doesn't have scopes, it wasn't + * compiled with debug info which is ok. If it has debug info, it must + * also have a main scope. If there are scopes, sort them by name. */ for (I = 0; I < CollCount (&D->Info->ModInfoById); ++I) { /* Get this module */ ModInfo* M = CollAt (&D->Info->ModInfoById, I); + /* Ignore modules without any scopes (no debug info) */ + if (CollCount (&M->ScopeInfoByName) == 0) { + continue; + } + /* Must have a main scope */ if (M->MainScope == 0) { ParseError (D, diff --git a/src/dbginfo/dbginfo.h b/src/dbginfo/dbginfo.h index 71f7c5a7b..664966f48 100644 --- a/src/dbginfo/dbginfo.h +++ b/src/dbginfo/dbginfo.h @@ -205,7 +205,11 @@ void cc65_free_lineinfo (cc65_dbginfo handle, const cc65_lineinfo* info); -/* Module information */ +/* Module information + * Notes: + * - scope_id contains CC65_INV_ID if the module was compiled without + * debug information. + */ typedef struct cc65_moduledata cc65_moduledata; struct cc65_moduledata { unsigned module_id; /* The internal module id */ @@ -406,15 +410,15 @@ typedef enum { /* Notes: * - If the symbol is segment relative, the segment id gives segment * information, otherwise it contains CC65_INV_ID. - * - If the type is CC65_SYM_IMPORT, export_id may contain the id of the + * - If the type is CC65_SYM_IMPORT, export_id may contain the id of the * export. This is not the case if the module contaiing the export doesn't * have debug information. * - For an import, the fields symbol_value and segment_id are taken from * the export, if it is available, since imports have no value or segments * by itself. - * - For an import symbol_type and symbol_size are more or less unusable + * - For an import symbol_type and symbol_size are more or less unusable * because they don't have a meaning for imports. - * - For normal symbols (not cheap locals) parent_id contains CC65_INV_ID, + * - For normal symbols (not cheap locals) parent_id contains CC65_INV_ID, * for cheap locals it contains the symbol id of the parent symbol. */ typedef struct cc65_symboldata cc65_symboldata; -- 2.39.5