From: Dibyendu Majumdar (dibyendu_at_mazumdar.demon.co.uk)
Date: Thu Dec 03 1998 - 00:05:22 GMT
Ian, I have fixed a couple of more problems when debugging CX executables with UPS 3.33. I have been building UPS, CX, XC and CG on RedHat 5.1 (intel) (Linux 2.0.34). Following summarises ALL the fixes so far: C Interpreter ------------- 1. The UPS C interpreter executables could not be built initially because of missing references to demangle_name_2(). 2. CX and CG failed because of libvar botch. This was caused by cc.c not including the same headers (particularly <mtrprog/ifdefs.h>) as xc_builtins.c. 3. stderr, stdout, stderr, errno were inaccessible from interpreted code. Now they can be accessed (readonly) by defining following macros: #define stderr _stderr_() #define stdout _stdout_() #define stdin _stdin_() #define errno _errno_() Deficiencies in the C Interpreter --------------------------------- So far, I have found the following deficiencies in the interpreter: 1. Following does not work: typedef enum bool bool; enum bool { false, true }; However, rearranging above as follows works: enum bool { false, true }; typedef enum bool bool; 2. enum values are not automatically converted to int - example, following code does not work: extern int printf(const char *, ...); enum bool { false, true }; typedef enum bool bool; int main(void) { bool boolean = true; int integer = true; // fails printf("boolean = %s\n", boolean ? "true" : "false"); // fails return 0; } 3. The increment (++) or decrement (--) operators do not work with floating point values. 4. Double values cannot be returned from external C routines called from interpreted code. This means standard C functions such as atof(), difftime() cannot be called from interpreted code. However, an interpreted atof() works. 5. Arrays and structures cannot be initialised in functions. For example, this doesn't work: int func(void) { int array[] = { 1, 2 }; } UPS Debugger ------------ I think I have fixed some problems in the UPS debugger when debugging CX executables: 1. The debugger aborted with segmentation fault because demangle_name_2() did not recognise CX executables. My solution is described in the diff, but is dubious. 2. The debugger complained that there was no line number information despite compiling with -g flag. 3. The debugger aborted with segmentation fault in open_source_file() in st_util.c. 4. When debugging an executable linked from several sources, the debugger was unable to step into code that was in a different source. 5. The debugger could not step through code generated from some switch statements (SWITCH_ON_CHAIN category). The program behaved incorrectly when attempting to do so. 6. The debugger failed with segmentation fault when attempting to step through a switch statement. Outstanding problems in UPS Debugger ------------------------------------ I still cannot debug a C source file directly. The same problem as in (3) above. Haven't figured out how to fix it. NEXT doesnot work always (specially when stepping over a function). It causes UPS to panic (graj NYI). Another thing ------------- I am using UPS to debug UPS itself. Has worked fine so far. Diffs ---- A diff is attached. Thanks and Regards ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ./Makefile differs ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 22c22 < X11INCLUDE=-I/usr/openwin/include --- > #X11INCLUDE=-I/usr/openwin/include 30c30 < #X11LIB = /usr/X11/lib/libX11.a --- > X11LIB = /usr/X11R6/lib/libX11.a 59,60c59,60 < CC = cc < CFLAGS = -g --- > CC = gcc > CFLAGS = -g -Wall -DOS_LINUX 63,65c63,65 < RANLIB = : < SVR4_LINKFLAGS=-R/usr/openwin/lib -L/usr/openwin/lib < LINKFLAGS = ${SVR4_LINKFLAGS} --- > #RANLIB = : > #SVR4_LINKFLAGS=-R/usr/openwin/lib -L/usr/openwin/lib > #LINKFLAGS = ${SVR4_LINKFLAGS} 68c68 < #RANLIB = ranlib --- > RANLIB = ranlib ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ./lib/libedit/render.c differs ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 750c750,751 < *iptr++; --- > /* Ladanyi */ > iptr++; 865c866,867 < *iptr++; --- > /* Ladanyi */ > iptr++; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ./ups/ao_target.c differs ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 22a23,27 > /* Ladanyi */ > #ifdef OS_LINUX > #include <sys/reg.h> > #endif > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ./ups/ao_ptrace.c differs ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 110a111,116 > /* Ladanyi */ > #if defined(OS_LINUX) > #include <sys/ptrace.h> > #include <sys/reg.h> > #endif > 118d123 < #if defined(OS_LINUX) 120a126,128 > #if defined(OS_LINUX) > > /** Ladanyi - commented out 122a131 > */ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ./ups/ao_symload.c differs ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 100c100,101 < #ifdef OS_SUNOS --- > /* Ladanyi */ > #if defined (OS_SUNOS) || defined (OS_LINUX) 384c385,386 < #ifdef OS_SUNOS --- > /* Ladanyi */ > #if defined (OS_SUNOS) || defined(OS_LINUX) 1820c1822,1823 < return TRUE; --- > /* Dibyendu */ > return likely; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ./ups/ao_symparse.c differs ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 564c564,565 < #ifdef OS_SUNOS_5 --- > /* Ladanyi */ > #if defined (OS_SUNOS_5) || defined (OS_LINUX) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ./ups/ao_symscan.c differs ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 213c213,214 < #ifdef OS_SUNOS --- > /* Ladanyi */ > #if defined (OS_SUNOS) || defined (OS_LINUX) 562c563,564 < #ifdef OS_SUNOS --- > /* Ladanyi */ > #if defined (OS_SUNOS) || defined (OS_LINUX) 814c816,817 < #ifdef OS_SUNOS --- > /* Ladanyi */ > #if defined (OS_SUNOS) || defined (OS_LINUX) 855c858,859 < #ifdef OS_SUNOS --- > /* Ladanyi */ > #if defined (OS_SUNOS) || defined(OS_LINUX) 1204c1208,1209 < #ifdef OS_SUNOS --- > /* Ladanyi */ > #if defined (OS_SUNOS) || defined (OS_LINUX) 2176,2177c2181,2192 < demangle_name(name, len, alloc_id, ptr, func, < ao_compiler(fil, FALSE, CT_UNKNOWN)); --- > /* Dibyendu : when debugging CX executables, demangle_name() does > * not make sense - so avoid calling it. I am assuming that CT_UNKNOWN > * is not a valid compiler type - and the default. Ideally CX/CG > * should get their own type. > * ao_compiler() is fooled by setting FI_FOUND_COMPILER flag when > * loading a CX executable (see xc_text.c). > */ > Compiler_type ct = ao_compiler(fil, FALSE, CT_UNKNOWN); > if (ct == CT_UNKNOWN) > *ptr = strdup(name); > else > demangle_name(name, len, alloc_id, ptr, func, ct); 5137a5153 > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ./ups/ao_text.c differs ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 28a29,33 > /* Ladanyi */ > #ifdef OS_LINUX > #include <sys/reg.h> > #endif > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ./ups/cc.c differs ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 11a12,30 > /* Dibyendu */ > #include <mtrprog/ifdefs.h> > > #include <sys/types.h> > #include <time.h> > #include <sys/stat.h> > #include <stdio.h> > #include <fcntl.h> > #include <ctype.h> > #include <errno.h> > > #if defined (OS_SUNOS_5) && defined (__CLCC__) > #include <unistd.h> > #endif > > #include <local/ukcprog.h> > > /* Dibyendu */ > #if 0 20a40,42 > /* Dibyendu */ > #endif > 25a48,59 > /* Dibyendu */ > #include "xc_opcodes.h" > #include "xc_machine.h" > #include "xc_builtins.h" > > #ifdef BUILTIN_X11 > #include <X11/Xlib.h> > #include <X11/Xutil.h> > #include <X11/Xresource.h> > extern int _Xdebug; > #endif > 301a336 > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ./ups/xc_text.c differs ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 342c342,343 < xf = (xc_fidata_t *)alloc(ma->ma_apool, sizeof(xc_fudata_t)); --- > /* Dibyendu */ > xf = (xc_fidata_t *)alloc(ma->ma_apool, sizeof(xc_fidata_t)); 922c923,925 < panic("duplicate breakpoint in xc_tswap"); --- > /* panic("duplicate breakpoint in xc_tswap"); */ > /* Dibyendu */ > errf("duplicate breakpoint in xc_tswap"); 1117a1121,1128 > > /* Dibyendu : added to fool ao_compiler() into returning > * CT_UNKNOWN when running UPS over a CX executable. > * This causes demangle_name_2() to do nothing > * (see ao_symscan.c). > */ > filtab[i]->fi_flags |= FI_FOUND_COMPILER; > 1346a1358,1363 > /* Dibyendu - not sure if this is correct - but seems to work > * for single source CX executables. > */ > xf->xf_letab = xltab; > xf->xf_letab_size = os->os_letab_count; > 1485a1503,1508 > > /* Dibyendu - ln_fil was not being set causing segmentation > * fault. > */ > ln->ln_fil = f->fu_fil; > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ./ups/xc_builtins.c differs ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 106a107,114 > /* Dibyendu */ > #ifdef OS_LINUX > static FILE* builtin_stdin PROTO((void)); > static FILE* builtin_stderr PROTO((void)); > static FILE* builtin_stdout PROTO((void)); > static int builtin_errno PROTO((void)); > #endif > 491a500,527 > > /* Dibyendu */ > #ifdef OS_LINUX > static FILE* > builtin_stdin(void) > { > return stdin; > } > > static FILE* > builtin_stdout(void) > { > return stdout; > } > > static FILE* > builtin_stderr(void) > { > return stderr; > } > > static int > builtin_errno(void) > { > return errno; > } > #endif > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ./ups/ci_compile.c differs ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1100c1100,1101 < if (tx->tx_max_sp & sizeof(stackword_t) != 0) --- > /* Dibyendu */ > if ((tx->tx_max_sp % sizeof(stackword_t)) != 0) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ./ups/ci_opcodes.c differs ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 668c668,670 < if (val == switchval) --- > if (val == switchval) { > /* Dibyendu : this was missing */ > pc += (short)GETWORD(pc); 669a672 > } 675c678,679 < return 0; --- > /* Dibyendu : incorrectly returned 0 causing segmentation fault */ > return pc; 709c713 < pc = get_pc_after_switch_on_chain(pc, (int)ma->ma_sp[0]); --- > pc = get_pc_after_switch_on_chain(pc, (int)(ma->ma_sp[0])); 793c797,799 < if (func_index >= 0) { --- > /* Dibyendu : following looks incorrect - see xc_machine.c */ > /* if (func_index >= 0) { */ > { 802c808,812 < er = fcf->cf_funcrefs[-func_index]; --- > /* Dibyendu : following looks incorrect - see > * xc_machine.c. > */ > /* er = fcf->cf_funcrefs[-func_index]; */ > er = fcf->cf_funcrefs[func_index]; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ./ups/cx.c differs ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 213a214,227 > > /* Ian Edwards supplied dummy */ > void > demangle_name_2(name, len, alloc_id, ptr, func, fil) > char *name; > int len; > alloc_pool_t *alloc_id; > char **ptr; > int func; > fil_t *fil; > { > *ptr = strdup (name); > } > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ./ups/cg.c differs ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 148a149,161 > /* Ian Edwards supplied dummy */ > void > demangle_name_2(name, len, alloc_id, ptr, func, fil) > char *name; > int len; > alloc_pool_t *alloc_id; > char **ptr; > int func; > fil_t *fil; > { > *ptr = strdup (name); > } > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ./ups/cx_libfuncs.h differs ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 87a88,95 > /* Dibyendu */ > #if defined(OS_LINUX) > F2(FILE *, builtin_stdin, _stdin_) > F2(FILE *, builtin_stdout, _stdout_) > F2(FILE *, builtin_stderr, _stderr_) > F2(int, builtin_errno, _errno_) > #endif > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ./ups/Makefile differs ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 23c23 < default_target: ${TARGET} --- > default_target: ${TARGET} ${CX_BINARY} ${XC_BINARY} ${CG_BINARY}
This archive was generated by hypermail 2.1.4 : Wed Feb 13 2002 - 21:51:32 GMT