浏览代码

+ ELF/ppc64le resource support

git-svn-id: trunk@30218 -
Jonas Maebe 10 年之前
父节点
当前提交
7bc66a5142

+ 6 - 0
compiler/comprsrc.pas

@@ -289,6 +289,12 @@ begin
           if (target_info.endian=endian_big) then
           if (target_info.endian=endian_big) then
             arch:=arch+'eb';
             arch:=arch+'eb';
         end;
         end;
+      if target_info.cpu=systems.cpu_powerpc64 then
+        begin
+          { differentiate between ppc64 and ppc64le }
+          if target_info.endian=endian_little then
+            arch:=arch+'le';
+        end;
       Replace(s,'$ARCH',arch);
       Replace(s,'$ARCH',arch);
       if target_info.system=system_arm_darwin then
       if target_info.system=system_arm_darwin then
         subarch:=lower(cputypestr[current_settings.cputype]);
         subarch:=lower(cputypestr[current_settings.cputype]);

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

@@ -22,7 +22,7 @@ interface
 type
 type
   TElfMachineType = (emtnone, emtsparc, emti386, emtm68k, emtppc, emtppc64,
   TElfMachineType = (emtnone, emtsparc, emti386, emtm68k, emtppc, emtppc64,
                      emtarm, emtarmeb, emtia64, emtx86_64, emtalpha,
                      emtarm, emtarmeb, emtia64, emtx86_64, emtalpha,
-                     emtmips, emtmipsel);
+                     emtmips, emtmipsel, emtppc64le);
 const
 const
   ELFMAGIC     = chr($7f)+'ELF';
   ELFMAGIC     = chr($7f)+'ELF';
 
 

+ 5 - 1
packages/fcl-res/src/elfdefaulttarget.inc

@@ -24,7 +24,11 @@
   fMachineType:=emtppc;;
   fMachineType:=emtppc;;
   {$ENDIF}
   {$ENDIF}
   {$IFDEF CPUPOWERPC64}
   {$IFDEF CPUPOWERPC64}
-  fMachineType:=emtppc64;;
+  {$ifdef FPC_BIG_ENDIAN}
+  fMachineType:=emtppc64;
+  {$else FPC_BIG_ENDIAN}
+  fMachineType:=emtppc64le;
+  {$endif FPC_BIG_ENDIAN}
   {$ENDIF}
   {$ENDIF}
   {$IFDEF CPUARM}
   {$IFDEF CPUARM}
     {$IFDEF ENDIAN_LITTLE}
     {$IFDEF ENDIAN_LITTLE}

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

@@ -548,7 +548,8 @@ begin
     emti386   : begin fMachineTypeInt:=EM_386; fBits:=ELFCLASS32; fOrder:=ELFDATA2LSB; end;
     emti386   : begin fMachineTypeInt:=EM_386; fBits:=ELFCLASS32; fOrder:=ELFDATA2LSB; end;
     emtm68k   : begin fMachineTypeInt:=EM_68K; fBits:=ELFCLASS32; fOrder:=ELFDATA2MSB; end;
     emtm68k   : begin fMachineTypeInt:=EM_68K; fBits:=ELFCLASS32; fOrder:=ELFDATA2MSB; end;
     emtppc    : begin fMachineTypeInt:=EM_PPC; fBits:=ELFCLASS32; fOrder:=ELFDATA2MSB; end;
     emtppc    : begin fMachineTypeInt:=EM_PPC; fBits:=ELFCLASS32; fOrder:=ELFDATA2MSB; end;
-    emtppc64  : begin fMachineTypeInt:=EM_PPC64; fBits:=ELFCLASS64; fOrder:=ELFDATA2MSB; end;
+    emtppc64  : begin fMachineTypeInt:=EM_PPC64; fBits:=ELFCLASS64;fOrder:=ELFDATA2MSB; end;
+    emtppc64le: begin fMachineTypeInt:=EM_PPC64; fBits:=ELFCLASS64;fOrder:=ELFDATA2LSB; end;
     emtarm    : begin fMachineTypeInt:=EM_ARM; fBits:=ELFCLASS32; fOrder:=ELFDATA2LSB; end;
     emtarm    : begin fMachineTypeInt:=EM_ARM; fBits:=ELFCLASS32; fOrder:=ELFDATA2LSB; end;
     emtarmeb  : begin fMachineTypeInt:=EM_ARM; fBits:=ELFCLASS32; fOrder:=ELFDATA2MSB; end;
     emtarmeb  : begin fMachineTypeInt:=EM_ARM; fBits:=ELFCLASS32; fOrder:=ELFDATA2MSB; end;
     emtalpha  : begin fMachineTypeInt:=EM_ALPHA; fBits:=ELFCLASS64; fOrder:=ELFDATA2LSB; end;
     emtalpha  : begin fMachineTypeInt:=EM_ALPHA; fBits:=ELFCLASS64; fOrder:=ELFDATA2LSB; end;

+ 1 - 0
utils/fpcres/fpcres.pas

