Implement support for SPARC 64-bit in fpcres
authorSven/Sarah Barth <pascaldragon@gmail.com>
Sat, 13 Jul 2024 15:35:36 +0000 (17:35 +0200)
committerAbou Al Montacir <abou.almontacir@sfr.fr>
Sat, 13 Jul 2024 15:35:36 +0000 (17:35 +0200)
Last-Update: Tue, 2 Jan 2024 22:59:51 +0100

Lazarus build fails on sparc64 due to missing support of this
architecture in fpcres tool. This patch backports the support to
version 3.2.2.

Gbp-Pq: Name 7-060f24600bb559f62b6350899864f3ac4155c207.patch

fpcsrc/packages/fcl-res/src/elfconsts.pp
fpcsrc/packages/fcl-res/src/elfdefaulttarget.inc
fpcsrc/packages/fcl-res/src/elfreader.pp
fpcsrc/packages/fcl-res/src/elfsubwriter.inc
fpcsrc/packages/fcl-res/src/elfwriter.pp
fpcsrc/utils/fpcres/fpcres.pas
fpcsrc/utils/fpcres/target.pas

index 9393b5451f74b8fc7215e430a619744d92f92b80..49287d7b913401b99bf8517f785f752ca1a78591 100644 (file)
@@ -22,7 +22,8 @@ interface
 type
   TElfMachineType = (emtnone, emtsparc, emti386, emtm68k, emtppc, emtppc64,
                      emtarm, emtarmeb, emtia64, emtx86_64, emtalpha,
-                     emtmips, emtmipsel, emtppc64le, emtaarch64);
+                     emtmips, emtmipsel, emtppc64le, emtaarch64,
+                     emtsparc64);
 const
   ELFMAGIC     = chr($7f)+'ELF';
 
@@ -68,6 +69,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;
@@ -134,6 +136,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;
index 2afd243c1818a10ba978e2600a1f7961abe07c6e..9faf8fb00264f1db630696818e81c815b2037a01 100644 (file)
@@ -46,6 +46,9 @@
   {$IFDEF CPUSPARC}
   fMachineType:=emtsparc;
   {$ENDIF}
+  {$IFDEF CPUSPARC64}
+  fMachineType:=emtsparc64;
+  {$ENDIF}
   {$IFDEF CPUALPHA}
   fMachineType:=emtalpha;
   {$ENDIF}
index c6774a6ee6b0e3f3680a4f61ef75be46c65b8e24..e62d4e17cb6886bde28f9f7639d09680d8cb4164 100644 (file)
@@ -274,6 +274,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;
index 4a649b5d85ae755af4a7dfdb4cc8aa45a0755187..651fb49bc092cc9dfb6fe09561b0f08ce87f04de 100644 (file)
@@ -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;
index e28e3073ac0aa75c385ea0d45b8f030328997d83..516bbf0d3e3281d2ecbb40499ea2bf7af87ae3da 100644 (file)
@@ -545,6 +545,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;
index 1a27eb3512c4977473b748a793535cdba24d99c0..8b9091bbb00e1fa1284c4462c15a8f455186d7df 100644 (file)
@@ -75,7 +75,7 @@ begin
   writeln('  --arch, -a <name>    Set object file architecture. Supported architectures:');
   writeln('                         i386, x86_64, arm (coff)');
   writeln('                         i386, x86_64, powerpc, powerpc64, arm, armeb, m68k,');
-  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:');
@@ -254,6 +254,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;
index ed908e89b106149cc8b5f4f37dcc36173a01ab51..69f5999a91caeb6802fa5062466fda115759d65f 100644 (file)
@@ -23,6 +23,7 @@ interface
 type
   TMachineType = (mtnone, mti386,mtx86_64,mtppc,mtppc64,mtarm,mtarmeb,mtm68k,
                   mtsparc,mtalpha,mtia64,mtmips,mtmipsel,mtaarch64,mtppc64le,
+                  mtsparc64,
                   mtBigEndian,mtLittleEndian);
   TMachineTypes = set of TMachineType;
 
@@ -35,6 +36,7 @@ type
         (subarm: TSubMachineTypeArm);
       mtnone, mti386,mtx86_64,mtppc,mtppc64,mtm68k,
       mtsparc,mtalpha,mtia64,mtmips,mtmipsel,mtaarch64,mtppc64le,
+      mtsparc64,
       mtBigEndian,mtLittleEndian:
         (subgen: TSubMachineTypeGeneric);
   end;
@@ -85,6 +87,7 @@ var
     (name : 'mipsel';       formats : [ofElf]),                   //mtmipsel
     (name : 'aarch64';      formats : [ofElf, ofCoff, ofMachO]),  //mtaarch64
     (name : 'powerpc64le';  formats : [ofElf]),                   //mtppc64le
+    (name : 'sparc64';      formats : [ofElf]),                   //mtsparc64
     (name : 'bigendian';    formats : [ofExt]),                   //mtBigEndian
     (name : 'littleendian'; formats : [ofExt])                    //mtLittleEndian
   );
@@ -102,7 +105,8 @@ var
                                                      mtppc64,mtarm,mtarmeb,
                                                      mtm68k,mtsparc,mtalpha,
                                                      mtia64,mtmips,mtmipsel,
-                                                     mtppc64le,mtaarch64]),
+                                                     mtppc64le,mtaarch64,
+                                                     mtsparc64]),
     (name : 'coff';     ext : '.o';      machines : [mti386,mtx86_64,mtarm,
                                                      mtaarch64,mtppc,mtppc64]),
     (name : 'xcoff';    ext : '.o';      machines : [mtppc{,mtppc64}]),
@@ -144,6 +148,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);