This patch adds support for inline procedure names, a non-intrusive debug method supported by GSBug and NiftyList. See IIgs technote #103 for more information.
Setting bit 15 (0x8000) of the #pragma debug
directive enables
inline names. Inline names will not be generated for asm
functions.
Unified diff:
==== cgi.pas (text) ==== @@ -307,6 +307,7 @@ currentSegment,defaultSegment: segNameType; {current & default seg names} segmentKind: integer; {kind field of segment (ored with start/data)} debugFlag: boolean; {generate debugger calls?} + debugStrFlag: boolean; {gsbug/niftylist debug names?} dataBank: boolean; {save, restore data bank?} floatCard: integer; {0 -> SANE; 1 -> FPE} floatSlot: integer; {FPE slot} @@ -764,6 +765,7 @@ rangeCheck := false; {don't generate range checks} profileFlag := false; {don't generate profiling code} debugFlag := false; {don't generate debug code} +debugStrFlag := false; {don't generate gsbug debug strings} traceBack := false; {don't generate traceback code} volatile := false; {no volatile quialifiers found} ==== gen.pas (text) ==== @@ -4121,11 +4121,26 @@ end; {GenDviMod} - procedure GenEnt; + procedure GenEnt(op: icptr); + var + i: integer; + len: integer; { Generate code for a pc_ent } begin {GenEnt} + + if debugStrFlag then begin {gsbug/niftylist debug string} + len := length(op^.lab^); + CnOut(m_brl); + CnOut2(len + 3); + CnOut2($7771); + CnOut(len); + for i := 1 to len do + CnOut(ord(op^.lab^[i])); + end; + + if rangeCheck then begin {if range checking is on, check for a stack overflow} GenNative(m_pea, immediate, localSize - returnSize - 1, nil, 0); GenCall(1); @@ -5417,7 +5432,7 @@ pc_cup: GenCup(op); pc_dec,pc_inc: GenIncDec(op, nil); pc_dvi,pc_mod,pc_udi,pc_uim: GenDviMod(op); - pc_ent: GenEnt; + pc_ent: GenEnt(op); pc_equ,pc_neq: GenEquNeq(op, op^.opcode, 0); pc_fjp,pc_tjp: GenFjpTjp(op); pc_geq,pc_grt,pc_leq,pc_les: GenCmp(op, op^.opcode, 0); ==== Scanner.pas (text) ==== @@ -2604,6 +2604,7 @@ profileFlag := odd(val >> 2); traceBack := odd(val >> 3); checkStack := odd(val >> 4); + debugStrFlag := odd(val >> 15); profileFlag := profileFlag or debugFlag; if token.kind <> eolsy then ==== Parser.pas (text) ==== @@ -3414,7 +3414,7 @@ firstCompoundStatement := true; Gen0 (dc_pin); if not isAsm then - Gen0(pc_ent); + Gen1Name(pc_ent, 0, variable^.name); nextLocalLabel := 1; {initialize GetLocalLabel} returnLabel := GenLabel; {set up an exit point} tempList := nil; {initialize the work label list}