From 338c064beb928d1563640c716c69bbf16a0e85a0 Mon Sep 17 00:00:00 2001 From: Jonas Maebe Date: Sun, 30 Mar 2014 21:04:36 +0000 Subject: [PATCH] * moved x86-specific tpointerdef functionality to architecture-specific descendants git-svn-id: trunk@27397 - --- compiler/defcmp.pas | 4 +- compiler/defutil.pas | 8 ++-- compiler/i386/n386mem.pas | 4 +- compiler/i386/symcpu.pas | 4 +- compiler/i8086/n8086con.pas | 6 +-- compiler/i8086/n8086mem.pas | 8 ++-- compiler/i8086/symcpu.pas | 25 +++++++++++- compiler/ncgmem.pas | 4 +- compiler/pdecl.pas | 20 +++++----- compiler/psystem.pas | 32 +++++++-------- compiler/symdef.pas | 78 +------------------------------------ compiler/x86/nx86mem.pas | 4 +- compiler/x86_64/symcpu.pas | 4 +- 13 files changed, 73 insertions(+), 128 deletions(-) diff --git a/compiler/defcmp.pas b/compiler/defcmp.pas index 20206d281d..b776a70449 100644 --- a/compiler/defcmp.pas +++ b/compiler/defcmp.pas @@ -169,7 +169,7 @@ implementation uses verbose,systems,constexp, - symtable,symsym, + symtable,symsym,symcpu, defutil,symutil; @@ -1302,7 +1302,7 @@ implementation begin {$ifdef x86} { check for far pointers } - if (tpointerdef(def_from).x86pointertyp<>tpointerdef(def_to).x86pointertyp) then + if (tcpupointerdef(def_from).x86pointertyp<>tcpupointerdef(def_to).x86pointertyp) then begin if fromtreetype=niln then eq:=te_equal diff --git a/compiler/defutil.pas b/compiler/defutil.pas index b105d614fa..11fbfc6e32 100644 --- a/compiler/defutil.pas +++ b/compiler/defutil.pas @@ -342,7 +342,7 @@ interface implementation uses - verbose,cutils; + verbose,cutils,symcpu; { returns true, if def uses FPU } function is_fpu(def : tdef) : boolean; @@ -1215,7 +1215,7 @@ implementation begin {$ifdef x86} if (def.typ=pointerdef) and - (tpointerdef(def).x86pointertyp in [x86pt_far,x86pt_huge]) then + (tcpupointerdef(def).x86pointertyp in [x86pt_far,x86pt_huge]) then begin {$if defined(i8086)} result := OS_32; @@ -1437,13 +1437,13 @@ implementation { true if p is a far pointer def } function is_farpointer(p : tdef) : boolean; begin - result:=(p.typ=pointerdef) and (tpointerdef(p).x86pointertyp=x86pt_far); + result:=(p.typ=pointerdef) and (tcpupointerdef(p).x86pointertyp=x86pt_far); end; { true if p is a huge pointer def } function is_hugepointer(p : tdef) : boolean; begin - result:=(p.typ=pointerdef) and (tpointerdef(p).x86pointertyp=x86pt_huge); + result:=(p.typ=pointerdef) and (tcpupointerdef(p).x86pointertyp=x86pt_huge); end; {$endif i8086} diff --git a/compiler/i386/n386mem.pas b/compiler/i386/n386mem.pas index 34c4e6ed3e..04e6e99063 100644 --- a/compiler/i386/n386mem.pas +++ b/compiler/i386/n386mem.pas @@ -47,7 +47,7 @@ implementation uses systems, cutils,verbose, - symconst,symdef,paramgr, + symconst,symdef,symcpu,paramgr, aasmtai,aasmdata, nld,ncon,nadd, cgutils,cgobj; @@ -61,7 +61,7 @@ implementation if not(nf_typedaddr in flags) then resultdef:=voidnearfspointertype else - resultdef:=cpointerdef.createx86(left.resultdef,x86pt_near_fs); + resultdef:=tcpupointerdefclass(cpointerdef).createx86(left.resultdef,x86pt_near_fs); end; diff --git a/compiler/i386/symcpu.pas b/compiler/i386/symcpu.pas index 059074c798..e06001eea3 100644 --- a/compiler/i386/symcpu.pas +++ b/compiler/i386/symcpu.pas @@ -26,7 +26,7 @@ unit symcpu; interface uses - symdef,symsym,symi86; + symdef,symsym,symx86,symi86; type { defs } @@ -54,7 +54,7 @@ type end; tcpuerrordefclass = class of tcpuerrordef; - tcpupointerdef = class(tpointerdef) + tcpupointerdef = class(tx86pointerdef) end; tcpupointerdefclass = class of tcpupointerdef; diff --git a/compiler/i8086/n8086con.pas b/compiler/i8086/n8086con.pas index 05c008d13d..746e162165 100644 --- a/compiler/i8086/n8086con.pas +++ b/compiler/i8086/n8086con.pas @@ -41,7 +41,7 @@ implementation uses systems,globals, - symconst,symdef, + symconst,symdef,symcpu, defutil, cpubase, cga,cgx86,cgobj,cgbase,cgutils; @@ -54,7 +54,7 @@ implementation constructor ti8086pointerconstnode.create(v: TConstPtrUInt; def: tdef); begin { truncate near pointers } - if (def.typ<>pointerdef) or not (tpointerdef(def).x86pointertyp in [x86pt_far,x86pt_huge]) then + if (def.typ<>pointerdef) or not (tcpupointerdef(def).x86pointertyp in [x86pt_far,x86pt_huge]) then v := Word(v); inherited create(v, def); end; @@ -63,7 +63,7 @@ implementation procedure ti8086pointerconstnode.pass_generate_code; begin { far pointer? } - if (typedef.typ=pointerdef) and (tpointerdef(typedef).x86pointertyp in [x86pt_far,x86pt_huge]) then + if (typedef.typ=pointerdef) and (tcpupointerdef(typedef).x86pointertyp in [x86pt_far,x86pt_huge]) then begin location_reset(location,LOC_CONSTANT,OS_32); location.value:=longint(value); diff --git a/compiler/i8086/n8086mem.pas b/compiler/i8086/n8086mem.pas index f418064ff0..776f1ca655 100644 --- a/compiler/i8086/n8086mem.pas +++ b/compiler/i8086/n8086mem.pas @@ -46,7 +46,7 @@ implementation uses systems,globals, cutils,verbose, - symbase,symconst,symdef,symtable,symtype,symsym, + symbase,symconst,symdef,symtable,symtype,symsym,symcpu, parabase,paramgr, aasmtai,aasmdata, nld,ncon,nadd, @@ -63,7 +63,7 @@ implementation if not(nf_typedaddr in flags) then resultdef:=voidfarpointertype else - resultdef:=cpointerdef.createx86(left.resultdef,x86pt_far); + resultdef:=tcpupointerdefclass(cpointerdef).createx86(left.resultdef,x86pt_far); end; @@ -95,7 +95,7 @@ implementation st : tsymtable; tmpref: treference; begin - if tpointerdef(left.resultdef).x86pointertyp in [x86pt_far,x86pt_huge] then + if tcpupointerdef(left.resultdef).x86pointertyp in [x86pt_far,x86pt_huge] then begin secondpass(left); { assume natural alignment, except for packed records } @@ -137,7 +137,7 @@ implementation (cs_checkpointer in current_settings.localswitches) and not(cs_compilesystem in current_settings.moduleswitches) and {$ifdef x86} - (tpointerdef(left.resultdef).x86pointertyp = default_x86_data_pointer_type) and + (tcpupointerdef(left.resultdef).x86pointertyp = tcpupointerdefclass(cpointerdef).default_x86_data_pointer_type) and {$endif x86} not(nf_no_checkpointer in flags) and { can be NR_NO in case of LOC_CONSTANT } diff --git a/compiler/i8086/symcpu.pas b/compiler/i8086/symcpu.pas index f28a13a724..0b03112f9f 100644 --- a/compiler/i8086/symcpu.pas +++ b/compiler/i8086/symcpu.pas @@ -27,7 +27,7 @@ interface uses globtype, - symtype,symdef,symsym,symi86; + symconst,symtype,symdef,symsym,symx86,symi86; type { defs } @@ -55,7 +55,8 @@ type end; tcpuerrordefclass = class of tcpuerrordef; - tcpupointerdef = class(tpointerdef) + tcpupointerdef = class(tx86pointerdef) + class function default_x86_data_pointer_type: tx86pointertyp; override; end; tcpupointerdefclass = class of tcpupointerdef; @@ -172,6 +173,26 @@ type implementation + uses + globals, cpuinfo; + +{**************************************************************************** + tcpupointerdef +****************************************************************************} + + class function tcpupointerdef.default_x86_data_pointer_type: tx86pointertyp; + begin + if current_settings.x86memorymodel in x86_far_data_models then + result:=x86pt_far + else + result:=inherited; + end; + + +{**************************************************************************** + tcpuabsolutevarsym +****************************************************************************} + procedure tcpuabsolutevarsym.ppuload_platform(ppufile: tcompilerppufile); begin inherited; diff --git a/compiler/ncgmem.pas b/compiler/ncgmem.pas index db7de17f65..a2d1b7d92a 100644 --- a/compiler/ncgmem.pas +++ b/compiler/ncgmem.pas @@ -81,7 +81,7 @@ implementation uses systems, cutils,cclasses,verbose,globals,constexp, - symconst,symbase,symtype,symdef,symsym,symtable,defutil,paramgr, + symconst,symbase,symtype,symdef,symsym,symcpu,symtable,defutil,paramgr, aasmbase,aasmtai,aasmdata, procinfo,pass_2,parabase, pass_1,nld,ncon,nadd,ncnv,nutils, @@ -288,7 +288,7 @@ implementation (cs_checkpointer in current_settings.localswitches) and not(cs_compilesystem in current_settings.moduleswitches) and {$ifdef x86} - (tpointerdef(left.resultdef).x86pointertyp = default_x86_data_pointer_type) and + (tcpupointerdef(left.resultdef).x86pointertyp = tcpupointerdefclass(cpointerdef).default_x86_data_pointer_type) and {$endif x86} not(nf_no_checkpointer in flags) and { can be NR_NO in case of LOC_CONSTANT } diff --git a/compiler/pdecl.pas b/compiler/pdecl.pas index 5bd5a0bb83..ffabb7e879 100644 --- a/compiler/pdecl.pas +++ b/compiler/pdecl.pas @@ -56,7 +56,7 @@ implementation globals,tokens,verbose,widestr,constexp, systems,aasmdata,fmodule, { symtable } - symconst,symbase,symtype,symtable,symcreat,defutil, + symconst,symbase,symtype,symcpu,symtable,symcreat,defutil, { pass 1 } htypechk,ninl,ncon,nobj,ngenutil, { parser } @@ -722,9 +722,9 @@ implementation if try_to_consume(_FAR) then begin {$if defined(i8086)} - tpointerdef(hdef).x86pointertyp:=x86pt_far; + tcpupointerdef(hdef).x86pointertyp:=x86pt_far; {$elseif defined(i386)} - tpointerdef(hdef).x86pointertyp:=x86pt_near_fs; + tcpupointerdef(hdef).x86pointertyp:=x86pt_near_fs; {$elseif defined(x86_64)} { for compatibility with previous versions of fpc, far pointer = regular pointer on x86_64 } @@ -739,18 +739,18 @@ implementation begin segment_register:=get_stringconst; case UpCase(segment_register) of - 'CS': tpointerdef(hdef).x86pointertyp:=x86pt_near_cs; - 'DS': tpointerdef(hdef).x86pointertyp:=x86pt_near_ds; - 'SS': tpointerdef(hdef).x86pointertyp:=x86pt_near_ss; - 'ES': tpointerdef(hdef).x86pointertyp:=x86pt_near_es; - 'FS': tpointerdef(hdef).x86pointertyp:=x86pt_near_fs; - 'GS': tpointerdef(hdef).x86pointertyp:=x86pt_near_gs; + 'CS': tcpupointerdef(hdef).x86pointertyp:=x86pt_near_cs; + 'DS': tcpupointerdef(hdef).x86pointertyp:=x86pt_near_ds; + 'SS': tcpupointerdef(hdef).x86pointertyp:=x86pt_near_ss; + 'ES': tcpupointerdef(hdef).x86pointertyp:=x86pt_near_es; + 'FS': tcpupointerdef(hdef).x86pointertyp:=x86pt_near_fs; + 'GS': tcpupointerdef(hdef).x86pointertyp:=x86pt_near_gs; else Message(asmr_e_invalid_register); end; end else - tpointerdef(hdef).x86pointertyp:=x86pt_near; + tcpupointerdef(hdef).x86pointertyp:=x86pt_near; consume(_SEMICOLON); end; {$else x86} diff --git a/compiler/psystem.pas b/compiler/psystem.pas index 0fd3619ced..43f5b97bd8 100644 --- a/compiler/psystem.pas +++ b/compiler/psystem.pas @@ -42,7 +42,7 @@ implementation uses globals,globtype,verbose,constexp,cpuinfo, systems, - symconst,symtype,symsym,symdef,symtable, + symconst,symtype,symsym,symdef,symcpu,symtable, aasmtai,aasmdata,aasmcpu, ncgutil,ncgrtti,fmodule, node,nbas,nflw,nset,ncon,ncnv,nld,nmem,ncal,nmat,nadd,ninl,nopt @@ -284,26 +284,26 @@ implementation charpointertype:=cpointerdef.create(cansichartype); widecharpointertype:=cpointerdef.create(cwidechartype); {$ifdef i8086} - parentfpvoidpointertype:=cpointerdef.createx86(voidtype,x86pt_near); + parentfpvoidpointertype:=tcpupointerdefclass(cpointerdef).createx86(voidtype,x86pt_near); {$else i8086} parentfpvoidpointertype:=cpointerdef.create(voidtype); {$endif i8086} {$ifdef x86} - voidnearpointertype:=cpointerdef.createx86(voidtype,x86pt_near); - voidnearcspointertype:=cpointerdef.createx86(voidtype,x86pt_near_cs); - voidneardspointertype:=cpointerdef.createx86(voidtype,x86pt_near_ds); - voidnearsspointertype:=cpointerdef.createx86(voidtype,x86pt_near_ss); - voidnearespointertype:=cpointerdef.createx86(voidtype,x86pt_near_es); - voidnearfspointertype:=cpointerdef.createx86(voidtype,x86pt_near_fs); - voidneargspointertype:=cpointerdef.createx86(voidtype,x86pt_near_gs); + voidnearpointertype:=tcpupointerdefclass(cpointerdef).createx86(voidtype,x86pt_near); + voidnearcspointertype:=tcpupointerdefclass(cpointerdef).createx86(voidtype,x86pt_near_cs); + voidneardspointertype:=tcpupointerdefclass(cpointerdef).createx86(voidtype,x86pt_near_ds); + voidnearsspointertype:=tcpupointerdefclass(cpointerdef).createx86(voidtype,x86pt_near_ss); + voidnearespointertype:=tcpupointerdefclass(cpointerdef).createx86(voidtype,x86pt_near_es); + voidnearfspointertype:=tcpupointerdefclass(cpointerdef).createx86(voidtype,x86pt_near_fs); + voidneargspointertype:=tcpupointerdefclass(cpointerdef).createx86(voidtype,x86pt_near_gs); {$ifdef i8086} - voidfarpointertype:=cpointerdef.createx86(voidtype,x86pt_far); - voidhugepointertype:=cpointerdef.createx86(voidtype,x86pt_huge); - charnearpointertype:=cpointerdef.createx86(cansichartype,x86pt_near); - charfarpointertype:=cpointerdef.createx86(cansichartype,x86pt_far); - bytefarpointertype:=cpointerdef.createx86(u8inttype,x86pt_far); - wordfarpointertype:=cpointerdef.createx86(u16inttype,x86pt_far); - longintfarpointertype:=cpointerdef.createx86(s32inttype,x86pt_far); + voidfarpointertype:=tcpupointerdefclass(cpointerdef).createx86(voidtype,x86pt_far); + voidhugepointertype:=tcpupointerdefclass(cpointerdef).createx86(voidtype,x86pt_huge); + charnearpointertype:=tcpupointerdefclass(cpointerdef).createx86(cansichartype,x86pt_near); + charfarpointertype:=tcpupointerdefclass(cpointerdef).createx86(cansichartype,x86pt_far); + bytefarpointertype:=tcpupointerdefclass(cpointerdef).createx86(u8inttype,x86pt_far); + wordfarpointertype:=tcpupointerdefclass(cpointerdef).createx86(u16inttype,x86pt_far); + longintfarpointertype:=tcpupointerdefclass(cpointerdef).createx86(s32inttype,x86pt_far); {$endif i8086} {$endif x86} set_default_ptr_types; diff --git a/compiler/symdef.pas b/compiler/symdef.pas index 27b531d76d..fa0af6d38b 100644 --- a/compiler/symdef.pas +++ b/compiler/symdef.pas @@ -218,14 +218,8 @@ interface { tpointerdef } tpointerdef = class(tabstractpointerdef) -{$ifdef x86} - x86pointertyp : tx86pointertyp; -{$endif x86} has_pointer_math : boolean; constructor create(def:tdef);virtual; -{$ifdef x86} - constructor createx86(def:tdef;x86typ:tx86pointertyp);virtual; -{$endif x86} function size:asizeint;override; function getcopy:tstoreddef;override; constructor ppuload(ppufile:tcompilerppufile); @@ -1179,10 +1173,6 @@ interface function getansistringdef:tstringdef; function getparaencoding(def:tdef):tstringencoding; inline; -{$ifdef x86} - function default_x86_data_pointer_type: tx86pointertyp; -{$endif x86} - implementation uses @@ -3120,40 +3110,19 @@ implementation constructor tpointerdef.create(def:tdef); begin inherited create(pointerdef,def); -{$ifdef x86} - x86pointertyp := default_x86_data_pointer_type; -{$endif x86} has_pointer_math:=cs_pointermath in current_settings.localswitches; end; -{$ifdef x86} - constructor tpointerdef.createx86(def: tdef; x86typ: tx86pointertyp); - begin - inherited create(pointerdef,def); - x86pointertyp := x86typ; - has_pointer_math:=cs_pointermath in current_settings.localswitches; - end; -{$endif x86} - - function tpointerdef.size: asizeint; begin -{$ifdef x86} - if x86pointertyp in [x86pt_far,x86pt_huge] then - result:=sizeof(pint)+2 - else -{$endif x86} - result:=sizeof(pint); + result:=sizeof(pint); end; constructor tpointerdef.ppuload(ppufile:tcompilerppufile); begin inherited ppuload(pointerdef,ppufile); -{$ifdef x86} - x86pointertyp:=tx86pointertyp(ppufile.getbyte); -{$endif x86} has_pointer_math:=(ppufile.getbyte<>0); ppuload_platform(ppufile); end; @@ -3168,9 +3137,6 @@ implementation result:=cpointerdef.create(tforwarddef(pointeddef).getcopy) else result:=cpointerdef.create(pointeddef); -{$ifdef x86} - tpointerdef(result).x86pointertyp:=x86pointertyp; -{$endif x86} tpointerdef(result).has_pointer_math:=has_pointer_math; tpointerdef(result).savesize:=savesize; end; @@ -3179,9 +3145,6 @@ implementation procedure tpointerdef.ppuwrite(ppufile:tcompilerppufile); begin inherited ppuwrite(ppufile); -{$ifdef x86} - ppufile.putbyte(byte(x86pointertyp)); -{$endif x86} ppufile.putbyte(byte(has_pointer_math)); writeentry(ppufile,ibpointerdef); end; @@ -3199,33 +3162,6 @@ implementation GetTypeName:='^'+pointeddef.typename else GetTypeName:='^'+pointeddef.typesym.realname; -{$ifdef x86} - if x86pointertyp<>default_x86_data_pointer_type then - begin - case x86pointertyp of - x86pt_near: - GetTypeName:=Result+';near'; - x86pt_near_cs: - GetTypeName:=Result+';near ''CS'''; - x86pt_near_ds: - GetTypeName:=Result+';near ''DS'''; - x86pt_near_ss: - GetTypeName:=Result+';near ''SS'''; - x86pt_near_es: - GetTypeName:=Result+';near ''ES'''; - x86pt_near_fs: - GetTypeName:=Result+';near ''FS'''; - x86pt_near_gs: - GetTypeName:=Result+';near ''GS'''; - x86pt_far: - GetTypeName:=Result+';far'; - x86pt_huge: - GetTypeName:=Result+';huge'; - else - internalerror(2013050301); - end; - end; -{$endif x86} end; @@ -7506,16 +7442,4 @@ implementation end; -{$ifdef x86} - function default_x86_data_pointer_type: tx86pointertyp; - begin -{$ifdef i8086} - if current_settings.x86memorymodel in x86_far_data_models then - result:=x86pt_far - else -{$endif i8086} - result:=x86pt_near; - end; -{$endif x86} - end. diff --git a/compiler/x86/nx86mem.pas b/compiler/x86/nx86mem.pas index 7da2ee41ab..dbe604e667 100644 --- a/compiler/x86/nx86mem.pas +++ b/compiler/x86/nx86mem.pas @@ -44,7 +44,7 @@ implementation cutils,verbose, aasmtai,aasmdata, cgutils,cgobj, - symconst,symdef; + symconst,symdef,symcpu; {***************************************************************************** TX86DEREFNODE @@ -53,7 +53,7 @@ implementation procedure tx86derefnode.pass_generate_code; begin inherited pass_generate_code; - case tpointerdef(left.resultdef).x86pointertyp of + case tcpupointerdef(left.resultdef).x86pointertyp of x86pt_near: ; x86pt_near_cs: location.reference.segment:=NR_CS; x86pt_near_ds: location.reference.segment:=NR_DS; diff --git a/compiler/x86_64/symcpu.pas b/compiler/x86_64/symcpu.pas index dbab28a5bd..274721dc35 100644 --- a/compiler/x86_64/symcpu.pas +++ b/compiler/x86_64/symcpu.pas @@ -26,7 +26,7 @@ unit symcpu; interface uses - symdef,symsym; + symdef,symsym,symx86; type { defs } @@ -54,7 +54,7 @@ type end; tcpuerrordefclass = class of tcpuerrordef; - tcpupointerdef = class(tpointerdef) + tcpupointerdef = class(tx86pointerdef) end; tcpupointerdefclass = class of tcpupointerdef;