1 {
2     Copyright (c) 2014 by Florian Klaempfl
3 
4     Symbol table overrides for PowerPC
5 
6     This program is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10 
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15 
16     You should have received a copy of the GNU General Public License
17     along with this program; if not, write to the Free Software
18     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 
20  ****************************************************************************
21 }
22 unit symcpu;
23 
24 {$i fpcdefs.inc}
25 
26 interface
27 
28 uses
29   symconst,symtype,symdef,symsym;
30 
31 type
32   { defs }
33   tcpufiledef = class(tfiledef)
34   end;
35   tcpufiledefclass = class of tcpufiledef;
36 
37   tcpuvariantdef = class(tvariantdef)
38   end;
39   tcpuvariantdefclass = class of tcpuvariantdef;
40 
41   tcpuformaldef = class(tformaldef)
42   end;
43   tcpuformaldefclass = class of tcpuformaldef;
44 
45   tcpuforwarddef = class(tforwarddef)
46   end;
47   tcpuforwarddefclass = class of tcpuforwarddef;
48 
49   tcpuundefineddef = class(tundefineddef)
50   end;
51   tcpuundefineddefclass = class of tcpuundefineddef;
52 
53   tcpuerrordef = class(terrordef)
54   end;
55   tcpuerrordefclass = class of tcpuerrordef;
56 
57   tcpupointerdef = class(tpointerdef)
58   end;
59   tcpupointerdefclass = class of tcpupointerdef;
60 
61   tcpurecorddef = class(trecorddef)
62   end;
63   tcpurecorddefclass = class of tcpurecorddef;
64 
65   tcpuimplementedinterface = class(timplementedinterface)
66   end;
67   tcpuimplementedinterfaceclass = class of tcpuimplementedinterface;
68 
69   tcpuobjectdef = class(tobjectdef)
70   end;
71   tcpuobjectdefclass = class of tcpuobjectdef;
72 
73   tcpuclassrefdef = class(tclassrefdef)
74   end;
75   tcpuclassrefdefclass = class of tcpuclassrefdef;
76 
77   tcpuarraydef = class(tarraydef)
78   end;
79   tcpuarraydefclass = class of tcpuarraydef;
80 
81   tcpuorddef = class(torddef)
82   end;
83   tcpuorddefclass = class of tcpuorddef;
84 
85   tcpufloatdef = class(tfloatdef)
86   end;
87   tcpufloatdefclass = class of tcpufloatdef;
88 
89   tcpuprocvardef = class(tprocvardef)
90   end;
91   tcpuprocvardefclass = class of tcpuprocvardef;
92 
93   tcpuprocdef = class(tprocdef)
94     procedure ppuload_platform(ppufile: tcompilerppufile); override;
95     procedure ppuwrite_platform(ppufile: tcompilerppufile); override;
96    public
97     { library symbol for AmigaOS/MorphOS }
98     libsym : tsym;
99     libsymderef : tderef;
getcopyasnull100     function getcopyas(newtyp: tdeftyp; copytyp: tproccopytyp; const paraprefix: string): tstoreddef; override;
101     procedure buildderef; override;
102     procedure deref; override;
103   end;
104   tcpuprocdefclass = class of tcpuprocdef;
105 
106   tcpustringdef = class(tstringdef)
107   end;
108   tcpustringdefclass = class of tcpustringdef;
109 
110   tcpuenumdef = class(tenumdef)
111   end;
112   tcpuenumdefclass = class of tcpuenumdef;
113 
114   tcpusetdef = class(tsetdef)
115   end;
116   tcpusetdefclass = class of tcpusetdef;
117 
118   { syms }
119   tcpulabelsym = class(tlabelsym)
120   end;
121   tcpulabelsymclass = class of tcpulabelsym;
122 
123   tcpuunitsym = class(tunitsym)
124   end;
125   tcpuunitsymclass = class of tcpuunitsym;
126 
127   tcpuprogramparasym = class(tprogramparasym)
128   end;
129   tcpuprogramparasymclass = class(tprogramparasym);
130 
131   tcpunamespacesym = class(tnamespacesym)
132   end;
133   tcpunamespacesymclass = class of tcpunamespacesym;
134 
135   tcpuprocsym = class(tprocsym)
136   end;
137   tcpuprocsymclass = class of tcpuprocsym;
138 
139   tcputypesym = class(ttypesym)
140   end;
141   tcpuypesymclass = class of tcputypesym;
142 
143   tcpufieldvarsym = class(tfieldvarsym)
144   end;
145   tcpufieldvarsymclass = class of tcpufieldvarsym;
146 
147   tcpulocalvarsym = class(tlocalvarsym)
148   end;
149   tcpulocalvarsymclass = class of tcpulocalvarsym;
150 
151   tcpuparavarsym = class(tparavarsym)
152   end;
153   tcpuparavarsymclass = class of tcpuparavarsym;
154 
155   tcpustaticvarsym = class(tstaticvarsym)
156   end;
157   tcpustaticvarsymclass = class of tcpustaticvarsym;
158 
159   tcpuabsolutevarsym = class(tabsolutevarsym)
160   end;
161   tcpuabsolutevarsymclass = class of tcpuabsolutevarsym;
162 
163   tcpupropertysym = class(tpropertysym)
164   end;
165   tcpupropertysymclass = class of tcpupropertysym;
166 
167   tcpuconstsym = class(tconstsym)
168   end;
169   tcpuconstsymclass = class of tcpuconstsym;
170 
171   tcpuenumsym = class(tenumsym)
172   end;
173   tcpuenumsymclass = class of tcpuenumsym;
174 
175   tcpusyssym = class(tsyssym)
176   end;
177   tcpusyssymclass = class of tcpusyssym;
178 
179 
180 const
181    pbestrealtype : ^tdef = @s64floattype;
182 
183 
184 implementation
185 
186 {****************************************************************************
187                              tcpuprocdef
188 ****************************************************************************}
189 
190   procedure tcpuprocdef.ppuload_platform(ppufile: tcompilerppufile);
191     begin
192       inherited;
193       if po_syscall_has_libsym in procoptions then
194         ppufile.getderef(libsymderef);
195     end;
196 
197 
198   procedure tcpuprocdef.ppuwrite_platform(ppufile: tcompilerppufile);
199     begin
200       inherited;
201       if po_syscall_has_libsym in procoptions then
202         ppufile.putderef(libsymderef);
203     end;
204 
205 
tcpuprocdef.getcopyasnull206   function tcpuprocdef.getcopyas(newtyp: tdeftyp; copytyp: tproccopytyp; const paraprefix: string): tstoreddef;
207     begin
208       result:=inherited;
209       if newtyp=procdef then
210         tcpuprocdef(result).libsym:=libsym;
211     end;
212 
213 
214   procedure tcpuprocdef.buildderef;
215     begin
216       inherited;
217       if po_syscall_has_libsym in procoptions then
218         libsymderef.build(libsym);
219     end;
220 
221 
222   procedure tcpuprocdef.deref;
223     begin
224       inherited;
225       if po_syscall_has_libsym in procoptions then
226         libsym:=tsym(libsymderef.resolve)
227       else
228         libsym:=nil;
229     end;
230 
231 begin
232   { used tdef classes }
233   cfiledef:=tcpufiledef;
234   cvariantdef:=tcpuvariantdef;
235   cformaldef:=tcpuformaldef;
236   cforwarddef:=tcpuforwarddef;
237   cundefineddef:=tcpuundefineddef;
238   cerrordef:=tcpuerrordef;
239   cpointerdef:=tcpupointerdef;
240   crecorddef:=tcpurecorddef;
241   cimplementedinterface:=tcpuimplementedinterface;
242   cobjectdef:=tcpuobjectdef;
243   cclassrefdef:=tcpuclassrefdef;
244   carraydef:=tcpuarraydef;
245   corddef:=tcpuorddef;
246   cfloatdef:=tcpufloatdef;
247   cprocvardef:=tcpuprocvardef;
248   cprocdef:=tcpuprocdef;
249   cstringdef:=tcpustringdef;
250   cenumdef:=tcpuenumdef;
251   csetdef:=tcpusetdef;
252 
253   { used tsym classes }
254   clabelsym:=tcpulabelsym;
255   cunitsym:=tcpuunitsym;
256   cprogramparasym:=tcpuprogramparasym;
257   cnamespacesym:=tcpunamespacesym;
258   cprocsym:=tcpuprocsym;
259   ctypesym:=tcputypesym;
260   cfieldvarsym:=tcpufieldvarsym;
261   clocalvarsym:=tcpulocalvarsym;
262   cparavarsym:=tcpuparavarsym;
263   cstaticvarsym:=tcpustaticvarsym;
264   cabsolutevarsym:=tcpuabsolutevarsym;
265   cpropertysym:=tcpupropertysym;
266   cconstsym:=tcpuconstsym;
267   cenumsym:=tcpuenumsym;
268   csyssym:=tcpusyssym;
269 end.
270 
271