|
@@ -41,13 +41,10 @@
|
|
{$ifdef UseBrowser}
|
|
{$ifdef UseBrowser}
|
|
defref:=nil;
|
|
defref:=nil;
|
|
lastwritten:=nil;
|
|
lastwritten:=nil;
|
|
- refcount:=0;
|
|
|
|
- if (cs_browser in aktswitches) and make_ref then
|
|
|
|
- begin
|
|
|
|
- defref:=new(pref,init(defref,@tokenpos));
|
|
|
|
- inc(refcount);
|
|
|
|
- end;
|
|
|
|
|
|
+ if make_ref then
|
|
|
|
+ add_new_ref(defref,@tokenpos);
|
|
lastref:=defref;
|
|
lastref:=defref;
|
|
|
|
+ refcount:=1;
|
|
{$endif UseBrowser}
|
|
{$endif UseBrowser}
|
|
end;
|
|
end;
|
|
|
|
|
|
@@ -58,7 +55,6 @@
|
|
right:=nil;
|
|
right:=nil;
|
|
setname(readstring);
|
|
setname(readstring);
|
|
typ:=abstractsym;
|
|
typ:=abstractsym;
|
|
- line_no:=0;
|
|
|
|
if object_options then
|
|
if object_options then
|
|
properties:=symprop(readbyte)
|
|
properties:=symprop(readbyte)
|
|
else
|
|
else
|
|
@@ -68,10 +64,16 @@
|
|
defref:=nil;
|
|
defref:=nil;
|
|
lastwritten:=nil;
|
|
lastwritten:=nil;
|
|
refcount:=0;
|
|
refcount:=0;
|
|
|
|
+ if (current_module^.flags and uf_uses_browser)<>0 then
|
|
|
|
+ { references do not change the ppu caracteristics }
|
|
|
|
+ { this only save the references to variables/functions }
|
|
|
|
+ { defined in the unit what about the others }
|
|
|
|
+ load_references;
|
|
{$endif UseBrowser}
|
|
{$endif UseBrowser}
|
|
{$ifdef GDB}
|
|
{$ifdef GDB}
|
|
isstabwritten := false;
|
|
isstabwritten := false;
|
|
{$endif GDB}
|
|
{$endif GDB}
|
|
|
|
+ line_no:=0;
|
|
end;
|
|
end;
|
|
|
|
|
|
{$ifdef UseBrowser}
|
|
{$ifdef UseBrowser}
|
|
@@ -80,51 +82,98 @@
|
|
|
|
|
|
procedure tsym.load_references;
|
|
procedure tsym.load_references;
|
|
var
|
|
var
|
|
- pos : tfileposinfo;
|
|
|
|
|
|
+ fileindex : word;
|
|
|
|
+ b : byte;
|
|
|
|
+ l,c : longint;
|
|
begin
|
|
begin
|
|
- while (not ppufile^.endofentry) do
|
|
|
|
- begin
|
|
|
|
- readposinfo(pos);
|
|
|
|
- inc(refcount);
|
|
|
|
- lastref:=new(pref,init(lastref,@pos));
|
|
|
|
- if refcount=1 then
|
|
|
|
- defref:=lastref;
|
|
|
|
- end;
|
|
|
|
- lastwritten:=lastref;
|
|
|
|
|
|
+ b:=readentry;
|
|
|
|
+ if b=ibref then
|
|
|
|
+ begin
|
|
|
|
+ while (not ppufile^.endofentry) do
|
|
|
|
+ begin
|
|
|
|
+ fileindex:=readword;
|
|
|
|
+ l:=readlong;
|
|
|
|
+ c:=readword;
|
|
|
|
+ inc(refcount);
|
|
|
|
+ lastref:=new(pref,load(lastref,fileindex,l,c));
|
|
|
|
+ if refcount=1 then
|
|
|
|
+ defref:=lastref;
|
|
|
|
+ end;
|
|
|
|
+ end
|
|
|
|
+ else
|
|
|
|
+ Message(unit_f_ppu_read_error);
|
|
|
|
+ lastwritten:=lastref;
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure tsym.write_references;
|
|
procedure tsym.write_references;
|
|
var
|
|
var
|
|
- ref : pref;
|
|
|
|
- prdef : pdef;
|
|
|
|
- begin
|
|
|
|
- if lastwritten=lastref then
|
|
|
|
- exit;
|
|
|
|
- { write address to this symbol }
|
|
|
|
- writesymref(@self);
|
|
|
|
- { write symbol refs }
|
|
|
|
- if assigned(lastwritten) then
|
|
|
|
- ref:=lastwritten
|
|
|
|
- else
|
|
|
|
- ref:=defref;
|
|
|
|
- while assigned(ref) do
|
|
|
|
- begin
|
|
|
|
- writeposinfo(ref^.posinfo);
|
|
|
|
- ref:=ref^.nextref;
|
|
|
|
- end;
|
|
|
|
- lastwritten:=lastref;
|
|
|
|
- ppufile^.writeentry(ibsymref);
|
|
|
|
- { when it's a procsym then write also the refs to the definition
|
|
|
|
- due the overloading }
|
|
|
|
- if typ=procsym then
|
|
|
|
|
|
+ ref : pref;
|
|
|
|
+ begin
|
|
|
|
+ { references do not change the ppu caracteristics }
|
|
|
|
+ { this only save the references to variables/functions }
|
|
|
|
+ { defined in the unit what about the others }
|
|
|
|
+ ppufile^.do_crc:=false;
|
|
|
|
+ if assigned(lastwritten) then
|
|
|
|
+ ref:=lastwritten
|
|
|
|
+ else
|
|
|
|
+ ref:=defref;
|
|
|
|
+ while assigned(ref) do
|
|
|
|
+ begin
|
|
|
|
+ writeposinfo(ref^.posinfo);
|
|
|
|
+ ref:=ref^.nextref;
|
|
|
|
+ end;
|
|
|
|
+ lastwritten:=lastref;
|
|
|
|
+ ppufile^.writeentry(ibref);
|
|
|
|
+ ppufile^.do_crc:=true;
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ procedure load_external_references;
|
|
|
|
+ var b : byte;
|
|
|
|
+ sym : psym;
|
|
|
|
+ prdef : pdef;
|
|
|
|
+ begin
|
|
|
|
+ b:=readentry;
|
|
|
|
+ if b=ibextsymref then
|
|
begin
|
|
begin
|
|
- prdef:=pprocsym(@self)^.definition;
|
|
|
|
- while assigned(prdef) do
|
|
|
|
- begin
|
|
|
|
- pprocdef(prdef)^.write_references;
|
|
|
|
- prdef:=pprocdef(prdef)^.nextoverloaded;
|
|
|
|
- end;
|
|
|
|
|
|
+ sym:=readsymref;
|
|
|
|
+ resolvesym(sym);
|
|
|
|
+ sym^.load_references;
|
|
end;
|
|
end;
|
|
|
|
+ ibextdefref : begin
|
|
|
|
+ prdef:=readdefref;
|
|
|
|
+ resolvedef(prdef);
|
|
|
|
+ if prdef^.deftype<>procdef then
|
|
|
|
+ Message(unit_f_ppu_read_error);
|
|
|
|
+ pprocdef(prdef)^.load_references;
|
|
|
|
+ end;
|
|
|
|
+ else
|
|
|
|
+ Message(unit_f_ppu_read_error);
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+ procedure tsym.write_external_references;
|
|
|
|
+ var ref : pref;
|
|
|
|
+ prdef : pdef;
|
|
|
|
+ begin
|
|
|
|
+ ppufile^.do_crc:=false;
|
|
|
|
+ if lastwritten=lastref then
|
|
|
|
+ exit;
|
|
|
|
+ writesymref(@self);
|
|
|
|
+ writeentry(ibextsymref);
|
|
|
|
+
|
|
|
|
+ write_references;
|
|
|
|
+
|
|
|
|
+ if typ=procsym then
|
|
|
|
+ begin
|
|
|
|
+ prdef:=pprocsym(@self)^.definition;
|
|
|
|
+ while assigned(prdef) do
|
|
|
|
+ begin
|
|
|
|
+ pprocdef(prdef)^.write_external_references;
|
|
|
|
+ prdef:=pprocdef(prdef)^.nextoverloaded;
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
|
|
+ ppufile^.do_crc:=true;
|
|
end;
|
|
end;
|
|
|
|
|
|
{$else NEWPPU}
|
|
{$else NEWPPU}
|
|
@@ -179,6 +228,37 @@
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
+ procedure load_external_references;
|
|
|
|
+
|
|
|
|
+ var b : byte;
|
|
|
|
+ sym : psym;
|
|
|
|
+ prdef : pdef;
|
|
|
|
+ begin
|
|
|
|
+ b:=readbyte;
|
|
|
|
+ while (b=ibextsymref) or (b=ibextdefref) do
|
|
|
|
+ begin
|
|
|
|
+ if b=ibextsymref then
|
|
|
|
+ begin
|
|
|
|
+ sym:=readsymref;
|
|
|
|
+ resolvesym(sym);
|
|
|
|
+ sym^.load_references;
|
|
|
|
+ b:=readbyte;
|
|
|
|
+ end
|
|
|
|
+ else
|
|
|
|
+ if b=ibextdefref then
|
|
|
|
+ begin
|
|
|
|
+ prdef:=readdefref;
|
|
|
|
+ resolvedef(prdef);
|
|
|
|
+ if prdef^.deftype<>procdef then
|
|
|
|
+ Message(unit_f_ppu_read_error);
|
|
|
|
+ pprocdef(prdef)^.load_references;
|
|
|
|
+ b:=readbyte;
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
|
|
+ if b <> ibend then
|
|
|
|
+ Message(unit_f_ppu_read_error);
|
|
|
|
+ end;
|
|
|
|
+
|
|
procedure tsym.write_external_references;
|
|
procedure tsym.write_external_references;
|
|
var ref : pref;
|
|
var ref : pref;
|
|
prdef : pdef;
|
|
prdef : pdef;
|
|
@@ -216,48 +296,44 @@
|
|
|
|
|
|
{$endif NEWPPU}
|
|
{$endif NEWPPU}
|
|
|
|
|
|
- procedure tsym.add_to_browserlog;
|
|
|
|
- var
|
|
|
|
- prdef : pprocdef;
|
|
|
|
|
|
+ procedure tsym.write_ref_to_file(var f : text);
|
|
|
|
+
|
|
|
|
+ var ref : pref;
|
|
|
|
+ i : longint;
|
|
|
|
+
|
|
begin
|
|
begin
|
|
- if assigned(defref) then
|
|
|
|
- begin
|
|
|
|
- Browse.AddLog('***'+name+'***');
|
|
|
|
- Browse.AddLogRefs(defref);
|
|
|
|
- end;
|
|
|
|
- { when it's a procsym then write also the refs to the definition
|
|
|
|
- due the overloading }
|
|
|
|
- if typ=procsym then
|
|
|
|
- begin
|
|
|
|
- prdef:=pprocsym(@self)^.definition;
|
|
|
|
- while assigned(prdef) do
|
|
|
|
- begin
|
|
|
|
- pprocdef(prdef)^.add_to_browserlog;
|
|
|
|
- prdef:=pprocdef(prdef)^.nextoverloaded;
|
|
|
|
- end;
|
|
|
|
- end;
|
|
|
|
|
|
+ ref:=defref;
|
|
|
|
+ if assigned(ref) then
|
|
|
|
+ begin
|
|
|
|
+ for i:=1 to reffile_indent do
|
|
|
|
+ system.write(f,' ');
|
|
|
|
+ writeln(f,'***',name,'***');
|
|
|
|
+ end;
|
|
|
|
+ inc(reffile_indent,2);
|
|
|
|
+ while assigned(ref) do
|
|
|
|
+ begin
|
|
|
|
+ for i:=1 to reffile_indent do
|
|
|
|
+ system.write(f,' ');
|
|
|
|
+ writeln(f,ref^.get_file_line);
|
|
|
|
+ ref:=ref^.nextref;
|
|
|
|
+ end;
|
|
|
|
+ dec(reffile_indent,2);
|
|
end;
|
|
end;
|
|
{$endif UseBrowser}
|
|
{$endif UseBrowser}
|
|
|
|
|
|
-
|
|
|
|
destructor tsym.done;
|
|
destructor tsym.done;
|
|
|
|
+
|
|
begin
|
|
begin
|
|
{$ifdef tp}
|
|
{$ifdef tp}
|
|
if not(use_big) then
|
|
if not(use_big) then
|
|
{$endif tp}
|
|
{$endif tp}
|
|
strdispose(_name);
|
|
strdispose(_name);
|
|
-{$ifdef UseBrowser}
|
|
|
|
- if assigned(defref) then
|
|
|
|
- dispose(defref,done);
|
|
|
|
-{$endif UseBrowser}
|
|
|
|
- if assigned(left) then
|
|
|
|
- dispose(left,done);
|
|
|
|
- if assigned(right) then
|
|
|
|
- dispose(right,done);
|
|
|
|
|
|
+ if assigned(left) then dispose(left,done);
|
|
|
|
+ if assigned(right) then dispose(right,done);
|
|
end;
|
|
end;
|
|
|
|
|
|
-
|
|
|
|
destructor tsym.single_done;
|
|
destructor tsym.single_done;
|
|
|
|
+
|
|
begin
|
|
begin
|
|
{$ifdef tp}
|
|
{$ifdef tp}
|
|
if not(use_big) then
|
|
if not(use_big) then
|
|
@@ -272,8 +348,8 @@
|
|
if object_options then
|
|
if object_options then
|
|
writebyte(byte(properties));
|
|
writebyte(byte(properties));
|
|
{$ifdef UseBrowser}
|
|
{$ifdef UseBrowser}
|
|
-{ if cs_browser in aktswitches then
|
|
|
|
- write_references; }
|
|
|
|
|
|
+ if (current_module^.flags and uf_uses_browser)<>0 then
|
|
|
|
+ write_references;
|
|
{$endif UseBrowser}
|
|
{$endif UseBrowser}
|
|
end;
|
|
end;
|
|
|
|
|
|
@@ -386,13 +462,9 @@
|
|
****************************************************************************}
|
|
****************************************************************************}
|
|
|
|
|
|
constructor tunitsym.init(const n : string;ref : punitsymtable);
|
|
constructor tunitsym.init(const n : string;ref : punitsymtable);
|
|
- var
|
|
|
|
- old_make_ref : boolean;
|
|
|
|
|
|
+
|
|
begin
|
|
begin
|
|
- old_make_ref:=make_ref;
|
|
|
|
- make_ref:=false;
|
|
|
|
- inherited init(n);
|
|
|
|
- make_ref:=old_make_ref;
|
|
|
|
|
|
+ tsym.init(n);
|
|
typ:=unitsym;
|
|
typ:=unitsym;
|
|
unitsymtable:=ref;
|
|
unitsymtable:=ref;
|
|
prevsym:=ref^.unitsym;
|
|
prevsym:=ref^.unitsym;
|
|
@@ -555,8 +627,8 @@
|
|
|
|
|
|
constructor tprogramsym.init(const n : string);
|
|
constructor tprogramsym.init(const n : string);
|
|
begin
|
|
begin
|
|
- inherited init(n);
|
|
|
|
- typ:=programsym;
|
|
|
|
|
|
+ tsym.init(n);
|
|
|
|
+ typ:=programsym;
|
|
end;
|
|
end;
|
|
|
|
|
|
{****************************************************************************
|
|
{****************************************************************************
|
|
@@ -565,8 +637,8 @@
|
|
|
|
|
|
constructor terrorsym.init;
|
|
constructor terrorsym.init;
|
|
begin
|
|
begin
|
|
- inherited init('');
|
|
|
|
- typ:=errorsym;
|
|
|
|
|
|
+ tsym.init('');
|
|
|
|
+ typ:=errorsym;
|
|
end;
|
|
end;
|
|
|
|
|
|
{****************************************************************************
|
|
{****************************************************************************
|
|
@@ -803,14 +875,15 @@
|
|
_mangledname:=nil;
|
|
_mangledname:=nil;
|
|
varspez:=vs_value;
|
|
varspez:=vs_value;
|
|
address:=0;
|
|
address:=0;
|
|
- refs:=0;
|
|
|
|
|
|
+ refs:=0;
|
|
|
|
+ var_options:=0;
|
|
is_valid := 1;
|
|
is_valid := 1;
|
|
- var_options:=0;
|
|
|
|
{ can we load the value into a register ? }
|
|
{ can we load the value into a register ? }
|
|
case p^.deftype of
|
|
case p^.deftype of
|
|
pointerdef,
|
|
pointerdef,
|
|
enumdef,
|
|
enumdef,
|
|
- procvardef : var_options:=var_options or vo_regable;
|
|
|
|
|
|
+ procvardef :
|
|
|
|
+ var_options:=var_options or vo_regable;
|
|
orddef : case porddef(p)^.typ of
|
|
orddef : case porddef(p)^.typ of
|
|
u8bit,u16bit,u32bit,
|
|
u8bit,u16bit,u32bit,
|
|
bool8bit,bool16bit,bool32bit,
|
|
bool8bit,bool16bit,bool32bit,
|
|
@@ -834,8 +907,7 @@
|
|
varspez:=tvarspez(readbyte);
|
|
varspez:=tvarspez(readbyte);
|
|
if read_member then
|
|
if read_member then
|
|
address:=readlong
|
|
address:=readlong
|
|
- else
|
|
|
|
- address:=0;
|
|
|
|
|
|
+ else address:=0;
|
|
definition:=readdefref;
|
|
definition:=readdefref;
|
|
refs := 0;
|
|
refs := 0;
|
|
is_valid := 1;
|
|
is_valid := 1;
|
|
@@ -852,7 +924,7 @@
|
|
var_options:=var_options or vo_is_C_var;
|
|
var_options:=var_options or vo_is_C_var;
|
|
_mangledname:=strpnew(target_os.Cprefix+mangled);
|
|
_mangledname:=strpnew(target_os.Cprefix+mangled);
|
|
end;
|
|
end;
|
|
-
|
|
|
|
|
|
+
|
|
constructor tvarsym.load_C;
|
|
constructor tvarsym.load_C;
|
|
|
|
|
|
begin
|
|
begin
|
|
@@ -956,7 +1028,7 @@
|
|
{ the data filed is generated in parser.pas
|
|
{ the data filed is generated in parser.pas
|
|
with a tobject_FIELDNAME variable }
|
|
with a tobject_FIELDNAME variable }
|
|
{ this symbol can't be loaded to a register }
|
|
{ this symbol can't be loaded to a register }
|
|
- var_options:=var_options and not vo_regable;
|
|
|
|
|
|
+ var_options:=var_options or vo_regable;
|
|
end
|
|
end
|
|
else if not(read_member) then
|
|
else if not(read_member) then
|
|
begin
|
|
begin
|
|
@@ -999,8 +1071,7 @@
|
|
if cs_debuginfo in aktswitches then
|
|
if cs_debuginfo in aktswitches then
|
|
concatstabto(bsssegment);
|
|
concatstabto(bsssegment);
|
|
{$endif GDB}
|
|
{$endif GDB}
|
|
- if (cs_smartlink in aktswitches) or
|
|
|
|
- ((var_options and vo_is_c_var)<>0) then
|
|
|
|
|
|
+ if (cs_smartlink in aktswitches) then
|
|
bsssegment^.concat(new(pai_datablock,init_global(mangledname,l)))
|
|
bsssegment^.concat(new(pai_datablock,init_global(mangledname,l)))
|
|
else
|
|
else
|
|
bsssegment^.concat(new(pai_datablock,init(mangledname,l)));
|
|
bsssegment^.concat(new(pai_datablock,init(mangledname,l)));
|
|
@@ -1177,7 +1248,7 @@
|
|
strdispose(_mangledname);
|
|
strdispose(_mangledname);
|
|
inherited done;
|
|
inherited done;
|
|
end;
|
|
end;
|
|
-
|
|
|
|
|
|
+
|
|
|
|
|
|
{****************************************************************************
|
|
{****************************************************************************
|
|
TTYPEDCONSTSYM
|
|
TTYPEDCONSTSYM
|
|
@@ -1671,17 +1742,10 @@
|
|
|
|
|
|
{
|
|
{
|
|
$Log$
|
|
$Log$
|
|
- Revision 1.10 1998-06-13 00:10:18 peter
|
|
|
|
- * working browser and newppu
|
|
|
|
- * some small fixes against crashes which occured in bp7 (but not in
|
|
|
|
- fpc?!)
|
|
|
|
-
|
|
|
|
- Revision 1.9 1998/06/12 16:15:35 pierre
|
|
|
|
- * external name 'C_var';
|
|
|
|
- export name 'intern_C_var';
|
|
|
|
- cdecl;
|
|
|
|
- cdecl;external;
|
|
|
|
- are now supported only with -Sv switch
|
|
|
|
|
|
+ Revision 1.11 1998-06-15 13:31:21 daniel
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ * Fixes to make it compilable under BP again.
|
|
|
|
|
|
Revision 1.8 1998/06/11 10:11:59 peter
|
|
Revision 1.8 1998/06/11 10:11:59 peter
|
|
* -gb works again
|
|
* -gb works again
|