From 4736cc2360d401731a9fa615b3020a60e2f35c77 Mon Sep 17 00:00:00 2001 From: "J. Gareth \"Curious Kit\" Moreton" Date: Sat, 2 Mar 2024 00:32:59 +0000 Subject: [PATCH] * Flags specific to TDerefNode have been moved to their own field --- compiler/i8086/n8086mem.pas | 2 +- compiler/ncgmem.pas | 2 +- compiler/ncnv.pas | 2 +- compiler/nmem.pas | 60 +++++++++++++++++++++++++++++++++++++ compiler/node.pas | 3 -- compiler/pinline.pas | 2 +- 6 files changed, 64 insertions(+), 7 deletions(-) diff --git a/compiler/i8086/n8086mem.pas b/compiler/i8086/n8086mem.pas index a3b19726a1..1e92b88c52 100644 --- a/compiler/i8086/n8086mem.pas +++ b/compiler/i8086/n8086mem.pas @@ -160,7 +160,7 @@ implementation {$ifdef x86} (tcpupointerdef(left.resultdef).x86pointertyp = tcpupointerdefclass(cpointerdef).default_x86_data_pointer_type) and {$endif x86} - not(nf_no_checkpointer in flags) and + not(drnf_no_checkpointer in derefnodeflags) and { can be NR_NO in case of LOC_CONSTANT } (location.reference.base<>NR_NO) then begin diff --git a/compiler/ncgmem.pas b/compiler/ncgmem.pas index 3e288982a9..ec75918411 100644 --- a/compiler/ncgmem.pas +++ b/compiler/ncgmem.pas @@ -298,7 +298,7 @@ implementation (cs_checkpointer in current_settings.localswitches) and not(cs_compilesystem in current_settings.moduleswitches) and tpointerdef(left.resultdef).compatible_with_pointerdef_size(tpointerdef(voidpointertype)) and - not(nf_no_checkpointer in flags) and + not(drnf_no_checkpointer in derefnodeflags) and { can be NR_NO in case of LOC_CONSTANT } (location.reference.base<>NR_NO) then begin diff --git a/compiler/ncnv.pas b/compiler/ncnv.pas index f6bba9720f..bf68d41491 100644 --- a/compiler/ncnv.pas +++ b/compiler/ncnv.pas @@ -1840,7 +1840,7 @@ implementation { left is reused } left := nil; result := cderefnode.create(result); - include(result.flags,nf_no_checkpointer); + include(TDerefNode(result).derefnodeflags,drnf_no_checkpointer); end; diff --git a/compiler/nmem.pas b/compiler/nmem.pas index 5472903e90..7f2aec85af 100644 --- a/compiler/nmem.pas +++ b/compiler/nmem.pas @@ -103,11 +103,25 @@ interface end; taddrnodeclass = class of taddrnode; + TDerefNodeFlag = + ( + drnf_no_checkpointer + ); + + TDerefNodeFlags = set of TDerefNodeFlag; + tderefnode = class(tunarynode) + derefnodeflags: TDerefNodeFlags; constructor create(l : tnode);virtual; + constructor ppuload(t:tnodetype;ppufile:tcompilerppufile);override; + procedure ppuwrite(ppufile:tcompilerppufile);override; + function dogetcopy : tnode;override; function pass_1 : tnode;override; function pass_typecheck:tnode;override; procedure mark_write;override; +{$ifdef DEBUG_NODE_XML} + procedure XMLPrintNodeInfo(var T: Text); +{$endif DEBUG_NODE_XML} end; tderefnodeclass = class of tderefnode; @@ -850,6 +864,30 @@ implementation end; + constructor tderefnode.ppuload(t:tnodetype;ppufile:tcompilerppufile); + begin + inherited ppuload(t, ppufile); + ppufile.getset(tppuset1(derefnodeflags)); + end; + + + procedure tderefnode.ppuwrite(ppufile:tcompilerppufile); + begin + inherited ppuwrite(ppufile); + ppufile.putset(tppuset1(derefnodeflags)); + end; + + + function tderefnode.dogetcopy : tnode; + var + n: TDerefNode; + begin + n := TDerefNode(inherited dogetcopy); + n.derefnodeflags := derefnodeflags; + Result := n; + end; + + function tderefnode.pass_typecheck:tnode; begin result:=nil; @@ -885,6 +923,28 @@ implementation expectloc:=LOC_REFERENCE; end; +{$ifdef DEBUG_NODE_XML} + procedure TDerefNode.XMLPrintNodeInfo(var T: Text); + var + i: TDerefNodeFlag; + First: Boolean; + begin + inherited XMLPrintNodeInfo(T); + First := True; + for i in derefnodeflags do + begin + if First then + begin + Write(T, ' derefnodeflags="', i); + First := False; + end + else + Write(T, ',', i) + end; + if not First then + Write(T, '"'); + end; +{$endif DEBUG_NODE_XML} {***************************************************************************** TSUBSCRIPTNODE diff --git a/compiler/node.pas b/compiler/node.pas index bdda34a2d5..bc81d0ebd8 100644 --- a/compiler/node.pas +++ b/compiler/node.pas @@ -233,9 +233,6 @@ interface in the case of pure assembly routines } nf_usercode_entry, - { tderefnode } - nf_no_checkpointer, - { tloadnode/ttypeconvnode } nf_absolute, diff --git a/compiler/pinline.pas b/compiler/pinline.pas index 243b684457..fbdc07c092 100644 --- a/compiler/pinline.pas +++ b/compiler/pinline.pas @@ -277,7 +277,7 @@ implementation if is_new then begin p2:=cderefnode.create(p.getcopy); - include(p2.flags,nf_no_checkpointer); + include(TDerefNode(p2).derefnodeflags,drnf_no_checkpointer); end else p2:=cderefnode.create(p);