mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-05 05:58:02 +02:00

o fixes several places where there was a check whether something is a fieldvarsym, but not whether it's an instance rather than a class field git-svn-id: trunk@43786 -
294 lines
7.3 KiB
ObjectPascal
294 lines
7.3 KiB
ObjectPascal
{
|
|
Copyright (c) 2014 by Florian Klaempfl
|
|
|
|
Symbol table overrides for PowerPC64
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
****************************************************************************
|
|
}
|
|
unit symcpu;
|
|
|
|
{$i fpcdefs.inc}
|
|
|
|
interface
|
|
|
|
uses
|
|
symtype,symdef,symsym;
|
|
|
|
type
|
|
{ defs }
|
|
tcpufiledef = class(tfiledef)
|
|
end;
|
|
tcpufiledefclass = class of tcpufiledef;
|
|
|
|
tcpuvariantdef = class(tvariantdef)
|
|
end;
|
|
tcpuvariantdefclass = class of tcpuvariantdef;
|
|
|
|
tcpuformaldef = class(tformaldef)
|
|
end;
|
|
tcpuformaldefclass = class of tcpuformaldef;
|
|
|
|
tcpuforwarddef = class(tforwarddef)
|
|
end;
|
|
tcpuforwarddefclass = class of tcpuforwarddef;
|
|
|
|
tcpuundefineddef = class(tundefineddef)
|
|
end;
|
|
tcpuundefineddefclass = class of tcpuundefineddef;
|
|
|
|
tcpuerrordef = class(terrordef)
|
|
end;
|
|
tcpuerrordefclass = class of tcpuerrordef;
|
|
|
|
tcpupointerdef = class(tpointerdef)
|
|
end;
|
|
tcpupointerdefclass = class of tcpupointerdef;
|
|
|
|
tcpurecorddef = class(trecorddef)
|
|
{ returns whether the record's elements (including arrays) all have
|
|
the same floating point or vector type; returns that type in the "def"
|
|
parameter if so }
|
|
function has_single_type_elfv2(out def: tdef): boolean;
|
|
end;
|
|
tcpurecorddefclass = class of tcpurecorddef;
|
|
|
|
tcpuimplementedinterface = class(timplementedinterface)
|
|
end;
|
|
tcpuimplementedinterfaceclass = class of tcpuimplementedinterface;
|
|
|
|
tcpuobjectdef = class(tobjectdef)
|
|
end;
|
|
tcpuobjectdefclass = class of tcpuobjectdef;
|
|
|
|
tcpuclassrefdef = class(tclassrefdef)
|
|
end;
|
|
tcpuclassrefdefclass = class of tcpuclassrefdef;
|
|
|
|
tcpuarraydef = class(tarraydef)
|
|
{ see tcpurecorddef.has_single_type_elfv2 }
|
|
function has_single_type_elfv2(out def: tdef): boolean;
|
|
end;
|
|
tcpuarraydefclass = class of tcpuarraydef;
|
|
|
|
tcpuorddef = class(torddef)
|
|
end;
|
|
tcpuorddefclass = class of tcpuorddef;
|
|
|
|
tcpufloatdef = class(tfloatdef)
|
|
end;
|
|
tcpufloatdefclass = class of tcpufloatdef;
|
|
|
|
tcpuprocvardef = class(tprocvardef)
|
|
end;
|
|
tcpuprocvardefclass = class of tcpuprocvardef;
|
|
|
|
tcpuprocdef = class(tprocdef)
|
|
end;
|
|
tcpuprocdefclass = class of tcpuprocdef;
|
|
|
|
tcpustringdef = class(tstringdef)
|
|
end;
|
|
tcpustringdefclass = class of tcpustringdef;
|
|
|
|
tcpuenumdef = class(tenumdef)
|
|
end;
|
|
tcpuenumdefclass = class of tcpuenumdef;
|
|
|
|
tcpusetdef = class(tsetdef)
|
|
end;
|
|
tcpusetdefclass = class of tcpusetdef;
|
|
|
|
{ syms }
|
|
tcpulabelsym = class(tlabelsym)
|
|
end;
|
|
tcpulabelsymclass = class of tcpulabelsym;
|
|
|
|
tcpuunitsym = class(tunitsym)
|
|
end;
|
|
tcpuunitsymclass = class of tcpuunitsym;
|
|
|
|
tcpuprogramparasym = class(tprogramparasym)
|
|
end;
|
|
tcpuprogramparasymclass = class(tprogramparasym);
|
|
|
|
tcpunamespacesym = class(tnamespacesym)
|
|
end;
|
|
tcpunamespacesymclass = class of tcpunamespacesym;
|
|
|
|
tcpuprocsym = class(tprocsym)
|
|
end;
|
|
tcpuprocsymclass = class of tcpuprocsym;
|
|
|
|
tcputypesym = class(ttypesym)
|
|
end;
|
|
tcpuypesymclass = class of tcputypesym;
|
|
|
|
tcpufieldvarsym = class(tfieldvarsym)
|
|
end;
|
|
tcpufieldvarsymclass = class of tcpufieldvarsym;
|
|
|
|
tcpulocalvarsym = class(tlocalvarsym)
|
|
end;
|
|
tcpulocalvarsymclass = class of tcpulocalvarsym;
|
|
|
|
tcpuparavarsym = class(tparavarsym)
|
|
end;
|
|
tcpuparavarsymclass = class of tcpuparavarsym;
|
|
|
|
tcpustaticvarsym = class(tstaticvarsym)
|
|
end;
|
|
tcpustaticvarsymclass = class of tcpustaticvarsym;
|
|
|
|
tcpuabsolutevarsym = class(tabsolutevarsym)
|
|
end;
|
|
tcpuabsolutevarsymclass = class of tcpuabsolutevarsym;
|
|
|
|
tcpupropertysym = class(tpropertysym)
|
|
end;
|
|
tcpupropertysymclass = class of tcpupropertysym;
|
|
|
|
tcpuconstsym = class(tconstsym)
|
|
end;
|
|
tcpuconstsymclass = class of tcpuconstsym;
|
|
|
|
tcpuenumsym = class(tenumsym)
|
|
end;
|
|
tcpuenumsymclass = class of tcpuenumsym;
|
|
|
|
tcpusyssym = class(tsyssym)
|
|
end;
|
|
tcpusyssymclass = class of tcpusyssym;
|
|
|
|
|
|
const
|
|
pbestrealtype : ^tdef = @s64floattype;
|
|
|
|
|
|
implementation
|
|
|
|
uses
|
|
symconst, symutil, defutil, defcmp;
|
|
|
|
{ tcpurecorddef }
|
|
|
|
function tcpurecorddef.has_single_type_elfv2(out def: tdef): boolean;
|
|
var
|
|
i: longint;
|
|
checkdef, tmpdef: tdef;
|
|
begin
|
|
def:=nil;
|
|
tmpdef:=nil;
|
|
result:=false;
|
|
for i:=0 to symtable.SymList.Count-1 do
|
|
begin
|
|
if is_normal_fieldvarsym(tsym(symtable.symlist[i])) then
|
|
begin
|
|
checkdef:=tfieldvarsym(symtable.symlist[i]).vardef;
|
|
repeat
|
|
case checkdef.typ of
|
|
floatdef:
|
|
;
|
|
arraydef:
|
|
if not is_special_array(checkdef) then
|
|
checkdef:=tarraydef(checkdef).elementdef
|
|
else
|
|
exit;
|
|
recorddef:
|
|
if not tcpurecorddef(checkdef).has_single_type_elfv2(checkdef) then
|
|
exit;
|
|
else
|
|
exit;
|
|
end;
|
|
until checkdef.typ=floatdef;
|
|
if not assigned(def) then
|
|
def:=checkdef
|
|
else if not equal_defs(def,checkdef) then
|
|
exit;
|
|
end;
|
|
end;
|
|
if assigned(def) then
|
|
result:=true;
|
|
end;
|
|
|
|
|
|
{ tcpuarraydef }
|
|
|
|
function tcpuarraydef.has_single_type_elfv2(out def: tdef): boolean;
|
|
var
|
|
checkdef: tdef;
|
|
begin
|
|
result:=false;
|
|
checkdef:=self;
|
|
while (checkdef.typ=arraydef) and
|
|
not is_special_array(checkdef) do
|
|
checkdef:=tarraydef(checkdef).elementdef;
|
|
case checkdef.typ of
|
|
recorddef:
|
|
result:=tcpurecorddef(checkdef).has_single_type_elfv2(def);
|
|
floatdef:
|
|
begin
|
|
def:=checkdef;
|
|
result:=true;
|
|
exit;
|
|
end;
|
|
else
|
|
exit;
|
|
end;
|
|
end;
|
|
|
|
|
|
begin
|
|
{ used tdef classes }
|
|
cfiledef:=tcpufiledef;
|
|
cvariantdef:=tcpuvariantdef;
|
|
cformaldef:=tcpuformaldef;
|
|
cforwarddef:=tcpuforwarddef;
|
|
cundefineddef:=tcpuundefineddef;
|
|
cerrordef:=tcpuerrordef;
|
|
cpointerdef:=tcpupointerdef;
|
|
crecorddef:=tcpurecorddef;
|
|
cimplementedinterface:=tcpuimplementedinterface;
|
|
cobjectdef:=tcpuobjectdef;
|
|
cclassrefdef:=tcpuclassrefdef;
|
|
carraydef:=tcpuarraydef;
|
|
corddef:=tcpuorddef;
|
|
cfloatdef:=tcpufloatdef;
|
|
cprocvardef:=tcpuprocvardef;
|
|
cprocdef:=tcpuprocdef;
|
|
cstringdef:=tcpustringdef;
|
|
cenumdef:=tcpuenumdef;
|
|
csetdef:=tcpusetdef;
|
|
|
|
{ used tsym classes }
|
|
clabelsym:=tcpulabelsym;
|
|
cunitsym:=tcpuunitsym;
|
|
cprogramparasym:=tcpuprogramparasym;
|
|
cnamespacesym:=tcpunamespacesym;
|
|
cprocsym:=tcpuprocsym;
|
|
ctypesym:=tcputypesym;
|
|
cfieldvarsym:=tcpufieldvarsym;
|
|
clocalvarsym:=tcpulocalvarsym;
|
|
cparavarsym:=tcpuparavarsym;
|
|
cstaticvarsym:=tcpustaticvarsym;
|
|
cabsolutevarsym:=tcpuabsolutevarsym;
|
|
cpropertysym:=tcpupropertysym;
|
|
cconstsym:=tcpuconstsym;
|
|
cenumsym:=tcpuenumsym;
|
|
csyssym:=tcpusyssym;
|
|
end.
|
|
|