ddd fixes
[fw/sdcc] / debugger / mcs51 / sdcdb.c
index 53a1a38cf253044b872a34211ed4e932213a4a65..260a744df6f1dfb0a41c9f136baafe493709233e 100644 (file)
 #include "cmd.h"
 #include "newalloc.h"
 
+#ifdef SDCDB_DEBUG
+int   sdcdbDebug = 0;
+#endif
+
 char *currModName = NULL;
 cdbrecs *recsRoot = NULL ;
 set  *modules = NULL;    /* set of all modules */
@@ -39,6 +43,8 @@ int nLinkrecs = 0;
 linkrec **linkrecs = NULL; /* all linkage editor records */
 context *currCtxt = NULL;
 short fullname = 0;
+short showfull = 0;
+short userinterrupt = 0;
 char *ssdirl = DATADIR LIB_DIR_SUFFIX ":" DATADIR LIB_DIR_SUFFIX "/small" ;
 char *simArgs[40];
 int nsimArgs = 0;
@@ -75,19 +81,20 @@ struct cmdtab
     },
     { "c"        ,  cmdContinue   , NULL },
 
+    { "disassemble",cmdDisasmF    , "x disassemble asm commands\n" },
     { "delete" ,  cmdDelUserBp  ,
       "{d}elete n\t\t clears break point number n\n"
     },
-    { "d"        ,  cmdDelUserBp  , NULL },
-
-    { "help"     ,  cmdHelp       ,
-      "{h|?}elp\t\t this message\n"
+    { "display"    ,  cmdDisplay     ,
+      "display [<variable>]\t print value of given variable each time the program stops\n"
     },
-    { "?"        ,  cmdHelp       , NULL },
-    { "h"        ,  cmdHelp       , NULL },
+    { "undisplay"  ,  cmdUnDisplay   ,
+      "undisplay [<variable>]\t dont display this variable or all\n"
+    },
+    { "d"        ,  cmdDelUserBp  , NULL },
 
     { "info"     ,  cmdInfo       ,
-      "info <break stack frame registers>\n"
+      "info <break stack frame registers all-registers>\n"
       "\t list all break points, call-stack, frame or register information\n"
     },
 
@@ -106,7 +113,7 @@ struct cmdtab
       "show"
       " <copying warranty>\t copying & distribution terms, warranty\n"
     },
-    { "set"      ,  cmdSetOption  , "set <srcmode>\t\t toggle between c/asm.\n" },
+    { "set"      ,  cmdSetOption  , "set <srcmode>\t\t toggle between c/asm.\nset variable <var> = >value\t\tset variable to new value\n" },
     { "step"     ,  cmdStep       ,
       "{s}tep\t\t\t Step program until it reaches a different source line.\n"
     },
@@ -126,6 +133,9 @@ struct cmdtab
     { "print"    ,  cmdPrint      ,
       "{p}rint <variable>\t print value of given variable\n"
     },
+    { "output"   ,  cmdOutput      ,
+      "output <variable>\t print value of given variable without $ and newline \n"
+    },
     { "p"        ,  cmdPrint      , NULL },
     { "file"     ,  cmdFile       ,
       "file <filename>\t\t load symbolic information from <filename>\n"
@@ -137,14 +147,22 @@ struct cmdtab
       "{fi}nish\t\t execute till return of current function\n"
     },
     { "fi"       ,  cmdFinish     , NULL },
+    { "where"    ,  cmdWhere      , "where\t\t\t print stack\n" },
     { "fr"       ,  cmdFrame      , NULL },
     { "f"        ,  cmdFrame      , NULL },
+    { "x /i"     ,  cmdDisasm1    , "x\t\t disassemble one asm command\n" },
     { "!"        ,  cmdSimulator  ,
       "!<simulator command>\t send a command directly to the simulator\n"
     },
     { "."        ,  cmdSimulator  ,
       ".{cmd}\t switch from simulator or debugger command mode\n"
     },
+    { "help"     ,  cmdHelp       ,
+      "{h|?}elp\t [CMD_NAME | 0,1,2,3(help page)] (general help or specific help)\n"
+    },
+    { "?"        ,  cmdHelp       , NULL },
+    { "h"        ,  cmdHelp       , NULL },
+
     { "quit"     ,  cmdQuit       ,
       "{q}uit\t\t\t \"Watch me now. Iam going Down. My name is Bobby Brown\"\n"
     },
@@ -433,7 +451,7 @@ static void functionPoints ()
 
   sym = func->sym;
 
