From b2661d12beef1efab4ffaa54b7d1ced23e819883 Mon Sep 17 00:00:00 2001 From: pierre Date: Tue, 22 Sep 1998 17:13:42 +0000 Subject: [PATCH] + browsing updated and developed records and objects fields are also stored --- compiler/browser.pas | 78 ++++++++++++++++++++++++++++++++++++------- compiler/files.pas | 13 ++++++-- compiler/gdb.pas | 7 +++- compiler/parser.pas | 19 ++++++++++- compiler/pmodules.pas | 55 ++++++++++++++++++++++++++---- compiler/switches.pas | 8 +++-- compiler/symppu.inc | 8 ++++- 7 files changed, 163 insertions(+), 25 deletions(-) diff --git a/compiler/browser.pas b/compiler/browser.pas index 0a2427b64f..7a00d921ff 100644 --- a/compiler/browser.pas +++ b/compiler/browser.pas @@ -67,8 +67,9 @@ type procedure closelog; procedure ident; procedure unident; - procedure browse_symbol(s : string); + procedure browse_symbol(const sr : string); procedure list_elements; + procedure list_debug_infos; end; var @@ -222,6 +223,30 @@ implementation stderrlog:=false; end; + procedure tbrowser.list_debug_infos; +{$ifndef debug} + begin + end; +{$else debug} + var + hp : pmodule; + ff : pinputfile; + begin + hp:=pmodule(loaded_units.first); + while assigned(hp) do + begin + addlog('Unit '+hp^.modulename^+' has index '+tostr(hp^.unit_index)); + ff:=hp^.sourcefiles.files; + while assigned(ff) do + begin + addlog('File '+ff^.name^+' index '+tostr(ff^.ref_index)); + ff:=ff^.ref_next; + end; + hp:=pmodule(hp^.next); + end; + end; +{$endif debug} + procedure tbrowser.addlog(const s:string); begin if not logopen then @@ -265,12 +290,12 @@ implementation end; - procedure tbrowser.browse_symbol(s : string); + procedure tbrowser.browse_symbol(const sr : string); var sym,symb : psym; symt : psymtable; hp : pmodule; - ss : string; + s,ss : string; p : byte; procedure next_substring; @@ -286,11 +311,32 @@ implementation ss:=s; s:=''; end; + addlog('substring : '+ss); end; begin + s:=sr; symt:=symtablestack; next_substring; - sym:=symt^.search(ss); + if assigned(symt) then + begin + sym:=symt^.search(ss); + if sym=nil then + sym:=symt^.search(upper(ss)); + end + else + sym:=nil; + if assigned(sym) and (sym^.typ=unitsym) and (s<>'') then + begin + addlog('Unitsym found !'); + symt:=punitsym(sym)^.unitsymtable; + if assigned(symt) then + begin + next_substring; + sym:=symt^.search(ss); + end + else + sym:=nil; + end; if not assigned(sym) then begin symt:=nil; @@ -298,7 +344,7 @@ implementation hp:=pmodule(loaded_units.first); while assigned(hp) do begin - if hp^.modulename^=ss then + if hp^.modulename^=upper(ss) then begin symt:=hp^.symtable; break; @@ -314,15 +360,11 @@ implementation begin next_substring; sym:=symt^.search(ss); + if sym=nil then + sym:=symt^.search(upper(ss)); end; end; - if (sym^.typ=unitsym) and (s<>'') then - begin - symt:=punitsym(sym)^.unitsymtable; - next_substring; - sym:=symt^.search(ss); - end; while assigned(sym) and (s<>'') do begin next_substring; @@ -336,6 +378,8 @@ implementation else symt:=pobjectdef(ptypesym(sym)^.definition)^.publicsyms; sym:=symt^.search(ss); + if sym=nil then + sym:=symt^.search(upper(ss)); end; end; varsym : @@ -347,16 +391,22 @@ implementation else symt:=pobjectdef(pvarsym(sym)^.definition)^.publicsyms; sym:=symt^.search(ss); + if sym=nil then + sym:=symt^.search(upper(ss)); end; end; procsym : begin symt:=pprocsym(sym)^.definition^.parast; symb:=symt^.search(ss); + if symb=nil then + symb:=symt^.search(upper(ss)); if not assigned(symb) then begin symt:=pprocsym(sym)^.definition^.parast; sym:=symt^.search(ss); + if symb=nil then + symb:=symt^.search(upper(ss)); end else sym:=symb; @@ -417,7 +467,11 @@ begin end. { $Log$ - Revision 1.7 1998-09-21 08:45:05 pierre + Revision 1.8 1998-09-22 17:13:42 pierre + + browsing updated and developed + records and objects fields are also stored + + Revision 1.7 1998/09/21 08:45:05 pierre + added vmt_offset in tobjectdef.write for fututre use (first steps to have objects without vmt if no virtual !!) + added fpu_used field for tabstractprocdef : diff --git a/compiler/files.pas b/compiler/files.pas index 1d8181d840..6c23a7d92a 100644 --- a/compiler/files.pas +++ b/compiler/files.pas @@ -123,7 +123,9 @@ unit files; unitcount : word; { local unit counter } unit_index : word; { global counter for browser } symtable : pointer; { pointer to the psymtable of this unit } - +{$ifdef UseBrowser} + implsymtable : pointer; +{$endif UseBrowser} uses_imports : boolean; { Set if the module imports from DLL's.} imports : plinkedlist; @@ -795,6 +797,9 @@ unit files; scanner:=nil; map:=nil; symtable:=nil; +{$ifdef UseBrowser} + implsymtable:=nil; +{$endif UseBrowser} flags:=0; crc:=0; unitcount:=1; @@ -887,7 +892,11 @@ unit files; end. { $Log$ - Revision 1.46 1998-09-21 08:45:10 pierre + Revision 1.47 1998-09-22 17:13:43 pierre + + browsing updated and developed + records and objects fields are also stored + + Revision 1.46 1998/09/21 08:45:10 pierre + added vmt_offset in tobjectdef.write for fututre use (first steps to have objects without vmt if no virtual !!) + added fpu_used field for tabstractprocdef : diff --git a/compiler/gdb.pas b/compiler/gdb.pas index cd5cab526d..7b2533cd24 100644 --- a/compiler/gdb.pas +++ b/compiler/gdb.pas @@ -174,6 +174,7 @@ N_BINCL to N_EINCL if do_count then begin dbx_counter^ := dbx_counter^+byte(st[i]); + { skip file number } if st[i] = '(' then begin inc(i); @@ -242,7 +243,11 @@ end. { $Log$ - Revision 1.2 1998-07-10 08:31:38 pierre + Revision 1.3 1998-09-22 17:13:45 pierre + + browsing updated and developed + records and objects fields are also stored + + Revision 1.2 1998/07/10 08:31:38 pierre * Just the N_FNAME to N_FUN substitution for stabs of functions thanks again Daniel !! diff --git a/compiler/parser.pas b/compiler/parser.pas index 983c8fa933..4500715eff 100644 --- a/compiler/parser.pas +++ b/compiler/parser.pas @@ -136,6 +136,11 @@ unit parser; oldaktoptprocessor : tprocessors; oldaktasmmode : tasmmode; +{$ifdef usebrowser} +{$ifdef debug} + hp : pmodule; +{$endif debug} +{$endif usebrowser} begin inc(compile_level); @@ -356,6 +361,14 @@ unit parser; end; {$ifdef UseBrowser} { Write Browser } +{$ifdef debug} + hp:=pmodule(loaded_units.first); + while assigned(hp) do + begin + writeln('Unit ',hp^.modulename^,' has index ',hp^.unit_index); + hp:=pmodule(hp^.next); + end; +{$endif debug} if cs_browser in aktmoduleswitches then if Browse.elements_to_list^.empty then begin @@ -373,7 +386,11 @@ unit parser; end. { $Log$ - Revision 1.47 1998-09-21 09:00:18 peter + Revision 1.48 1998-09-22 17:13:48 pierre + + browsing updated and developed + records and objects fields are also stored + + Revision 1.47 1998/09/21 09:00:18 peter * reset_gdb_info only when debuginfo is set Revision 1.46 1998/09/21 08:45:12 pierre diff --git a/compiler/pmodules.pas b/compiler/pmodules.pas index 46ba90a346..ba3fe3076f 100644 --- a/compiler/pmodules.pas +++ b/compiler/pmodules.pas @@ -255,6 +255,14 @@ unit pmodules; punitsymtable(current_module^.symtable)^. load_symtable_refs; end; + if ((current_module^.flags and uf_has_browser)<>0) and + (cs_local_browser in aktmoduleswitches) then + begin + current_module^.implsymtable:=new(psymtable,load); + psymtable(current_module^.implsymtable)^.name:= + stringdup('implementation of '+psymtable(current_module^.symtable)^.name^); + psymtable(current_module^.implsymtable)^.load_browser; + end; {$endif UseBrowser} { remove the map, it's not needed anymore } dispose(current_module^.map); @@ -345,6 +353,7 @@ unit pmodules; if (not assigned(st)) then begin { if the unit is loaded remove it first } + { this creates problem with the browser !! } if assigned(hp) then begin { remove the old unit } @@ -650,7 +659,11 @@ unit pmodules; { number the definitions, so a deref from other units works } refsymtable^.number_defs; - +{$ifdef UseBrowser} + refsymtable^.number_symbols; + { we don't want implementation units symbols in unitsymtable !! PM } + refsymtable:=p; +{$endif UseBrowser} { Read the implementation units } parse_implementation_uses(unitst); @@ -724,6 +737,9 @@ unit pmodules; { size of the static data } datasize:=symtablestack^.datasize; + { avoid self recursive destructor call !! PM } + aktprocsym^.definition^.localst:=nil; + { unsed static symbols ? } symtablestack^.allsymbolsused; @@ -741,7 +757,10 @@ unit pmodules; current_module^.in_implementation:=false; { deletes all symtables generated in the implementation part } while symtablestack^.symtabletype<>globalsymtable do - dellexlevel; + if cs_local_browser in aktmoduleswitches then + symtablestack:=symtablestack^.next + else + dellexlevel; { tests, if all forwards are resolved } symtablestack^.check_forwards; @@ -755,7 +774,17 @@ unit pmodules; {Write out the unit if the compile was succesfull.} if status.errorcount=0 then - writeunitas(current_module^.ppufilename^,punitsymtable(symtablestack)); + begin + writeunitas(current_module^.ppufilename^,punitsymtable(symtablestack)); +{$ifdef UseBrowser} + if cs_local_browser in aktmoduleswitches then + begin + current_module^.implsymtable:=refsymtable; + refsymtable^.write; + refsymtable^.write_browser; + end; +{$endif UseBrowser} + end; {$ifdef GDB} pu:=pused_unit(usedunits.first); @@ -822,8 +851,17 @@ unit pmodules; { of the program } st:=new(punitsymtable,init(staticsymtable,current_module^.modulename^)); + { necessary for browser } + loaded_units.insert(current_module); + + {Generate a procsym.} make_ref:=false; + { this was missing !! + the procdef was registered to systemunit + after the defhasharray was set !! + so the defhasharray became wrong !! PM } + symtablestack:=st; aktprocsym:=new(Pprocsym,init('main')); aktprocsym^.definition:=new(Pprocdef,init); aktprocsym^.definition^.options:=aktprocsym^.definition^.options or poproginit; @@ -836,8 +874,6 @@ unit pmodules; refsymtable:=st; - { necessary for browser } - loaded_units.insert(current_module); {Insert the symbols of the system unit into the stack of symbol tables.} @@ -887,6 +923,9 @@ unit pmodules; compile_proc_body(names,true,false); names.done; + { avoid self recursive destructor call !! PM } + aktprocsym^.definition^.localst:=nil; + codegen_doneprocedure; consume(POINT); @@ -928,7 +967,11 @@ unit pmodules; end. { $Log$ - Revision 1.51 1998-09-22 15:40:55 peter + Revision 1.52 1998-09-22 17:13:49 pierre + + browsing updated and developed + records and objects fields are also stored + + Revision 1.51 1998/09/22 15:40:55 peter * some extra ifdef GDB Revision 1.50 1998/09/21 08:45:17 pierre diff --git a/compiler/switches.pas b/compiler/switches.pas index 23a21b14fe..0648e5369a 100644 --- a/compiler/switches.pas +++ b/compiler/switches.pas @@ -53,7 +53,7 @@ const {I} (typesw:localsw; setsw:ord(cs_check_io)), {J} (typesw:illegalsw; setsw:ord(cs_localnone)), {K} (typesw:unsupportedsw; setsw:ord(cs_localnone)), - {L} (typesw:unsupportedsw; setsw:ord(cs_localnone)), + {L} (typesw:modulesw; setsw:ord(cs_local_browser)), {M} (typesw:localsw; setsw:ord(cs_generate_rtti)), {N} (typesw:unsupportedsw; setsw:ord(cs_localnone)), {O} (typesw:unsupportedsw; setsw:ord(cs_localnone)), @@ -154,7 +154,11 @@ end; end. { $Log$ - Revision 1.12 1998-09-01 12:52:05 peter + Revision 1.13 1998-09-22 17:13:52 pierre + + browsing updated and developed + records and objects fields are also stored + + Revision 1.12 1998/09/01 12:52:05 peter + a lot of delphi switches Revision 1.11 1998/08/18 20:52:21 peter diff --git a/compiler/symppu.inc b/compiler/symppu.inc index a1fa4a766f..1e6156c8bf 100644 --- a/compiler/symppu.inc +++ b/compiler/symppu.inc @@ -196,6 +196,8 @@ {$ifdef UseBrowser} if cs_browser in aktmoduleswitches then flags:=flags or uf_has_browser; + if cs_local_browser in aktmoduleswitches then + flags:=flags or uf_local_browser; {$endif UseBrowser} end; @@ -441,7 +443,11 @@ { $Log$ - Revision 1.16 1998-09-22 15:40:56 peter + Revision 1.17 1998-09-22 17:13:53 pierre + + browsing updated and developed + records and objects fields are also stored + + Revision 1.16 1998/09/22 15:40:56 peter * some extra ifdef GDB Revision 1.15 1998/09/21 08:45:23 pierre