|
@@ -22,17 +22,15 @@
|
|
}
|
|
}
|
|
unit ncgbas;
|
|
unit ncgbas;
|
|
|
|
|
|
- interface
|
|
|
|
|
|
+{$i defines.inc}
|
|
|
|
+
|
|
|
|
+interface
|
|
|
|
|
|
uses
|
|
uses
|
|
- node;
|
|
|
|
|
|
+ node,nbas;
|
|
|
|
|
|
type
|
|
type
|
|
- tcgnothingnode = class(tnoethingnode)
|
|
|
|
- procedure pass_2;override;
|
|
|
|
- end;
|
|
|
|
-
|
|
|
|
- tcgerrornode = class(terrornode)
|
|
|
|
|
|
+ tcgnothingnode = class(tnothingnode)
|
|
procedure pass_2;override;
|
|
procedure pass_2;override;
|
|
end;
|
|
end;
|
|
|
|
|
|
@@ -53,62 +51,181 @@ unit ncgbas;
|
|
uses
|
|
uses
|
|
globtype,systems,
|
|
globtype,systems,
|
|
cutils,cclasses,verbose,globals,
|
|
cutils,cclasses,verbose,globals,
|
|
- aasm,symtable,types,
|
|
|
|
|
|
+ aasm,symconst,symsym,symtable,types,
|
|
htypechk,
|
|
htypechk,
|
|
cpubase,cpuasm,
|
|
cpubase,cpuasm,
|
|
- nflw
|
|
|
|
|
|
+ nflw,pass_2
|
|
{$ifdef newcg}
|
|
{$ifdef newcg}
|
|
,cgbase
|
|
,cgbase
|
|
- ,tgcpu
|
|
|
|
{$else newcg}
|
|
{$else newcg}
|
|
,hcodegen
|
|
,hcodegen
|
|
- {$ifdef i386}
|
|
|
|
- ,tgeni386
|
|
|
|
- {$endif}
|
|
|
|
- {$ifdef m68k}
|
|
|
|
- ,tgen68k
|
|
|
|
- {$endif}
|
|
|
|
{$endif}
|
|
{$endif}
|
|
|
|
+{$ifdef i386}
|
|
|
|
+ ,cgai386
|
|
|
|
+{$endif}
|
|
|
|
+ ,tgcpu
|
|
;
|
|
;
|
|
{*****************************************************************************
|
|
{*****************************************************************************
|
|
- TFIRSTNOTHING
|
|
|
|
|
|
+ TNOTHING
|
|
*****************************************************************************}
|
|
*****************************************************************************}
|
|
|
|
|
|
- procedure tnothingnode.pass_2;
|
|
|
|
-
|
|
|
|
|
|
+ procedure tcgnothingnode.pass_2;
|
|
begin
|
|
begin
|
|
|
|
+ { avoid an abstract rte }
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+
|
|
{*****************************************************************************
|
|
{*****************************************************************************
|
|
- TFIRSTERROR
|
|
|
|
|
|
+ TSTATEMENTNODE
|
|
*****************************************************************************}
|
|
*****************************************************************************}
|
|
|
|
|
|
|
|
+ procedure tcgstatementnode.pass_2;
|
|
|
|
+ var
|
|
|
|
+ hp : tnode;
|
|
|
|
+ begin
|
|
|
|
+ hp:=self;
|
|
|
|
+ while assigned(hp) do
|
|
|
|
+ begin
|
|
|
|
+ if assigned(tstatementnode(hp).right) then
|
|
|
|
+ begin
|
|
|
|
+ cleartempgen;
|
|
|
|
+ secondpass(tstatementnode(hp).right);
|
|
|
|
+ end;
|
|
|
|
+ hp:=tstatementnode(hp).left;
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+
|
|
{*****************************************************************************
|
|
{*****************************************************************************
|
|
- TSTATEMENTNODE
|
|
|
|
|
|
+ TASMNODE
|
|
*****************************************************************************}
|
|
*****************************************************************************}
|
|
|
|
|
|
|
|
+ procedure tcgasmnode.pass_2;
|
|
|
|
+
|
|
|
|
+ procedure ReLabel(var p:tasmsymbol);
|
|
|
|
+ begin
|
|
|
|
+ if p.proclocal then
|
|
|
|
+ begin
|
|
|
|
+ if not assigned(p.altsymbol) then
|
|
|
|
+ begin
|
|
|
|
+ p.GenerateAltSymbol;
|
|
|
|
+ UsedAsmSymbolListInsert(p);
|
|
|
|
+ end;
|
|
|
|
+ p:=p.altsymbol;
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+ var
|
|
|
|
+ hp,hp2 : tai;
|
|
|
|
+ localfixup,parafixup,
|
|
|
|
+ i : longint;
|
|
|
|
+ skipnode : boolean;
|
|
|
|
+ begin
|
|
|
|
+ if inlining_procedure then
|
|
|
|
+ begin
|
|
|
|
+ CreateUsedAsmSymbolList;
|
|
|
|
+ localfixup:=aktprocsym.definition.localst.address_fixup;
|
|
|
|
+ parafixup:=aktprocsym.definition.parast.address_fixup;
|
|
|
|
+ hp:=tai(p_asm.first);
|
|
|
|
+ while assigned(hp) do
|
|
|
|
+ begin
|
|
|
|
+ hp2:=tai(hp.getcopy);
|
|
|
|
+ skipnode:=false;
|
|
|
|
+ case hp2.typ of
|
|
|
|
+ ait_label :
|
|
|
|
+ begin
|
|
|
|
+ { regenerate the labels by setting altsymbol }
|
|
|
|
+ ReLabel(tasmsymbol(tai_label(hp2).l));
|
|
|
|
+ end;
|
|
|
|
+ ait_const_rva,
|
|
|
|
+ ait_const_symbol :
|
|
|
|
+ begin
|
|
|
|
+ ReLabel(tai_const_symbol(hp2).sym);
|
|
|
|
+ end;
|
|
|
|
+ ait_instruction :
|
|
|
|
+ begin
|
|
|
|
+ { fixup the references }
|
|
|
|
+ for i:=1 to taicpu(hp2).ops do
|
|
|
|
+ begin
|
|
|
|
+ with taicpu(hp2).oper[i-1] do
|
|
|
|
+ begin
|
|
|
|
+ case typ of
|
|
|
|
+ top_ref :
|
|
|
|
+ begin
|
|
|
|
+ case ref^.options of
|
|
|
|
+ ref_parafixup :
|
|
|
|
+ ref^.offsetfixup:=parafixup;
|
|
|
|
+ ref_localfixup :
|
|
|
|
+ ref^.offsetfixup:=localfixup;
|
|
|
|
+ end;
|
|
|
|
+ if assigned(ref^.symbol) then
|
|
|
|
+ ReLabel(ref^.symbol);
|
|
|
|
+ end;
|
|
|
|
+ top_symbol :
|
|
|
|
+ begin
|
|
|
|
+ ReLabel(sym);
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
|
|
+ ait_marker :
|
|
|
|
+ begin
|
|
|
|
+ { it's not an assembler block anymore }
|
|
|
|
+ if (tai_marker(hp2).kind in [AsmBlockStart, AsmBlockEnd]) then
|
|
|
|
+ skipnode:=true;
|
|
|
|
+ end;
|
|
|
|
+ else
|
|
|
|
+ end;
|
|
|
|
+ if not skipnode then
|
|
|
|
+ exprasmList.concat(hp2)
|
|
|
|
+ else
|
|
|
|
+ hp2.free;
|
|
|
|
+ hp:=tai(hp.next);
|
|
|
|
+ end;
|
|
|
|
+ { restore used symbols }
|
|
|
|
+ UsedAsmSymbolListResetAltSym;
|
|
|
|
+ DestroyUsedAsmSymbolList;
|
|
|
|
+ end
|
|
|
|
+ else
|
|
|
|
+ begin
|
|
|
|
+ { if the routine is an inline routine, then we must hold a copy
|
|
|
|
+ because it can be necessary for inlining later }
|
|
|
|
+ if (pocall_inline in aktprocsym.definition.proccalloptions) then
|
|
|
|
+ exprasmList.concatlistcopy(p_asm)
|
|
|
|
+ else
|
|
|
|
+ exprasmList.concatlist(p_asm);
|
|
|
|
+ end;
|
|
|
|
+ if not (nf_object_preserved in flags) then
|
|
|
|
+ maybe_loadself;
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+
|
|
{*****************************************************************************
|
|
{*****************************************************************************
|
|
TBLOCKNODE
|
|
TBLOCKNODE
|
|
*****************************************************************************}
|
|
*****************************************************************************}
|
|
|
|
|
|
- procedure tblocknode.pass_2;
|
|
|
|
|
|
+ procedure tcgblocknode.pass_2;
|
|
begin
|
|
begin
|
|
- { do second pass on left node }
|
|
|
|
- if assigned(p^.left) then
|
|
|
|
- secondpass(p^.left);
|
|
|
|
|
|
+ { do second pass on left node }
|
|
|
|
+ if assigned(left) then
|
|
|
|
+ secondpass(left);
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
begin
|
|
begin
|
|
cnothingnode:=tcgnothingnode;
|
|
cnothingnode:=tcgnothingnode;
|
|
- cerrornode:=tcgerrornode;
|
|
|
|
casmnode:=tcgasmnode;
|
|
casmnode:=tcgasmnode;
|
|
cstatementnode:=tcgstatementnode;
|
|
cstatementnode:=tcgstatementnode;
|
|
cblocknode:=tcgblocknode;
|
|
cblocknode:=tcgblocknode;
|
|
end.
|
|
end.
|
|
{
|
|
{
|
|
$Log$
|
|
$Log$
|
|
- Revision 1.2 2001-04-13 01:22:08 peter
|
|
|
|
|
|
+ Revision 1.3 2001-05-18 22:31:06 peter
|
|
|
|
+ * tasmnode.pass_2 is independent of cpu, moved to ncgbas
|
|
|
|
+ * include ncgbas for independent nodes
|
|
|
|
+
|
|
|
|
+ Revision 1.2 2001/04/13 01:22:08 peter
|
|
* symtable change to classes
|
|
* symtable change to classes
|
|
* range check generation and errors fixed, make cycle DEBUG=1 works
|
|
* range check generation and errors fixed, make cycle DEBUG=1 works
|
|
* memory leaks fixed
|
|
* memory leaks fixed
|