summaryrefslogtreecommitdiff
path: root/compiler/rautils.pas
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rautils.pas')
-rw-r--r--compiler/rautils.pas36
1 files changed, 31 insertions, 5 deletions
diff --git a/compiler/rautils.pas b/compiler/rautils.pas
index 12289fbd62..e4e1a30c26 100644
--- a/compiler/rautils.pas
+++ b/compiler/rautils.pas
@@ -79,8 +79,8 @@ type
OPR_NONE : ();
OPR_CONSTANT : (val:aint);
OPR_SYMBOL : (symbol:tasmsymbol;symofs:aint);
- OPR_REFERENCE : (ref:treference);
- OPR_LOCAL : (localsym:tabstractnormalvarsym;localsymofs:aint;localindexreg:tregister;localscale:byte;localgetoffset,localforceref:boolean);
+ OPR_REFERENCE : (varsize:asizeint; constoffset: asizeint; ref:treference);
+ OPR_LOCAL : (localvarsize, localconstoffset: asizeint;localsym:tabstractnormalvarsym;localsymofs:aint;localindexreg:tregister;localscale:byte;localgetoffset,localforceref:boolean);
OPR_REGISTER : (reg:tregister);
{$ifdef m68k}
OPR_REGLIST : (regset : tcpuregisterset);
@@ -874,16 +874,32 @@ Begin
{ for arrays try to get the element size, take care of
multiple indexes }
harrdef:=tarraydef(tabstractvarsym(sym).vardef);
+
+ { calc array size }
+ if is_special_array(harrdef) then
+ l := -1
+ else
+ l := harrdef.size;
+
+ case opr.typ of
+ OPR_REFERENCE: opr.varsize := l;
+ OPR_LOCAL: opr.localvarsize := l;
+ end;
+
+
while assigned(harrdef.elementdef) and
(harrdef.elementdef.typ=arraydef) do
harrdef:=tarraydef(harrdef.elementdef);
if not is_packed_array(harrdef) then
SetSize(harrdef.elesize,false)
else
- begin
if (harrdef.elepackedbitsize mod 8) = 0 then
- SetSize(harrdef.elepackedbitsize div 8,false)
- end;
+ SetSize(harrdef.elepackedbitsize div 8,false);
+ end;
+ recorddef:
+ case opr.typ of
+ OPR_REFERENCE: opr.varsize := tabstractvarsym(sym).getsize;
+ OPR_LOCAL: opr.localvarsize := tabstractvarsym(sym).getsize;
end;
end;
hasvar:=true;
@@ -954,16 +970,22 @@ Begin
opr.typ:=OPR_REFERENCE;
Fillchar(opr.ref,sizeof(treference),0);
opr.Ref.Offset:=l;
+ opr.varsize:=0;
+ opr.constoffset:=0;
end;
OPR_NONE :
begin
opr.typ:=OPR_REFERENCE;
+ opr.varsize:=0;
+ opr.constoffset:=0;
Fillchar(opr.ref,sizeof(treference),0);
end;
OPR_REGISTER :
begin
reg:=opr.reg;
opr.typ:=OPR_REFERENCE;
+ opr.varsize:=0;
+ opr.constoffset:=0;
Fillchar(opr.ref,sizeof(treference),0);
opr.Ref.base:=reg;
end;
@@ -972,6 +994,8 @@ Begin
hsymbol:=opr.symbol;
hsymofs:=opr.symofs;
opr.typ:=OPR_REFERENCE;
+ opr.varsize:=0;
+ opr.constoffset:=0;
Fillchar(opr.ref,sizeof(treference),0);
opr.ref.symbol:=hsymbol;
opr.ref.offset:=hsymofs;
@@ -981,6 +1005,8 @@ Begin
Message(asmr_e_invalid_operand_type);
{ Recover }
opr.typ:=OPR_REFERENCE;
+ opr.varsize:=0;
+ opr.constoffset:=0;
Fillchar(opr.ref,sizeof(treference),0);
end;
end;