diff options
Diffstat (limited to 'compiler/rautils.pas')
-rw-r--r-- | compiler/rautils.pas | 36 |
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; |