Added a source code file date check when reading DWARF information
authorJean-Paul Mari <djipi.mari@gmail.com>
Fri, 21 Aug 2020 12:56:18 +0000 (08:56 -0400)
committerJean-Paul Mari <djipi.mari@gmail.com>
Fri, 21 Aug 2020 12:56:18 +0000 (08:56 -0400)
13 files changed:
docs/vj_HistoryNotes.txt
src/debugger/DBGManager.cpp
src/debugger/DBGManager.h
src/debugger/DWARFManager.cpp
src/debugger/DWARFManager.h
src/debugger/ELFManager.cpp
src/debugger/ELFManager.h
src/debugger/NewFnctBreakpointWin.cpp
src/debugger/SourcesWin.cpp
src/debugger/callstackbrowser.cpp
src/debugger/m68kDasmWin.cpp
src/debugger/m68kDasmWin.h
src/file.cpp

index f8c3fb4..8151a17 100644 (file)
@@ -14,12 +14,13 @@ Release 5 (TBA)
 7) Fix a random crash when reading the source lines information
 8) Added ELF & DWARF .debug* types
 9) Added ELF section types check and new error messages
-10) Project has switched to libdwarf 20191104 library 64bits for VS 2017
-11) Modified the call stack layout window and added source filename from the called source line
-12) Added a source tab in the main window for step into tracing
-13) Added the step over for source level tracing
-14) Project has switched to libdwarf 20200114 library 64bits for VS 2017
-15) Set text conversion to Qt/HTML format for the M68K tracing window
+10) Modified the call stack layout window and added source filename from the called source line
+11) Added a source tab in the main window for step into tracing
+12) Added the step over for source level tracing
+13) Project has switched to libdwarf 20200114 library 64bits for VS 2017
+14) Set text conversion to Qt/HTML format for the M68K tracing window
+15) Added a source code file date check when reading DWARF information
+-- Will avoid source code mismatching with the ELF executable
 
 Release 4a (15th August 2019)
 -----------------------------
index f401c4a..28d1ffe 100644 (file)
@@ -214,11 +214,11 @@ size_t DBGManager_GetType(void)
 \r
 // Get source filename based on the memeory address\r
 // return NULL if no source filename\r
