Kaynağa Gözat

+ implement support for SPARC 64-bit in fpcres

Sven/Sarah Barth 1 yıl önce
ebeveyn
işleme
060f24600b

+ 3 - 1
packages/fcl-res/src/elfconsts.pp

@@ -25,7 +25,7 @@ type
   TElfMachineType = (emtnone, emtsparc, emti386, emtm68k, emtppc, emtppc64,
                      emtarm, emtarmeb, emtia64, emtx86_64, emtalpha,
                      emtmips, emtmipsel, emtppc64le, emtaarch64,
-                     emtriscv32, emtriscv64, emtloongarch64);
+                     emtriscv32, emtriscv64, emtloongarch64, emtsparc64);
 const
   ELFMAGIC     = chr($7f)+'ELF';
 
@@ -71,6 +71,7 @@ const
   EM_PPC64       = 21;
   EM_ARM         = 40;
 //  EM_OLD_ALPHA       = 41;
+  EM_SPARCV9     = 43; // Sparc 64-bit
   EM_IA_64       = 50;
   EM_MIPS_X      = 51; // GNU readelf returns machine name "Stanford MIPS-X"
   EM_X86_64      = 62;
@@ -156,6 +157,7 @@ const
   R_AARCH64_ABS64 = 257;
   R_68K_32        =   1;
   R_SPARC_32      =   3;
+  R_SPARC_64      =   32;
   R_ALPHA_REFQUAD =   2;
   R_IA64_DIR64LSB = $27;
   R_MIPS_32       =   2;

+ 3 - 0
packages/fcl-res/src/elfdefaulttarget.inc

@@ -46,6 +46,9 @@
   {$IFDEF CPUSPARC}
   fMachineType:=emtsparc;
   {$ENDIF}
+  {$IFDEF CPUSPARC64}
+  fMachineType:=emtsparc64;
+  {$ENDIF}
   {$IFDEF CPUALPHA}
   fMachineType:=emtalpha;
   {$ENDIF}

+ 1 - 0
packages/fcl-res/src/elfreader.pp

@@ -285,6 +285,7 @@ begin
     end;
     case subreader.MachineType of
       EM_SPARC  : fMachineType:=emtsparc;
+      EM_SPARCV9: fMachineType:=emtsparc64;
       EM_386    : fMachineType:=emti386;
       EM_68K    : fMachineType:=emtm68k;
       EM_PPC    : fMachineType:=emtppc;

+ 1 - 0
packages/fcl-res/src/elfsubwriter.inc

@@ -421,6 +421,7 @@ begin
       EM_AARCH64: begin RelocType:=R_AARCH64_ABS64; SectionType:=SHT_RELA; end;
       EM_68K    : begin RelocType:=R_68K_32;        SectionType:=SHT_RELA; end;
       EM_SPARC  : begin RelocType:=R_SPARC_32;      SectionType:=SHT_RELA; end;
+      EM_SPARCV9: begin RelocType:=R_SPARC_64;      SectionType:=SHT_RELA; end;
       EM_X86_64 : begin RelocType:=R_x86_64_64;     SectionType:=SHT_RELA; end;
       EM_PPC64  : begin RelocType:=R_PPC64_ADDR64;  SectionType:=SHT_RELA; end;
       EM_ALPHA  : begin RelocType:=R_ALPHA_REFQUAD; SectionType:=SHT_RELA; end;

+ 1 - 0
packages/fcl-res/src/elfwriter.pp

@@ -556,6 +556,7 @@ procedure TElfResourceWriter.SetMachineType(const aMachineType: TElfMachineType)
 begin
   case aMachineType of
     emtsparc  : begin fMachineTypeInt:=EM_SPARC; fBits:=ELFCLASS32; fOrder:=ELFDATA2MSB; end;
+    emtsparc64: begin fMachineTypeInt:=EM_SPARCV9; fBits:=ELFCLASS64; fOrder:=ELFDATA2MSB; end;
     emti386   : begin fMachineTypeInt:=EM_386; fBits:=ELFCLASS32; fOrder:=ELFDATA2LSB; end;
     emtm68k   : begin fMachineTypeInt:=EM_68K; fBits:=ELFCLASS32; fOrder:=ELFDATA2MSB; end;
     emtppc    : begin fMachineTypeInt:=EM_PPC; fBits:=ELFCLASS32; fOrder:=ELFDATA2MSB; end;

