summaryrefslogtreecommitdiff
path: root/packages/fcl-res
diff options
context:
space:
mode:
authorjonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2>2015-02-23 22:51:47 +0000
committerjonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2>2015-02-23 22:51:47 +0000
commitb9bb43ee9aee76a80a3bc83f763fb08296e9e8c5 (patch)
tree2f393aa5240626ccff2ba8e1eb2f72c8a2b73600 /packages/fcl-res
parent0eabf27bb31a7b0a7bdbe4451c27fd4be9b9f0c6 (diff)
downloadfpc-b9bb43ee9aee76a80a3bc83f763fb08296e9e8c5.tar.gz
+ Darwin/AArch64 support in fcl-res
o disabled writing an addend for the "usedhandles" entry, since we already add a relocation for it (and while the result of this relocation overwrites the addend on previously supported Darwin targets, it gets added on AArch64 git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@29898 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'packages/fcl-res')
-rw-r--r--packages/fcl-res/src/machoconsts.pp6
-rw-r--r--packages/fcl-res/src/machodefaulttarget.inc3
-rw-r--r--packages/fcl-res/src/machoreader.pp3
-rw-r--r--packages/fcl-res/src/machosubwriter.inc12
-rw-r--r--packages/fcl-res/src/machotypes.pp3
-rw-r--r--packages/fcl-res/src/machowriter.pp14
6 files changed, 26 insertions, 15 deletions
diff --git a/packages/fcl-res/src/machoconsts.pp b/packages/fcl-res/src/machoconsts.pp
index 7c99421c82..af7d27a95a 100644
--- a/packages/fcl-res/src/machoconsts.pp
+++ b/packages/fcl-res/src/machoconsts.pp
@@ -48,6 +48,7 @@ const
CPU_TYPE_I386 = 7;
CPU_TYPE_X86_64 = CPU_TYPE_I386 or CPU_ARCH_ABI64;
CPU_TYPE_ARM = 12;
+ CPU_TYPE_ARM64 = CPU_TYPE_ARM or CPU_ARCH_ABI64;
CPU_TYPE_POWERPC = 18;
CPU_TYPE_POWERPC64 = CPU_TYPE_POWERPC or CPU_ARCH_ABI64;
@@ -61,6 +62,8 @@ const
CPU_SUBTYPE_ARM_V5TEJ = 7;
CPU_SUBTYPE_ARM_XSCALE = 8;
CPU_SUBTYPE_ARM_V7 = 9;
+ CPU_SUBTYPE_ARM64_ALL = 0;
+ CPU_SUBTYPE_ARM64_V8 = 1;
//Mach-O object types
MH_OBJECT = $1; // relocatable object file
@@ -206,6 +209,9 @@ const
// relocation types - ARM
ARM_RELOC_VANILLA = 0; // generic relocation
+ // relocation types - AARCH64
+ ARM64_RELOC_UNSIGNED = 0; // for pointers
+
implementation
end.
diff --git a/packages/fcl-res/src/machodefaulttarget.inc b/packages/fcl-res/src/machodefaulttarget.inc
index d33ca97b04..e3b180b4cd 100644
--- a/packages/fcl-res/src/machodefaulttarget.inc
+++ b/packages/fcl-res/src/machodefaulttarget.inc
@@ -26,6 +26,9 @@
{$IFDEF CPUX86_64}
fMachineType:=mmtx86_64;
{$ENDIF}
+ {$IFDEF CPUAARCH64}
+ fMachineType:=mmtarm64;
+ {$ENDIF}
fBits:=MACH_ERRBIT;
{$IFDEF CPU32}
diff --git a/packages/fcl-res/src/machoreader.pp b/packages/fcl-res/src/machoreader.pp
index 17f28e33be..7ebd608fff 100644
--- a/packages/fcl-res/src/machoreader.pp
+++ b/packages/fcl-res/src/machoreader.pp
@@ -219,7 +219,8 @@ begin
CPU_TYPE_X86_64 : fMachineType:=mmtx86_64;
CPU_TYPE_POWERPC : fMachineType:=mmtpowerpc;
CPU_TYPE_POWERPC64 : fMachineType:=mmtpowerpc64;
- CPU_TYPE_ARM : fMachineType:=mmtarm
+ CPU_TYPE_ARM : fMachineType:=mmtarm;
+ CPU_TYPE_ARM64 : fMachineType:=mmtarm64
else exit;
end;
diff --git a/packages/fcl-res/src/machosubwriter.inc b/packages/fcl-res/src/machosubwriter.inc
index bb1194f0ab..f379e29a52 100644
--- a/packages/fcl-res/src/machosubwriter.inc
+++ b/packages/fcl-res/src/machosubwriter.inc
@@ -34,7 +34,6 @@ type
procedure AllocateSpaceForLoadCommands(aStream : TStream); override;
procedure FixLoadCommands(aStream : TStream; aResources : TResources); override;
- procedure FixResHeader(aStream : TStream); override;
public
constructor Create(aParent : TMachOResourceWriter; const aMachineType
: TMachOMachineType; const aSubMachineType: TMachoSubMachineType;
@@ -325,17 +324,6 @@ begin
aStream.WriteBuffer(dysymcommand,sizeof(dysymcommand));
end;
-procedure _TMachOSubWriter_.FixResHeader(aStream : TStream);
-var hdr : _TResHdr_;
-begin
- hdr.handles:=fDataCurOfs;
- if fOppositeEndianess then
- hdr.handles:=SwapEndian(hdr.handles);
- aStream.Seek(sizeof(hdr.rootptr)+sizeof(hdr.count)+sizeof(hdr.usedhandles),
- soFromCurrent);
- aStream.WriteBuffer(hdr.handles,sizeof(hdr.handles));
-end;
-
constructor _TMachOSubWriter_.Create(aParent : TMachOResourceWriter;
const aMachineType : TMachOMachineType; const aSubMachineType: TMachoSubMachineType; const aOppositeEndianess : boolean);
begin
diff --git a/packages/fcl-res/src/machotypes.pp b/packages/fcl-res/src/machotypes.pp
index ec5288d60c..59da2fbb19 100644
--- a/packages/fcl-res/src/machotypes.pp
+++ b/packages/fcl-res/src/machotypes.pp
@@ -20,12 +20,13 @@ unit machotypes;
interface
type
- TMachOMachineType = (mmtpowerpc, mmtpowerpc64, mmti386, mmtx86_64, mmtarm);
+ TMachOMachineType = (mmtpowerpc, mmtpowerpc64, mmti386, mmtx86_64, mmtarm, mmtarm64);
TMachOSubMachineTypePowerPC = (msmppc_all);
TMachOSubMachineTypePowerPC64 = (msmppc64_all);
TMachOSubMachineType386 = (msm386_all);
TMachOSubMachineTypex64 = (msmx64_all);
TMachOSubMachineTypeArm = (msmarm_all,msmarm_v4t,msmarm_v6,msmarm_v5tej,msmarm_xscale,msmarm_v7);
+ TMachOSubMachineTypeAarch64 = (msmaarch64_all);
TSegSectName = array[0..15] of char;
type
diff --git a/packages/fcl-res/src/machowriter.pp b/packages/fcl-res/src/machowriter.pp
index 3b7946b1d0..2420006e07 100644
--- a/packages/fcl-res/src/machowriter.pp
+++ b/packages/fcl-res/src/machowriter.pp
@@ -37,6 +37,7 @@ type
msm386_all: (f386SubType: TMachOSubMachineType386);
msmx64_all: (fX64SubType: TMachOSubMachineTypex64);
mmtarm: (fArmSubType: TMachOSubMachineTypeArm);
+ mmtarm64: (fArm64SubType: TMachOSubMachineTypeAarch64);
end;
TMachOResourceWriter = class(TAbstractResourceWriter)
@@ -301,6 +302,11 @@ begin
fRelocType:=ARM_RELOC_VANILLA;
fRelocSize:=2;
end;
+ mmtarm64 : begin
+ fEndianess:=MACH_LITTLE_ENDIAN;
+ fRelocType:=ARM64_RELOC_UNSIGNED;
+ fRelocSize:=3;
+ end;
end;
fOppositeEndianess:=aOppositeEndianess;
end;
@@ -491,6 +497,7 @@ const
armsm2int: array[TMachOSubMachineTypeArm] of longint = (CPU_SUBTYPE_ARM_ALL,
CPU_SUBTYPE_ARM_V4T,CPU_SUBTYPE_ARM_V6,CPU_SUBTYPE_ARM_V5TEJ,
CPU_SUBTYPE_ARM_XSCALE,CPU_SUBTYPE_ARM_V7);
+ arm64sm2int: array[TMachOSubMachineTypeAarch64] of longint = (CPU_SUBTYPE_ARM64_ALL);
begin
aStream.Position:=0;
case fMachineType of
@@ -519,6 +526,11 @@ begin
fHeader.cputype:=CPU_TYPE_ARM;
fHeader.cpusubtype:=armsm2int[fSubMachineType.fArmSubType];
end;
+ mmtarm64 : begin
+ fHeader.magic:=MH_MAGIC_64;
+ fHeader.cputype:=CPU_TYPE_ARM64;
+ fHeader.cpusubtype:=arm64sm2int[fSubMachineType.fArm64SubType];
+ end;
end;
fHeader.filetype:=MH_OBJECT;
fHeader.ncmds:=3;
@@ -559,7 +571,6 @@ begin
WriteMachOStringTable(aStream);
FixHeader(aStream);
FixLoadCommands(aStream,aResources);
- FixResHeader(aStream);
end;
constructor TAbstractMachOSubWriter.Create(aParent : TMachOResourceWriter;
@@ -602,6 +613,7 @@ begin
mmti386 : begin fBits:=MACH_32BIT; fEndianess:=MACH_LITTLE_ENDIAN; end;
mmtx86_64 : begin fBits:=MACH_64BIT; fEndianess:=MACH_LITTLE_ENDIAN; end;
mmtarm : begin fBits:=MACH_32BIT; fEndianess:=MACH_LITTLE_ENDIAN; end;
+ mmtarm64 : begin fBits:=MACH_64BIT; fEndianess:=MACH_LITTLE_ENDIAN; end;
end;
fMachineType:=aMachineType;
fOppositeEndianess:=fNativeEndianess<>fEndianess;