-char *DBGManager_GetFullSourceFilenameFromAdr(size_t Adr, bool *Error)\r
+char *DBGManager_GetFullSourceFilenameFromAdr(size_t Adr, DBGstatus *Status)\r
 {\r
        if ((DBGType & DBG_ELFDWARF))\r
        {\r
-               return DWARFManager_GetFullSourceFilenameFromAdr(Adr, Error);\r
+               return DWARFManager_GetFullSourceFilenameFromAdr(Adr, (DWARFstatus *)Status);\r
        }\r
        else\r
        {\r
index 09cabc1..5695eb0 100644 (file)
@@ -4,6 +4,16 @@
 #define __DBGMANAGER_H__\r
 \r
 \r
+// Definition for the DWARF status of each source file\r
+typedef enum\r
+{\r
+       DBGSTATUS_OK = 0x0,\r
+       DBGSTATUS_OUTDATEDFILE = 0x1,\r
+       DBGSTATUS_NOFILE = 0x2,\r
+       DBGSTATUS_NOFILEINFO = 0x4,\r
+       DBGSTATUS_UNKNOWN = 0xff\r
+}DBGstatus;\r
+\r
 // Language tag based in the DW_TAG_... list from the dwarf.h\r
 typedef enum {\r
        DBG_NO_LANG = 0x0,\r
@@ -260,7 +270,7 @@ extern char *DBGManager_GetSymbolNameFromAdr(size_t Adr);
 extern size_t DBGManager_GetAdrFromSymbolName(char *SymbolName);\r
 \r
 // Source text files manager\r
-extern char    *DBGManager_GetFullSourceFilenameFromAdr(size_t Adr, bool *Error);\r
+extern char    *DBGManager_GetFullSourceFilenameFromAdr(size_t Adr, DBGstatus *Status);\r
 extern char *DBGManager_GetNumFullSourceFilename(size_t Index);\r
 extern char *DBGManager_GetNumSourceFilename(size_t Index);\r
 \r
index 130342a..e0e07b9 100644 (file)
@@ -12,6 +12,7 @@
 // JPM   Oct./2018  Improve the DWARF parsing information, and the source file text reading; support the used source lines from DWARF structure, and the search paths for the files\r
 // JPM   Aug./2019  Added new functions to handle DWARF information, full filename fix\r
 // JPM   Mar./2020  Fix a random crash when reading the source lines information\r
+// JPM   Aug./2020  Added a source code file date check when reading DWARF information\r
 //\r
 \r
 // To Do\r
 #include <stdio.h>\r
 #include <stdint.h>\r
 #include <string.h>\r
-#include <libdwarf.h>\r
-#include <dwarf.h>\r
+#include <time.h>\r
+#include <sys/types.h>\r
+#include <sys/stat.h>\r
+#include "libdwarf.h"\r
+#include "dwarf.h"\r
 #include "LEB128.h"\r
+#include "DWARFManager.h"\r
 \r
 \r
 // Definitions for debugging\r
@@ -131,7 +136,7 @@ typedef struct CUStruct
        size_t Tag;\r
        size_t Language;                                                                // Language (C, etc.) used by the source code\r
        size_t LowPC, HighPC;                                                   // Memory range for the code\r
-       char *PtrProducer;                                                              // Pointer to the "Producer" text information (mostly compiler and compilation options used)\r
+       char *PtrProducer;                                                              // "Producer" text information (mostly compiler and compilation options used)\r
        char *PtrSourceFilename;                                                // Source file name\r
        char *PtrSourceFileDirectory;                                   // Directory of the source file\r
        char *PtrFullFilename;                                                  // Pointer to full namefile (directory & filename)\r
@@ -151,6 +156,8 @@ typedef struct CUStruct
        CUStruct_LineSrc *PtrUsedLinesSrc;                              // Pointer to the used source lines list structure\r
        char **PtrUsedLinesLoadSrc;                                             // Pointer lists to each used source line referenced by the CUStruct_LineSrc structure\r
        size_t *PtrUsedNumLines;                                                // List of the number lines used\r
+       struct _stat _statbuf;                                                  // File information\r
+       DWARFstatus Status;                                                             // File status\r
 }S_CUStruct;\r
 \r
 \r
@@ -163,6 +170,7 @@ Dwarf_Debug dbg;
 CUStruct *PtrCU;\r
 char **ListSearchPaths;\r
 size_t NbSearchPaths;\r
+struct _stat FileElfExeInfo;\r
 \r
 \r
 //\r
@@ -242,10 +250,11 @@ bool DWARFManager_Close(void)
 \r
 \r
 // Dwarf manager Elf init\r
-int    DWARFManager_ElfInit(Elf *ElfPtr)\r
+int    DWARFManager_ElfInit(Elf *ElfPtr, struct _stat FileElfInfo)\r
 {\r
        if ((LibDwarf = dwarf_elf_init(ElfPtr, DW_DLC_READ, (Dwarf_Handler)DWARFManager_ErrorHandler, errarg, &dbg, &error)) == DW_DLV_OK)\r
        {\r
+               FileElfExeInfo = FileElfInfo;\r
                DWARFManager_InitDMI();\r
        }\r
 \r
@@ -525,65 +534,88 @@ void DWARFManager_InitDMI(void)
                                                                strcpy((Ptr1 + 1), (Ptr + 4));\r
                                                        }\r
 \r
-                                                       // Open the source file as a binary file\r
-                                                       if (!fopen_s(&SrcFile, PtrCU[NbCU].PtrFullFilename, "rb"))\r
+                                                       // Get the source file information\r
+                                                       if (!_stat(PtrCU[NbCU].PtrFullFilename, &PtrCU[NbCU]._statbuf))\r
                                                        {\r
-                                                               if (!fseek(SrcFile, 0, SEEK_END))\r
+                                                               // check the time stamp with the executable\r
+                                                               if (PtrCU[NbCU]._statbuf.st_mtime <= FileElfExeInfo.st_mtime)\r
                                                                {\r
-                                                                       if ((PtrCU[NbCU].SizeLoadSrc = ftell(SrcFile)) > 0)\r
+                                                                       // Open the source file as a binary file\r
+                                                                       if (!fopen_s(&SrcFile, PtrCU[NbCU].PtrFullFilename, "rb"))\r
                                                                        {\r
-                                                                               if (!fseek(SrcFile, 0, SEEK_SET))\r
+                                                                               if (!fseek(SrcFile, 0, SEEK_END))\r
                                                                                {\r
-                                                                                       if (PtrCU[NbCU].PtrLoadSrc = Ptr = Ptr1 = (char *)calloc(1, (PtrCU[NbCU].SizeLoadSrc + 2)))\r
+                                                                                       if ((PtrCU[NbCU].SizeLoadSrc = ftell(SrcFile)) > 0)\r
                                                                                        {\r
-                                                                                               // Read whole file\r
-                                                                                               if (fread_s(PtrCU[NbCU].PtrLoadSrc, PtrCU[NbCU].SizeLoadSrc, PtrCU[NbCU].SizeLoadSrc, 1, SrcFile) != 1)\r
-                                                                                               {\r
-                                                                                                       free(PtrCU[NbCU].PtrLoadSrc);\r
-                                                                                                       PtrCU[NbCU].PtrLoadSrc = NULL;\r
-                                                                                                       PtrCU[NbCU].SizeLoadSrc = 0;\r
-                                                                                               }\r
-                                                                                               else\r
+                                                                                               if (!fseek(SrcFile, 0, SEEK_SET))\r
                                                                                                {\r
-                                                                                                       // Eliminate all carriage return code '\r' (oxd)\r
-                                                                                                       do\r
+                                                                                                       if (PtrCU[NbCU].PtrLoadSrc = Ptr = Ptr1 = (char *)calloc(1, (PtrCU[NbCU].SizeLoadSrc + 2)))\r
                                                                                                        {\r
-                                                                                                               if ((*Ptr = *Ptr1) != '\r')\r
+                                                                                                               // Read whole file\r
+                                                                                                               if (fread_s(PtrCU[NbCU].PtrLoadSrc, PtrCU[NbCU].SizeLoadSrc, PtrCU[NbCU].SizeLoadSrc, 1, SrcFile) != 1)\r
                                                                                                                {\r
-                                                                                                                       Ptr++;\r
+                                                                                                                       free(PtrCU[NbCU].PtrLoadSrc);\r
+                                                                                                                       PtrCU[NbCU].PtrLoadSrc = NULL;\r
+                                                                                                                       PtrCU[NbCU].SizeLoadSrc = 0;\r
                                                                                                                }\r
-                                                                                                       }\r
-                                                                                                       while (*Ptr1++);\r
+                                                                                                               else\r
+                                                                                                               {\r
+                                                                                                                       // Eliminate all carriage return code '\r' (oxd)\r
+                                                                                                                       do\r
+                                                                                                                       {\r
+                                                                                                                               if ((*Ptr = *Ptr1) != '\r')\r
+                                                                                                                               {\r
+                                                                                                                                       Ptr++;\r
+                                                                                                                               }\r
+                                                                                                                       } while (*Ptr1++);\r
 \r
-                                                                                                       // Get back the new text file size\r
-                                                                                                       PtrCU[NbCU].SizeLoadSrc = strlen(Ptr = PtrCU[NbCU].PtrLoadSrc);\r
+                                                                                                                       // Get back the new text file size\r
+                                                                                                                       PtrCU[NbCU].SizeLoadSrc = strlen(Ptr = PtrCU[NbCU].PtrLoadSrc);\r
 \r
-                                                                                                       // Make sure the text file finish with a new line code '\n' (0xa)\r
-                                                                                                       if (PtrCU[NbCU].PtrLoadSrc[PtrCU[NbCU].SizeLoadSrc - 1] != '\n')\r
-                                                                                                       {\r
-                                                                                                               PtrCU[NbCU].PtrLoadSrc[PtrCU[NbCU].SizeLoadSrc++] = '\n';\r
-                                                                                                               PtrCU[NbCU].PtrLoadSrc[PtrCU[NbCU].SizeLoadSrc] = 0;\r
-                                                                                                       }\r
+                                                                                                                       // Make sure the text file finish with a new line code '\n' (0xa)\r
+                                                                                                                       if (PtrCU[NbCU].PtrLoadSrc[PtrCU[NbCU].SizeLoadSrc - 1] != '\n')\r
+                                                                                                                       {\r
+                                                                                                                               PtrCU[NbCU].PtrLoadSrc[PtrCU[NbCU].SizeLoadSrc++] = '\n';\r
+                                                                                                                               PtrCU[NbCU].PtrLoadSrc[PtrCU[NbCU].SizeLoadSrc] = 0;\r
+                                                                                                                       }\r
 \r
-                                                                                                       // Reallocate text file\r
-                                                                                                       if (PtrCU[NbCU].PtrLoadSrc = Ptr = (char *)realloc(PtrCU[NbCU].PtrLoadSrc, (PtrCU[NbCU].SizeLoadSrc + 1)))\r
-                                                                                                       {\r
-                                                                                                               // Count line numbers, based on the new line code '\n' (0xa), and finish each line with 0\r
-                                                                                                               do\r
-                                                                                                               {\r
-                                                                                                                       if (*Ptr == '\n')\r
+                                                                                                                       // Reallocate text file\r
+                                                                                                                       if (PtrCU[NbCU].PtrLoadSrc = Ptr = (char *)realloc(PtrCU[NbCU].PtrLoadSrc, (PtrCU[NbCU].SizeLoadSrc + 1)))\r
                                                                                                                        {\r
-                                                                                                                               PtrCU[NbCU].NbLinesLoadSrc++;\r
-                                                                                                                               *Ptr = 0;\r
+                                                                                                                               // Count line numbers, based on the new line code '\n' (0xa), and finish each line with 0\r
+                                                                                                                               do\r
+                                                                                                                               {\r
+                                                                                                                                       if (*Ptr == '\n')\r
+                                                                                                                                       {\r
+                                                                                                                                               PtrCU[NbCU].NbLinesLoadSrc++;\r
+                                                                                                                                               *Ptr = 0;\r
+                                                                                                                                       }\r
+                                                                                                                               } while (*++Ptr);\r
                                                                                                                        }\r
-                                                                                                               } while (*++Ptr);\r
+                                                                                                               }\r
                                                                                                        }\r
                                                                                                }\r
                                                                                        }\r
                                                                                }\r
+\r
+                                                                               fclose(SrcFile);\r
                                                                        }\r
+                                                                       else\r
+                                                                       {\r
+                                                                               // Source file doesn't exist\r
+                                                                               PtrCU[NbCU].Status = DWARFSTATUS_NOFILE;\r
+                                                                       }\r
+                                                               }\r
+                                                               else\r
+                                                               {\r
+                                                                       // Source file is outdated\r
+                                                                       PtrCU[NbCU].Status = DWARFSTATUS_OUTDATEDFILE;\r
                                                                }\r
-                                                               fclose(SrcFile);\r
+                                                       }\r
+                                                       else\r
+                                                       {\r
+                                                               // Source file doesn't have information\r
+                                                               PtrCU[NbCU].Status = DWARFSTATUS_NOFILEINFO;\r
                                                        }\r
                                                        break;\r
 \r
@@ -593,7 +625,7 @@ void DWARFManager_InitDMI(void)
                                        }\r
 \r
                                        // Get the source lines table located in the CU\r
-                                       if (dwarf_srclines(return_sib, &linebuf, &cnt, &error) == DW_DLV_OK)\r
+                                       if ((dwarf_srclines(return_sib, &linebuf, &cnt, &error) == DW_DLV_OK) && (PtrCU[NbCU].Status == DWARFSTATUS_OK))\r
                                        {\r
                                                if (cnt)\r
                                                {\r
@@ -903,7 +935,8 @@ void DWARFManager_InitDMI(void)
                                                                                // Get source line number and associated block of address\r
                                                                                for (Dwarf_Signed i = 0; i < cnt; ++i)\r
                                                                                {\r
-                                                                                       if ((PtrCU[NbCU].PtrUsedLinesSrc[i].StartPC >= return_lowpc) && (PtrCU[NbCU].PtrUsedLinesSrc[i].StartPC <= return_highpc))\r
+                                                                                       // Check the presence of the line in the memory frame\r
+                                                                                       if (PtrCU[NbCU].PtrUsedLinesSrc && (PtrCU[NbCU].PtrUsedLinesSrc[i].StartPC >= return_lowpc) && (PtrCU[NbCU].PtrUsedLinesSrc[i].StartPC <= return_highpc))\r
                                                                                        {\r
                                                                                                PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc = (DMIStruct_LineSrc *)realloc(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc, (PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc + 1) * sizeof(DMIStruct_LineSrc));\r
                                                                                                memset((void *)(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc + PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc), 0, sizeof(DMIStruct_LineSrc));\r
@@ -1371,16 +1404,16 @@ char *DWARFManager_GetSymbolnameFromAdr(size_t Adr)
 \r
 // Get complete source filename based from address\r
 // Return NULL if no source filename exists\r
-// Return the existence status (true or false) in Error if pointer not NULL\r
-char *DWARFManager_GetFullSourceFilenameFromAdr(size_t Adr, bool *Error)\r
+// Return the existence status in Status if pointer not NULL\r
+char *DWARFManager_GetFullSourceFilenameFromAdr(size_t Adr, DWARFstatus *Status)\r
 {\r
        for (size_t i = 0; i < NbCU; i++)\r
        {\r
                if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
                {\r
-                       if (Error)\r
+                       if (Status)\r
                        {\r
-                               *Error = PtrCU[i].PtrLoadSrc ? true : false;\r
+                               *Status = PtrCU[i].Status;\r
                        }\r
 \r
                        return PtrCU[i].PtrFullFilename;\r
index 9df4535..a1bcf77 100644 (file)
@@ -4,11 +4,21 @@
 #define __DWARFMANAGER_H__\r
 \r
 \r
+// Definition for the DWARF status of each source file\r
+typedef enum\r
+{\r
+       DWARFSTATUS_OK = 0x0,\r
+       DWARFSTATUS_OUTDATEDFILE = 0x1,\r
+       DWARFSTATUS_NOFILE = 0x2,\r
+       DWARFSTATUS_NOFILEINFO = 0x4,\r
+       DWARFSTATUS_UNKNOWN = 0xff\r
+}DWARFstatus;\r
+\r
 // Internal manager\r
 extern bool    DWARFManager_Reset(void);\r
 extern bool    DWARFManager_Close(void);\r
 extern void    DWARFManager_Init(void);\r
-extern int DWARFManager_ElfInit(Elf *ElfPtr);\r
+extern int DWARFManager_ElfInit(Elf *ElfPtr, struct _stat FileElfInfo);\r
 extern void DWARFManager_Set(size_t NbPathsInList, char **PtrListPaths);\r
 extern size_t DWARFManager_GetNbSources(void);\r
 \r
@@ -17,7 +27,7 @@ extern char *DWARFManager_GetFunctionName(size_t Adr);
 extern size_t DWARFManager_GetSrcLanguageFromIndex(size_t Index);\r
 \r
 // Source text files manager\r
-extern char    *DWARFManager_GetFullSourceFilenameFromAdr(size_t Adr, bool *Error);\r
+extern char    *DWARFManager_GetFullSourceFilenameFromAdr(size_t Adr, DWARFstatus *Status);\r
 extern char *DWARFManager_GetNumFullSourceFilename(size_t Index);\r
 extern char *DWARFManager_GetNumSourceFilename(size_t Index);\r
 \r
index 421e3e3..459e4b8 100644 (file)
@@ -15,6 +15,8 @@
 
 #include <stdlib.h>
 #include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
 #include "libelf/libelf.h"
 #include "libelf/gelf.h"
 #include "libdwarf.h"
@@ -145,9 +147,9 @@ void        ELFManager_Init(void)
 
 
 // ELF manager Dwarf Initialisation
-bool   ELFManager_DwarfInit(Elf *PtrElfMem)
+bool   ELFManager_DwarfInit(Elf *PtrElfMem, struct _stat FileElfInfo)
 {
-       return (ElfDwarf = (DWARFManager_ElfInit(PtrElfMem) == DW_DLV_OK) ? true : false);
+       return (ElfDwarf = (DWARFManager_ElfInit(PtrElfMem, FileElfInfo) == DW_DLV_OK) ? true : false);
 }
 
 
index 23c137f..06caa86 100644 (file)
@@ -35,7 +35,7 @@ typedef enum {
 
 // Internal manager
 extern void    ELFManager_Init(void);
-extern bool    ELFManager_DwarfInit(Elf *PtrElfMem);
+extern bool    ELFManager_DwarfInit(Elf *PtrElfMem, struct _stat FileElfInfo);
 extern Elf *ELFManager_MemOpen(char *PtrELFExe, size_t Size);
 extern int     ELFManager_MemEnd(void);
 extern void    ELFManager_Reset(void);
index a962ded..268898c 100644 (file)
@@ -97,7 +97,7 @@ void NewFnctBreakpointWindow::AddBreakpointAddress(void)
                {
                        // Set information based on address
                        Brk.Name = DBGManager_GetSymbolNameFromAdr(adr);
-                       Brk.Filename = DBGManager_GetFullSourceFilenameFromAdr(adr, &ok);
+                       Brk.Filename = DBGManager_GetFullSourceFilenameFromAdr(adr, NULL);
                        Brk.NumLine = DBGManager_GetNumLineFromAdr(adr, DBG_TAG_subprogram);
                        Brk.LineSrc = DBGManager_GetLineSrcFromAdrNumLine(adr, Brk.NumLine);
 
index 0dfa87e..c9b3a0e 100644 (file)
@@ -158,15 +158,15 @@ void SourcesWindow::RefreshContents(void)
        size_t m68kPC = m68k_get_reg(NULL, M68K_REG_PC);
        int index = 0;
        size_t i;
-       bool Error;
+       DBGstatus Status;
        char *Filename;
 
        // Check valid PC
        if (m68kPC && NbSourcesInfos)
        {
                // Get source filename pointed by PC address
-               Filename = DBGManager_GetFullSourceFilenameFromAdr(m68kPC, &Error);
-               if (Error && Filename)
+               Filename = DBGManager_GetFullSourceFilenameFromAdr(m68kPC, &Status);
+               if (!Status && Filename)
                {
                        // Look for a new tab
                        for (i = 0; i < NbSourcesInfos; i++, !index)
@@ -196,7 +196,7 @@ void SourcesWindow::RefreshContents(void)
                        // Source file doesn't exist
                        if (indexErrorTab == -1)
                        {
-                               indexErrorTab = sourcestabWidget->addTab(sourceErrorTab = new(SourceCWindow), tr("Source file not found"));
+                               indexErrorTab = sourcestabWidget->addTab(sourceErrorTab = new(SourceCWindow), tr("Source file not available"));
                                //sourceErrorTab->hide();
                        }
                        sourcestabWidget->setCurrentIndex(indexErrorTab);
index 6f618a6..40d8e13 100644 (file)
@@ -81,7 +81,7 @@ void CallStackBrowserWindow::RefreshContents(void)
 {
        char msg[1024];
        size_t Error = CS_NOERROR;
-       bool FilenameError;
+       DBGstatus FilenameStatus;
        unsigned int a6, Sa6, ret;
        char *Name;
        size_t NumError = 0;
@@ -127,7 +127,7 @@ void CallStackBrowserWindow::RefreshContents(void)
                                        sprintf(msg, "0x%06X", ret);
                                        model->setItem(NbRaw, 2, new QStandardItem(QString("%1").arg(msg)));
                                        // display the source filename from called source line
-                                       model->setItem(NbRaw++, 3, new QStandardItem(QString("%1").arg(((Name = DBGManager_GetFullSourceFilenameFromAdr(ret, &FilenameError)) && FilenameError) ? Name : "(N/A)")));
+                                       model->setItem(NbRaw++, 3, new QStandardItem(QString("%1").arg(((Name = DBGManager_GetFullSourceFilenameFromAdr(ret, &FilenameStatus)) && !FilenameStatus) ? Name : "(N/A)")));
 #endif
                                }
                                else
index 65542fd..de4fc82 100644 (file)
@@ -10,7 +10,7 @@
 // JPM  06/27/2016  Created this file\r
 // JPM  12/04/2016  Suport ELF debug information\r
 // JPM              Replacing the ELF support by the debugger information manager calls\r
-// JPM   Aug./2020  Display only the code related to the traced function, added different layouts, Qt/HTML text format support\r
+// JPM   Aug./2020  Display only the code related to the traced function, added different layouts & a status bar, Qt/HTML text format support\r
 //\r
 \r
 // STILL TO DO:\r
@@ -28,6 +28,9 @@
 // \r
 m68KDasmWindow::m68KDasmWindow(QWidget * parent/*= 0*/): QWidget(parent, Qt::Dialog),\r
 layout(new QVBoxLayout),\r
+#if MD_LAYOUTFILE == 1\r
+statusbar(new QStatusBar),\r
+#endif\r
 #ifdef MD_LAYOUTTEXTS\r
 text(new QTextBrowser),\r
 #endif\r
@@ -44,6 +47,12 @@ memBase(0)
        layout->addWidget(text);\r
 #endif\r
 \r
+       // Status bar\r
+#if MD_LAYOUTFILE == 1\r
+       layout->addWidget(statusbar);\r
+       setLayout(layout);\r
+#endif\r
+\r
        // Set layout\r
        setLayout(layout);\r
 }\r
@@ -59,7 +68,8 @@ void m68KDasmWindow::RefreshContents(void)
        size_t m68KPCNbrDisasmLines = 0;\r
        char *Symbol = NULL, *LineSrc, *CurrentLineSrc = NULL;\r
        bool m68kPCShow = false;\r
-       bool constant, adr, equal, Error;\r
+       bool constant, adr, equal;\r
+       DBGstatus Status;\r
        size_t j, i;\r
        size_t  nbr = vjs.nbrdisasmlines;\r
        char *PtrFullSource, *CurrentPtrFullSource = (char *)calloc(1, 1);\r
@@ -78,7 +88,7 @@ void m68KDasmWindow::RefreshContents(void)
                adr = constant = equal = false;\r
 \r
                // Display source filename based on the program address\r
-               if (vjs.displayFullSourceFilename && (PtrFullSource = DBGManager_GetFullSourceFilenameFromAdr(oldpc, &Error)) && strcmp(CurrentPtrFullSource, PtrFullSource))\r
+               if (vjs.displayFullSourceFilename && (PtrFullSource = DBGManager_GetFullSourceFilenameFromAdr(oldpc, &Status)) && strcmp(CurrentPtrFullSource, PtrFullSource))\r
                {\r
 #if defined(MD_LAYOUTFILE)\r
                        if (i)\r
@@ -100,15 +110,33 @@ void m68KDasmWindow::RefreshContents(void)
                                CurrentPtrFullSource = (char *)realloc(CurrentPtrFullSource, strlen(PtrFullSource) + 1);\r
                                strcpy(CurrentPtrFullSource, PtrFullSource);\r
 #if defined(MD_LAYOUTFILE)\r
-                               if (!Error)\r
+                               if (Status)\r
                                {\r
-                                       // Referenced filename does exist\r
+                                       // Referenced filename doesn't exist\r
                                        sprintf(string, "<font color='#ff0000'><b>%s</b></font><br>", PtrFullSource);\r
+#if MD_LAYOUTFILE == 1\r
+                                       // Display status bar\r
+                                       if ((Status & DBGSTATUS_OUTDATEDFILE))\r
+                                       {\r
+                                               statusbar->setStyleSheet("background-color: lightyellow; font: bold");\r
+                                               statusbar->showMessage(QString("Outdated source file"));\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               statusbar->setStyleSheet("background-color: tomato; font: bold");\r
+                                               statusbar->showMessage(QString("Unavailable source file"));\r
+                                       }\r
+#endif\r
                                }\r
                                else\r
                                {\r
-                                       // Referenced filename doesn't exist\r
+                                       // Referenced filename does exist\r
                                        sprintf(string, "<font color='#00ff00'><b>%s</b></font><br>", PtrFullSource);\r
+#if MD_LAYOUTFILE == 1\r
+                                       // Display status bar\r
+                                       statusbar->setStyleSheet("background-color: transparent; font: bold");\r
+                                       statusbar->showMessage(QString(""));\r
+#endif\r
                                }\r
                                nbr++;\r
                                s += QString(string);\r
@@ -118,7 +146,7 @@ void m68KDasmWindow::RefreshContents(void)
                else\r
                {\r
                        // Display line number based on the program address\r
-                       if ((NumLine = DBGManager_GetNumLineFromAdr(oldpc, DBG_NO_TAG)) && ((signed)NumLine > (signed)CurrentNumLine))\r
+                       if ((NumLine = DBGManager_GetNumLineFromAdr(oldpc, DBG_NO_TAG)) && ((signed)NumLine > (signed)CurrentNumLine) && !Status)\r
                        {\r
 #if MD_LAYOUTFILE != 1\r
                                if ((signed)CurrentNumLine < 0)\r
index e10ba93..77e31cc 100644 (file)
@@ -6,7 +6,7 @@
 // Who  When        What\r
 // ---  ----------  -------------------------------------------------------------\r
 // JPM  06/27/2016  Created this file\r
-// JPM   Aug./2020  Added different layouts\r
+// JPM   Aug./2020  Added different layouts, and a status bar\r
 //\r
 \r
 #ifndef __M68KDASMWIN_H__\r
@@ -38,6 +38,9 @@ class m68KDasmWindow: public QWidget
 \r
        private:\r
                QVBoxLayout *layout;\r
+#if MD_LAYOUTFILE == 1\r
+               QStatusBar *statusbar;\r
+#endif\r
 #ifdef MD_LAYOUTTEXTS\r
                QTextBrowser *text;\r
 #endif\r
index 73d255e..288f97a 100644 (file)
@@ -17,6 +17,7 @@
 // JPM  07/15/2016  DWARF format support\r
 // JPM  04/06/2019  Added ELF sections check\r
 // JPM  03/12/2020  Added ELF section types check and new error messages\r
+// JPM   Aug./2020  ELF executable file information\r
 //\r
 \r
 #include "file.h"\r
@@ -25,6 +26,8 @@
 #endif // _MSC_VER\r
 #include <stdarg.h>\r
 #include <string.h>\r
+#include <sys/types.h>\r
+#include <sys/stat.h>\r
 #include "crc32.h"\r
 #include "filedb.h"\r
 #include "eeprom.h"\r
@@ -147,6 +150,7 @@ bool JaguarLoadFile(char * path)
        int     DBGType = DBG_NO_TYPE;\r
        bool error;\r
        int err;\r
+       struct _stat _statbuf;\r
 \r
        jaguarROMSize = JaguarLoadROM(buffer, path);\r
 \r
@@ -200,9 +204,13 @@ WriteLog("FILE: Cartridge run address is reported as $%X...\n", jaguarRunAddress
 \r
                if (PtrELFExe != NULL)\r
                {\r
+                       // check the ELF version\r
                        if ((elf_version(EV_CURRENT) != EV_NONE) && (ElfMem = ELFManager_MemOpen(PtrELFExe, jaguarROMSize)))\r
                        {\r
-                               if (ELFManager_DwarfInit(ElfMem))\r
+                               // get the file information\r
+                               _stat(path, &_statbuf);\r
+\r
+                               if (ELFManager_DwarfInit(ElfMem, _statbuf))\r
                                {\r
                                        DBGType |= DBG_ELFDWARF;\r
                                }\r