+ 2 - 1
utils/fpcres/fpcres.pas

@@ -76,7 +76,7 @@ begin
   writeln('                         i386, x86_64, arm (coff)');
   writeln('                         i386, x86_64, powerpc, powerpc64, arm, armeb, m68k,');
   writeln('                         riscv32, riscv64,');
-  writeln('                         sparc, alpha, ia64, mips, mipsel (elf)');
+  writeln('                         sparc, sparc64, alpha, ia64, mips, mipsel (elf)');
   writeln('                         i386, x86_64, powerpc, powerpc64, arm, aarch64 (mach-o)');
   writeln('                         bigendian, littleendian (external)');
   writeln('  --subarch, -s <name> Set object file sub-architecture. Supported values:');
@@ -255,6 +255,7 @@ begin
     mtarmeb : Result.MachineType:=emtarmeb;
     mtm68k : Result.MachineType:=emtm68k;
     mtsparc : Result.MachineType:=emtsparc;
+    mtsparc64 : Result.MachineType:=emtsparc64;
     mtalpha : Result.MachineType:=emtalpha;
     mtia64 : Result.MachineType:=emtia64;
     mtmips : Result.MachineType:=emtmips;

+ 7 - 3
utils/fpcres/target.pas

@@ -23,7 +23,7 @@ interface
 type
   TMachineType = (mtnone, mti386,mtx86_64,mtppc,mtppc64,mtarm,mtarmeb,mtm68k,
                   mtsparc,mtalpha,mtia64,mtmips,mtmipsel,mtaarch64,mtppc64le,
-                  mtriscv32,mtriscv64,mtloongarch64,
+                  mtriscv32,mtriscv64,mtloongarch64,mtsparc64,
                   mtBigEndian,mtLittleEndian);
   TMachineTypes = set of TMachineType;
 
@@ -36,7 +36,7 @@ type
         (subarm: TSubMachineTypeArm);
       mtnone, mti386,mtx86_64,mtppc,mtppc64,mtm68k,
       mtsparc,mtalpha,mtia64,mtmips,mtmipsel,mtaarch64,mtppc64le,
-      mtriscv32,mtriscv64,mtloongarch64,
+      mtriscv32,mtriscv64,mtloongarch64,mtsparc64,
       mtBigEndian,mtLittleEndian:
         (subgen: TSubMachineTypeGeneric);
   end;
@@ -90,6 +90,7 @@ var
     (name : 'riscv32';      formats : [ofElf]),                   //mtriscv32
     (name : 'riscv64';      formats : [ofElf]),                   //mtriscv64
     (name : 'loongarch64';  formats : [ofElf]),                   //mtloongarch64
+    (name : 'sparc64';      formats : [ofElf]),                   //mtsparc64
     (name : 'bigendian';    formats : [ofExt]),                   //mtBigEndian
     (name : 'littleendian'; formats : [ofExt])                    //mtLittleEndian
   );
@@ -109,7 +110,7 @@ var
                                                      mtia64,mtmips,mtmipsel,
                                                      mtppc64le,mtaarch64,
                                                      mtriscv32,mtriscv64,
-                                                     mtloongarch64]),
+                                                     mtloongarch64,mtsparc64]),
     (name : 'coff';     ext : '.o';      machines : [mti386,mtx86_64,mtarm,
                                                      mtaarch64,mtppc,mtppc64]),
     (name : 'xcoff';    ext : '.o';      machines : [mtppc{,mtppc64}]),
@@ -151,6 +152,9 @@ var
   {$elseif defined(CPUSPARC)}
     machine : mtsparc;
     submachine : (subgen: smtgen_all);
+  {$elseif defined(CPUSPARC64)}
+    machine : mtsparc64;
+    submachine : (subgen: smtgen_all);
   {$elseif defined(CPUALPHA)}
     machine : mtalpha;
     submachine : (subgen: smtgen_all);