* initial version of internal Mach-O/i386 assembler by Dmitry Boyarintsev

(mantis #15163)

git-svn-id: trunk@14628 -
This commit is contained in:
Jonas Maebe 2010-01-12 19:52:55 +00:00
parent 134331f129
commit 28cd8271c9
13 changed files with 4991 additions and 106 deletions

3
.gitattributes vendored
View File

@ -234,6 +234,8 @@ compiler/m68k/r68ksup.inc svneol=native#text/plain
compiler/m68k/ra68k.pas svneol=native#text/plain compiler/m68k/ra68k.pas svneol=native#text/plain
compiler/m68k/ra68kmot.pas svneol=native#text/plain compiler/m68k/ra68kmot.pas svneol=native#text/plain
compiler/m68k/rgcpu.pas svneol=native#text/plain compiler/m68k/rgcpu.pas svneol=native#text/plain
compiler/macho.pas svneol=native#text/plain
compiler/machoutils.pas svneol=native#text/plain
compiler/mips/aasmcpu.pas svneol=native#text/plain compiler/mips/aasmcpu.pas svneol=native#text/plain
compiler/mips/aoptcpu.pas svneol=native#text/plain compiler/mips/aoptcpu.pas svneol=native#text/plain
compiler/mips/aoptcpub.pas svneol=native#text/plain compiler/mips/aoptcpub.pas svneol=native#text/plain
@ -330,6 +332,7 @@ compiler/ogbase.pas svneol=native#text/plain
compiler/ogcoff.pas svneol=native#text/plain compiler/ogcoff.pas svneol=native#text/plain
compiler/ogelf.pas svneol=native#text/plain compiler/ogelf.pas svneol=native#text/plain
compiler/oglx.pas svneol=native#text/plain compiler/oglx.pas svneol=native#text/plain
compiler/ogmacho.pas svneol=native#text/plain
compiler/ogmap.pas svneol=native#text/plain compiler/ogmap.pas svneol=native#text/plain
compiler/optbase.pas svneol=native#text/plain compiler/optbase.pas svneol=native#text/plain
compiler/optcse.pas svneol=native#text/plain compiler/optcse.pas svneol=native#text/plain

View File

@ -40,7 +40,7 @@ interface
TAsmsymbind=( TAsmsymbind=(
AB_NONE,AB_EXTERNAL,AB_COMMON,AB_LOCAL,AB_GLOBAL,AB_WEAK_EXTERNAL, AB_NONE,AB_EXTERNAL,AB_COMMON,AB_LOCAL,AB_GLOBAL,AB_WEAK_EXTERNAL,
{ global in the current program/library, but not visible outside it } { global in the current program/library, but not visible outside it }
AB_PRIVATE_EXTERN); AB_PRIVATE_EXTERN,AB_LAZY);
TAsmsymtype=( TAsmsymtype=(
AT_NONE,AT_FUNCTION,AT_DATA,AT_SECTION,AT_LABEL, AT_NONE,AT_FUNCTION,AT_DATA,AT_SECTION,AT_LABEL,

View File

@ -131,6 +131,8 @@ interface
procedure MakeObject;override; procedure MakeObject;override;
end; end;
{ TInternalAssembler }
TInternalAssembler=class(TAssembler) TInternalAssembler=class(TAssembler)
private private
FCObjOutput : TObjOutputclass; FCObjOutput : TObjOutputclass;
@ -142,6 +144,7 @@ interface
currlist : TAsmList; currlist : TAsmList;
procedure WriteStab(p:pchar); procedure WriteStab(p:pchar);
function MaybeNextList(var hp:Tai):boolean; function MaybeNextList(var hp:Tai):boolean;
function SetIndirectToSymbol(hp: Tai; const indirectname: string): Boolean;
function TreePass0(hp:Tai):Tai; function TreePass0(hp:Tai):Tai;
function TreePass1(hp:Tai):Tai; function TreePass1(hp:Tai):Tai;
function TreePass2(hp:Tai):Tai; function TreePass2(hp:Tai):Tai;
@ -925,6 +928,33 @@ Implementation
end; end;
function TInternalAssembler.SetIndirectToSymbol(hp: Tai; const indirectname: string): Boolean;
var
objsym : TObjSymbol;
indsym : TObjSymbol;
begin
Result:=
Assigned(hp) and
(hp.typ=ait_symbol);
if not Result then
Exit;
objsym:=Objdata.SymbolRef(tai_symbol(hp).sym);
objsym.size:=0;
indsym := TObjSymbol(ObjData.ObjSymbolList.Find(indirectname));
if not Assigned(indsym) then
begin
{ it's possible that indirect symbol is not present in the list,
so we must create it as undefined }
indsym:=TObjSymbol.Create(ObjData.ObjSymbolList, indirectname);
indsym.typ:=AT_NONE;
indsym.bind:=AB_NONE;
end;
objsym.indsymbol:=indsym;
Result:=true;
end;
function TInternalAssembler.TreePass0(hp:Tai):Tai; function TInternalAssembler.TreePass0(hp:Tai):Tai;
var var
objsym, objsym,
@ -989,6 +1019,26 @@ Implementation
end; end;
ObjData.alloc(tai_const(hp).size); ObjData.alloc(tai_const(hp).size);
end; end;
ait_directive:
begin
case tai_directive(hp).directive of
asd_indirect_symbol:
{ handled in TreePass1 }
;
asd_lazy_reference:
begin
if tai_directive(hp).name = nil then
Internalerror(2009112101);
objsym:=ObjData.symbolref(tai_directive(hp).name^);
objsym.bind:=AB_LAZY;
end;
asd_reference:
{ ignore for now, but should be added}
;
else
internalerror(2010011101);
end;
end;
ait_section: ait_section:
begin begin
ObjData.CreateSection(Tai_section(hp).sectype,Tai_section(hp).name^,Tai_section(hp).secorder); ObjData.CreateSection(Tai_section(hp).sectype,Tai_section(hp).name^,Tai_section(hp).secorder);
@ -997,8 +1047,9 @@ Implementation
ait_symbol : ait_symbol :
begin begin
{ needs extra support in the internal assembler } { needs extra support in the internal assembler }
if tai_symbol(hp).has_value then { the value is just ignored }
internalerror(2009090804); {if tai_symbol(hp).has_value then
internalerror(2009090804); ;}
ObjData.SymbolDefine(Tai_symbol(hp).sym); ObjData.SymbolDefine(Tai_symbol(hp).sym);
end; end;
ait_label : ait_label :
@ -1109,6 +1160,24 @@ Implementation
ait_cutobject : ait_cutobject :
if SmartAsm then if SmartAsm then
break; break;
ait_directive :
begin
case tai_directive(hp).directive of
asd_indirect_symbol:
if tai_directive(hp).name = nil then
Internalerror(2009101103)
else if not SetIndirectToSymbol(Tai(hp.Previous), tai_directive(hp).name^) then
Internalerror(2009101102);
asd_lazy_reference:
{ handled in TreePass0 }
;
asd_reference:
{ ignore for now, but should be added}
;
else
internalerror(2010011102);
end;
end;
end; end;
hp:=Tai(hp.next); hp:=Tai(hp.next);
end; end;
@ -1224,6 +1293,9 @@ Implementation
internalerror(200709271); internalerror(200709271);
ObjData.writebytes(lebbuf,leblen); ObjData.writebytes(lebbuf,leblen);
end; end;
aitconst_darwin_dwarf_delta32,
aitconst_darwin_dwarf_delta64:
ObjData.writebytes(Tai_const(hp).value,tai_const(hp).size);
else else
internalerror(200603254); internalerror(200603254);
end; end;

View File

@ -97,6 +97,7 @@ implementation
,ogcoff ,ogcoff
,ogelf ,ogelf
,ogmacho
{************************************** {**************************************
Assembler Readers Assembler Readers

2103
compiler/macho.pas Normal file

File diff suppressed because it is too large Load Diff

1466
compiler/machoutils.pas Normal file

File diff suppressed because it is too large Load Diff

View File

@ -2872,6 +2872,7 @@ option_help_pages=11025_[
**1A<x>_Output format: **1A<x>_Output format:
**2Adefault_Use default assembler **2Adefault_Use default assembler
3*2Aas_Assemble using GNU AS 3*2Aas_Assemble using GNU AS
3*2Amacho_Mach-O (Darwin, Intel 32 bit) using internal writer
3*2Anasmcoff_COFF (Go32v2) file using Nasm 3*2Anasmcoff_COFF (Go32v2) file using Nasm
3*2Anasmelf_ELF32 (Linux) file using Nasm 3*2Anasmelf_ELF32 (Linux) file using Nasm
3*2Anasmwin32_Win32 object file using Nasm 3*2Anasmwin32_Win32 object file using Nasm

View File

@ -840,7 +840,7 @@ const
option_info=11024; option_info=11024;
option_help_pages=11025; option_help_pages=11025;
MsgTxtSize = 55246; MsgTxtSize = 55308;
MsgIdxMax : array[1..20] of longint=( MsgIdxMax : array[1..20] of longint=(
24,87,285,95,71,51,110,22,202,63, 24,87,285,95,71,51,110,22,202,63,

View File

@ -1028,274 +1028,274 @@ const msgtxt : array[0..000230,1..240] of char=(
'**1A<x>_Output format:'#010+ '**1A<x>_Output format:'#010+
'**2Adefault_Use default assembler'#010+ '**2Adefault_Use default assembler'#010+
'3*2Aas_Assemble using GNU AS'#010+ '3*2Aas_Assemble using GNU AS'#010+
'3*2Anasmcoff_COFF (Go32v2) file using Nasm'#010+ '3*2Amacho_Mach-O (Darwin, Intel 32 bit) using internal writer'#010+
'3*2Anasmelf_ELF32 (Linux) f','ile using Nasm'#010+ '3*2Anasm','coff_COFF (Go32v2) file using Nasm'#010+
'3*2Anasmelf_ELF32 (Linux) file using Nasm'#010+
'3*2Anasmwin32_Win32 object file using Nasm'#010+ '3*2Anasmwin32_Win32 object file using Nasm'#010+
'3*2Anasmwdosx_Win32/WDOSX object file using Nasm'#010+ '3*2Anasmwdosx_Win32/WDOSX object file using Nasm'#010+
'3*2Awasm_Obj file using Wasm (Watcom)'#010+ '3*2Awasm_Obj file using Wasm (Watcom)'#010+
'3*2Anasmobj_Obj file using Nasm'#010+ '3*2Anasmobj_Obj file using Nasm'#010+
'3*2Amasm_Obj file using Masm (Microsoft)'#010+ '3','*2Amasm_Obj file using Masm (Microsoft)'#010+
'3*2Atasm_Obj file usin','g Tasm (Borland)'#010+ '3*2Atasm_Obj file using Tasm (Borland)'#010+
'3*2Aelf_ELF (Linux) using internal writer'#010+ '3*2Aelf_ELF (Linux) using internal writer'#010+
'3*2Acoff_COFF (Go32v2) using internal writer'#010+ '3*2Acoff_COFF (Go32v2) using internal writer'#010+
'3*2Apecoff_PE-COFF (Win32) using internal writer'#010+ '3*2Apecoff_PE-COFF (Win32) using internal writer'#010+
'4*2Aas_Assemble using GNU AS'#010+ '4*2Aas_Assemble using GNU',' AS'#010+
'6*2Aas_Unix o-file using GNU AS'#010+ '6*2Aas_Unix o-file using GNU AS'#010+
'6*2Agas_GNU Motorola assem','bler'#010+ '6*2Agas_GNU Motorola assembler'#010+
'6*2Amit_MIT Syntax (old GAS)'#010+ '6*2Amit_MIT Syntax (old GAS)'#010+
'6*2Amot_Standard Motorola assembler'#010+ '6*2Amot_Standard Motorola assembler'#010+
'A*2Aas_Assemble using GNU AS'#010+ 'A*2Aas_Assemble using GNU AS'#010+
'P*2Aas_Assemble using GNU AS'#010+ 'P*2Aas_Assemble using GNU AS'#010+
'S*2Aas_Assemble using GNU AS'#010+ 'S*2Aas_Assemble using GNU AS'#010+
'**1b_Generate browser info'#010+ '**1b_Generate browser',' info'#010+
'**2bl_Generate local symbol info'#010+ '**2bl_Generate local symbol info'#010+
'**1B_Build all modules'#010, '**1B_Build all modules'#010+
'**1C<x>_Code generation options:'#010+ '**1C<x>_Code generation options:'#010+
'**2Ca<x>_Select ABI, see fpc -i for possible values'#010+ '**2Ca<x>_Select ABI, see fpc -i for possible values'#010+
'**2Cb_Generate big-endian code'#010+ '**2Cb_Generate big-endian code'#010+
'**2Cc<x>_Set default calling convention to <x>'#010+ '**2Cc<x>_Set default calling convention to <x>'#010+
'**2CD_Create also dynamic library (not supported)'#010+ '**2CD_Create al','so dynamic library (not supported)'#010+
'**2Ce_Compilation with emul','ated floating point opcodes'#010+ '**2Ce_Compilation with emulated floating point opcodes'#010+
'**2Cf<x>_Select fpu instruction set to use, see fpc -i for possible va'+ '**2Cf<x>_Select fpu instruction set to use, see fpc -i for possible va'+
'lues'#010+ 'lues'#010+
'**2CF<x>_Minimal floating point constant precision (default, 32, 64)'#010+ '**2CF<x>_Minimal floating point constant precision (default, 32, 64)'#010+
'**2Cg_Generate PIC code'#010+ '**2Cg_','Generate PIC code'#010+
'**2Ch<n>_<n> bytes heap (between 1023 and 67','107840)'#010+ '**2Ch<n>_<n> bytes heap (between 1023 and 67107840)'#010+
'**2Ci_IO-checking'#010+ '**2Ci_IO-checking'#010+
'**2Cn_Omit linking stage'#010+ '**2Cn_Omit linking stage'#010+
'**2Co_Check overflow of integer operations'#010+ '**2Co_Check overflow of integer operations'#010+
'**2CO_Check for possible overflow of integer operations'#010+ '**2CO_Check for possible overflow of integer operations'#010+
'**2Cp<x>_Select instruction set, see fpc -i for possible values'#010+ '**2Cp<x>_Select instruction ','set, see fpc -i for possible values'#010+
'**2CP<x>=<y>_ packing sett','ings'#010+ '**2CP<x>=<y>_ packing settings'#010+
'**3CPPACKSET=<y>_ <y> set allocation: 0, 1 or DEFAULT or NORMAL, 2, 4 '+ '**3CPPACKSET=<y>_ <y> set allocation: 0, 1 or DEFAULT or NORMAL, 2, 4 '+
'and 8'#010+ 'and 8'#010+
'**2Cr_Range checking'#010+ '**2Cr_Range checking'#010+
'**2CR_Verify object method call validity'#010+ '**2CR_Verify object method call validity'#010+
'**2Cs<n>_Set stack checking size to <n>'#010+ '**2Cs<n>_Set stack checking size to',' <n>'#010+
'**2Ct_Stack checking (for testing only, see manual)'#010+ '**2Ct_Stack checking (for testing only, see manual)'#010+
'**2CX','_Create also smartlinked library'#010+ '**2CX_Create also smartlinked library'#010+
'**1d<x>_Defines the symbol <x>'#010+ '**1d<x>_Defines the symbol <x>'#010+
'**1D_Generate a DEF file'#010+ '**1D_Generate a DEF file'#010+
'**2Dd<x>_Set description to <x>'#010+ '**2Dd<x>_Set description to <x>'#010+
'**2Dv<x>_Set DLL version to <x>'#010+ '**2Dv<x>_Set DLL version to <x>'#010+
'*O2Dw_PM application'#010+ '*O2Dw_PM application'#010+
'**1e<x>_Set path to executable'#010+ '**1e','<x>_Set path to executable'#010+
'**1E_Same as -Cn'#010+ '**1E_Same as -Cn'#010+
'**1fPIC_Same as -C','g'#010+ '**1fPIC_Same as -Cg'#010+
'**1F<x>_Set file names and paths:'#010+ '**1F<x>_Set file names and paths:'#010+
'**2Fa<x>[,y]_(for a program) load units <x> and [y] before uses is par'+ '**2Fa<x>[,y]_(for a program) load units <x> and [y] before uses is par'+
'sed'#010+ 'sed'#010+
'**2Fc<x>_Set input codepage to <x>'#010+ '**2Fc<x>_Set input codepage to <x>'#010+
'**2FC<x>_Set RC compiler binary name to <x>'#010+ '**2FC<x>_Set RC compiler binary n','ame to <x>'#010+
'**2Fd_Disable the compiler'#039's internal directory cac','he'#010+ '**2Fd_Disable the compiler'#039's internal directory cache'#010+
'**2FD<x>_Set the directory where to search for compiler utilities'#010+ '**2FD<x>_Set the directory where to search for compiler utilities'#010+
'**2Fe<x>_Redirect error output to <x>'#010+ '**2Fe<x>_Redirect error output to <x>'#010+
'**2Ff<x>_Add <x> to framework path (Darwin only)'#010+ '**2Ff<x>_Add <x> to framework path (Darwin only)'#010+
'**2FE<x>_Set exe/unit output path to <x>'#010+ '**2FE<x>_Set exe/unit ','output path to <x>'#010+
'**2Fi<x>_Add <x> to include path'#010+ '**2Fi<x>_Add <x> to include path'#010+
'**2Fl<x>_A','dd <x> to library path'#010+ '**2Fl<x>_Add <x> to library path'#010+
'**2FL<x>_Use <x> as dynamic linker'#010+ '**2FL<x>_Use <x> as dynamic linker'#010+
'**2Fm<x>_Load unicode conversion table from <x>.txt in the compiler di'+ '**2Fm<x>_Load unicode conversion table from <x>.txt in the compiler di'+
'r'#010+ 'r'#010+
'**2Fo<x>_Add <x> to object path'#010+ '**2Fo<x>_Add <x> to object path'#010+
'**2Fr<x>_Load error message file <x>'#010+ '**2Fr<x>_Load er','ror message file <x>'#010+
'**2FR<x>_Set resource (.res) linker to <x','>'#010+ '**2FR<x>_Set resource (.res) linker to <x>'#010+
'**2Fu<x>_Add <x> to unit path'#010+ '**2Fu<x>_Add <x> to unit path'#010+
'**2FU<x>_Set unit output path to <x>, overrides -FE'#010+ '**2FU<x>_Set unit output path to <x>, overrides -FE'#010+
'**2FW<x>_Store generated whole-program optimization feedback in <x>'#010+ '**2FW<x>_Store generated whole-program optimization feedback in <x>'#010+
'**2Fw<x>_Load previously stored whole-program optimization feedback fr'+ '**2Fw<x>_Load previously s','tored whole-program optimization feedback '+
'om <x>'#010+ 'from <x>'#010+
'*g1g_Genera','te debug information (default format for target)'#010+ '*g1g_Generate debug information (default format for target)'#010+
'*g2gc_Generate checks for pointers'#010+ '*g2gc_Generate checks for pointers'#010+
'*g2gh_Use heaptrace unit (for memory leak/corruption debugging)'#010+ '*g2gh_Use heaptrace unit (for memory leak/corruption debugging)'#010+
'*g2gl_Use line info unit (show more info with backtraces)'#010+ '*g2gl_Use line info unit (show',' more info with backtraces)'#010+
'*g2go<x>_Set debug information opt','ions'#010+ '*g2go<x>_Set debug information options'#010+
'*g3godwarfsets_ Enable DWARF '#039'set'#039' type debug information (bre'+ '*g3godwarfsets_ Enable DWARF '#039'set'#039' type debug information (bre'+
'aks gdb < 6.5)'#010+ 'aks gdb < 6.5)'#010+
'*g3gostabsabsincludes_ Store absolute/full include file paths in Stabs'+ '*g3gostabsabsincludes_ Store absolute/full include file paths in Stabs'+
#010+ #010+
'*g3godwarfmethodclassprefix_ Prefix method names in DWARF with class n'+ '*g3godwarfmethodclasspref','ix_ Prefix method names in DWARF with class'+
'ame'#010+ ' name'#010+
'*g2gp_Preserv','e case in stabs symbol names'#010+ '*g2gp_Preserve case in stabs symbol names'#010+
'*g2gs_Generate Stabs debug information'#010+ '*g2gs_Generate Stabs debug information'#010+
'*g2gt_Trash local variables (to detect uninitialized uses)'#010+ '*g2gt_Trash local variables (to detect uninitialized uses)'#010+
'*g2gv_Generates programs traceable with Valgrind'#010+ '*g2gv_Generates programs traceable with Valgrind'#010+
'*g2gw_Generate DWARFv2 debug information (same as -gw2)'#010+ '*g','2gw_Generate DWARFv2 debug information (same as -gw2)'#010+
'*g2gw2_G','enerate DWARFv2 debug information'#010+ '*g2gw2_Generate DWARFv2 debug information'#010+
'*g2gw3_Generate DWARFv3 debug information'#010+ '*g2gw3_Generate DWARFv3 debug information'#010+
'**1i_Information'#010+ '**1i_Information'#010+
'**2iD_Return compiler date'#010+ '**2iD_Return compiler date'#010+
'**2iV_Return short compiler version'#010+ '**2iV_Return short compiler version'#010+
'**2iW_Return full compiler version'#010+ '**2iW_Return full comp','iler version'#010+
'**2iSO_Return compiler OS'#010+ '**2iSO_Return compiler OS'#010+
'**2iSP_Return compiler ','host processor'#010+ '**2iSP_Return compiler host processor'#010+
'**2iTO_Return target OS'#010+ '**2iTO_Return target OS'#010+
'**2iTP_Return target processor'#010+ '**2iTP_Return target processor'#010+
'**1I<x>_Add <x> to include path'#010+ '**1I<x>_Add <x> to include path'#010+
'**1k<x>_Pass <x> to the linker'#010+ '**1k<x>_Pass <x> to the linker'#010+
'**1l_Write logo'#010+ '**1l_Write logo'#010+
'**1M<x>_Set language mode to <x>'#010+ '**1M<x>_Set language mode to ','<x>'#010+
'**2Mfpc_Free Pascal dialect (default)'#010+ '**2Mfpc_Free Pascal dialect (default)'#010+
'**2Mobjfpc_FPC mode ','with Object Pascal support'#010+ '**2Mobjfpc_FPC mode with Object Pascal support'#010+
'**2Mdelphi_Delphi 7 compatibility mode'#010+ '**2Mdelphi_Delphi 7 compatibility mode'#010+
'**2Mtp_TP/BP 7.0 compatibility mode'#010+ '**2Mtp_TP/BP 7.0 compatibility mode'#010+
'**2Mmacpas_Macintosh Pascal dialects compatibility mode'#010+ '**2Mmacpas_Macintosh Pascal dialects compatibility mode'#010+
'**1n_Do not read the default config files'#010+ '**1n_Do not read the',' default config files'#010+
'**1N<x>_Node tree optimizations'#010+ '**1N<x>_Node tree optimizations'#010+
'**2Nu_Un','roll loops'#010+ '**2Nu_Unroll loops'#010+
'**1o<x>_Change the name of the executable produced to <x>'#010+ '**1o<x>_Change the name of the executable produced to <x>'#010+
'**1O<x>_Optimizations:'#010+ '**1O<x>_Optimizations:'#010+
'**2O-_Disable optimizations'#010+ '**2O-_Disable optimizations'#010+
'**2O1_Level 1 optimizations (quick and debugger friendly)'#010+ '**2O1_Level 1 optimizations (quick and debugger friendly)'#010,
'**2O2_Level 2 optimizations (-O1 + quick optimizations)'#010+ '**2O2_Level 2 optimizations (-O1 + quick optimizations)'#010+
'**2O3_','Level 3 optimizations (-O2 + slow optimizations)'#010+ '**2O3_Level 3 optimizations (-O2 + slow optimizations)'#010+
'**2Oa<x>=<y>_Set alignment'#010+ '**2Oa<x>=<y>_Set alignment'#010+
'**2Oo[NO]<x>_Enable or disable optimizations, see fpc -i for possible '+ '**2Oo[NO]<x>_Enable or disable optimizations, see fpc -i for possible '+
'values'#010+ 'values'#010+
'**2Op<x>_Set target cpu for optimizing, see fpc -i for possible values'+ '**2Op<x>_Set target cpu f','or optimizing, see fpc -i for possible valu'+
#010+ 'es'#010+
'**2OW<x>_Generat','e whole-program optimization feedback for optimizati'+ '**2OW<x>_Generate whole-program optimization feedback for optimization'+
'on <x>, see fpc -i for possible values'#010+ ' <x>, see fpc -i for possible values'#010+
'**2Ow<x>_Perform whole-program optimization <x>, see fpc -i for possib'+ '**2Ow<x>_Perform whole-program optimization <x>, see fpc -i for possib'+
'le values'#010+ 'le values'#010+
'**2Os_Optimize for size rather than speed'#010+ '**2Os_O','ptimize for size rather than speed'#010+
'**1pg_Generate profile code',' for gprof (defines FPC_PROFILE)'#010+ '**1pg_Generate profile code for gprof (defines FPC_PROFILE)'#010+
'**1R<x>_Assembler reading style:'#010+ '**1R<x>_Assembler reading style:'#010+
'**2Rdefault_Use default assembler for target'#010+ '**2Rdefault_Use default assembler for target'#010+
'3*2Ratt_Read AT&T style assembler'#010+ '3*2Ratt_Read AT&T style assembler'#010+
'3*2Rintel_Read Intel style assembler'#010+ '3*2Rintel_Read Intel style assemb','ler'#010+
'6*2RMOT_Read motorola style assembler'#010+ '6*2RMOT_Read motorola style assembler'#010+
'**1S<x>_Syntax optio','ns:'#010+ '**1S<x>_Syntax options:'#010+
'**2S2_Same as -Mobjfpc'#010+ '**2S2_Same as -Mobjfpc'#010+
'**2Sc_Support operators like C (*=,+=,/= and -=)'#010+ '**2Sc_Support operators like C (*=,+=,/= and -=)'#010+
'**2Sa_Turn on assertions'#010+ '**2Sa_Turn on assertions'#010+
'**2Sd_Same as -Mdelphi'#010+ '**2Sd_Same as -Mdelphi'#010+
'**2Se<x>_Error options. <x> is a combination of the following:'#010+ '**2Se<x>_Error options. <x> is a combination of the fo','llowing:'#010+
'**3*_<n> : Compiler halts after the <n> errors (defau','lt is 1)'#010+ '**3*_<n> : Compiler halts after the <n> errors (default is 1)'#010+
'**3*_w : Compiler also halts after warnings'#010+ '**3*_w : Compiler also halts after warnings'#010+
'**3*_n : Compiler also halts after notes'#010+ '**3*_n : Compiler also halts after notes'#010+
'**3*_h : Compiler also halts after hints'#010+ '**3*_h : Compiler also halts after hints'#010+
'**2Sg_Enable LABEL and GOTO (default in -Mtp and -Mdelphi)'#010+ '**2Sg_Enable LABEL and GOTO (default in -Mt','p and -Mdelphi)'#010+
'**2Sh_Use ansistrings by default instead of sh','ortstrings'#010+ '**2Sh_Use ansistrings by default instead of shortstrings'#010+
'**2Si_Turn on inlining of procedures/functions declared as "inline"'#010+ '**2Si_Turn on inlining of procedures/functions declared as "inline"'#010+
'**2Sk_Load fpcylix unit'#010+ '**2Sk_Load fpcylix unit'#010+
'**2SI<x>_Set interface style to <x>'#010+ '**2SI<x>_Set interface style to <x>'#010+
'**3SIcom_COM compatible interface (default)'#010+ '**3SIcom_COM compatible interface (defa','ult)'#010+
'**3SIcorba_CORBA compatible interface'#010+ '**3SIcorba_CORBA compatible interface'#010+
'**2Sm_Support macro','s like C (global)'#010+ '**2Sm_Support macros like C (global)'#010+
'**2So_Same as -Mtp'#010+ '**2So_Same as -Mtp'#010+
'**2Ss_Constructor name must be init (destructor must be done)'#010+ '**2Ss_Constructor name must be init (destructor must be done)'#010+
'**2Sx_Enable exception keywords (default in Delphi/ObjFPC modes)'#010+ '**2Sx_Enable exception keywords (default in Delphi/ObjFPC modes)'#010+
'**1s_Do not call assembler and linker'#010+ '**1s_Do not ca','ll assembler and linker'#010+
'**2sh_Generate script to link on host'#010, '**2sh_Generate script to link on host'#010+
'**2st_Generate script to link on target'#010+ '**2st_Generate script to link on target'#010+
'**2sr_Skip register allocation phase (use with -alr)'#010+ '**2sr_Skip register allocation phase (use with -alr)'#010+
'**1T<x>_Target operating system:'#010+ '**1T<x>_Target operating system:'#010+
'3*2Temx_OS/2 via EMX (including EMX/RSX extender)'#010+ '3*2Temx_OS/2 via EMX (including EMX/RSX extender)'#010+
'3*2Tfreebsd_FreeBSD'#010+ '3*','2Tfreebsd_FreeBSD'#010+
'3*2Tgo32v2_Version 2 of DJ Delorie DOS exten','der'#010+ '3*2Tgo32v2_Version 2 of DJ Delorie DOS extender'#010+
'3*2Tlinux_Linux'#010+ '3*2Tlinux_Linux'#010+
'3*2Tnetbsd_NetBSD'#010+ '3*2Tnetbsd_NetBSD'#010+
'3*2Tnetware_Novell Netware Module (clib)'#010+ '3*2Tnetware_Novell Netware Module (clib)'#010+
'3*2Tnetwlibc_Novell Netware Module (libc)'#010+ '3*2Tnetwlibc_Novell Netware Module (libc)'#010+
'3*2Topenbsd_OpenBSD'#010+ '3*2Topenbsd_OpenBSD'#010+
'3*2Tos2_OS/2 / eComStation'#010+ '3*2Tos2_OS/2 / eComStation'#010+
'3*2Tsunos_SunOS/Solaris'#010+ '3*2Tsunos_','SunOS/Solaris'#010+
'3*2Tsymbian_Symbian OS'#010+ '3*2Tsymbian_Symbian OS'#010+
'3*2Twatcom_Watcom compati','ble DOS extender'#010+ '3*2Twatcom_Watcom compatible DOS extender'#010+
'3*2Twdosx_WDOSX DOS extender'#010+ '3*2Twdosx_WDOSX DOS extender'#010+
'3*2Twin32_Windows 32 Bit'#010+ '3*2Twin32_Windows 32 Bit'#010+
'3*2Twince_Windows CE'#010+ '3*2Twince_Windows CE'#010+
'4*2Tlinux_Linux'#010+ '4*2Tlinux_Linux'#010+
'6*2Tamiga_Commodore Amiga'#010+ '6*2Tamiga_Commodore Amiga'#010+
'6*2Tatari_Atari ST/STe/TT'#010+ '6*2Tatari_Atari ST/STe/TT'#010+
'6*2Tlinux_Linux/m68k'#010+ '6*2Tlinux_Linux/m6','8k'#010+
'6*2Tmacos_Macintosh m68k (not supported)'#010+ '6*2Tmacos_Macintosh m68k (not supported)'#010+
'6*2Tpalmos_PalmOS'#010, '6*2Tpalmos_PalmOS'#010+
'A*2Tlinux_Linux'#010+ 'A*2Tlinux_Linux'#010+
'A*2Twince_Windows CE'#010+ 'A*2Twince_Windows CE'#010+
'P*2Tamiga_AmigaOS on PowerPC'#010+ 'P*2Tamiga_AmigaOS on PowerPC'#010+
'P*2Tdarwin_Darwin and Mac OS X on PowerPC'#010+ 'P*2Tdarwin_Darwin and Mac OS X on PowerPC'#010+
'P*2Tlinux_Linux on PowerPC'#010+ 'P*2Tlinux_Linux on PowerPC'#010+
'P*2Tmacos_Mac OS (classic) on PowerPC'#010+ 'P*2Tmacos_Mac OS (classic) on PowerPC'#010+
'P*2Tmorphos_MorphOS'#010+ 'P*2Tm','orphos_MorphOS'#010+
'S*2Tlinux_Linux'#010+ 'S*2Tlinux_Linux'#010+
'**1u<x>_Undefines the symbol <x','>'#010+ '**1u<x>_Undefines the symbol <x>'#010+
'**1U_Unit options:'#010+ '**1U_Unit options:'#010+
'**2Un_Do not check where the unit name matches the file name'#010+ '**2Un_Do not check where the unit name matches the file name'#010+
'**2Ur_Generate release unit files (never automatically recompiled)'#010+ '**2Ur_Generate release unit files (never automatically recompiled)'#010+
'**2Us_Compile a system unit'#010+ '**2Us_Compile a system unit'#010+
'**1v<x>_Be verbose. <x> is a combination of the following lette','rs:'#010+ '*','*1v<x>_Be verbose. <x> is a combination of the following letters:'#010+
'**2*_e : Show errors (default) 0 : Show nothing (except errors)'#010+ '**2*_e : Show errors (default) 0 : Show nothing (except errors)'#010+
'**2*_w : Show warnings u : Show unit info'#010+ '**2*_w : Show warnings u : Show unit info'#010+
'**2*_n : Show notes t : Show tried/used files'#010+ '**2*_n : Show notes t : Show tr','ied/used files'#010+
'**2*_h : Show hints c : Show c','onditionals'#010+ '**2*_h : Show hints c : Show conditionals'#010+
'**2*_i : Show general info d : Show debug info'#010+ '**2*_i : Show general info d : Show debug info'#010+
'**2*_l : Show linenumbers r : Rhide/GCC compatibility mode'#010+ '**2*_l : Show linenumbers r : Rhide/GCC compatibility mode'#010+
'**2*_s : Show time stamps q : Show message numbers'#010+ '**2*_s : Show time stamps q ',': Show message numbers'#010+
'**2*_a : Show everything x ',': Executable info (Win32 only'+ '**2*_a : Show everything x : Executable info (Win32 only)'#010+
')'#010+
'**2*_b : Write file names messages p : Write tree.log with parse tre'+ '**2*_b : Write file names messages p : Write tree.log with parse tre'+
'e'#010+ 'e'#010+
'**2*_ with full path v : Write fpcdebug.txt with'#010+ '**2*_ with full path v : Write fpcdebug.txt with'#010+
'**2*_ lots of debugging info'#010+ '**2*_ ',' lots of debugging info'#010+
'**2*_m<x','>,<y> : Don'#039't show messages numbered <x> and <y>'#010+ '**2*_m<x>,<y> : Don'#039't show messages numbered <x> and <y>'#010+
'3*1W<x>_Target-specific options (targets)'#010+ '3*1W<x>_Target-specific options (targets)'#010+
'A*1W<x>_Target-specific options (targets)'#010+ 'A*1W<x>_Target-specific options (targets)'#010+
'P*1W<x>_Target-specific options (targets)'#010+ 'P*1W<x>_Target-specific options (targets)'#010+
'p*1W<x>_Target-specific options (targets)'#010+ 'p*1','W<x>_Target-specific options (targets)'#010+
'3*2Wb_Create a bundle i','nstead of a library (Darwin)'#010+ '3*2Wb_Create a bundle instead of a library (Darwin)'#010+
'P*2Wb_Create a bundle instead of a library (Darwin)'#010+ 'P*2Wb_Create a bundle instead of a library (Darwin)'#010+
'p*2Wb_Create a bundle instead of a library (Darwin)'#010+ 'p*2Wb_Create a bundle instead of a library (Darwin)'#010+
'3*2WB_Create a relocatable image (Windows)'#010+ '3*2WB_Create a relocatable image (Windows)'#010+
'A*2WB_Create a relocatable image (Windows, Symbian)'#010+ 'A*','2WB_Create a relocatable image (Windows, Symbian)'#010+
'3*2WC_Specif','y console type application (EMX, OS/2, Windows)'#010+ '3*2WC_Specify console type application (EMX, OS/2, Windows)'#010+
'A*2WC_Specify console type application (Windows)'#010+ 'A*2WC_Specify console type application (Windows)'#010+
'P*2WC_Specify console type application (Classic Mac OS)'#010+ 'P*2WC_Specify console type application (Classic Mac OS)'#010+
'3*2WD_Use DEFFILE to export functions of DLL or EXE (Windows)'#010+ '3*2WD_Use DEFFILE to expo','rt functions of DLL or EXE (Windows)'#010+
'A*2WD_Use DEFFILE to expo','rt functions of DLL or EXE (Windows)'#010+ 'A*2WD_Use DEFFILE to export functions of DLL or EXE (Windows)'#010+
'3*2We_Use external resources (Darwin)'#010+ '3*2We_Use external resources (Darwin)'#010+
'P*2We_Use external resources (Darwin)'#010+ 'P*2We_Use external resources (Darwin)'#010+
'p*2We_Use external resources (Darwin)'#010+ 'p*2We_Use external resources (Darwin)'#010+
'3*2WF_Specify full-screen type application (EMX, OS/2)'#010+ '3*2WF_Specify full-screen t','ype application (EMX, OS/2)'#010+
'3*2WG_Specify graphic type applica','tion (EMX, OS/2, Windows)'#010+ '3*2WG_Specify graphic type application (EMX, OS/2, Windows)'#010+
'A*2WG_Specify graphic type application (Windows)'#010+ 'A*2WG_Specify graphic type application (Windows)'#010+
'P*2WG_Specify graphic type application (Classic Mac OS)'#010+ 'P*2WG_Specify graphic type application (Classic Mac OS)'#010+
'3*2Wi_Use internal resources (Darwin)'#010+ '3*2Wi_Use internal resources (Darwin)'#010+
'P*2Wi_Use internal resources (Darwin)'#010+ 'P*2Wi_Use',' internal resources (Darwin)'#010+
'p*2Wi_Use internal resources (Dar','win)'#010+ 'p*2Wi_Use internal resources (Darwin)'#010+
'3*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+ '3*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+
'A*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+ 'A*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+
'3*2WR_Generate relocation code (Windows)'#010+ '3*2WR_Generate relocation code (W','indows)'#010+
'A*2WR_Generate relocation code (Windows)'#010+ 'A*2WR_Generate relocation code (Windows)'#010+
'P*2WT_Specify',' MPW tool type application (Classic Mac OS)'#010+ 'P*2WT_Specify MPW tool type application (Classic Mac OS)'#010+
'3*2WX_Enable executable stack (Linux)'#010+ '3*2WX_Enable executable stack (Linux)'#010+
'A*2WX_Enable executable stack (Linux)'#010+ 'A*2WX_Enable executable stack (Linux)'#010+
'p*2WX_Enable executable stack (Linux)'#010+ 'p*2WX_Enable executable stack (Linux)'#010+
'P*2WX_Enable executable stack (Linux)'#010+ 'P*2WX_Enable executa','ble stack (Linux)'#010+
'**1X_Executable options:'#010+ '**1X_Executable options:'#010+
'**2Xc_Pass --shared','/-dynamic to the linker (BeOS, Darwin, FreeBSD, L'+ '**2Xc_Pass --shared/-dynamic to the linker (BeOS, Darwin, FreeBSD, Lin'+
'inux)'#010+ 'ux)'#010+
'**2Xd_Do not use standard library search path (needed for cross compil'+ '**2Xd_Do not use standard library search path (needed for cross compil'+
'e)'#010+ 'e)'#010+
'**2Xe_Use external linker'#010+ '**2Xe_Use external linker'#010+
'**2Xg_Create debuginfo in a separate file and add a debuglink section '+ '**2Xg_Create debuginfo i','n a separate file and add a debuglink sectio'+
'to executable'#010+ 'n to executable'#010+
'**','2XD_Try to link units dynamically (defines FPC_LINK_DYNAMIC)'#010+ '**2XD_Try to link units dynamically (defines FPC_LINK_DYNAMIC)'#010+
'**2Xi_Use internal linker'#010+ '**2Xi_Use internal linker'#010+
'**2Xm_Generate link map'#010+ '**2Xm_Generate link map'#010+
'**2XM<x>_Set the name of the '#039'main'#039' program routine (default i'+ '**2XM<x>_Set the name of the '#039'main'#039' program routine (default i',
's '#039'main'#039')'#010+ 's '#039'main'#039')'#010+
'**2XP<x>_Prepend the binutils names with the prefix ','<x>'#010+ '**2XP<x>_Prepend the binutils names with the prefix <x>'#010+
'**2Xr<x>_Set the linker'#039's rlink-path to <x> (needed for cross comp'+ '**2Xr<x>_Set the linker'#039's rlink-path to <x> (needed for cross comp'+
'ile, see the ld manual for more information) (BeOS, Linux)'#010+ 'ile, see the ld manual for more information) (BeOS, Linux)'#010+
'**2XR<x>_Prepend <x> to all linker search paths (BeOS, Darwin, FreeBSD'+ '**2XR<x>_Prepend <x> to all linker search paths (','BeOS, Darwin, FreeB'+
', Linux, Mac OS, Solaris)'#010+ 'SD, Linux, Mac OS, Solaris)'#010+
'**2Xs_Strip all',' symbols from executable'#010+ '**2Xs_Strip all symbols from executable'#010+
'**2XS_Try to link units statically (default, defines FPC_LINK_STATIC)'#010+ '**2XS_Try to link units statically (default, defines FPC_LINK_STATIC)'#010+
'**2Xt_Link with static libraries (-static is passed to linker)'#010+ '**2Xt_Link with static libraries (-static is passed to linker)'#010+
'**2XX_Try to smartlink units (defines FPC_LINK_SMART)'#010+ '**2XX_Try to smartli','nk units (defines FPC_LINK_SMART)'#010+
'**1*_'#010+ '**1*_'#010+
'**1?_Show ','this help'#010+ '**1?_Show this help'#010+
'**1h_Shows this help without waiting' '**1h_Shows this help without waiting'
); );

View File

@ -74,7 +74,9 @@ interface
{ No relocation is needed. It is used in ARM object files. { No relocation is needed. It is used in ARM object files.
Also internal linker use this reloc to make virtual (not real) Also internal linker use this reloc to make virtual (not real)
links to some sections } links to some sections }
RELOC_NONE RELOC_NONE,
{ Darwin relocation, using PAIR }
RELOC_PIC_PAIR
); );
{$ifndef x86_64} {$ifndef x86_64}
@ -143,6 +145,10 @@ interface
size : aword; size : aword;
{ Used for external and common solving during linking } { Used for external and common solving during linking }
exesymbol : TExeSymbol; exesymbol : TExeSymbol;
{ Darwin asm is using indirect symbols resolving }
indsymbol : TObjSymbol;
constructor create(AList:TFPHashObjectList;const AName:string); constructor create(AList:TFPHashObjectList;const AName:string);
function address:aword; function address:aword;
procedure SetAddress(apass:byte;aobjsec:TObjSection;abind:TAsmsymbind;atyp:Tasmsymtype); procedure SetAddress(apass:byte;aobjsec:TObjSection;abind:TAsmsymbind;atyp:Tasmsymtype);
@ -536,7 +542,7 @@ implementation
internalerror(200603016); internalerror(200603016);
if not assigned(aobjsec) then if not assigned(aobjsec) then
internalerror(200603017); internalerror(200603017);
if (bind=AB_EXTERNAL) then if (bind in [AB_EXTERNAL,AB_LAZY]) then
begin begin
bind:=abind; bind:=abind;
typ:=atyp; typ:=atyp;

1223
compiler/ogmacho.pas Normal file

File diff suppressed because it is too large Load Diff

View File

@ -173,6 +173,7 @@ interface
,as_m68k_mit ,as_m68k_mit
,as_powerpc_mpw ,as_powerpc_mpw
,as_darwin ,as_darwin
,as_i386_macho
,as_x86_64_masm ,as_x86_64_masm
,as_x86_64_pecoff ,as_x86_64_pecoff
,as_i386_pecoffwince ,as_i386_pecoffwince

View File

@ -1969,6 +1969,7 @@ implementation
rfield, rfield,
data,s,opidx : longint; data,s,opidx : longint;
ea_data : ea; ea_data : ea;
relsym : TObjSymbol;
begin begin
{ safety check } { safety check }
if objdata.currobjsec.size<>longword(insoffset) then if objdata.currobjsec.size<>longword(insoffset) then
@ -2303,6 +2304,14 @@ implementation
else else
{$endif x86_64} {$endif x86_64}
currabsreloc:=RELOC_ABSOLUTE32; currabsreloc:=RELOC_ABSOLUTE32;
if (currabsreloc=RELOC_ABSOLUTE32) and
(Assigned(oper[opidx]^.ref^.relsymbol)) then
begin
relsym:=objdata.symbolref(oper[opidx]^.ref^.relsymbol);
currabsreloc:=RELOC_PIC_PAIR;
currval:=relsym.offset;
end;
objdata.writereloc(currval,ea_data.bytes,currsym,currabsreloc); objdata.writereloc(currval,ea_data.bytes,currsym,currabsreloc);
inc(s,ea_data.bytes); inc(s,ea_data.bytes);
end; end;