From 4c4ad0fef53082292bf221efa00c3b336309160d Mon Sep 17 00:00:00 2001 From: ketmar Date: Fri, 20 Oct 2023 04:58:08 +0000 Subject: [PATCH] UrForth: some new words for debuggers FossilOrigin-Name: 934780b8e55474cf8888e4ab75b2851edd285897dbccd02dba5eeb4c9cd5fed3 --- dox/urforth.txt | 8 +++++++- src/liburforth/urforth.c | 53 +++++++++++++++++++++++++++++++++++++----------- 2 files changed, 48 insertions(+), 13 deletions(-) diff --git a/dox/urforth.txt b/dox/urforth.txt index a7e7b74..3694e5a 100644 --- a/dox/urforth.txt +++ b/dox/urforth.txt @@ -688,7 +688,13 @@ convert instruction pointer to NFA. return 0 if cannot. DEBUG:IP->FILE/LINE ( ip -- addr count line TRUE / FALSE ) -name is at PAD; it is safe to use PAD, because each task has its own temp image. +name is at PAD; it is safe to use PAD, because each task has its +own temp image. + +DEBUG:IP->FILE-HASH/LINE +( ip -- len hash line TRUE / FALSE ) +return unique file hash and name length instead of string name. +used in debugger. STRING:= ( a0 c0 a1 c1 -- bool ) diff --git a/src/liburforth/urforth.c b/src/liburforth/urforth.c index 7f09704..33d95b5 100644 --- a/src/liburforth/urforth.c +++ b/src/liburforth/urforth.c @@ -1579,12 +1579,16 @@ static uint32_t ufoFindWordForIP (const uint32_t ip) { // WARNING: this is SLOW! // //========================================================================== -static const char *ufoFindFileForIP (uint32_t ip, uint32_t *line) { +static const char *ufoFindFileForIP (uint32_t ip, uint32_t *line, + uint32_t *nlen, uint32_t *nhash) +{ if (ip != 0 && ufoDebugImageUsed != 0) { const char *filename = NULL; uint32_t dbgpos = 4u; // first line header info uint32_t lastline = 0; uint32_t lastdp = 0; + uint32_t namelen = 0; + uint32_t namehash = 0; while (dbgpos < ufoDebugImageUsed) { if (ufoDebugImage[dbgpos] == 0) { // new file info @@ -1592,14 +1596,17 @@ static const char *ufoFindFileForIP (uint32_t ip, uint32_t *line) { const uint32_t fhdrSize = *(const uint16_t *)(ufoDebugImage + dbgpos); dbgpos += 2u; lastdp = ufoGetDebugVarInt(dbgpos); dbgpos = ufoSkipDebugVarInt(dbgpos); + uint32_t infoOfs; if (fhdrSize == 0) { // reused - const uint32_t infoOfs = *(const uint32_t *)(ufoDebugImage + dbgpos); dbgpos += 4u; - filename = (const char *)(ufoDebugImage + infoOfs + 3u * 4u); + infoOfs = *(const uint32_t *)(ufoDebugImage + dbgpos); dbgpos += 4u; } else { // new - filename = (const char *)(ufoDebugImage + dbgpos + 3u * 4u); + infoOfs = dbgpos; } + filename = (const char *)(ufoDebugImage + infoOfs + 3u * 4u); + namelen = ((const uint32_t *)(ufoDebugImage + infoOfs))[2]; + namehash = ((const uint32_t *)(ufoDebugImage + infoOfs))[1]; if (filename[0] == 0) filename = NULL; dbgpos += fhdrSize; lastline = ~(uint32_t)0; @@ -1612,6 +1619,8 @@ static const char *ufoFindFileForIP (uint32_t ip, uint32_t *line) { dbgpos = ufoSkipDebugVarInt(dbgpos); if (ip >= lastdp && ip < lastdp + edp) { if (line) *line = lastline; + if (nlen) *nlen = namelen; + if (nhash) *nhash = namehash; return filename; } lastdp += edp; @@ -1619,6 +1628,8 @@ static const char *ufoFindFileForIP (uint32_t ip, uint32_t *line) { } } if (line) *line = 0; + if (nlen) *nlen = 0; + if (nhash) *nlen = 0; return NULL; } @@ -2730,7 +2741,7 @@ static void ufoBacktrace (uint32_t ip) { if (nfa != 0) { fprintf(stderr, " **: %8u -- ", ip); ufoBTShowWordName(nfa); - fname = ufoFindFileForIP(ip, &fline); + fname = ufoFindFileForIP(ip, &fline, NULL, NULL); if (fname != NULL) { fprintf(stderr, " (at %s:%u)", fname, fline); } fputc('\n', stderr); } @@ -2745,7 +2756,7 @@ static void ufoBacktrace (uint32_t ip) { if (nfa != 0) { fprintf(stderr, " %2u: %8u -- ", ufoRP - rp - 1u, val); ufoBTShowWordName(nfa); - fname = ufoFindFileForIP(val - 4u, &fline); + fname = ufoFindFileForIP(val - 4u, &fline, NULL, NULL); if (fname != NULL) { fprintf(stderr, " (at %s:%u)", fname, fline); } fputc('\n', stderr); } else { @@ -4635,18 +4646,35 @@ UFWORD(IP2NFA) { UFWORD(IP2FILELINE) { const uint32_t ip = ufoPop(); uint32_t fline; - const char *fname = ufoFindFileForIP(ip, &fline); + const char *fname = ufoFindFileForIP(ip, &fline, NULL, NULL); if (fname != NULL) { UFCALL(PAD); - const uint32_t addr = ufoPeek(); + uint32_t addr = ufoPeek(); uint32_t count = 0; while (*fname != 0) { - ufoImgPutU8(addr + count, *(const unsigned char *)fname); - fname += 1u; count += 1u; + ufoImgPutU8(addr, *(const unsigned char *)fname); + fname += 1u; addr += 1u; count += 1u; } - ufoImgPutU8(addr + count, 0); // just in case - ufoPush(addr); + ufoImgPutU8(addr, 0); // just in case ufoPush(count); + ufoPush(fline); + ufoPushBool(1); + } else { + ufoPushBool(0); + } +} + + +// IP->FILE-HASH/LINE +// ( ip -- len hash line TRUE / FALSE ) +UFWORD(IP2FILEHASHLINE) { + const uint32_t ip = ufoPop(); + uint32_t fline, fhash, flen; + const char *fname = ufoFindFileForIP(ip, &fline, &flen, &fhash); + if (fname != NULL) { + ufoPush(flen); + ufoPush(fhash); + ufoPush(fline); ufoPushBool(1); } else { ufoPushBool(0); @@ -7645,6 +7673,7 @@ UFO_DISABLE_INLINE void ufoInitDebugWords (void) { UFWORDX("(BP)", MT_DEBUGGER_BP); UFWORDX("IP->NFA", IP2NFA); UFWORDX("IP->FILE/LINE", IP2FILELINE); + UFWORDX("IP->FILE-HASH/LINE", IP2FILEHASHLINE); ufoVocSetOnlyDefs(ufoForthVocId); } -- 2.11.4.GIT