mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-11-03 11:29:36 +01:00
* fixed call bugs with assembler readers
+ OPR_SYMBOL to hold a symbol in the asm parser
* fixed staticsymtable vars which were acessed through %ebp instead of
name
This commit is contained in:
parent
ed10a74289
commit
659c2fb45d
@ -108,7 +108,7 @@ Type
|
||||
{---------------------------------------------------------------------}
|
||||
|
||||
toperandtype = (OPR_NONE,OPR_REFERENCE,OPR_CONSTANT,OPR_REGISTER,OPR_LABINSTR,
|
||||
OPR_REGLIST);
|
||||
OPR_REGLIST,OPR_SYMBOL);
|
||||
|
||||
{ When the TReference field isintvalue = TRUE }
|
||||
{ then offset points to an ABSOLUTE address }
|
||||
@ -136,6 +136,7 @@ Type
|
||||
OPR_LABINSTR: (hl: plabel);
|
||||
{ Register list such as in the movem instruction }
|
||||
OPR_REGLIST: (list: set of tregister);
|
||||
OPR_SYMBOL : (symbol:pstring);
|
||||
end;
|
||||
|
||||
|
||||
@ -1207,194 +1208,188 @@ end;
|
||||
{ search and sets up the correct fields in the Instr record }
|
||||
{ for the NON-constant identifier passed to the routine. }
|
||||
{ if not found returns FALSE. }
|
||||
var
|
||||
sym:psym;
|
||||
l: longint;
|
||||
var
|
||||
sym : psym;
|
||||
l : longint;
|
||||
Begin
|
||||
CreateVarInstr := FALSE;
|
||||
{ are we in a routine ? }
|
||||
if assigned(aktprocsym) then
|
||||
CreateVarInstr := FALSE;
|
||||
{ are we in a routine ? }
|
||||
if assigned(aktprocsym) then
|
||||
begin
|
||||
if assigned(aktprocsym^.definition^.localst) then
|
||||
{ search the local list for the name of this variable. }
|
||||
{ search the local list for the name of this variable. }
|
||||
if assigned(aktprocsym^.definition^.localst) then
|
||||
sym:=aktprocsym^.definition^.localst^.search(hs)
|
||||
else
|
||||
else
|
||||
sym:=nil;
|
||||
if assigned(sym) then
|
||||
begin
|
||||
if sym^.typ=varsym then
|
||||
begin
|
||||
{ we always assume in asm statements that }
|
||||
{ that the variable is valid. }
|
||||
pvarsym(sym)^.is_valid:=1;
|
||||
instr.operands[operandnum].ref.base := procinfo.framepointer;
|
||||
instr.operands[operandnum].ref.offset := - (pvarsym(sym)^.address);
|
||||
{ the current size is NOT overriden if it already }
|
||||
{ exists, such as in the case of a byte ptr, in }
|
||||
{ front of the identifier. }
|
||||
if instr.operands[operandnum].size = S_NO then
|
||||
Begin
|
||||
case pvarsym(sym)^.getsize of
|
||||
1: instr.operands[operandnum].size := S_B;
|
||||
2: instr.operands[operandnum].size := S_W{ could be S_IS};
|
||||
4: instr.operands[operandnum].size := S_L{ could be S_IL or S_FS};
|
||||
8: instr.operands[operandnum].size := S_IQ{ could be S_D or S_FL};
|
||||
extended_size: instr.operands[operandnum].size := S_FX;
|
||||
else
|
||||
{ this is in the case where the instruction is LEA }
|
||||
{ or something like that, in that case size is not }
|
||||
{ important. }
|
||||
instr.operands[operandnum].size := S_NO;
|
||||
end; { end case }
|
||||
end;
|
||||
{ ok, finished for thir variable. }
|
||||
CreateVarInstr := TRUE;
|
||||
Exit;
|
||||
end
|
||||
else
|
||||
{ call to local function }
|
||||
if (sym^.typ=procsym) then
|
||||
begin
|
||||
{ free the memory before changing the symbol name. }
|
||||
if assigned(instr.operands[operandnum].ref.symbol) then
|
||||
FreeMem(instr.operands[operandnum].ref.symbol,
|
||||
length(instr.operands[operandnum].ref.symbol^)+1);
|
||||
instr.operands[operandnum].ref.symbol:=newpasstr(pprocsym(sym)^.definition^.mangledname);
|
||||
CreateVarInstr := TRUE;
|
||||
Exit;
|
||||
end
|
||||
{ else
|
||||
if (sym^.typ = typedconstsym) then
|
||||
Begin}
|
||||
{ UGH????? pprocsym??? }
|
||||
{ instr.operands[operandnum].ref.symbol:=newpasstr(pprocsym(sym)^.definition^.mangledname);}
|
||||
{* the current size is NOT overriden if it already *}
|
||||
{* exists, such as in the case of a byte ptr, in *}
|
||||
{* front of the identifier. *}
|
||||
{ if instr.operands[operandnum].size = S_NO then
|
||||
Begin
|
||||
case ptypedconstsym(sym)^.definition^.size of
|
||||
1: instr.operands[operandnum].size := S_B;
|
||||
2: instr.operands[operandnum].size := S_W;
|
||||
4: instr.operands[operandnum].size := S_L;
|
||||
8: instr.operands[operandnum].size := S_IQ;
|
||||
extended_size: instr.operands[operandnum].size := S_FX;
|
||||
else}
|
||||
{* this is in the case where the instruction is LEA *}
|
||||
{* or something like that, in that case size is not *}
|
||||
{* important. *}
|
||||
{ instr.operands[operandnum].size := S_NO;}
|
||||
{ end;} {* end case *}
|
||||
{ end;}
|
||||
{* ok, finished for this variable. *}
|
||||
{ CreateVarInstr := TRUE;
|
||||
Exit;
|
||||
end }
|
||||
end;
|
||||
{ now check for parameters passed to routine }
|
||||
{ else}
|
||||
begin
|
||||
if assigned(aktprocsym^.definition^.parast) then
|
||||
sym:=aktprocsym^.definition^.parast^.search(hs)
|
||||
else
|
||||
sym:=nil;
|
||||
if assigned(sym) then
|
||||
begin
|
||||
if sym^.typ=varsym then
|
||||
if assigned(sym) then
|
||||
begin
|
||||
case sym^.typ of
|
||||
typedconstsym,
|
||||
varsym : begin
|
||||
{ we always assume in asm statements that }
|
||||
{ that the variable is valid. }
|
||||
pvarsym(sym)^.is_valid:=1;
|
||||
if pvarsym(sym)^.owner^.symtabletype=staticsymtable then
|
||||
begin
|
||||
if assigned(instr.operands[operandnum].ref.symbol) then
|
||||
FreeMem(instr.operands[operandnum].ref.symbol,length(instr.operands[operandnum].ref.symbol^)+1);
|
||||
instr.operands[operandnum].ref.symbol:=newpasstr(pvarsym(sym)^.mangledname);
|
||||
end
|
||||
else
|
||||
begin
|
||||
instr.operands[operandnum].ref.base := procinfo.framepointer;
|
||||
instr.operands[operandnum].ref.offset := -(pvarsym(sym)^.address);
|
||||
end;
|
||||
{ the current size is NOT overriden if it already }
|
||||
{ exists, such as in the case of a byte ptr, in }
|
||||
{ front of the identifier. }
|
||||
if instr.operands[operandnum].size = S_NO then
|
||||
Begin
|
||||
case pvarsym(sym)^.getsize of
|
||||
1: instr.operands[operandnum].size := S_B;
|
||||
2: instr.operands[operandnum].size := S_W{ could be S_IS};
|
||||
4: instr.operands[operandnum].size := S_L{ could be S_IL or S_FS};
|
||||
8: instr.operands[operandnum].size := S_IQ{ could be S_D or S_FL};
|
||||
extended_size: instr.operands[operandnum].size := S_FX;
|
||||
else
|
||||
{ this is in the case where the instruction is LEA }
|
||||
{ or something like that, in that case size is not }
|
||||
{ important. }
|
||||
instr.operands[operandnum].size := S_NO;
|
||||
end; { end case }
|
||||
end;
|
||||
{ ok, finished for thir variable. }
|
||||
CreateVarInstr := TRUE;
|
||||
Exit;
|
||||
end;
|
||||
procsym : begin
|
||||
{ free the memory before changing the symbol name. }
|
||||
if assigned(instr.operands[operandnum].ref.symbol) then
|
||||
FreeMem(instr.operands[operandnum].ref.symbol,length(instr.operands[operandnum].ref.symbol^)+1);
|
||||
instr.operands[operandnum].operandtype:=OPR_SYMBOL;
|
||||
instr.operands[operandnum].symbol:=newpasstr(pprocsym(sym)^.definition^.mangledname);
|
||||
CreateVarInstr := TRUE;
|
||||
Exit;
|
||||
end
|
||||
else
|
||||
begin
|
||||
l:=pvarsym(sym)^.address;
|
||||
{ set offset }
|
||||
inc(l,aktprocsym^.definition^.parast^.call_offset);
|
||||
pvarsym(sym)^.is_valid:=1;
|
||||
instr.operands[operandnum].ref.base := procinfo.framepointer;
|
||||
instr.operands[operandnum].ref.offset := l;
|
||||
{ the current size is NOT overriden if it already }
|
||||
{ exists, such as in the case of a byte ptr, in }
|
||||
{ front of the identifier. }
|
||||
if instr.operands[operandnum].size = S_NO then
|
||||
Begin
|
||||
case pvarsym(sym)^.getsize of
|
||||
1: instr.operands[operandnum].size := S_B;
|
||||
2: instr.operands[operandnum].size := S_W;
|
||||
4: instr.operands[operandnum].size := S_L;
|
||||
8: instr.operands[operandnum].size := S_IQ;
|
||||
extended_size: instr.operands[operandnum].size := S_FX;
|
||||
else
|
||||
{ this is in the case where the instruction is LEA }
|
||||
{ or something like that, in that case size is not }
|
||||
{ important. }
|
||||
instr.operands[operandnum].size := S_NO;
|
||||
end; { end case }
|
||||
end; { endif }
|
||||
CreateVarInstr := TRUE;
|
||||
Exit;
|
||||
end; { endif }
|
||||
end; {endif }
|
||||
end; { endif }
|
||||
end;
|
||||
|
||||
{ not found.. .now look for global variables. }
|
||||
getsym(hs,false);
|
||||
sym:=srsym;
|
||||
if assigned(sym) then
|
||||
Begin
|
||||
if (sym^.typ = varsym) or (sym^.typ = typedconstsym) then
|
||||
Begin
|
||||
{ free the memory before changing the symbol name. }
|
||||
if assigned(instr.operands[operandnum].ref.symbol) then
|
||||
FreeMem(instr.operands[operandnum].ref.symbol,
|
||||
length(instr.operands[operandnum].ref.symbol^)+1);
|
||||
instr.operands[operandnum].ref.symbol:=newpasstr(sym^.mangledname);
|
||||
{ the current size is NOT overriden if it already }
|
||||
{ exists, such as in the case of a byte ptr, in }
|
||||
{ front of the identifier. }
|
||||
if (instr.operands[operandnum].size = S_NO) and (sym^.typ = varsym) then
|
||||
Begin
|
||||
case pvarsym(sym)^.getsize of
|
||||
1: instr.operands[operandnum].size := S_B;
|
||||
2: instr.operands[operandnum].size := S_W;
|
||||
4: instr.operands[operandnum].size := S_L;
|
||||
8: instr.operands[operandnum].size := S_IQ;
|
||||
else
|
||||
{ this is in the case where the instruction is LEA }
|
||||
{ or something like that, in that case size is not }
|
||||
{ important. }
|
||||
instr.operands[operandnum].size := S_NO;
|
||||
Comment(V_Error,'Unsupported symbol type for operand');
|
||||
exit;
|
||||
end;
|
||||
end
|
||||
else
|
||||
if (instr.operands[operandnum].size = S_NO) and (sym^.typ = typedconstsym) then
|
||||
Begin
|
||||
{ only these are valid sizes, otherwise prefixes are }
|
||||
{ required. }
|
||||
case ptypedconstsym(sym)^.definition^.size of
|
||||
1: instr.operands[operandnum].size := S_B;
|
||||
2: instr.operands[operandnum].size := S_W;
|
||||
4: instr.operands[operandnum].size := S_L;
|
||||
8: instr.operands[operandnum].size := S_IQ;
|
||||
else
|
||||
{ this is in the case where the instruction is LEA }
|
||||
{ or something like that, in that case size is not }
|
||||
{ important. }
|
||||
instr.operands[operandnum].size := S_NO;
|
||||
end;
|
||||
end; { endif }
|
||||
CreateVarInstr := TRUE;
|
||||
Exit;
|
||||
end;
|
||||
if (sym^.typ=procsym) then
|
||||
begin
|
||||
if assigned(pprocsym(sym)^.definition^.nextoverloaded) then
|
||||
Message(assem_w_calling_overload_func);
|
||||
{ free the memory before changing the symbol name. }
|
||||
if assigned(instr.operands[operandnum].ref.symbol) then
|
||||
FreeMem(instr.operands[operandnum].ref.symbol,
|
||||
length(instr.operands[operandnum].ref.symbol^)+1);
|
||||
instr.operands[operandnum].ref.symbol:=
|
||||
newpasstr(pprocsym(sym)^.definition^.mangledname);
|
||||
CreateVarInstr := TRUE;
|
||||
Exit;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
{ now check for parameters passed to routine }
|
||||
if assigned(aktprocsym^.definition^.parast) then
|
||||
sym:=aktprocsym^.definition^.parast^.search(hs)
|
||||
else
|
||||
sym:=nil;
|
||||
if assigned(sym) then
|
||||
begin
|
||||
case sym^.typ of
|
||||
varsym : begin
|
||||
l:=pvarsym(sym)^.address;
|
||||
{ set offset }
|
||||
inc(l,aktprocsym^.definition^.parast^.call_offset);
|
||||
pvarsym(sym)^.is_valid:=1;
|
||||
instr.operands[operandnum].ref.base := procinfo.framepointer;
|
||||
instr.operands[operandnum].ref.offset := l;
|
||||
{ the current size is NOT overriden if it already }
|
||||
{ exists, such as in the case of a byte ptr, in }
|
||||
{ front of the identifier. }
|
||||
if instr.operands[operandnum].size = S_NO then
|
||||
Begin
|
||||
case pvarsym(sym)^.getsize of
|
||||
1: instr.operands[operandnum].size := S_B;
|
||||
2: instr.operands[operandnum].size := S_W;
|
||||
4: instr.operands[operandnum].size := S_L;
|
||||
8: instr.operands[operandnum].size := S_IQ;
|
||||
extended_size: instr.operands[operandnum].size := S_FX;
|
||||
else
|
||||
{ this is in the case where the instruction is LEA }
|
||||
{ or something like that, in that case size is not }
|
||||
{ important. }
|
||||
instr.operands[operandnum].size := S_NO;
|
||||
end; { end case }
|
||||
end; { endif }
|
||||
CreateVarInstr := TRUE;
|
||||
Exit;
|
||||
end;
|
||||
else
|
||||
begin
|
||||
Comment(V_Error,'Unsupported symbol type for operand');
|
||||
exit;
|
||||
end;
|
||||
end; { case }
|
||||
end; { endif }
|
||||
end;
|
||||
{ not found.. .now look for global variables. }
|
||||
getsym(hs,false);
|
||||
sym:=srsym;
|
||||
if assigned(sym) then
|
||||
Begin
|
||||
case sym^.typ of
|
||||
varsym,
|
||||
typedconstsym : Begin
|
||||
{ free the memory before changing the symbol name. }
|
||||
if assigned(instr.operands[operandnum].ref.symbol) then
|
||||
FreeMem(instr.operands[operandnum].ref.symbol,
|
||||
length(instr.operands[operandnum].ref.symbol^)+1);
|
||||
instr.operands[operandnum].ref.symbol:=newpasstr(sym^.mangledname);
|
||||
{ the current size is NOT overriden if it already }
|
||||
{ exists, such as in the case of a byte ptr, in }
|
||||
{ front of the identifier. }
|
||||
if (instr.operands[operandnum].size = S_NO) and (sym^.typ = varsym) then
|
||||
Begin
|
||||
case pvarsym(sym)^.getsize of
|
||||
1: instr.operands[operandnum].size := S_B;
|
||||
2: instr.operands[operandnum].size := S_W;
|
||||
4: instr.operands[operandnum].size := S_L;
|
||||
8: instr.operands[operandnum].size := S_IQ;
|
||||
else
|
||||
{ this is in the case where the instruction is LEA }
|
||||
{ or something like that, in that case size is not }
|
||||
{ important. }
|
||||
instr.operands[operandnum].size := S_NO;
|
||||
end;
|
||||
end
|
||||
else
|
||||
if (instr.operands[operandnum].size = S_NO) and (sym^.typ = typedconstsym) then
|
||||
Begin
|
||||
{ only these are valid sizes, otherwise prefixes are }
|
||||
{ required. }
|
||||
case ptypedconstsym(sym)^.definition^.size of
|
||||
1: instr.operands[operandnum].size := S_B;
|
||||
2: instr.operands[operandnum].size := S_W;
|
||||
4: instr.operands[operandnum].size := S_L;
|
||||
8: instr.operands[operandnum].size := S_IQ;
|
||||
else
|
||||
{ this is in the case where the instruction is LEA }
|
||||
{ or something like that, in that case size is not }
|
||||
{ important. }
|
||||
instr.operands[operandnum].size := S_NO;
|
||||
end;
|
||||
end; { endif }
|
||||
CreateVarInstr := TRUE;
|
||||
Exit;
|
||||
end;
|
||||
procsym : begin
|
||||
if assigned(pprocsym(sym)^.definition^.nextoverloaded) then
|
||||
Message(assem_w_calling_overload_func);
|
||||
{ free the memory before changing the symbol name. }
|
||||
if assigned(instr.operands[operandnum].ref.symbol) then
|
||||
FreeMem(instr.operands[operandnum].ref.symbol,length(instr.operands[operandnum].ref.symbol^)+1);
|
||||
instr.operands[operandnum].operandtype:=OPR_SYMBOL;
|
||||
instr.operands[operandnum].symbol:=newpasstr(pprocsym(sym)^.definition^.mangledname);
|
||||
CreateVarInstr := TRUE;
|
||||
Exit;
|
||||
end;
|
||||
else
|
||||
begin
|
||||
Comment(V_Error,'Unsupported symbol type for operand');
|
||||
exit;
|
||||
end;
|
||||
end; {case}
|
||||
end; { end looking for global variables .. }
|
||||
end;
|
||||
|
||||
@ -1626,80 +1621,17 @@ end;
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.2 1998-04-29 10:33:43 pierre
|
||||
Revision 1.3 1998-05-31 14:13:30 peter
|
||||
* fixed call bugs with assembler readers
|
||||
+ OPR_SYMBOL to hold a symbol in the asm parser
|
||||
* fixed staticsymtable vars which were acessed through %ebp instead of
|
||||
name
|
||||
|
||||
Revision 1.2 1998/04/29 10:33:43 pierre
|
||||
+ added some code for ansistring (not complete nor working yet)
|
||||
* corrected operator overloading
|
||||
* corrected nasm output
|
||||
+ started inline procedures
|
||||
+ added starstarn : use ** for exponentiation (^ gave problems)
|
||||
+ started UseTokenInfo cond to get accurate positions
|
||||
|
||||
Revision 1.1.1.1 1998/03/25 11:18:12 root
|
||||
* Restored version
|
||||
|
||||
Revision 1.15 1998/03/10 01:17:14 peter
|
||||
* all files have the same header
|
||||
* messages are fully implemented, EXTDEBUG uses Comment()
|
||||
+ AG... files for the Assembler generation
|
||||
|
||||
Revision 1.14 1998/03/09 12:58:10 peter
|
||||
* FWait warning is only showed for Go32V2 and $E+
|
||||
* opcode tables moved to i386.pas/m68k.pas to reduce circular uses (and
|
||||
for m68k the same tables are removed)
|
||||
+ $E for i386
|
||||
|
||||
Revision 1.13 1998/03/03 16:45:16 peter
|
||||
+ message support for assembler parsers
|
||||
|
||||
Revision 1.12 1998/03/02 01:48:02 peter
|
||||
* renamed target_DOS to target_GO32V1
|
||||
+ new verbose system, merged old errors and verbose units into one new
|
||||
verbose.pas, so errors.pas is obsolete
|
||||
|
||||
Revision 1.11 1998/02/13 10:34:34 daniel
|
||||
* Made Motorola version compilable.
|
||||
* Fixed optimizer
|
||||
|
||||
Revision 1.10 1998/01/09 19:21:19 carl
|
||||
+ added support for m68k
|
||||
|
||||
Revision 1.7 1997/12/14 22:43:17 florian
|
||||
+ command line switch -Xs for DOS (passes -s to the linker to strip symbols from
|
||||
executable)
|
||||
* some changes of Carl-Eric implemented
|
||||
|
||||
Revision 1.5 1997/12/09 13:23:54 carl
|
||||
+ less processor specific
|
||||
- moved searching for externals/internal symbols from CreateVarInstr to
|
||||
ratti386.pas (this would cause invalid stuff in rai386.pas!)
|
||||
|
||||
Revision 1.4 1997/12/04 12:20:39 pierre
|
||||
+* MMX instructions added to att output with a warning that
|
||||
GNU as version >= 2.81 is needed
|
||||
bug in reading of reals under att syntax corrected
|
||||
|
||||
Revision 1.3 1997/12/01 17:42:49 pierre
|
||||
+ added some more functionnality to the assembler parser
|
||||
|
||||
Revision 1.2 1997/11/27 17:55:11 carl
|
||||
* made it compile under bp (one comment was nested)
|
||||
|
||||
Revision 1.1.1.1 1997/11/27 08:32:50 michael
|
||||
FPC Compiler CVS start
|
||||
|
||||
|
||||
Pre-CVS log:
|
||||
|
||||
CEC Carl-Eric Codere
|
||||
FK Florian Klaempfl
|
||||
PM Pierre Muller
|
||||
+ feature added
|
||||
- removed
|
||||
* bug fixed or changed
|
||||
|
||||
11th november 1997:
|
||||
* fixed problems when using reserved words TRUE and FALSE (CEC).
|
||||
22th november 1997:
|
||||
* changed operator (reserved word) into _operator (PM).
|
||||
|
||||
}
|
||||
|
||||
@ -780,6 +780,9 @@ var
|
||||
findtype := _regtypes[reg];
|
||||
exit;
|
||||
end;
|
||||
OPR_SYMBOL: Begin
|
||||
findtype := ao_jumpabsolute;
|
||||
end;
|
||||
OPR_NONE: Begin
|
||||
findtype := 0;
|
||||
end;
|
||||
@ -1472,6 +1475,10 @@ var
|
||||
else
|
||||
Message(assem_e_invalid_opcode_and_operand);
|
||||
end;
|
||||
OPR_SYMBOL: Begin
|
||||
p^.concat(new(pai386,op_csymbol(instruc,
|
||||
instr.stropsize, newcsymbol(instr.operands[1].symbol^,0))));
|
||||
End;
|
||||
OPR_NONE: Begin
|
||||
Message(assem_f_internal_error_in_concatopcode);
|
||||
end;
|
||||
@ -3369,7 +3376,13 @@ Begin
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.8 1998-05-30 14:31:07 peter
|
||||
Revision 1.9 1998-05-31 14:13:32 peter
|
||||
* fixed call bugs with assembler readers
|
||||
+ OPR_SYMBOL to hold a symbol in the asm parser
|
||||
* fixed staticsymtable vars which were acessed through %ebp instead of
|
||||
name
|
||||
|
||||
Revision 1.8 1998/05/30 14:31:07 peter
|
||||
+ $ASMMODE
|
||||
|
||||
Revision 1.7 1998/05/28 16:32:05 carl
|
||||
@ -3406,120 +3419,4 @@ end.
|
||||
nasm output OK (program still crashes at end
|
||||
and creates wrong assembler files !!)
|
||||
procsym types sym in tdef removed !!
|
||||
|
||||
Revision 1.2 1998/03/31 15:21:01 florian
|
||||
* fix of out (intel syntax) applied
|
||||
|
||||
Revision 1.1.1.1 1998/03/25 11:18:15 root
|
||||
* Restored version
|
||||
|
||||
Revision 1.19 1998/03/24 21:48:34 florian
|
||||
* just a couple of fixes applied:
|
||||
- problem with fixed16 solved
|
||||
- internalerror 10005 problem fixed
|
||||
- patch for assembler reading
|
||||
- small optimizer fix
|
||||
- mem is now supported
|
||||
|
||||
Revision 1.18 1998/03/10 01:17:26 peter
|
||||
* all files have the same header
|
||||
* messages are fully implemented, EXTDEBUG uses Comment()
|
||||
+ AG... files for the Assembler generation
|
||||
|
||||
Revision 1.17 1998/03/09 12:58:12 peter
|
||||
* FWait warning is only showed for Go32V2 and $E+
|
||||
* opcode tables moved to i386.pas/m68k.pas to reduce circular uses (and
|
||||
for m68k the same tables are removed)
|
||||
+ $E for i386
|
||||
|
||||
Revision 1.16 1998/03/04 17:33:56 michael
|
||||
+ Changed ifdef FPK to ifdef FPC
|
||||
|
||||
Revision 1.15 1998/03/03 22:38:26 peter
|
||||
* the last 3 files
|
||||
|
||||
Revision 1.14 1998/03/02 01:49:15 peter
|
||||
* renamed target_DOS to target_GO32V1
|
||||
+ new verbose system, merged old errors and verbose units into one new
|
||||
verbose.pas, so errors.pas is obsolete
|
||||
|
||||
Revision 1.13 1998/02/13 10:35:38 daniel
|
||||
* Made Motorola version compilable.
|
||||
* Fixed optimizer
|
||||
|
||||
Revision 1.12 1998/02/12 11:50:36 daniel
|
||||
Yes! Finally! After three retries, my patch!
|
||||
|
||||
Changes:
|
||||
|
||||
Complete rewrite of psub.pas.
|
||||
Added support for DLL's.
|
||||
Compiler requires less memory.
|
||||
Platform units for each platform.
|
||||
|
||||
Revision 1.11 1998/02/07 18:02:36 carl
|
||||
+ fwait warning for emulation
|
||||
|
||||
Revision 1.10 1998/01/19 03:11:40 carl
|
||||
* bugfix number 78
|
||||
|
||||
Revision 1.9 1998/01/09 19:22:51 carl
|
||||
* bugfix of __ID variable names
|
||||
|
||||
Revision 1.8 1997/12/09 14:00:25 carl
|
||||
* bugfix of intr reg,reg instructions, size must always be specified
|
||||
under gas (ref: DJGPP FAQ)
|
||||
* bugfix of concatopcode with fits init twice!
|
||||
+ unknown instr. only poermitted when compiling system unit and/or
|
||||
target processor > i386
|
||||
|
||||
Revision 1.7 1997/12/04 12:20:50 pierre
|
||||
+* MMX instructions added to att output with a warning that
|
||||
GNU as version >= 2.81 is needed
|
||||
bug in reading of reals under att syntax corrected
|
||||
|
||||
Revision 1.6 1997/11/28 18:14:45 pierre
|
||||
working version with several bug fixes
|
||||
|
||||
Revision 1.5 1997/11/28 15:43:20 florian
|
||||
Fixed stack ajustment bug, 0.9.8 compiles now 0.9.8 without problems.
|
||||
|
||||
Revision 1.4 1997/11/28 15:31:59 carl
|
||||
* uncommented firstop and lastop. (otherwise can cause bugs)
|
||||
|
||||
Revision 1.3 1997/11/28 14:26:22 florian
|
||||
Fixed some bugs
|
||||
|
||||
Revision 1.2 1997/11/28 12:03:53 michael
|
||||
Changed comment delimiters to braces, causes problems with 0.9.1
|
||||
Changed use of ord to typecast with longint.
|
||||
Made boolean expressions non-redundant.
|
||||
|
||||
Revision 1.1.1.1 1997/11/27 08:33:00 michael
|
||||
FPC Compiler CVS start
|
||||
|
||||
|
||||
Pre-CVS log:
|
||||
|
||||
CEC Carl-Eric Codere
|
||||
FK Florian Klaempfl
|
||||
PM Pierre Muller
|
||||
+ feature added
|
||||
- removed
|
||||
* bug fixed or changed
|
||||
|
||||
9th november 1997:
|
||||
+ first working version with main distribution line of FPC (CEC)
|
||||
12th november 1997:
|
||||
* bugfix of CALL and JMP with symbolic references. (CEC)
|
||||
13th november 1997:
|
||||
* too many bugfixes/improvements to name... (CEC)
|
||||
* Fixed range check, line numbering, missing operand checking
|
||||
bugs - range checking must be off to compile under tp. (CEC)
|
||||
+ speed improvement of 30% over old version with global look up tables.
|
||||
14th november 1997:
|
||||
+ added support for record/object offsets. (CEC)
|
||||
* fixed bug regarding ENTER and push imm8 instruction(CEC)
|
||||
+ fixed conflicts with fpu instructions. (CEC).
|
||||
|
||||
}
|
||||
|
||||
@ -954,6 +954,9 @@ const
|
||||
findtype := _regtypes[reg];
|
||||
exit;
|
||||
end;
|
||||
OPR_SYMBOL: Begin
|
||||
findtype := ao_jumpabsolute;
|
||||
end;
|
||||
OPR_NONE: Begin
|
||||
findtype := 0;
|
||||
end;
|
||||
@ -1648,6 +1651,11 @@ const
|
||||
p^.concat(new(pai386,op_reg(instruc,
|
||||
instr.stropsize, instr.operands[1].reg)));
|
||||
End;
|
||||
OPR_SYMBOL:
|
||||
Begin
|
||||
p^.concat(new(pai386,op_csymbol(instruc,
|
||||
instr.stropsize, newcsymbol(instr.operands[1].symbol^,0))));
|
||||
End;
|
||||
OPR_REFERENCE:
|
||||
{ now first check suffix ... }
|
||||
if instr.stropsize <> S_NO then
|
||||
@ -3683,7 +3691,13 @@ end.
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.10 1998-05-30 14:31:08 peter
|
||||
Revision 1.11 1998-05-31 14:13:35 peter
|
||||
* fixed call bugs with assembler readers
|
||||
+ OPR_SYMBOL to hold a symbol in the asm parser
|
||||
* fixed staticsymtable vars which were acessed through %ebp instead of
|
||||
name
|
||||
|
||||
Revision 1.10 1998/05/30 14:31:08 peter
|
||||
+ $ASMMODE
|
||||
|
||||
Revision 1.9 1998/05/29 09:58:16 pierre
|
||||
@ -3729,130 +3743,5 @@ end.
|
||||
nasm output OK (program still crashes at end
|
||||
and creates wrong assembler files !!)
|
||||
procsym types sym in tdef removed !!
|
||||
|
||||
Revision 1.2 1998/03/30 15:53:01 florian
|
||||
* last changes before release:
|
||||
- gdb fixed
|
||||
- ratti386 warning removed (about unset function result)
|
||||
|
||||
Revision 1.1.1.1 1998/03/25 11:18:15 root
|
||||
* Restored version
|
||||
|
||||
Revision 1.21 1998/03/10 16:27:44 pierre
|
||||
* better line info in stabs debug
|
||||
* symtabletype and lexlevel separated into two fields of tsymtable
|
||||
+ ifdef MAKELIB for direct library output, not complete
|
||||
+ ifdef CHAINPROCSYMS for overloaded seach across units, not fully
|
||||
working
|
||||
+ ifdef TESTFUNCRET for setting func result in underfunction, not
|
||||
working
|
||||
|
||||
Revision 1.20 1998/03/10 01:17:27 peter
|
||||
* all files have the same header
|
||||
* messages are fully implemented, EXTDEBUG uses Comment()
|
||||
+ AG... files for the Assembler generation
|
||||
|
||||
Revision 1.19 1998/03/09 12:58:13 peter
|
||||
* FWait warning is only showed for Go32V2 and $E+
|
||||
* opcode tables moved to i386.pas/m68k.pas to reduce circular uses (and
|
||||
for m68k the same tables are removed)
|
||||
+ $E for i386
|
||||
|
||||
Revision 1.18 1998/03/04 17:34:01 michael
|
||||
+ Changed ifdef FPK to ifdef FPC
|
||||
|
||||
Revision 1.17 1998/03/03 22:38:30 peter
|
||||
* the last 3 files
|
||||
|
||||
Revision 1.16 1998/03/02 01:49:21 peter
|
||||
* renamed target_DOS to target_GO32V1
|
||||
+ new verbose system, merged old errors and verbose units into one new
|
||||
verbose.pas, so errors.pas is obsolete
|
||||
|
||||
Revision 1.15 1998/02/13 10:35:42 daniel
|
||||
* Made Motorola version compilable.
|
||||
* Fixed optimizer
|
||||
|
||||
Revision 1.14 1998/02/12 11:50:41 daniel
|
||||
Yes! Finally! After three retries, my patch!
|
||||
|
||||
Changes:
|
||||
|
||||
Complete rewrite of psub.pas.
|
||||
Added support for DLL's.
|
||||
Compiler requires less memory.
|
||||
Platform units for each platform.
|
||||
|
||||
Revision 1.13 1998/02/07 18:03:55 carl
|
||||
+ fwait warning for emulation
|
||||
|
||||
Revision 1.12 1998/01/19 03:10:52 carl
|
||||
* bugfix number 78
|
||||
|
||||
Revision 1.11 1998/01/09 19:24:00 carl
|
||||
+ externals are now added if identifier is not found
|
||||
|
||||
Revision 1.10 1997/12/14 22:43:25 florian
|
||||
+ command line switch -Xs for DOS (passes -s to the linker to strip symbols from
|
||||
executable)
|
||||
* some changes of Carl-Eric implemented
|
||||
|
||||
Revision 1.9 1997/12/09 14:07:14 carl
|
||||
+ added better error size checkimg -- otherwise would cause problems
|
||||
with intasmi3
|
||||
* bugfixes as in rai386
|
||||
* BuildRealConstant gave out Overflow errors (hex/bin/octal should be
|
||||
directly decoded into real)
|
||||
* bugfix of MOVSX/MOVZX instruction
|
||||
* ConcatOpCode op_csymbol gave out a Runerrore 216 under each test
|
||||
I performed, or output a nil symbol -- so removed.
|
||||
* All identifiers must be in uppercase!!!
|
||||
(except local labels and directives)
|
||||
+ supervisor stuff only possible when compiling the system unit
|
||||
|
||||
Revision 1.7 1997/12/04 12:21:09 pierre
|
||||
+* MMX instructions added to att output with a warning that
|
||||
GNU as version >= 2.81 is needed
|
||||
bug in reading of reals under att syntax corrected
|
||||
|
||||
Revision 1.6 1997/12/01 17:42:56 pierre
|
||||
+ added some more functionnality to the assembler parser
|
||||
|
||||
Revision 1.5 1997/11/28 15:43:23 florian
|
||||
Fixed stack ajustment bug, 0.9.8 compiles now 0.9.8 without problems.
|
||||
|
||||
Revision 1.4 1997/11/28 15:39:46 carl
|
||||
- removed reference to WriteLn and replaced in inasmxxx
|
||||
* uncommented firstop and lastop (otherwise can cause bugs)
|
||||
|
||||
Revision 1.3 1997/11/28 14:26:24 florian
|
||||
Fixed some bugs
|
||||
|
||||
Revision 1.2 1997/11/28 12:05:44 michael
|
||||
Changed comment delimiter to braces
|
||||
CHanged use of ord to typecast with longint
|
||||
Changed line constant to variable. Added initialization. v0.9.1 chokes
|
||||
on 255 length constant strings.
|
||||
Boolean expressions are now non-redundant.
|
||||
|
||||
Revision 1.1.1.1 1997/11/27 08:33:01 michael
|
||||
FPC Compiler CVS start
|
||||
|
||||
|
||||
Pre-CVS log:
|
||||
|
||||
|
||||
CEC Carl-Eric Codere
|
||||
FK Florian Klaempfl
|
||||
PM Pierre Muller
|
||||
+ feature added
|
||||
- removed
|
||||
* bug fixed or changed
|
||||
|
||||
14th november 1997:
|
||||
* fixed bug regarding ENTER and push imm8 instruction (CEC)
|
||||
+ fixed conflicts with fpu instructions. (CEC).
|
||||
+ adding real const support. (PM).
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -385,10 +385,10 @@
|
||||
writelong(len);
|
||||
{$ifdef NEWPPU}
|
||||
case string_typ of
|
||||
shortstring : ppufile.writeentry(ibstringdef);
|
||||
longstring : ppufile.writeentry(iblongstringdef);
|
||||
ansistring : ppufile.writeentry(ibansistringdef);
|
||||
widestring : ppufile.writeentry(ibwidestringdef);
|
||||
shortstring : ppufile^.writeentry(ibstringdef);
|
||||
longstring : ppufile^.writeentry(iblongstringdef);
|
||||
ansistring : ppufile^.writeentry(ibansistringdef);
|
||||
widestring : ppufile^.writeentry(ibwidestringdef);
|
||||
end;
|
||||
{$endif}
|
||||
end;
|
||||
@ -488,7 +488,7 @@
|
||||
tdef.write;
|
||||
writelong(max);
|
||||
{$ifdef NEWPPU}
|
||||
ppufile.writeentry(ibenumdef);
|
||||
ppufile^.writeentry(ibenumdef);
|
||||
{$endif}
|
||||
end;
|
||||
|
||||
@ -640,7 +640,7 @@
|
||||
writelong(von);
|
||||
writelong(bis);
|
||||
{$ifdef NEWPPU}
|
||||
ppufile.writeentry(iborddef);
|
||||
ppufile^.writeentry(iborddef);
|
||||
{$endif}
|
||||
end;
|
||||
|
||||
@ -705,7 +705,7 @@
|
||||
tdef.write;
|
||||
writebyte(byte(typ));
|
||||
{$ifdef NEWPPU}
|
||||
ppufile.writeentry(ibfloatdef);
|
||||
ppufile^.writeentry(ibfloatdef);
|
||||
{$endif}
|
||||
end;
|
||||
|
||||
@ -805,7 +805,7 @@
|
||||
if filetype=ft_typed then
|
||||
writedefref(typed_as);
|
||||
{$ifdef NEWPPU}
|
||||
ppufile.writeentry(ibfiledef);
|
||||
ppufile^.writeentry(ibfiledef);
|
||||
{$endif}
|
||||
end;
|
||||
|
||||
@ -911,7 +911,7 @@
|
||||
tdef.write;
|
||||
writedefref(definition);
|
||||
{$ifdef NEWPPU}
|
||||
ppufile.writeentry(ibpointerdef);
|
||||
ppufile^.writeentry(ibpointerdef);
|
||||
{$endif}
|
||||
end;
|
||||
|
||||
@ -990,7 +990,7 @@
|
||||
tdef.write;
|
||||
writedefref(definition);
|
||||
{$ifdef NEWPPU}
|
||||
ppufile.writeentry(ibclassrefdef);
|
||||
ppufile^.writeentry(ibclassrefdef);
|
||||
{$endif}
|
||||
end;
|
||||
|
||||
@ -1061,7 +1061,7 @@
|
||||
if settype=varset then
|
||||
writelong(savesize);
|
||||
{$ifdef NEWPPU}
|
||||
ppufile.writeentry(ibsetdef);
|
||||
ppufile^.writeentry(ibsetdef);
|
||||
{$endif}
|
||||
end;
|
||||
|
||||
@ -1117,7 +1117,7 @@
|
||||
{$endif}
|
||||
tdef.write;
|
||||
{$ifdef NEWPPU}
|
||||
ppufile.writeentry(ibformaldef);
|
||||
ppufile^.writeentry(ibformaldef);
|
||||
{$endif}
|
||||
end;
|
||||
|
||||
@ -1197,7 +1197,7 @@
|
||||
writelong(lowrange);
|
||||
writelong(highrange);
|
||||
{$ifdef NEWPPU}
|
||||
ppufile.writeentry(ibarraydef);
|
||||
ppufile^.writeentry(ibarraydef);
|
||||
{$endif}
|
||||
end;
|
||||
|
||||
@ -1337,7 +1337,7 @@
|
||||
tdef.write;
|
||||
writelong(savesize);
|
||||
{$ifdef NEWPPU}
|
||||
ppufile.writeentry(ibrecorddef);
|
||||
ppufile^.writeentry(ibrecorddef);
|
||||
{$endif}
|
||||
self.symtable^.writeasstruct;
|
||||
read_member:=oldread_member;
|
||||
@ -1691,7 +1691,7 @@
|
||||
{ references do not change the ppu caracteristics }
|
||||
{ this only save the references to variables/functions }
|
||||
{ defined in the unit what about the others }
|
||||
ppufile.do_crc:=false;
|
||||
ppufile^.do_crc:=false;
|
||||
if assigned(lastwritten) then
|
||||
ref:=lastwritten
|
||||
else
|
||||
@ -1706,7 +1706,7 @@
|
||||
end;
|
||||
lastwritten:=lastref;
|
||||
writebyte(ibend);
|
||||
ppufile.do_crc:=true;
|
||||
ppufile^.do_crc:=true;
|
||||
end;
|
||||
|
||||
procedure tprocdef.write_external_references;
|
||||
@ -1714,7 +1714,7 @@
|
||||
var ref : pref;
|
||||
|
||||
begin
|
||||
ppufile.do_crc:=false;
|
||||
ppufile^.do_crc:=false;
|
||||
if lastwritten=lastref then exit;
|
||||
writebyte(ibextdefref);
|
||||
writedefref(@self);
|
||||
@ -1732,7 +1732,7 @@
|
||||
end;
|
||||
lastwritten:=lastref;
|
||||
writebyte(ibend);
|
||||
ppufile.do_crc:=true;
|
||||
ppufile^.do_crc:=true;
|
||||
end;
|
||||
|
||||
procedure tprocdef.write_ref_to_file(var f : text);
|
||||
@ -1798,7 +1798,7 @@
|
||||
writedefref(nextoverloaded);
|
||||
writedefref(_class);
|
||||
{$ifdef NEWPPU}
|
||||
ppufile.writeentry(ibprocdef);
|
||||
ppufile^.writeentry(ibprocdef);
|
||||
{$endif}
|
||||
{$ifdef UseBrowser}
|
||||
if (current_module^.flags and uf_uses_browser)<>0 then
|
||||
@ -1970,7 +1970,7 @@
|
||||
{$endif StoreFPULevel}
|
||||
inherited write;
|
||||
{$ifdef NEWPPU}
|
||||
ppufile.writeentry(ibprocvardef);
|
||||
ppufile^.writeentry(ibprocvardef);
|
||||
{$endif}
|
||||
end;
|
||||
|
||||
@ -2215,7 +2215,7 @@
|
||||
writedefref(childof);
|
||||
writelong(options);
|
||||
{$ifdef NEWPPU}
|
||||
ppufile.writeentry(ibobjectdef);
|
||||
ppufile^.writeentry(ibobjectdef);
|
||||
{$endif}
|
||||
if (options and (oo_hasprivate or oo_hasprotected))<>0 then
|
||||
object_options:=true;
|
||||
@ -2368,7 +2368,13 @@
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.1 1998-05-27 19:45:09 peter
|
||||
Revision 1.2 1998-05-31 14:13:37 peter
|
||||
* fixed call bugs with assembler readers
|
||||
+ OPR_SYMBOL to hold a symbol in the asm parser
|
||||
* fixed staticsymtable vars which were acessed through %ebp instead of
|
||||
name
|
||||
|
||||
Revision 1.1 1998/05/27 19:45:09 peter
|
||||
* symtable.pas splitted into includefiles
|
||||
* symtable adapted for $ifdef NEWPPU
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user