| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 | {    Copyright (c) 2002 by Florian Klaempfl    Implements the PowerPC specific part of call nodes    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 nppccal;{$I fpcdefs.inc}interfaceuses  aasmdata, cgbase,  symdef, node, ncal, ncgcal;type  tppccallparanode = class(tcgcallparanode)  end;  tppccallnode = class(tcgcallnode)   protected    function get_call_reg(list: TAsmList): tregister; override;    procedure unget_call_reg(list: TAsmList; reg: tregister); override;   public    function pass_1: tnode; override;    procedure do_syscall; override;  end;implementationuses  globtype, systems,  cutils, verbose, globals,  symconst, symbase, symsym, symtable, defutil, paramgr, parabase,  pass_2,  cpuinfo, cpubase, aasmbase, aasmtai, aasmcpu,  nmem, nld, ncnv,  ncgutil, cgutils, cgobj, tgobj, rgobj, rgcpu,  cgcpu, cpupi, procinfo;function tppccallnode.get_call_reg(list: TAsmList): tregister;  begin    { on the ppc64/ELFv2 abi, all indirect calls must go via R12, so that the      called function can use R12 as PIC base register }    cg.getcpuregister(list,NR_R12);    result:=NR_R12;  end;procedure tppccallnode.unget_call_reg(list: TAsmList; reg: tregister);  begin    cg.ungetcpuregister(list,NR_R12);  end;function tppccallnode.pass_1: tnode;  begin    result:=inherited;    if assigned(result) then      exit;    { for ELFv2, we must load the TOC/GOT register in case this routine may      call an external routine (because the lookup of the target address is      TOC-based). Maybe needs to be extended to non-ELFv2 too }    if target_info.abi=abi_powerpc_elfv2 then      include(current_procinfo.flags,pi_needs_got);  end;procedure tppccallnode.do_syscall;begin  { no MorphOS style syscalls supported. Only implemented to avoid abstract    method not implemented compiler warning. }  internalerror(2005120401);end;begin  ccallparanode:=tppccallparanode;  ccallnode := tppccallnode;end.
 |