@@ -252,6 +252,7 @@ begin
     mtia64 : Result.MachineType:=emtia64;
     mtia64 : Result.MachineType:=emtia64;
     mtmips : Result.MachineType:=emtmips;
     mtmips : Result.MachineType:=emtmips;
     mtmipsel : Result.MachineType:=emtmipsel;
     mtmipsel : Result.MachineType:=emtmipsel;
+    mtppc64le : Result.MachineType:=emtppc64le;
   end;
   end;
 end;
 end;
 
 

+ 9 - 3
utils/fpcres/target.pas

@@ -22,7 +22,7 @@ interface
 
 
 type
 type
   TMachineType = (mtnone, mti386,mtx86_64,mtppc,mtppc64,mtarm,mtarmeb,mtm68k,
   TMachineType = (mtnone, mti386,mtx86_64,mtppc,mtppc64,mtarm,mtarmeb,mtm68k,
-                  mtsparc,mtalpha,mtia64,mtmips,mtmipsel,mtaarch64,
+                  mtsparc,mtalpha,mtia64,mtmips,mtmipsel,mtaarch64,mtppc64le,
                   mtBigEndian,mtLittleEndian);
                   mtBigEndian,mtLittleEndian);
   TMachineTypes = set of TMachineType;
   TMachineTypes = set of TMachineType;
 
 
@@ -34,7 +34,7 @@ type
       mtarm,mtarmeb:
       mtarm,mtarmeb:
         (subarm: TSubMachineTypeArm);
         (subarm: TSubMachineTypeArm);
       mtnone, mti386,mtx86_64,mtppc,mtppc64,mtm68k,
       mtnone, mti386,mtx86_64,mtppc,mtppc64,mtm68k,
-      mtsparc,mtalpha,mtia64,mtmips,mtmipsel,mtaarch64,
+      mtsparc,mtalpha,mtia64,mtmips,mtmipsel,mtaarch64,mtppc64le,
       mtBigEndian,mtLittleEndian:
       mtBigEndian,mtLittleEndian:
         (subgen: TSubMachineTypeGeneric);
         (subgen: TSubMachineTypeGeneric);
   end;
   end;
@@ -84,6 +84,7 @@ var
     (name : 'mips';         formats : [ofElf]; alias : 'mipseb'), //mtmips
     (name : 'mips';         formats : [ofElf]; alias : 'mipseb'), //mtmips
     (name : 'mipsel';       formats : [ofElf]),                   //mtmipsel
     (name : 'mipsel';       formats : [ofElf]),                   //mtmipsel
     (name : 'aarch64';      formats : [ofMachO]),                 //mtaarch64
     (name : 'aarch64';      formats : [ofMachO]),                 //mtaarch64
+    (name : 'powerpc64le';  formats : [ofElf]),                   //mtppc64le
     (name : 'bigendian';    formats : [ofExt]),                   //mtBigEndian
     (name : 'bigendian';    formats : [ofExt]),                   //mtBigEndian
     (name : 'littleendian'; formats : [ofExt])                    //mtLittleEndian
     (name : 'littleendian'; formats : [ofExt])                    //mtLittleEndian
   );
   );
@@ -100,7 +101,8 @@ var
     (name : 'elf';      ext : '.or';     machines : [mti386,mtx86_64,mtppc,
     (name : 'elf';      ext : '.or';     machines : [mti386,mtx86_64,mtppc,
                                                      mtppc64,mtarm,mtarmeb,
                                                      mtppc64,mtarm,mtarmeb,
                                                      mtm68k,mtsparc,mtalpha,
                                                      mtm68k,mtsparc,mtalpha,
-                                                     mtia64,mtmips,mtmipsel]),
+                                                     mtia64,mtmips,mtmipsel,
+                                                     mtppc64le]),
     (name : 'coff';     ext : '.o';      machines : [mti386,mtx86_64,mtarm,
     (name : 'coff';     ext : '.o';      machines : [mti386,mtx86_64,mtarm,
                                                      mtppc,mtppc64]),
                                                      mtppc,mtppc64]),
     (name : 'xcoff';    ext : '.o';      machines : [mtppc{,mtppc64}]),
     (name : 'xcoff';    ext : '.o';      machines : [mtppc{,mtppc64}]),
@@ -122,7 +124,11 @@ var
     machine : mtppc;
     machine : mtppc;
     submachine : (subgen: smtgen_all);
     submachine : (subgen: smtgen_all);
   {$elseif defined(CPUPOWERPC64)}
   {$elseif defined(CPUPOWERPC64)}
+    {$ifdef FPC_BIG_ENDIAN}
     machine : mtppc64;
     machine : mtppc64;
+    {$else FPC_BIG_ENDIAN}
+    machine : mtppc64le;
+    {$endif FPC_BIG_ENDIAN}
     submachine : (subgen: smtgen_all);
     submachine : (subgen: smtgen_all);
   {$elseif defined(CPUARM)}
   {$elseif defined(CPUARM)}
     {$IFDEF ENDIAN_LITTLE}
     {$IFDEF ENDIAN_LITTLE}