fpc/compiler/sparc/cpuelf.pas
florian f1883c4e61 * arm: taicpu uses set instead of boolean to store instruction states
+ track if an instruction is a thumb instruction in taicpu

git-svn-id: trunk@48673 -
2021-02-14 15:51:48 +00:00

141 lines
3.7 KiB
ObjectPascal

{
Copyright (c) 1998-2006 by Peter Vreman
Includes ELF-related code specific to SPARC
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 cpuelf;
{$i fpcdefs.inc}
interface
implementation
uses
verbose,elfbase,
systems,ogbase,ogelf,assemble;
const
{ Relocation types }
R_SPARC_NONE = 0;
R_SPARC_8 = 1;
R_SPARC_16 = 2;
R_SPARC_32 = 3;
R_SPARC_DISP8 = 4;
R_SPARC_DISP16 = 5;
R_SPARC_DISP32 = 6;
R_SPARC_WDISP30 = 7;
R_SPARC_WDISP22 = 8;
R_SPARC_HI22 = 9;
R_SPARC_22 = 10;
R_SPARC_13 = 11;
R_SPARC_LO10 = 12;
R_SPARC_GOT10 = 13;
R_SPARC_GOT13 = 14;
R_SPARC_GOT22 = 15;
R_SPARC_PC10 = 16;
R_SPARC_PC22 = 17;
R_SPARC_WPLT30 = 18;
R_SPARC_COPY = 19;
R_SPARC_GLOB_DAT = 20;
R_SPARC_JMP_SLOT = 21;
R_SPARC_RELATIVE = 22;
R_SPARC_UA32 = 23;
R_SPARC_GNU_VTINHERIT = 250;
R_SPARC_GNU_VTENTRY = 251;
{****************************************************************************
ELF Target methods
****************************************************************************}
function elf_sparc_encodereloc(objrel:TObjRelocation):byte;
begin
case objrel.typ of
RELOC_NONE :
result:=R_SPARC_NONE;
RELOC_ABSOLUTE :
result:=R_SPARC_32;
{ TODO }
else
result:=0;
InternalError(2012082303);
end;
end;
function elf_sparc_relocname(reltyp:byte):string;
begin
result:='TODO';
end;
procedure elf_sparc.loadreloc(objrel:TObjRelocation);
begin
end;
{*****************************************************************************
Initialize
*****************************************************************************}
const
elf_target_sparc: TElfTarget =
(
max_page_size: $8000; // fixme
exe_image_base: $8000; // fixme
machine_code: EM_SPARC;
relocs_use_addend: false;
dyn_reloc_codes: (
R_SPARC_RELATIVE,
R_SPARC_GLOB_DAT,
R_SPARC_JUMP_SLOT,
R_SPARC_COPY,
0 // IRELATIVE is absent(?)
);
relocname: @elf_sparc_relocName;
encodereloc: @elf_sparc_encodeReloc;
loadreloc: @elf_sparc_loadReloc;
loadsection: nil;
encodeflags: nil;
);
as_sparc_elf32_info : tasminfo =
(
id : as_sparc_elf32;
idtxt : 'ELF';
asmbin : '';
asmcmd : '';
supported_targets : [system_sparc_linux, system_sparc_solaris,
system_sparc_embedded];
// flags : [af_outputbinary,af_smartlink_sections];
flags : [af_outputbinary,af_supports_dwarf];
labelprefix : '.L';
labelmaxlen : -1;
comment : '';
dollarsign: '$';
);
initialization
RegisterAssembler(as_sparc_elf32_info,TElfAssembler);
ElfTarget:=elf_target_sparc;
end.