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