From 2778bf55c7f0fd40e3d0db3ff7cbdda474b8c146 Mon Sep 17 00:00:00 2001 From: Jonas Maebe <jonas@freepascal.org> Date: Tue, 13 Oct 2015 15:59:06 +0000 Subject: [PATCH] * add "doregister" parameter to torddef.create, and don't register temporary defs created in the scanner for evaluating compile time expressions, or in the code generator for range checking git-svn-id: trunk@32046 - --- compiler/cg64f32.pas | 8 +++--- compiler/ninl.pas | 10 +++++--- compiler/nmem.pas | 5 ++-- compiler/psystem.pas | 58 ++++++++++++++++++++++---------------------- compiler/ptype.pas | 8 +++--- compiler/scanner.pas | 6 ++--- compiler/symdef.pas | 8 +++--- 7 files changed, 54 insertions(+), 49 deletions(-) diff --git a/compiler/cg64f32.pas b/compiler/cg64f32.pas index 6e4de622c0..9108540cbb 100644 --- a/compiler/cg64f32.pas +++ b/compiler/cg64f32.pas @@ -931,7 +931,7 @@ unit cg64f32; { if the high dword = 0, the low dword can be considered a } { simple cardinal } cg.a_label(list,poslabel); - hdef:=corddef.create(u32bit,0,$ffffffff); + hdef:=corddef.create(u32bit,0,$ffffffff,false); location_copy(temploc,l); temploc.size:=OS_32; @@ -944,7 +944,7 @@ unit cg64f32; end; hlcg.g_rangecheck(list,temploc,hdef,todef); - hdef.owner.deletedef(hdef); + hdef.free; if from_signed and to_signed then begin @@ -971,11 +971,11 @@ unit cg64f32; { if we get here, the 64bit value lies between } { longint($80000000) and -1 (JM) } cg.a_label(list,neglabel); - hdef:=corddef.create(s32bit,int64(longint($80000000)),int64(-1)); + hdef:=corddef.create(s32bit,int64(longint($80000000)),int64(-1),false); location_copy(temploc,l); temploc.size:=OS_32; hlcg.g_rangecheck(list,temploc,hdef,todef); - hdef.owner.deletedef(hdef); + hdef.free; cg.a_label(list,endlabel); end; end diff --git a/compiler/ninl.pas b/compiler/ninl.pas index e7102822f6..488d32169f 100644 --- a/compiler/ninl.pas +++ b/compiler/ninl.pas @@ -3399,7 +3399,8 @@ implementation s32bit, {$endif cpu64bitaddr} get_min_value(resultdef), - get_max_value(resultdef))) + get_max_value(resultdef), + true)) else inserttypeconv(hp,resultdef); @@ -3858,7 +3859,8 @@ implementation s32bit, {$endif cpu64bitaddr} get_min_value(resultnode.resultdef), - get_max_value(resultnode.resultdef))) + get_max_value(resultnode.resultdef), + true)) else inserttypeconv(hpp,resultnode.resultdef); @@ -4274,7 +4276,9 @@ implementation temprangedef:=nil; getrange(unpackednode.resultdef,ulorange,uhirange); getrange(packednode.resultdef,plorange,phirange); - temprangedef:=corddef.create(torddef(sinttype).ordtype,ulorange,uhirange); + { does not really need to be registered, but then we would have to + record it elsewhere so it still can be freed } + temprangedef:=corddef.create(torddef(sinttype).ordtype,ulorange,uhirange,true); sourcevecindex := ctemprefnode.create(loopvar); targetvecindex := ctypeconvnode.create_internal(index.getcopy,sinttype); targetvecindex := caddnode.create(subn,targetvecindex,cordconstnode.create(plorange,sinttype,true)); diff --git a/compiler/nmem.pas b/compiler/nmem.pas index 9b3698efcd..28f6ed8cdd 100644 --- a/compiler/nmem.pas +++ b/compiler/nmem.pas @@ -961,7 +961,8 @@ implementation newordtyp:=torddef(ptrsinttype).ordtype; inserttypeconv(right,corddef.create(newordtyp, int64(Tarraydef(left.resultdef).lowrange), - int64(Tarraydef(left.resultdef).highrange) + int64(Tarraydef(left.resultdef).highrange), + true )) end else @@ -972,7 +973,7 @@ implementation inserttypeconv(right,u8inttype) else if is_shortstring(left.resultdef) then {Convert shortstring indexes to 0..length.} - inserttypeconv(right,corddef.create(u8bit,0,int64(Tstringdef(left.resultdef).len))) + inserttypeconv(right,corddef.create(u8bit,0,int64(Tstringdef(left.resultdef).len),true)) else {Convert indexes into dynamically allocated strings to aword.} inserttypeconv(right,uinttype); diff --git a/compiler/psystem.pas b/compiler/psystem.pas index afafe2c497..f85d5dd2ab 100644 --- a/compiler/psystem.pas +++ b/compiler/psystem.pas @@ -205,26 +205,26 @@ implementation cundefinedtype:=cundefineddef.create(true); cformaltype:=cformaldef.create(false); ctypedformaltype:=cformaldef.create(true); - voidtype:=corddef.create(uvoid,0,0); + voidtype:=corddef.create(uvoid,0,0,true); voidpointertype:=cpointerdef.create(voidtype); - u8inttype:=corddef.create(u8bit,0,255); - s8inttype:=corddef.create(s8bit,int64(-128),127); - u16inttype:=corddef.create(u16bit,0,65535); - s16inttype:=corddef.create(s16bit,int64(-32768),32767); - u32inttype:=corddef.create(u32bit,0,high(longword)); - s32inttype:=corddef.create(s32bit,int64(low(longint)),int64(high(longint))); - u64inttype:=corddef.create(u64bit,low(qword),high(qword)); - s64inttype:=corddef.create(s64bit,low(int64),high(int64)); - pasbool8type:=corddef.create(pasbool8,0,1); - pasbool16type:=corddef.create(pasbool16,0,1); - pasbool32type:=corddef.create(pasbool32,0,1); - pasbool64type:=corddef.create(pasbool64,0,1); - bool8type:=corddef.create(bool8bit,low(int64),high(int64)); - bool16type:=corddef.create(bool16bit,low(int64),high(int64)); - bool32type:=corddef.create(bool32bit,low(int64),high(int64)); - bool64type:=corddef.create(bool64bit,low(int64),high(int64)); - cansichartype:=corddef.create(uchar,0,255); - cwidechartype:=corddef.create(uwidechar,0,65535); + u8inttype:=corddef.create(u8bit,0,255,true); + s8inttype:=corddef.create(s8bit,int64(-128),127,true); + u16inttype:=corddef.create(u16bit,0,65535,true); + s16inttype:=corddef.create(s16bit,int64(-32768),32767,true); + u32inttype:=corddef.create(u32bit,0,high(longword),true); + s32inttype:=corddef.create(s32bit,int64(low(longint)),int64(high(longint)),true); + u64inttype:=corddef.create(u64bit,low(qword),high(qword),true); + s64inttype:=corddef.create(s64bit,low(int64),high(int64),true); + pasbool8type:=corddef.create(pasbool8,0,1,true); + pasbool16type:=corddef.create(pasbool16,0,1,true); + pasbool32type:=corddef.create(pasbool32,0,1,true); + pasbool64type:=corddef.create(pasbool64,0,1,true); + bool8type:=corddef.create(bool8bit,low(int64),high(int64),true); + bool16type:=corddef.create(bool16bit,low(int64),high(int64),true); + bool32type:=corddef.create(bool32bit,low(int64),high(int64),true); + bool64type:=corddef.create(bool64bit,low(int64),high(int64),true); + cansichartype:=corddef.create(uchar,0,255,true); + cwidechartype:=corddef.create(uwidechar,0,65535,true); cshortstringtype:=cstringdef.createshort(255); { should we give a length to the default long and ansi string definition ?? } clongstringtype:=cstringdef.createlong(-1); @@ -241,7 +241,7 @@ implementation {$ifndef FPC_SUPPORT_X87_TYPES_ON_WIN64} if target_info.system=system_x86_64_win64 then begin - s64currencytype:=corddef.create(scurrency,low(int64),high(int64)); + s64currencytype:=corddef.create(scurrency,low(int64),high(int64),true); pbestrealtype:=@s64floattype; end else @@ -250,42 +250,42 @@ implementation {$endif x86} {$ifdef powerpc} create_fpu_types; - s64currencytype:=corddef.create(scurrency,low(int64),high(int64)); + s64currencytype:=corddef.create(scurrency,low(int64),high(int64),true); {$endif powerpc} {$ifdef POWERPC64} create_fpu_types; - s64currencytype:=corddef.create(scurrency,low(int64),high(int64)); + s64currencytype:=corddef.create(scurrency,low(int64),high(int64),true); {$endif POWERPC64} {$ifdef sparc} create_fpu_types; - s64currencytype:=corddef.create(scurrency,low(int64),high(int64)); + s64currencytype:=corddef.create(scurrency,low(int64),high(int64),true); {$endif sparc} {$ifdef m68k} create_fpu_types; - s64currencytype:=corddef.create(scurrency,low(int64),high(int64)); + s64currencytype:=corddef.create(scurrency,low(int64),high(int64),true); {$endif} {$ifdef arm} create_fpu_types; - s64currencytype:=corddef.create(scurrency,low(int64),high(int64)); + s64currencytype:=corddef.create(scurrency,low(int64),high(int64),true); {$endif arm} {$ifdef aarch64} create_fpu_types; - s64currencytype:=corddef.create(scurrency,low(int64),high(int64)); + s64currencytype:=corddef.create(scurrency,low(int64),high(int64),true); {$endif aarch64} {$ifdef avr} s32floattype:=cfloatdef.create(s32real); s64floattype:=cfloatdef.create(s64real); s80floattype:=cfloatdef.create(s80real); sc80floattype:=cfloatdef.create(sc80real); - s64currencytype:=corddef.create(scurrency,low(int64),high(int64)); + s64currencytype:=corddef.create(scurrency,low(int64),high(int64),true); {$endif avr} {$ifdef mips} create_fpu_types; - s64currencytype:=corddef.create(scurrency,low(int64),high(int64)); + s64currencytype:=corddef.create(scurrency,low(int64),high(int64),true); {$endif mips} {$ifdef jvm} create_fpu_types; - s64currencytype:=corddef.create(scurrency,low(int64),high(int64)); + s64currencytype:=corddef.create(scurrency,low(int64),high(int64),true); {$endif jvm} set_default_int_types; { some other definitions } diff --git a/compiler/ptype.pas b/compiler/ptype.pas index e9f783aa43..4455da9615 100644 --- a/compiler/ptype.pas +++ b/compiler/ptype.pas @@ -1061,14 +1061,14 @@ implementation orddef : begin if is_char(pt1.resultdef) then - def:=corddef.create(uchar,lv,hv) + def:=corddef.create(uchar,lv,hv,true) else if is_boolean(pt1.resultdef) then - def:=corddef.create(pasbool8,lv,hv) + def:=corddef.create(pasbool8,lv,hv,true) else if is_signed(pt1.resultdef) then - def:=corddef.create(range_to_basetype(lv,hv),lv,hv) + def:=corddef.create(range_to_basetype(lv,hv),lv,hv,true) else - def:=corddef.create(range_to_basetype(lv,hv),lv,hv); + def:=corddef.create(range_to_basetype(lv,hv),lv,hv,true); end; end; end; diff --git a/compiler/scanner.pas b/compiler/scanner.pas index de30ddb211..0a55b06353 100644 --- a/compiler/scanner.pas +++ b/compiler/scanner.pas @@ -918,9 +918,9 @@ type variables are initialised. Since these types are only used for compile-time evaluation of conditional expressions, it doesn't matter that we use the base types instead of the cpu-specific ones. } - sintdef:=torddef.create(s64bit,low(int64),high(int64)); - uintdef:=torddef.create(u64bit,low(qword),high(qword)); - booldef:=torddef.create(pasbool8,0,1); + sintdef:=torddef.create(s64bit,low(int64),high(int64),false); + uintdef:=torddef.create(u64bit,low(qword),high(qword),false); + booldef:=torddef.create(pasbool8,0,1,false); strdef:=tstringdef.createansi(0); setdef:=tsetdef.create(sintdef,0,255); realdef:=tfloatdef.create(s80real); diff --git a/compiler/symdef.pas b/compiler/symdef.pas index a1bdde6cc3..22810dbb92 100644 --- a/compiler/symdef.pas +++ b/compiler/symdef.pas @@ -518,7 +518,7 @@ interface torddef = class(tstoreddef) low,high : TConstExprInt; ordtype : tordtype; - constructor create(t : tordtype;v,b : TConstExprInt);virtual; + constructor create(t : tordtype;v,b : TConstExprInt; doregister: boolean);virtual; constructor ppuload(ppufile:tcompilerppufile); function getcopy : tstoreddef;override; { do not override this routine in platform-specific subclasses, @@ -2636,9 +2636,9 @@ implementation TORDDEF ****************************************************************************} - constructor torddef.create(t : tordtype;v,b : TConstExprInt); + constructor torddef.create(t : tordtype;v,b : TConstExprInt; doregister: boolean); begin - inherited create(orddef,true); + inherited create(orddef,doregister); low:=v; high:=b; ordtype:=t; @@ -2659,7 +2659,7 @@ implementation function torddef.getcopy : tstoreddef; begin - result:=corddef.create(ordtype,low,high); + result:=corddef.create(ordtype,low,high,true); result.typ:=orddef; torddef(result).low:=low; torddef(result).high:=high;