mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-01 02:30:58 +02:00
* fixed reference parsing
This commit is contained in:
parent
25bc00bb42
commit
4b09b89588
@ -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
|
||||
|
@ -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
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user