-  Dprintf(D_sdcdb, ("func '%s' has entry '%x' exit '%x'\n",
+  Dprintf(D_sdcdb, ("sdcdb: func '%s' has entry '0x%x' exit '0x%x'\n",
          func->sym->name,
          func->sym->addr,
          func->sym->eaddr));
@@ -498,20 +516,23 @@ static void functionPoints ()
   }
 
 #ifdef SDCDB_DEBUG
-  Dprintf(D_sdcdb, ("function '%s' has the following C exePoints\n",
+  if (!( D_sdcdb & sdcdbDebug))
+      return;
+
+  Dprintf(D_sdcdb, ("sdcdb: function '%s' has the following C exePoints\n",
          func->sym->name));
   {
       exePoint *ep;
 
       for (ep = setFirstItem(func->cfpoints); ep;
      ep = setNextItem(func->cfpoints))
-     Dprintf(D_sdcdb, ("{%x,%d} %s",
+     Dprintf(D_sdcdb, ("sdcdb: {0x%x,%d} %s",
          ep->addr,ep->line,mod->cLines[ep->line]->src));
 
-      Dprintf(D_sdcdb, (" and the following ASM exePoints\n"));
+      Dprintf(D_sdcdb, ("sdcdb:  and the following ASM exePoints\n"));
       for (ep = setFirstItem(func->afpoints); ep;
            ep = setNextItem(func->afpoints))
-        Dprintf (D_sdcdb, ("{%x,%d} %s",
+        Dprintf (D_sdcdb, ("sdcdb: {0x%x,%d} %s",
             ep->addr,ep->line,mod->asmLines[ep->line]->src));
   }
 #endif
@@ -581,7 +602,8 @@ int cmdFile (char *s,context *cctxt)
     functionPoints();
 
     /* start the simulator & setup connection to it */
-    openSimulator((char **)simArgs,nsimArgs);
+    if ( sock == -1 )
+        openSimulator((char **)simArgs,nsimArgs);
     fprintf(stdout,"%s",simResponse());
     /* now send the filename to be loaded to the simulator */
     sprintf(buffer,"%s.ihx",s);
@@ -614,6 +636,15 @@ int cmdHelp (char *s, context *cctxt)
       if (endline > 0)
         startline = endline - 20;
     }
+    else if (*s)
+    {
+        for (i = 0 ; i < (sizeof(cmdTab)/sizeof(struct cmdtab)) ; i++) 
+        {
+            if ((cmdTab[i].htxt) && !strcmp(cmdTab[i].cmd,s))
+                fprintf(stdout,"%s",cmdTab[i].htxt);             
+        }
+        return 0;
+    }
 
     for (i = 0 ; i < (sizeof(cmdTab)/sizeof(struct cmdtab)) ; i++) {
 
@@ -693,15 +724,17 @@ int interpretCmd (char *s)
         rv = (*cmdTab[i].cmdfunc)(s + strlen(cmdTab[i].cmd),currCtxt);
 
         /* if full name then give the file name & position */
-        if (fullname && currCtxt && currCtxt->func) {
+        if (fullname && showfull && currCtxt && currCtxt->func) {
+          showfull = 0;
           if (srcMode == SRC_CMODE)
-            fprintf(stdout,"\032\032%s:%d:1\n",
+            fprintf(stdout,"\032\032%s:%d:1:beg:0x%08x\n",
                     currCtxt->func->mod->cfullname,
-                    currCtxt->cline+1);
+                    currCtxt->cline,currCtxt->addr);
           else
-            fprintf(stdout,"\032\032%s:%d:1\n",
+            fprintf(stdout,"\032\032%s:%d:1:beg:0x%08x\n",
                     currCtxt->func->mod->afullname,
-                    currCtxt->asmline+1);
+                    currCtxt->asmline,currCtxt->addr);
+          displayAll(currCtxt);
         }
         goto ret;
       }
@@ -768,7 +801,7 @@ static void parseCmdLine (int argc, char **argv)
     char *filename = NULL;
     int passon_args_flag = 0;  /* if true, pass on args to simulator */
 
-    Dprintf(D_sdcdb, ("parseCmdLine\n"));
+    Dprintf(D_sdcdb, ("sdcdb: parseCmdLine\n"));
 
     for ( i = 1; i < argc ; i++) {
   //fprintf(stdout,"%s\n",argv[i]);
@@ -809,6 +842,13 @@ static void parseCmdLine (int argc, char **argv)
     continue;
       }
 
+#ifdef SDCDB_DEBUG
+      if (strncmp(argv[i],"-d=",3) == 0) {
+          sdcdbDebug = strtol(&argv[i][3],0,0);
+          continue;
+      }
+#endif
+
       /* model string */
       if (strncmp(argv[i],"-m",2) == 0) {
         strncpy(model_str, &argv[i][2], 15);
@@ -874,6 +914,53 @@ static void parseCmdLine (int argc, char **argv)
   cmdFile(filename,NULL);
 }
 
+/*-----------------------------------------------------------------*/
+/* setsignals -  catch some signals                                */
+/*-----------------------------------------------------------------*/
+#include <signal.h>
+static void
+bad_signal(int sig)
+{
+    if ( simactive )
+        closeSimulator();
+    exit(1);
+}
+
+static void
+sigintr(int sig)
+{
+    /* may be interrupt from user: stop debugger and also simulator */
+    userinterrupt = 1;
+    sendSim("\n");
+}
+
+/* the only child can be the simulator */
+static void sigchld(int sig)
+{
+    /* the only child can be the simulator */
+    int status, retpid;
+    retpid = wait ( &status );
+    /* if ( retpid == simPid ) */
+    simactive = 0;
+}
+
+static void
+setsignals()
+{
+    signal(SIGHUP , bad_signal);               
+    signal(SIGINT , sigintr ); 
+    signal(SIGTERM, bad_signal);       
+    signal(SIGCHLD, sigchld );
+
+    signal(SIGABRT, bad_signal);
+    signal(SIGALRM, bad_signal);
+    signal(SIGFPE,  bad_signal);
+    signal(SIGILL,  bad_signal);
+    signal(SIGPIPE, bad_signal);
+    signal(SIGQUIT, bad_signal);
+    signal(SIGSEGV, bad_signal);
+}
+
 /*-----------------------------------------------------------------*/
 /* main -                                                          */
 /*-----------------------------------------------------------------*/
@@ -881,13 +968,14 @@ static void parseCmdLine (int argc, char **argv)
 int main ( int argc, char **argv)
 {
     printVersionInfo();
-    printf("WARNING: SDCDB is EXPERIMENTAL and NOT A FULLY FUNCTIONING TOOL.\n");
+    printf("WARNING: SDCDB is EXPERIMENTAL.\n");
 
     simArgs[nsimArgs++] = "s51";
     simArgs[nsimArgs++] = "-P";
     simArgs[nsimArgs++] = "-r 9756";
     /* parse command line */
 
+    setsignals();
     parseCmdLine(argc,argv);
 
     commandLoop();