|
@@ -33,7 +33,7 @@ interface
|
|
|
symconst,symbase,symtype,symdef,defcmp,
|
|
|
{ ppu }
|
|
|
ppu,finput,
|
|
|
- cclasses,symnot,
|
|
|
+ cclasses,
|
|
|
{ aasm }
|
|
|
aasmbase,
|
|
|
cpuinfo,cpubase,cgbase,cgutils,parabase
|
|
@@ -168,7 +168,6 @@ interface
|
|
|
|
|
|
tabstractvarsym = class(tstoredsym)
|
|
|
varoptions : tvaroptions;
|
|
|
- notifications : Tlinkedlist;
|
|
|
varspez : tvarspez; { sets the type of access }
|
|
|
varregable : tvarregable;
|
|
|
varstate : tvarstate;
|
|
@@ -179,24 +178,21 @@ interface
|
|
|
addr_taken : boolean;
|
|
|
constructor create(st:tsymtyp;const n : string;vsp:tvarspez;def:tdef;vopts:tvaroptions);
|
|
|
constructor ppuload(st:tsymtyp;ppufile:tcompilerppufile);
|
|
|
- destructor destroy;override;
|
|
|
procedure ppuwrite(ppufile:tcompilerppufile);override;
|
|
|
procedure buildderef;override;
|
|
|
procedure deref;override;
|
|
|
function getsize : asizeint;
|
|
|
function getpackedbitsize : longint;
|
|
|
function is_regvar(refpara: boolean):boolean;
|
|
|
- procedure trigger_notifications(what:Tnotification_flag);
|
|
|
- function register_notification(flags:Tnotification_flags;
|
|
|
- callback:Tnotification_callback):cardinal;
|
|
|
- procedure unregister_notification(id:cardinal);
|
|
|
private
|
|
|
_vardef : tdef;
|
|
|
vardefderef : tderef;
|
|
|
|
|
|
- procedure setvardef(def:tdef);
|
|
|
+ procedure setregable;
|
|
|
+ procedure setvardef(const def: tdef);
|
|
|
+ procedure setvardef_and_regable(def:tdef);
|
|
|
public
|
|
|
- property vardef: tdef read _vardef write setvardef;
|
|
|
+ property vardef: tdef read _vardef write setvardef_and_regable;
|
|
|
end;
|
|
|
|
|
|
tfieldvarsym = class(tabstractvarsym)
|
|
@@ -1573,14 +1569,6 @@ implementation
|
|
|
end;
|
|
|
|
|
|
|
|
|
- destructor tabstractvarsym.destroy;
|
|
|
- begin
|
|
|
- if assigned(notifications) then
|
|
|
- notifications.destroy;
|
|
|
- inherited destroy;
|
|
|
- end;
|
|
|
-
|
|
|
-
|
|
|
procedure tabstractvarsym.buildderef;
|
|
|
begin
|
|
|
vardefderef.build(vardef);
|
|
@@ -1588,16 +1576,12 @@ implementation
|
|
|
|
|
|
|
|
|
procedure tabstractvarsym.deref;
|
|
|
- var
|
|
|
- oldvarregable: tvarregable;
|
|
|
begin
|
|
|
- { setting the vardef also updates varregable. We just loaded this }
|
|
|
+ { assigning vardef also updates varregable. We just loaded this }
|
|
|
{ value from a ppu, so it must not be changed (e.g. tw7817a.pp/ }
|
|
|
{ tw7817b.pp: the address is taken of a local variable in an }
|
|
|
{ inlined procedure -> must remain non-regable when inlining) }
|
|
|
- oldvarregable:=varregable;
|
|
|
- vardef:=tdef(vardefderef.resolve);
|
|
|
- varregable:=oldvarregable;
|
|
|
+ setvardef(tdef(vardefderef.resolve));
|
|
|
end;
|
|
|
|
|
|
|
|
@@ -1663,67 +1647,18 @@ implementation
|
|
|
end;
|
|
|
|
|
|
|
|
|
- procedure tabstractvarsym.trigger_notifications(what:Tnotification_flag);
|
|
|
-
|
|
|
- var n:Tnotification;
|
|
|
-
|
|
|
- begin
|
|
|
- if assigned(notifications) then
|
|
|
- begin
|
|
|
- n:=Tnotification(notifications.first);
|
|
|
- while assigned(n) do
|
|
|
- begin
|
|
|
- if what in n.flags then
|
|
|
- n.callback(what,self);
|
|
|
- n:=Tnotification(n.next);
|
|
|
- end;
|
|
|
- end;
|
|
|
- end;
|
|
|
-
|
|
|
- function Tabstractvarsym.register_notification(flags:Tnotification_flags;callback:
|
|
|
- Tnotification_callback):cardinal;
|
|
|
-
|
|
|
- var n:Tnotification;
|
|
|
-
|
|
|
- begin
|
|
|
- if not assigned(notifications) then
|
|
|
- notifications:=Tlinkedlist.create;
|
|
|
- n:=Tnotification.create(flags,callback);
|
|
|
- register_notification:=n.id;
|
|
|
- notifications.concat(n);
|
|
|
- end;
|
|
|
-
|
|
|
- procedure Tabstractvarsym.unregister_notification(id:cardinal);
|
|
|
-
|
|
|
- var n:Tnotification;
|
|
|
-
|
|
|
- begin
|
|
|
- if not assigned(notifications) then
|
|
|
- internalerror(200212311)
|
|
|
- else
|
|
|
- begin
|
|
|
- n:=Tnotification(notifications.first);
|
|
|
- while assigned(n) do
|
|
|
- begin
|
|
|
- if n.id=id then
|
|
|
- begin
|
|
|
- notifications.remove(n);
|
|
|
- n.destroy;
|
|
|
- exit;
|
|
|
- end;
|
|
|
- n:=Tnotification(n.next);
|
|
|
- end;
|
|
|
- internalerror(200212311)
|
|
|
- end;
|
|
|
- end;
|
|
|
+ procedure tabstractvarsym.setvardef_and_regable(def:tdef);
|
|
|
+ begin
|
|
|
+ setvardef(def);
|
|
|
+ setregable;
|
|
|
+ end;
|
|
|
|
|
|
|
|
|
- procedure tabstractvarsym.setvardef(def:tdef);
|
|
|
+ procedure tabstractvarsym.setregable;
|
|
|
begin
|
|
|
- _vardef := def;
|
|
|
{ can we load the value into a register ? }
|
|
|
if not assigned(owner) or
|
|
|
- (owner.symtabletype in [localsymtable,parasymtable]) or
|
|
|
+ (owner.symtabletype in [localsymtable, parasymtable]) or
|
|
|
(
|
|
|
(owner.symtabletype=staticsymtable) and
|
|
|
not(cs_create_pic in current_settings.moduleswitches)
|
|
@@ -1746,23 +1681,23 @@ implementation
|
|
|
(typ=paravarsym) and
|
|
|
(varspez=vs_const)) then
|
|
|
varregable:=vr_intreg
|
|
|
- else
|
|
|
-{ $warning TODO: no fpu regvar in staticsymtable yet, need initialization with 0 }
|
|
|
- if {(
|
|
|
- not assigned(owner) or
|
|
|
- (owner.symtabletype<>staticsymtable)
|
|
|
- ) and }
|
|
|
- tstoreddef(vardef).is_fpuregable then
|
|
|
- begin
|
|
|
- if use_vectorfpu(vardef) then
|
|
|
- varregable:=vr_mmreg
|
|
|
- else
|
|
|
- varregable:=vr_fpureg;
|
|
|
- end;
|
|
|
+ else if tstoreddef(vardef).is_fpuregable then
|
|
|
+ begin
|
|
|
+ if use_vectorfpu(vardef) then
|
|
|
+ varregable:=vr_mmreg
|
|
|
+ else
|
|
|
+ varregable:=vr_fpureg;
|
|
|
+ end;
|
|
|
end;
|
|
|
end;
|
|
|
|
|
|
|
|
|
+ procedure tabstractvarsym.setvardef(const def: tdef);
|
|
|
+ begin
|
|
|
+ _vardef := def;
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
{****************************************************************************
|
|
|
TFIELDVARSYM
|
|
|
****************************************************************************}
|