* fixed reference parsing

This commit is contained in:
peter 2000-05-08 13:23:03 +00:00
parent 25bc00bb42
commit 4b09b89588
3 changed files with 49 additions and 32 deletions

View File

@ -1229,7 +1229,7 @@ var
begin
BuildRecordOffsetSize(expr,toffset,tsize);
inc(l,toffset);
SetSize(tsize);
SetSize(tsize,true);
end;
end;
if actasmtoken in [AS_PLUS,AS_MINUS] then
@ -1994,7 +1994,10 @@ begin
end.
{
$Log$
Revision 1.74 2000-04-29 12:51:33 peter
Revision 1.75 2000-05-08 13:23:03 peter
* fixed reference parsing
Revision 1.74 2000/04/29 12:51:33 peter
* fixed offset support intel reader, the gotoffset variable was not
always reset
* moved check for local/para to be only used for varsym

View File

@ -973,8 +973,8 @@ type
Procedure T386IntelOperand.BuildReference;
var
l : longint;
hs : string;
k,l : longint;
tempstr,hs : string;
code : integer;
hreg,
oldbase : tregister;
@ -1026,20 +1026,30 @@ Begin
Message(asmr_e_only_add_relocatable_symbol);
oldbase:=opr.ref.base;
opr.ref.base:=R_NO;
if not SetupVar(actasmpattern,GotOffset) then
Message1(sym_e_unknown_id,actasmpattern);
tempstr:=actasmpattern;
if not SetupVar(tempstr,GotOffset) then
Message1(sym_e_unknown_id,tempstr);
Consume(AS_ID);
{ record.field ? }
if actasmtoken=AS_DOT then
begin
BuildRecordOffsetSize(tempstr,l,k);
inc(opr.ref.offset,l);
end;
if GotOffset then
if hasvar and (opr.ref.base=procinfo^.framepointer) then
begin
opr.ref.base:=R_NO;
hasvar:=hadvar;
end
else
begin
if hasvar and hadvar then
Message(asmr_e_cant_have_multiple_relocatable_symbols);
{ should we allow ?? }
end;
begin
if hasvar and (opr.ref.base=procinfo^.framepointer) then
begin
opr.ref.base:=R_NO;
hasvar:=hadvar;
end
else
begin
if hasvar and hadvar then
Message(asmr_e_cant_have_multiple_relocatable_symbols);
{ should we allow ?? }
end;
end;
{ is the base register loaded by the var ? }
if (opr.ref.base<>R_NO) then
begin
@ -1067,7 +1077,6 @@ Begin
opr.typ:=OPR_REFERENCE;
inc(opr.ref.offset,opr.val);
end;
Consume(AS_ID);
end;
GotOffset:=false;
end;
@ -1266,7 +1275,7 @@ var
begin
BuildRecordOffsetSize(expr,toffset,tsize);
inc(l,toffset);
SetSize(tsize);
SetSize(tsize,true);
end;
end;
if actasmtoken in [AS_PLUS,AS_MINUS] then
@ -1816,7 +1825,10 @@ begin
end.
{
$Log$
Revision 1.64 2000-04-29 12:51:34 peter
Revision 1.65 2000-05-08 13:23:04 peter
* fixed reference parsing
Revision 1.64 2000/04/29 12:51:34 peter
* fixed offset support intel reader, the gotoffset variable was not
always reset
* moved check for local/para to be only used for varsym
@ -1909,4 +1921,4 @@ end.
* string constants are now handle correctly and also allowed in
constant expressions
}
}

View File

@ -93,7 +93,7 @@ type
constructor init;
destructor done;virtual;
Procedure BuildOperand;virtual;
Procedure SetSize(_size:longint);
Procedure SetSize(_size:longint;force:boolean);
Procedure SetCorrectSize(opcode:tasmop);virtual;
Function SetupResult:boolean;
Function SetupSelf:boolean;
@ -663,9 +663,10 @@ Procedure TOperand.SetCorrectSize(opcode:tasmop);
begin
end;
Procedure TOperand.SetSize(_size:longint);
Procedure TOperand.SetSize(_size:longint;force:boolean);
begin
if (size = S_NO) and (_size<=extended_size) then
if force or
((size = S_NO) and (_size<=extended_size)) then
Begin
case _size of
1 : size:=S_B;
@ -854,7 +855,7 @@ Begin
enumdef,
pointerdef,
floatdef :
SetSize(pvarsym(sym)^.getsize);
SetSize(pvarsym(sym)^.getsize,false);
arraydef :
begin
{ for arrays try to get the element size, take care of
@ -863,7 +864,7 @@ Begin
while assigned(harrdef^.elementtype.def) and
(harrdef^.elementtype.def^.deftype=arraydef) do
harrdef:=parraydef(harrdef^.elementtype.def);
SetSize(harrdef^.elesize);
SetSize(harrdef^.elesize,false);
end;
end;
hasvar:=true;
@ -878,7 +879,7 @@ Begin
enumdef,
pointerdef,
floatdef :
SetSize(ptypedconstsym(sym)^.getsize);
SetSize(ptypedconstsym(sym)^.getsize,false);
arraydef :
begin
{ for arrays try to get the element size, take care of
@ -887,7 +888,7 @@ Begin
while assigned(harrdef^.elementtype.def) and
(harrdef^.elementtype.def^.deftype=arraydef) do
harrdef:=parraydef(harrdef^.elementtype.def);
SetSize(harrdef^.elesize);
SetSize(harrdef^.elesize,false);
end;
end;
hasvar:=true;
@ -900,7 +901,6 @@ Begin
begin
opr.typ:=OPR_CONSTANT;
opr.val:=pconstsym(sym)^.value;
hasvar:=true;
SetupVar:=true;
Exit;
end;
@ -911,7 +911,6 @@ Begin
begin
opr.typ:=OPR_CONSTANT;
opr.val:=0;
hasvar:=true;
SetupVar:=TRUE;
Exit;
end;
@ -1513,7 +1512,10 @@ end;
end.
{
$Log$
Revision 1.40 2000-04-06 07:56:04 pierre
Revision 1.41 2000-05-08 13:23:05 peter
* fixed reference parsing
Revision 1.40 2000/04/06 07:56:04 pierre
* bug in TOperand.SetSize corrected
Revision 1.39 2000/04/04 13:48:45 pierre
@ -1586,4 +1588,4 @@ end.
Revision 1.20 1999/07/29 20:54:06 peter
* write .size also
}
}