mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-19 13:59:29 +02:00
* store a pointer to the used tasminfo record in every assembler writer, so
that we can use assembler writers with different conventions from the currently set target_asm (e.g. an x86 assembler writer for inline assembly in LLVM IR) git-svn-id: trunk@31628 -
This commit is contained in:
parent
4bb82b0a3f
commit
991e1f49bd
@ -29,7 +29,7 @@ unit agcpugas;
|
||||
interface
|
||||
|
||||
uses
|
||||
globtype,
|
||||
globtype,systems,
|
||||
aasmtai,
|
||||
aggas,
|
||||
cpubase,cpuinfo;
|
||||
@ -40,11 +40,11 @@ unit agcpugas;
|
||||
end;
|
||||
|
||||
TAArch64Assembler=class(TGNUassembler)
|
||||
constructor create(smart: boolean); override;
|
||||
constructor create(info: pasminfo; smart: boolean); override;
|
||||
end;
|
||||
|
||||
TAArch64AppleAssembler=class(TAppleGNUassembler)
|
||||
constructor create(smart: boolean); override;
|
||||
constructor create(info: pasminfo; smart: boolean); override;
|
||||
function MakeCmdLine: TCmdStr; override;
|
||||
end;
|
||||
|
||||
@ -65,7 +65,6 @@ unit agcpugas;
|
||||
|
||||
uses
|
||||
cutils,globals,verbose,
|
||||
systems,
|
||||
assemble,
|
||||
aasmcpu,
|
||||
itcpugas,
|
||||
@ -76,9 +75,9 @@ unit agcpugas;
|
||||
{ AArch64 Assembler writer }
|
||||
{****************************************************************************}
|
||||
|
||||
constructor TAArch64Assembler.create(smart: boolean);
|
||||
constructor TAArch64Assembler.create(info: pasminfo; smart: boolean);
|
||||
begin
|
||||
inherited create(smart);
|
||||
inherited;
|
||||
InstrWriter := TAArch64InstrWriter.create(self);
|
||||
end;
|
||||
|
||||
@ -86,9 +85,9 @@ unit agcpugas;
|
||||
{ Apple AArch64 Assembler writer }
|
||||
{****************************************************************************}
|
||||
|
||||
constructor TAArch64AppleAssembler.create(smart: boolean);
|
||||
constructor TAArch64AppleAssembler.create(info: pasminfo; smart: boolean);
|
||||
begin
|
||||
inherited create(smart);
|
||||
inherited;
|
||||
InstrWriter := TAArch64InstrWriter.create(self);
|
||||
end;
|
||||
|
||||
@ -109,7 +108,7 @@ unit agcpugas;
|
||||
{ Helper routines for Instruction Writer }
|
||||
{****************************************************************************}
|
||||
|
||||
function getreferencestring(var ref : treference) : string;
|
||||
function getreferencestring(asminfo: pasminfo; var ref : treference) : string;
|
||||
const
|
||||
darwin_addrpage2str: array[addr_page..addr_gotpageoffset] of string[11] =
|
||||
('@PAGE','@PAGEOFF','@GOTPAGE','@GOTPAGEOFF');
|
||||
@ -130,7 +129,7 @@ unit agcpugas;
|
||||
(ref.shiftmode<>SM_None) or
|
||||
(ref.offset<>0) then
|
||||
internalerror(2014121501);
|
||||
if target_asm.id=as_darwin then
|
||||
if asminfo^.id=as_darwin then
|
||||
result:=ref.symbol.name+darwin_addrpage2str[ref.refaddr]
|
||||
else
|
||||
result:=linux_addrpage2str[ref.refaddr]+ref.symbol.name
|
||||
@ -172,7 +171,7 @@ unit agcpugas;
|
||||
addr_gotpageoffset,
|
||||
addr_pageoffset:
|
||||
begin
|
||||
if target_asm.id=as_darwin then
|
||||
if asminfo^.id=as_darwin then
|
||||
result:=result+', '+ref.symbol.name+darwin_addrpage2str[ref.refaddr]
|
||||
else
|
||||
result:=result+', '+linux_addrpage2str[ref.refaddr]+ref.symbol.name
|
||||
@ -200,7 +199,7 @@ unit agcpugas;
|
||||
end;
|
||||
|
||||
|
||||
function getopstr(hp: taicpu; opnr: longint; const o: toper): string;
|
||||
function getopstr(asminfo: pasminfo; hp: taicpu; opnr: longint; const o: toper): string;
|
||||
begin
|
||||
case o.typ of
|
||||
top_reg:
|
||||
@ -248,7 +247,7 @@ unit agcpugas;
|
||||
getopstr:=o.ref^.symbol.name;
|
||||
end
|
||||
else
|
||||
getopstr:=getreferencestring(o.ref^);
|
||||
getopstr:=getreferencestring(asminfo,o.ref^);
|
||||
else
|
||||
internalerror(2014121507);
|
||||
end;
|
||||
@ -274,7 +273,7 @@ unit agcpugas;
|
||||
// debug code
|
||||
// writeln(s);
|
||||
// writeln(taicpu(hp).fileinfo.line);
|
||||
s:=s+sep+getopstr(taicpu(hp),i,taicpu(hp).oper[i]^);
|
||||
s:=s+sep+getopstr(owner.asminfo,taicpu(hp),i,taicpu(hp).oper[i]^);
|
||||
sep:=',';
|
||||
end;
|
||||
end;
|
||||
|
@ -175,7 +175,7 @@ implementation
|
||||
function TGNUAssembler.NextSetLabel: string;
|
||||
begin
|
||||
inc(setcount);
|
||||
result := target_asm.labelprefix+'$set$'+tostr(setcount);
|
||||
result := asminfo^.labelprefix+'$set$'+tostr(setcount);
|
||||
end;
|
||||
|
||||
function is_smart_section(atype:TAsmSectiontype):boolean;
|
||||
@ -636,7 +636,7 @@ implementation
|
||||
begin
|
||||
if not assigned(p) then
|
||||
exit;
|
||||
replaceforbidden:=target_asm.dollarsign<>'$';
|
||||
replaceforbidden:=asminfo^.dollarsign<>'$';
|
||||
|
||||
last_align := 2;
|
||||
InlineLevel:=0;
|
||||
@ -661,7 +661,7 @@ implementation
|
||||
|
||||
ait_comment :
|
||||
Begin
|
||||
writer.AsmWrite(target_asm.comment);
|
||||
writer.AsmWrite(asminfo^.comment);
|
||||
writer.AsmWritePChar(tai_comment(hp).str);
|
||||
writer.AsmLn;
|
||||
End;
|
||||
@ -670,7 +670,7 @@ implementation
|
||||
begin
|
||||
if (cs_asm_regalloc in current_settings.globalswitches) then
|
||||
begin
|
||||
writer.AsmWrite(#9+target_asm.comment+'Register ');
|
||||
writer.AsmWrite(#9+asminfo^.comment+'Register ');
|
||||
repeat
|
||||
writer.AsmWrite(std_regname(Tai_regalloc(hp).reg));
|
||||
if (hp.next=nil) or
|
||||
@ -706,7 +706,7 @@ implementation
|
||||
else
|
||||
begin
|
||||
{$ifdef EXTDEBUG}
|
||||
writer.AsmWrite(target_asm.comment);
|
||||
writer.AsmWrite(asminfo^.comment);
|
||||
writer.AsmWriteln(' sec_none');
|
||||
{$endif EXTDEBUG}
|
||||
end;
|
||||
@ -1212,7 +1212,7 @@ implementation
|
||||
begin
|
||||
if tf_needs_symbol_size in target_info.flags then
|
||||
begin
|
||||
s:=target_asm.labelprefix+'e'+tostr(symendcount);
|
||||
s:=asminfo^.labelprefix+'e'+tostr(symendcount);
|
||||
inc(symendcount);
|
||||
writer.AsmWriteLn(s+':');
|
||||
writer.AsmWrite(#9'.size'#9);
|
||||
@ -1558,9 +1558,9 @@ implementation
|
||||
begin
|
||||
if not (current_asmdata.asmlists[hal].empty) then
|
||||
begin
|
||||
writer.AsmWriteLn(target_asm.comment+'Begin asmlist '+AsmlistTypeStr[hal]);
|
||||
writer.AsmWriteLn(asminfo^.comment+'Begin asmlist '+AsmlistTypeStr[hal]);
|
||||
writetree(current_asmdata.asmlists[hal]);
|
||||
writer.AsmWriteLn(target_asm.comment+'End asmlist '+AsmlistTypeStr[hal]);
|
||||
writer.AsmWriteLn(asminfo^.comment+'End asmlist '+AsmlistTypeStr[hal]);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
@ -29,14 +29,14 @@ unit agarmgas;
|
||||
interface
|
||||
|
||||
uses
|
||||
globtype,
|
||||
globtype,systems,
|
||||
aasmtai,
|
||||
aggas,
|
||||
cpubase,cpuinfo;
|
||||
|
||||
type
|
||||
TARMGNUAssembler=class(TGNUassembler)
|
||||
constructor create(smart: boolean); override;
|
||||
constructor create(info: pasminfo; smart: boolean); override;
|
||||
function MakeCmdLine: TCmdStr; override;
|
||||
procedure WriteExtraHeader; override;
|
||||
end;
|
||||
@ -46,7 +46,7 @@ unit agarmgas;
|
||||
end;
|
||||
|
||||
TArmAppleGNUAssembler=class(TAppleGNUassembler)
|
||||
constructor create(smart: boolean); override;
|
||||
constructor create(info: pasminfo; smart: boolean); override;
|
||||
end;
|
||||
|
||||
|
||||
@ -79,7 +79,6 @@ unit agarmgas;
|
||||
|
||||
uses
|
||||
cutils,globals,verbose,
|
||||
systems,
|
||||
assemble,
|
||||
aasmcpu,
|
||||
itcpugas,
|
||||
@ -89,9 +88,9 @@ unit agarmgas;
|
||||
{ GNU Arm Assembler writer }
|
||||
{****************************************************************************}
|
||||
|
||||
constructor TArmGNUAssembler.create(smart: boolean);
|
||||
constructor TArmGNUAssembler.create(info: pasminfo; smart: boolean);
|
||||
begin
|
||||
inherited create(smart);
|
||||
inherited;
|
||||
InstrWriter := TArmInstrWriter.create(self);
|
||||
end;
|
||||
|
||||
@ -135,9 +134,9 @@ unit agarmgas;
|
||||
{ GNU/Apple ARM Assembler writer }
|
||||
{****************************************************************************}
|
||||
|
||||
constructor TArmAppleGNUAssembler.create(smart: boolean);
|
||||
constructor TArmAppleGNUAssembler.create(info: pasminfo; smart: boolean);
|
||||
begin
|
||||
inherited create(smart);
|
||||
inherited;
|
||||
InstrWriter := TArmInstrWriter.create(self);
|
||||
end;
|
||||
|
||||
|
@ -44,6 +44,8 @@ interface
|
||||
type
|
||||
TAssembler=class(TObject)
|
||||
public
|
||||
{assembler info}
|
||||
asminfo : pasminfo;
|
||||
{filenames}
|
||||
path : TPathStr;
|
||||
name : string;
|
||||
@ -54,7 +56,7 @@ interface
|
||||
SmartAsm : boolean;
|
||||
SmartFilesCount,
|
||||
SmartHeaderCount : longint;
|
||||
Constructor Create(smart:boolean);virtual;
|
||||
Constructor Create(info: pasminfo; smart:boolean);virtual;
|
||||
Destructor Destroy;override;
|
||||
procedure NextSmartName(place:tcutplace);
|
||||
procedure MakeObject;virtual;abstract;
|
||||
@ -183,8 +185,8 @@ interface
|
||||
{# Constructs the command line for calling the assembler }
|
||||
function MakeCmdLine: TCmdStr; virtual;
|
||||
public
|
||||
Constructor Create(smart:boolean);override;
|
||||
Constructor CreateWithWriter(wr: TExternalAssemblerOutputFile; freewriter, smart: boolean);
|
||||
Constructor Create(info: pasminfo; smart: boolean);override;
|
||||
Constructor CreateWithWriter(info: pasminfo; wr: TExternalAssemblerOutputFile; freewriter, smart: boolean);
|
||||
procedure MakeObject;override;
|
||||
destructor Destroy; override;
|
||||
|
||||
@ -218,7 +220,7 @@ interface
|
||||
property CObjOutput:TObjOutputclass read FCObjOutput write FCObjOutput;
|
||||
property CInternalAr : TObjectWriterClass read FCInternalAr write FCInternalAr;
|
||||
public
|
||||
constructor create(smart:boolean);override;
|
||||
constructor Create(info: pasminfo; smart: boolean);override;
|
||||
destructor destroy;override;
|
||||
procedure MakeObject;override;
|
||||
end;
|
||||
@ -274,8 +276,9 @@ Implementation
|
||||
TAssembler
|
||||
*****************************************************************************}
|
||||
|
||||
Constructor TAssembler.Create(smart:boolean);
|
||||
Constructor TAssembler.Create(info: pasminfo; smart: boolean);
|
||||
begin
|
||||
asminfo:=info;
|
||||
{ load start values }
|
||||
AsmFileName:=current_module.AsmFilename;
|
||||
ObjFileName:=current_module.ObjFileName;
|
||||
@ -724,13 +727,13 @@ Implementation
|
||||
begin
|
||||
DoPipe:=(cs_asm_pipe in current_settings.globalswitches) and
|
||||
(([cs_asm_extern,cs_asm_leave,cs_link_on_target] * current_settings.globalswitches) = []) and
|
||||
((target_asm.id in [as_gas,as_ggas,as_darwin,as_powerpc_xcoff]));
|
||||
((asminfo^.id in [as_gas,as_ggas,as_darwin,as_powerpc_xcoff]));
|
||||
end;
|
||||
|
||||
|
||||
Constructor TExternalAssembler.Create(smart:boolean);
|
||||
Constructor TExternalAssembler.Create(info: pasminfo; smart: boolean);
|
||||
begin
|
||||
inherited create(smart);
|
||||
inherited;
|
||||
if not assigned(fwriter) then
|
||||
begin
|
||||
fwriter:=TExternalAssemblerOutputFile.Create(self);
|
||||
@ -744,11 +747,11 @@ Implementation
|
||||
end;
|
||||
|
||||
|
||||
constructor TExternalAssembler.CreateWithWriter(wr: TExternalAssemblerOutputFile; freewriter,smart: boolean);
|
||||
constructor TExternalAssembler.CreateWithWriter(info: pasminfo; wr: TExternalAssemblerOutputFile; freewriter,smart: boolean);
|
||||
begin
|
||||
fwriter:=wr;
|
||||
ffreewriter:=freewriter;
|
||||
Create(smart);
|
||||
Create(info,smart);
|
||||
end;
|
||||
|
||||
|
||||
@ -802,14 +805,14 @@ Implementation
|
||||
if cs_link_on_target in current_settings.globalswitches then
|
||||
begin
|
||||
{ If linking on target, don't add any path PM }
|
||||
FindAssembler:=utilsprefix+ChangeFileExt(target_asm.asmbin,target_info.exeext);
|
||||
FindAssembler:=utilsprefix+ChangeFileExt(asminfo^.asmbin,target_info.exeext);
|
||||
exit;
|
||||
end
|
||||
else
|
||||
UtilExe:=utilsprefix+ChangeFileExt(target_asm.asmbin,source_info.exeext);
|
||||
if lastas<>ord(target_asm.id) then
|
||||
UtilExe:=utilsprefix+ChangeFileExt(asminfo^.asmbin,source_info.exeext);
|
||||
if lastas<>ord(asminfo^.id) then
|
||||
begin
|
||||
lastas:=ord(target_asm.id);
|
||||
lastas:=ord(asminfo^.id);
|
||||
{ is an assembler passed ? }
|
||||
if utilsdirectory<>'' then
|
||||
asfound:=FindFile(UtilExe,utilsdirectory,false,LastASBin);
|
||||
@ -886,7 +889,7 @@ Implementation
|
||||
|
||||
function TExternalAssembler.MakeCmdLine: TCmdStr;
|
||||
begin
|
||||
result:=target_asm.asmcmd;
|
||||
result:=asminfo^.asmcmd;
|
||||
{$ifdef arm}
|
||||
if (target_info.system=system_arm_darwin) then
|
||||
Replace(result,'$ARCH',lower(cputypestr[current_settings.cputype]));
|
||||
@ -955,7 +958,7 @@ Implementation
|
||||
begin
|
||||
if (infile<>lastinfile) then
|
||||
begin
|
||||
writer.AsmWriteLn(target_asm.comment+'['+infile.name+']');
|
||||
writer.AsmWriteLn(asminfo^.comment+'['+infile.name+']');
|
||||
if assigned(lastinfile) then
|
||||
lastinfile.close;
|
||||
end;
|
||||
@ -964,7 +967,7 @@ Implementation
|
||||
begin
|
||||
if (hp.fileinfo.line<>0) and
|
||||
(infile.linebuf^[hp.fileinfo.line]>=0) then
|
||||
writer.AsmWriteLn(target_asm.comment+'['+tostr(hp.fileinfo.line)+'] '+
|
||||
writer.AsmWriteLn(asminfo^.comment+'['+tostr(hp.fileinfo.line)+'] '+
|
||||
fixline(infile.GetLineStr(hp.fileinfo.line)));
|
||||
{ set it to a negative value !
|
||||
to make that is has been read already !! PM }
|
||||
@ -980,11 +983,11 @@ Implementation
|
||||
begin
|
||||
{$ifdef EXTDEBUG}
|
||||
if assigned(hp.problem) then
|
||||
writer.AsmWriteLn(target_asm.comment+'Temp '+tostr(hp.temppos)+','+
|
||||
writer.AsmWriteLn(asminfo^.comment+'Temp '+tostr(hp.temppos)+','+
|
||||
tostr(hp.tempsize)+' '+hp.problem^)
|
||||
else
|
||||
{$endif EXTDEBUG}
|
||||
writer.AsmWriteLn(target_asm.comment+'Temp '+tostr(hp.temppos)+','+
|
||||
writer.AsmWriteLn(asminfo^.comment+'Temp '+tostr(hp.temppos)+','+
|
||||
tostr(hp.tempsize)+' '+tempallocstr[hp.allocation]);
|
||||
end;
|
||||
|
||||
@ -1004,16 +1007,16 @@ Implementation
|
||||
begin
|
||||
case tai_realconst(hp).realtyp of
|
||||
aitrealconst_s32bit:
|
||||
writer.AsmWriteLn(target_asm.comment+'value: '+single2str(tai_realconst(hp).value.s32val));
|
||||
writer.AsmWriteLn(asminfo^.comment+'value: '+single2str(tai_realconst(hp).value.s32val));
|
||||
aitrealconst_s64bit:
|
||||
writer.AsmWriteLn(target_asm.comment+'value: '+double2str(tai_realconst(hp).value.s64val));
|
||||
writer.AsmWriteLn(asminfo^.comment+'value: '+double2str(tai_realconst(hp).value.s64val));
|
||||
{$if defined(cpuextended) and defined(FPC_HAS_TYPE_EXTENDED)}
|
||||
{ can't write full 80 bit floating point constants yet on non-x86 }
|
||||
aitrealconst_s80bit:
|
||||
writer.AsmWriteLn(target_asm.comment+'value: '+extended2str(tai_realconst(hp).value.s80val));
|
||||
writer.AsmWriteLn(asminfo^.comment+'value: '+extended2str(tai_realconst(hp).value.s80val));
|
||||
{$endif cpuextended}
|
||||
aitrealconst_s64comp:
|
||||
writer.AsmWriteLn(target_asm.comment+'value: '+extended2str(tai_realconst(hp).value.s64compval));
|
||||
writer.AsmWriteLn(asminfo^.comment+'value: '+extended2str(tai_realconst(hp).value.s64compval));
|
||||
else
|
||||
internalerror(2014050604);
|
||||
end;
|
||||
@ -1127,9 +1130,9 @@ Implementation
|
||||
TInternalAssembler
|
||||
*****************************************************************************}
|
||||
|
||||
constructor TInternalAssembler.create(smart:boolean);
|
||||
constructor TInternalAssembler.Create(info: pasminfo; smart: boolean);
|
||||
begin
|
||||
inherited create(smart);
|
||||
inherited;
|
||||
ObjOutput:=nil;
|
||||
ObjData:=nil;
|
||||
SmartAsm:=smart;
|
||||
@ -2007,7 +2010,7 @@ Implementation
|
||||
startsecorder: TAsmSectionOrder;
|
||||
begin
|
||||
if not(cs_asm_leave in current_settings.globalswitches) and
|
||||
not(af_needar in target_asm.flags) then
|
||||
not(af_needar in asminfo^.flags) then
|
||||
ObjWriter:=CInternalAr.CreateAr(current_module.staticlibfilename)
|
||||
else
|
||||
ObjWriter:=TObjectwriter.create;
|
||||
@ -2151,7 +2154,7 @@ Implementation
|
||||
begin
|
||||
if not assigned(CAssembler[target_asm.id]) then
|
||||
Message(asmw_f_assembler_output_not_supported);
|
||||
a:=CAssembler[target_asm.id].Create(smart);
|
||||
a:=CAssembler[target_asm.id].Create(@target_asm,smart);
|
||||
a.MakeObject;
|
||||
a.Free;
|
||||
end;
|
||||
|
@ -29,7 +29,7 @@ unit agavrgas;
|
||||
interface
|
||||
|
||||
uses
|
||||
globtype,
|
||||
globtype,systems,
|
||||
aasmtai,aasmdata,
|
||||
aggas,
|
||||
cpubase;
|
||||
@ -39,7 +39,7 @@ unit agavrgas;
|
||||
{ TAVRGNUAssembler }
|
||||
|
||||
TAVRGNUAssembler=class(TGNUassembler)
|
||||
constructor create(smart: boolean); override;
|
||||
constructor create(info: pasminfo; smart: boolean); override;
|
||||
function MakeCmdLine: TCmdStr; override;
|
||||
end;
|
||||
|
||||
@ -52,7 +52,6 @@ unit agavrgas;
|
||||
|
||||
uses
|
||||
cutils,globals,verbose,
|
||||
systems,
|
||||
assemble,
|
||||
aasmbase,aasmcpu,
|
||||
itcpugas,
|
||||
@ -63,9 +62,9 @@ unit agavrgas;
|
||||
{ GNU Arm Assembler writer }
|
||||
{****************************************************************************}
|
||||
|
||||
constructor TAVRGNUAssembler.create(smart: boolean);
|
||||
constructor TAVRGNUAssembler.create(info: pasminfo; smart: boolean);
|
||||
begin
|
||||
inherited create(smart);
|
||||
inherited;
|
||||
InstrWriter := TAVRInstrWriter.create(self);
|
||||
end;
|
||||
|
||||
|
@ -28,7 +28,7 @@ unit agjasmin;
|
||||
interface
|
||||
|
||||
uses
|
||||
cclasses,
|
||||
cclasses,systems,
|
||||
globtype,globals,
|
||||
symconst,symbase,symdef,symsym,
|
||||
aasmbase,aasmtai,aasmdata,aasmcpu,
|
||||
@ -70,7 +70,7 @@ interface
|
||||
procedure WriteSymtableProcdefs(st: TSymtable);
|
||||
procedure WriteSymtableStructDefs(st: TSymtable);
|
||||
public
|
||||
constructor Create(smart: boolean); override;
|
||||
constructor Create(info: pasminfo; smart: boolean); override;
|
||||
function MakeCmdLine: TCmdStr;override;
|
||||
procedure WriteTree(p:TAsmList);override;
|
||||
procedure WriteAsmList;override;
|
||||
@ -101,7 +101,7 @@ implementation
|
||||
|
||||
uses
|
||||
SysUtils,
|
||||
cutils,cfileutl,systems,script,
|
||||
cutils,cfileutl,script,
|
||||
fmodule,finput,verbose,
|
||||
symtype,symcpu,symtable,jvmdef,
|
||||
itcpujas,cpubase,cpuinfo,cgutils,
|
||||
@ -336,7 +336,7 @@ implementation
|
||||
begin
|
||||
if (infile<>lastinfile) then
|
||||
begin
|
||||
writer.AsmWriteLn(target_asm.comment+'['+infile.name+']');
|
||||
writer.AsmWriteLn(asminfo^.comment+'['+infile.name+']');
|
||||
if assigned(lastinfile) then
|
||||
lastinfile.close;
|
||||
end;
|
||||
@ -345,7 +345,7 @@ implementation
|
||||
begin
|
||||
if (hp1.fileinfo.line<>0) and
|
||||
((infile.linebuf^[hp1.fileinfo.line]>=0) or (InlineLevel>0)) then
|
||||
writer.AsmWriteLn(target_asm.comment+'['+tostr(hp1.fileinfo.line)+'] '+
|
||||
writer.AsmWriteLn(asminfo^.comment+'['+tostr(hp1.fileinfo.line)+'] '+
|
||||
fixline(infile.GetLineStr(hp1.fileinfo.line)));
|
||||
{ set it to a negative value !
|
||||
to make that is has been read already !! PM }
|
||||
@ -362,7 +362,7 @@ implementation
|
||||
|
||||
ait_comment :
|
||||
Begin
|
||||
writer.AsmWrite(target_asm.comment);
|
||||
writer.AsmWrite(asminfo^.comment);
|
||||
writer.AsmWritePChar(tai_comment(hp).str);
|
||||
writer.AsmLn;
|
||||
End;
|
||||
@ -371,7 +371,7 @@ implementation
|
||||
begin
|
||||
if (cs_asm_regalloc in current_settings.globalswitches) then
|
||||
begin
|
||||
writer.AsmWrite(#9+target_asm.comment+'Register ');
|
||||
writer.AsmWrite(#9+asminfo^.comment+'Register ');
|
||||
repeat
|
||||
writer.AsmWrite(std_regname(Tai_regalloc(hp).reg));
|
||||
if (hp.next=nil) or
|
||||
@ -392,11 +392,11 @@ implementation
|
||||
begin
|
||||
{$ifdef EXTDEBUG}
|
||||
if assigned(tai_tempalloc(hp).problem) then
|
||||
writer.AsmWriteLn(target_asm.comment+'Temp '+tostr(tai_tempalloc(hp).temppos)+','+
|
||||
writer.AsmWriteLn(asminfo^.comment+'Temp '+tostr(tai_tempalloc(hp).temppos)+','+
|
||||
tostr(tai_tempalloc(hp).tempsize)+' '+tai_tempalloc(hp).problem^)
|
||||
else
|
||||
{$endif EXTDEBUG}
|
||||
writer.AsmWriteLn(target_asm.comment+'Temp '+tostr(tai_tempalloc(hp).temppos)+','+
|
||||
writer.AsmWriteLn(asminfo^.comment+'Temp '+tostr(tai_tempalloc(hp).temppos)+','+
|
||||
tostr(tai_tempalloc(hp).tempsize)+' '+tempallocstr[tai_tempalloc(hp).allocation]);
|
||||
end;
|
||||
end;
|
||||
@ -686,7 +686,7 @@ implementation
|
||||
if jasminjarfound then
|
||||
Message1(exec_t_using_assembler,jasminjar);
|
||||
end;
|
||||
result:=target_asm.asmcmd;
|
||||
result:=asminfo^.asmcmd;
|
||||
filenames:=ScriptFixFileName(AsmFileName);
|
||||
if cs_asm_extern in current_settings.globalswitches then
|
||||
filenames:=maybequoted(filenames);
|
||||
@ -1078,9 +1078,9 @@ implementation
|
||||
nestedstructs.free;
|
||||
end;
|
||||
|
||||
constructor TJasminAssembler.Create(smart: boolean);
|
||||
constructor TJasminAssembler.Create(info: pasminfo; smart: boolean);
|
||||
begin
|
||||
inherited CreateWithWriter(TJasminAssemblerOutputFile.Create(self),true,smart);
|
||||
inherited CreateWithWriter(info,TJasminAssemblerOutputFile.Create(self),true,smart);
|
||||
InstrWriter:=TJasminInstrWriter.Create(self);
|
||||
asmfiles:=TCmdStrList.Create;
|
||||
end;
|
||||
@ -1098,9 +1098,9 @@ implementation
|
||||
(*
|
||||
for hal:=low(TasmlistType) to high(TasmlistType) do
|
||||
begin
|
||||
writer.AsmWriteLn(target_asm.comment+'Begin asmlist '+AsmlistTypeStr[hal]);
|
||||
writer.AsmWriteLn(asminfo^.comment+'Begin asmlist '+AsmlistTypeStr[hal]);
|
||||
writetree(current_asmdata.asmlists[hal]);
|
||||
writer.AsmWriteLn(target_asm.comment+'End asmlist '+AsmlistTypeStr[hal]);
|
||||
writer.AsmWriteLn(asminfo^.comment+'End asmlist '+AsmlistTypeStr[hal]);
|
||||
end;
|
||||
*)
|
||||
{ print all global variables }
|
||||
|
@ -26,7 +26,7 @@ unit agllvm;
|
||||
interface
|
||||
|
||||
uses
|
||||
globtype,globals,
|
||||
globtype,globals,systems,
|
||||
aasmbase,aasmtai,aasmdata,
|
||||
assemble;
|
||||
|
||||
@ -46,7 +46,7 @@ interface
|
||||
procedure WriteOrdConst(hp: tai_const);
|
||||
procedure WriteTai(const replaceforbidden: boolean; const do_line: boolean; var InlineLevel: cardinal; var asmblock: boolean; var hp: tai);
|
||||
public
|
||||
constructor create(smart: boolean); override;
|
||||
constructor create(info: pasminfo; smart: boolean); override;
|
||||
function MakeCmdLine: TCmdStr; override;
|
||||
procedure WriteTree(p:TAsmList);override;
|
||||
procedure WriteAsmList;override;
|
||||
@ -77,7 +77,7 @@ implementation
|
||||
|
||||
uses
|
||||
SysUtils,
|
||||
cutils,cfileutl,systems,
|
||||
cutils,cfileutl,
|
||||
fmodule,verbose,
|
||||
aasmcnst,symconst,symdef,symtable,
|
||||
llvmbase,aasmllvm,itllvm,llvmdef,
|
||||
@ -519,7 +519,7 @@ implementation
|
||||
begin
|
||||
if not assigned(p) then
|
||||
exit;
|
||||
replaceforbidden:=target_asm.dollarsign<>'$';
|
||||
replaceforbidden:=asminfo^.dollarsign<>'$';
|
||||
|
||||
InlineLevel:=0;
|
||||
asmblock:=false;
|
||||
@ -580,16 +580,16 @@ implementation
|
||||
begin
|
||||
case tai_realconst(hp).realtyp of
|
||||
aitrealconst_s32bit:
|
||||
writer.AsmWriteLn(target_asm.comment+'value: '+single2str(tai_realconst(hp).value.s32val));
|
||||
writer.AsmWriteLn(asminfo^.comment+'value: '+single2str(tai_realconst(hp).value.s32val));
|
||||
aitrealconst_s64bit:
|
||||
writer.AsmWriteLn(target_asm.comment+'value: '+double2str(tai_realconst(hp).value.s64val));
|
||||
writer.AsmWriteLn(asminfo^.comment+'value: '+double2str(tai_realconst(hp).value.s64val));
|
||||
{$if defined(cpuextended) and defined(FPC_HAS_TYPE_EXTENDED)}
|
||||
{ can't write full 80 bit floating point constants yet on non-x86 }
|
||||
aitrealconst_s80bit:
|
||||
writer.AsmWriteLn(target_asm.comment+'value: '+extended2str(tai_realconst(hp).value.s80val));
|
||||
writer.AsmWriteLn(asminfo^.comment+'value: '+extended2str(tai_realconst(hp).value.s80val));
|
||||
{$endif cpuextended}
|
||||
aitrealconst_s64comp:
|
||||
writer.AsmWriteLn(target_asm.comment+'value: '+extended2str(tai_realconst(hp).value.s64compval));
|
||||
writer.AsmWriteLn(asminfo^.comment+'value: '+extended2str(tai_realconst(hp).value.s64compval));
|
||||
else
|
||||
internalerror(2014050604);
|
||||
end;
|
||||
@ -617,7 +617,7 @@ implementation
|
||||
consttyp: taiconst_type;
|
||||
begin
|
||||
if fdecllevel=0 then
|
||||
writer.AsmWrite(target_asm.comment+' const ');
|
||||
writer.AsmWrite(asminfo^.comment+' const ');
|
||||
consttyp:=hp.consttype;
|
||||
case consttyp of
|
||||
aitconst_got,
|
||||
@ -641,7 +641,7 @@ implementation
|
||||
aitconst_64bit_unaligned:
|
||||
begin
|
||||
if fdecllevel=0 then
|
||||
writer.AsmWrite(target_asm.comment);
|
||||
writer.AsmWrite(asminfo^.comment);
|
||||
{ can't have compile-time differences between symbols; these are
|
||||
normally for PIC, but llvm takes care of that for us }
|
||||
if assigned(hp.endsym) then
|
||||
@ -758,7 +758,7 @@ implementation
|
||||
case hp.typ of
|
||||
ait_comment :
|
||||
begin
|
||||
writer.AsmWrite(target_asm.comment);
|
||||
writer.AsmWrite(asminfo^.comment);
|
||||
writer.AsmWritePChar(tai_comment(hp).str);
|
||||
if fdecllevel<>0 then
|
||||
internalerror(2015090601);
|
||||
@ -769,7 +769,7 @@ implementation
|
||||
begin
|
||||
if (cs_asm_regalloc in current_settings.globalswitches) then
|
||||
begin
|
||||
writer.AsmWrite(#9+target_asm.comment+'Register ');
|
||||
writer.AsmWrite(#9+asminfo^.comment+'Register ');
|
||||
repeat
|
||||
writer.AsmWrite(std_regname(Tai_regalloc(hp).reg));
|
||||
if (hp.next=nil) or
|
||||
@ -800,7 +800,7 @@ implementation
|
||||
|
||||
ait_datablock :
|
||||
begin
|
||||
writer.AsmWrite(target_asm.comment);
|
||||
writer.AsmWrite(asminfo^.comment);
|
||||
writer.AsmWriteln('datablock');
|
||||
end;
|
||||
|
||||
@ -817,7 +817,7 @@ implementation
|
||||
ait_string :
|
||||
begin
|
||||
if fdecllevel=0 then
|
||||
writer.AsmWrite(target_asm.comment);
|
||||
writer.AsmWrite(asminfo^.comment);
|
||||
writer.AsmWrite('c"');
|
||||
for i:=1 to tai_string(hp).len do
|
||||
begin
|
||||
@ -850,7 +850,7 @@ implementation
|
||||
begin
|
||||
{ should be emitted as part of the variable/function def }
|
||||
//internalerror(2013010704);
|
||||
writer.AsmWriteln(target_asm.comment+'global/privateextern label: '+tai_label(hp).labsym.name);
|
||||
writer.AsmWriteln(asminfo^.comment+'global/privateextern label: '+tai_label(hp).labsym.name);
|
||||
end;
|
||||
if replaceforbidden then
|
||||
writer.AsmWrite(ReplaceForbiddenAsmSymbolChars(tai_label(hp).labsym.name))
|
||||
@ -863,7 +863,7 @@ implementation
|
||||
ait_symbol :
|
||||
begin
|
||||
if fdecllevel=0 then
|
||||
writer.AsmWrite(target_asm.comment);
|
||||
writer.AsmWrite(asminfo^.comment);
|
||||
writer.AsmWriteln(LlvmAsmSymName(tai_symbol(hp).sym));
|
||||
{ todo }
|
||||
if tai_symbol(hp).has_value then
|
||||
@ -1056,9 +1056,9 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
constructor TLLVMAssember.create(smart: boolean);
|
||||
constructor TLLVMAssember.create(info: pasminfo; smart: boolean);
|
||||
begin
|
||||
inherited create(smart);
|
||||
inherited;
|
||||
InstrWriter:=TLLVMInstrWriter.create(self);
|
||||
end;
|
||||
|
||||
|
@ -26,13 +26,13 @@ unit ag68kgas;
|
||||
interface
|
||||
|
||||
uses
|
||||
cclasses,cpubase,
|
||||
cclasses,cpubase,systems,
|
||||
globals,globtype,
|
||||
aasmbase,aasmtai,aasmdata,aasmcpu,assemble,aggas;
|
||||
|
||||
type
|
||||
Tm68kGNUAssembler=class(TGNUassembler)
|
||||
constructor create(smart: boolean); override;
|
||||
constructor create(info: pasminfo; smart: boolean); override;
|
||||
function MakeCmdLine : TCmdStr; override;
|
||||
end;
|
||||
|
||||
@ -49,7 +49,7 @@ interface
|
||||
implementation
|
||||
|
||||
uses
|
||||
cutils,systems,
|
||||
cutils,
|
||||
cgbase,cgutils,cpuinfo,
|
||||
verbose,itcpugas;
|
||||
|
||||
@ -58,9 +58,9 @@ interface
|
||||
{ GNU m68k Assembler writer }
|
||||
{****************************************************************************}
|
||||
|
||||
constructor Tm68kGNUAssembler.create(smart: boolean);
|
||||
constructor Tm68kGNUAssembler.create(info: pasminfo; smart: boolean);
|
||||
begin
|
||||
inherited create(smart);
|
||||
inherited;
|
||||
InstrWriter := Tm68kInstrWriter.create(self);
|
||||
end;
|
||||
|
||||
|
@ -26,13 +26,13 @@ unit cpugas;
|
||||
interface
|
||||
|
||||
uses
|
||||
cpubase, aasmbase, globtype,
|
||||
cpubase, aasmbase, globtype, systems,
|
||||
aasmtai, aasmcpu, assemble, aggas;
|
||||
|
||||
type
|
||||
TMIPSGNUAssembler = class(TGNUassembler)
|
||||
nomacro, noreorder, noat : boolean;
|
||||
constructor create(smart: boolean); override;
|
||||
constructor create(info: pasminfo; smart: boolean); override;
|
||||
{# Constructs the command line for calling the assembler }
|
||||
function MakeCmdLine: TCmdStr; override;
|
||||
end;
|
||||
@ -52,7 +52,7 @@ unit cpugas;
|
||||
implementation
|
||||
|
||||
uses
|
||||
cutils, systems, cpuinfo,
|
||||
cutils, cpuinfo,
|
||||
globals, verbose, itcpugas, cgbase, cgutils;
|
||||
|
||||
|
||||
@ -69,10 +69,10 @@ unit cpugas;
|
||||
{ GNU MIPS Assembler writer }
|
||||
{****************************************************************************}
|
||||
|
||||
constructor TMIPSGNUAssembler.create(smart: boolean);
|
||||
constructor TMIPSGNUAssembler.create(info: pasminfo; smart: boolean);
|
||||
begin
|
||||
inherited create(smart);
|
||||
InstrWriter := TMIPSInstrWriter.create(self);
|
||||
inherited;
|
||||
InstrWriter:=TMIPSInstrWriter.create(self);
|
||||
nomacro:=false;
|
||||
noreorder:=false;
|
||||
noat:=false;
|
||||
|
@ -243,11 +243,11 @@ interface
|
||||
TObjSectionArray = array[0..high(smallint)] of TObjSection;
|
||||
|
||||
TDJCoffAssembler = class(tinternalassembler)
|
||||
constructor create(smart:boolean);override;
|
||||
constructor create(info: pasminfo; smart:boolean);override;
|
||||
end;
|
||||
|
||||
TPECoffassembler = class(tinternalassembler)
|
||||
constructor create(smart:boolean);override;
|
||||
constructor create(info: pasminfo; smart:boolean);override;
|
||||
end;
|
||||
|
||||
|
||||
@ -2843,9 +2843,9 @@ const pemagic : array[0..3] of byte = (
|
||||
TDJCoffAssembler
|
||||
****************************************************************************}
|
||||
|
||||
constructor TDJCoffAssembler.Create(smart:boolean);
|
||||
constructor TDJCoffAssembler.Create(info: pasminfo; smart:boolean);
|
||||
begin
|
||||
inherited Create(smart);
|
||||
inherited;
|
||||
CObjOutput:=TDJCoffObjOutput;
|
||||
CInternalAr:=tarobjectwriter;
|
||||
end;
|
||||
@ -2855,9 +2855,9 @@ const pemagic : array[0..3] of byte = (
|
||||
TPECoffAssembler
|
||||
****************************************************************************}
|
||||
|
||||
constructor TPECoffAssembler.Create(smart:boolean);
|
||||
constructor TPECoffAssembler.Create(info: pasminfo; smart:boolean);
|
||||
begin
|
||||
inherited Create(smart);
|
||||
inherited;
|
||||
CObjOutput:=TPECoffObjOutput;
|
||||
CInternalAr:=tarobjectwriter;
|
||||
end;
|
||||
|
@ -104,7 +104,7 @@ interface
|
||||
end;
|
||||
|
||||
TElfAssembler = class(tinternalassembler)
|
||||
constructor create(smart:boolean);override;
|
||||
constructor create(info: pasminfo; smart:boolean);override;
|
||||
end;
|
||||
|
||||
PSectionRec=^TSectionRec;
|
||||
@ -1301,9 +1301,9 @@ implementation
|
||||
TELFAssembler
|
||||
****************************************************************************}
|
||||
|
||||
constructor TElfAssembler.Create(smart:boolean);
|
||||
constructor TElfAssembler.Create(info: pasminfo; smart:boolean);
|
||||
begin
|
||||
inherited Create(smart);
|
||||
inherited;
|
||||
CObjOutput:=TElfObjectOutput;
|
||||
CInternalAr:=tarobjectwriter;
|
||||
end;
|
||||
|
@ -146,7 +146,7 @@ type
|
||||
|
||||
TMachoAssembler=class(TInternalAssembler)
|
||||
public
|
||||
constructor create(smart:boolean);override;
|
||||
constructor create(info: pasminfo; smart:boolean);override;
|
||||
end;
|
||||
|
||||
|
||||
@ -354,9 +354,9 @@ uses
|
||||
|
||||
{ TMachoAssembler }
|
||||
|
||||
constructor TMachoAssembler.create(smart: boolean);
|
||||
constructor TMachoAssembler.create(info: pasminfo; smart: boolean);
|
||||
begin
|
||||
inherited create(smart);
|
||||
inherited;
|
||||
CObjOutput:=TMachoObjectOutput;
|
||||
CInternalAr:=tarobjectwriter;
|
||||
end;
|
||||
|
@ -302,7 +302,7 @@ const NLM_MAX_DESCRIPTION_LENGTH = 127;
|
||||
end;
|
||||
|
||||
TNLMCoffassembler = class(tinternalassembler)
|
||||
constructor create(smart:boolean);override;
|
||||
constructor create(info: pasminfo; smart:boolean);override;
|
||||
end;
|
||||
|
||||
TNLMCoffObjData = class(TCoffObjData)
|
||||
@ -1471,9 +1471,9 @@ function SecOpts(SecOptions:TObjSectionOptions):string;
|
||||
TDJCoffAssembler
|
||||
****************************************************************************}
|
||||
|
||||
constructor TNLMCoffAssembler.Create(smart:boolean);
|
||||
constructor TNLMCoffAssembler.Create(info: pasminfo; smart:boolean);
|
||||
begin
|
||||
inherited Create(smart);
|
||||
inherited;
|
||||
CObjOutput:=TNLMCoffObjOutput;
|
||||
CInternalAr:=tarobjectwriter;
|
||||
end;
|
||||
|
@ -304,7 +304,7 @@ interface
|
||||
end;
|
||||
|
||||
TOmfAssembler = class(tinternalassembler)
|
||||
constructor create(smart:boolean);override;
|
||||
constructor create(info: pasminfo; smart:boolean);override;
|
||||
end;
|
||||
|
||||
implementation
|
||||
@ -2534,9 +2534,9 @@ implementation
|
||||
TOmfAssembler
|
||||
****************************************************************************}
|
||||
|
||||
constructor TOmfAssembler.Create(smart:boolean);
|
||||
constructor TOmfAssembler.Create(info: pasminfo; smart:boolean);
|
||||
begin
|
||||
inherited Create(smart);
|
||||
inherited;
|
||||
CObjOutput:=TOmfObjOutput;
|
||||
CInternalAr:=TOmfLibObjectWriter;
|
||||
end;
|
||||
|
@ -734,7 +734,7 @@ interface
|
||||
case hp.typ of
|
||||
ait_comment:
|
||||
begin
|
||||
writer.AsmWrite(target_asm.comment);
|
||||
writer.AsmWrite(asminfo^.comment);
|
||||
writer.AsmWritePChar(tai_comment(hp).str);
|
||||
writer.AsmLn;
|
||||
end;
|
||||
@ -744,7 +744,7 @@ interface
|
||||
ait_section:
|
||||
begin
|
||||
{if LastSecType<>sec_none then
|
||||
writer.AsmWriteLn('_'+target_asm.secnames[LastSecType]+#9#9'ENDS');}
|
||||
writer.AsmWriteLn('_'+asminfo^.secnames[LastSecType]+#9#9'ENDS');}
|
||||
|
||||
if tai_section(hp).sectype<>sec_none then
|
||||
begin
|
||||
@ -911,7 +911,7 @@ interface
|
||||
(*
|
||||
ait_real_64bit :
|
||||
begin
|
||||
writer.AsmWriteLn(target_asm.comment+'value: '+double2str(tai_real_64bit(hp).value));
|
||||
writer.AsmWriteLn(asminfo^.comment+'value: '+double2str(tai_real_64bit(hp).value));
|
||||
d:=tai_real_64bit(hp).value;
|
||||
{ swap the values to correct endian if required }
|
||||
if source_info.endian <> target_info.endian then
|
||||
@ -930,7 +930,7 @@ interface
|
||||
|
||||
ait_real_32bit :
|
||||
begin
|
||||
writer.AsmWriteLn(target_asm.comment+'value: '+single2str(tai_real_32bit(hp).value));
|
||||
writer.AsmWriteLn(asminfo^.comment+'value: '+single2str(tai_real_32bit(hp).value));
|
||||
sin:=tai_real_32bit(hp).value;
|
||||
{ swap the values to correct endian if required }
|
||||
if source_info.endian <> target_info.endian then
|
||||
@ -1221,9 +1221,9 @@ interface
|
||||
|
||||
for hal:=low(TasmlistType) to high(TasmlistType) do
|
||||
begin
|
||||
writer.AsmWriteLn(target_asm.comment+'Begin asmlist '+AsmListTypeStr[hal]);
|
||||
writer.AsmWriteLn(asminfo^.comment+'Begin asmlist '+AsmListTypeStr[hal]);
|
||||
writetree(current_asmdata.asmlists[hal]);
|
||||
writer.AsmWriteLn(target_asm.comment+'End asmlist '+AsmListTypeStr[hal]);
|
||||
writer.AsmWriteLn(asminfo^.comment+'End asmlist '+AsmListTypeStr[hal]);
|
||||
end;
|
||||
|
||||
writer.AsmWriteLn(#9'end');
|
||||
|
@ -31,7 +31,7 @@ unit agppcvasm;
|
||||
interface
|
||||
|
||||
uses
|
||||
aasmbase,
|
||||
aasmbase,systems,
|
||||
aasmtai,aasmdata,
|
||||
aggas,
|
||||
cpubase,cgutils,
|
||||
@ -43,7 +43,7 @@ unit agppcvasm;
|
||||
end;
|
||||
|
||||
TPPCVASM=class(TGNUassembler)
|
||||
constructor create(smart: boolean); override;
|
||||
constructor create(info: pasminfo; smart: boolean); override;
|
||||
function MakeCmdLine: TCmdStr; override;
|
||||
end;
|
||||
|
||||
@ -59,7 +59,7 @@ unit agppcvasm;
|
||||
|
||||
uses
|
||||
cutils,cfileutl,globals,verbose,
|
||||
cgbase,systems,
|
||||
cgbase,
|
||||
assemble,script,
|
||||
itcpugas,cpuinfo,
|
||||
aasmcpu;
|
||||
@ -359,15 +359,15 @@ unit agppcvasm;
|
||||
{****************************************************************************}
|
||||
|
||||
|
||||
constructor TPPCVASM.create(smart: boolean);
|
||||
constructor TPPCVASM.create(info: pasminfo; smart: boolean);
|
||||
begin
|
||||
inherited create(smart);
|
||||
inherited;
|
||||
InstrWriter := TPPCInstrWriter.create(self);
|
||||
end;
|
||||
|
||||
function TPPCVASM.MakeCmdLine: TCmdStr;
|
||||
begin
|
||||
result:=target_asm.asmcmd;
|
||||
result:=asminfo^.asmcmd;
|
||||
|
||||
if (cs_link_on_target in current_settings.globalswitches) then
|
||||
begin
|
||||
|
@ -31,7 +31,7 @@ unit agppcgas;
|
||||
interface
|
||||
|
||||
uses
|
||||
aasmbase,
|
||||
systems,aasmbase,
|
||||
aasmtai,aasmdata,
|
||||
aggas,
|
||||
cpubase,cgutils,
|
||||
@ -43,17 +43,17 @@ unit agppcgas;
|
||||
end;
|
||||
|
||||
TPPCGNUAssembler=class(TGNUassembler)
|
||||
constructor create(smart: boolean); override;
|
||||
constructor create(info: pasminfo; smart: boolean); override;
|
||||
procedure WriteExtraHeader; override;
|
||||
end;
|
||||
|
||||
TPPCAppleGNUAssembler=class(TAppleGNUassembler)
|
||||
constructor create(smart: boolean); override;
|
||||
constructor create(info: pasminfo; smart: boolean); override;
|
||||
function MakeCmdLine: TCmdStr; override;
|
||||
end;
|
||||
|
||||
TPPCAIXAssembler=class(TPPCGNUAssembler)
|
||||
constructor create(smart: boolean); override;
|
||||
constructor create(info: pasminfo; smart: boolean); override;
|
||||
protected
|
||||
function sectionname(atype: TAsmSectiontype; const aname: string; aorder: TAsmSectionOrder): string; override;
|
||||
procedure WriteExtraHeader; override;
|
||||
@ -63,9 +63,6 @@ unit agppcgas;
|
||||
|
||||
topstr = string[4];
|
||||
|
||||
function getreferencestring(var ref : treference) : string;
|
||||
function getopstr_jmp(const o:toper) : string;
|
||||
function getopstr(const o:toper) : string;
|
||||
function branchmode(o: tasmop): topstr;
|
||||
function cond2str(op: tasmop; c: tasmcond): string;
|
||||
|
||||
@ -73,7 +70,7 @@ unit agppcgas;
|
||||
|
||||
uses
|
||||
cutils,globals,verbose,
|
||||
cgbase,systems,
|
||||
cgbase,
|
||||
assemble,
|
||||
itcpugas,cpuinfo,
|
||||
aasmcpu;
|
||||
@ -91,7 +88,7 @@ unit agppcgas;
|
||||
{$endif cpu64bitaddr}
|
||||
|
||||
|
||||
function getreferencestring(var ref : treference) : string;
|
||||
function getreferencestring(asminfo: pasminfo; var ref : treference) : string;
|
||||
var
|
||||
s : string;
|
||||
begin
|
||||
@ -111,7 +108,7 @@ unit agppcgas;
|
||||
(offset<>0) or
|
||||
not assigned(symbol) then
|
||||
internalerror(2011122701);
|
||||
if target_asm.dollarsign<>'$' then
|
||||
if asminfo^.dollarsign<>'$' then
|
||||
getreferencestring:=ReplaceForbiddenAsmSymbolChars(symbol.name)+'('+gas_regname(NR_RTOC)+')'
|
||||
else
|
||||
getreferencestring:=symbol.name+'('+gas_regname(NR_RTOC)+')';
|
||||
@ -126,7 +123,7 @@ unit agppcgas;
|
||||
s := s+'(';
|
||||
if assigned(symbol) then
|
||||
begin
|
||||
if target_asm.dollarsign<>'$' then
|
||||
if asminfo^.dollarsign<>'$' then
|
||||
begin
|
||||
s:=s+ReplaceForbiddenAsmSymbolChars(symbol.name);
|
||||
if assigned(relsymbol) then
|
||||
@ -190,7 +187,7 @@ unit agppcgas;
|
||||
end;
|
||||
|
||||
|
||||
function getopstr_jmp(const o:toper) : string;
|
||||
function getopstr_jmp(asminfo: pasminfo; const o:toper) : string;
|
||||
var
|
||||
hs : string;
|
||||
begin
|
||||
@ -205,7 +202,7 @@ unit agppcgas;
|
||||
if o.ref^.refaddr<>addr_full then
|
||||
internalerror(200402267);
|
||||
hs:=o.ref^.symbol.name;
|
||||
if target_asm.dollarsign<>'$' then
|
||||
if asminfo^.dollarsign<>'$' then
|
||||
hs:=ReplaceForbiddenAsmSymbolChars(hs);
|
||||
if o.ref^.offset>0 then
|
||||
hs:=hs+'+'+tostr(o.ref^.offset)
|
||||
@ -222,7 +219,7 @@ unit agppcgas;
|
||||
end;
|
||||
|
||||
|
||||
function getopstr(const o:toper) : string;
|
||||
function getopstr(asminfo: pasminfo; const o:toper) : string;
|
||||
var
|
||||
hs : string;
|
||||
begin
|
||||
@ -235,7 +232,7 @@ unit agppcgas;
|
||||
if o.ref^.refaddr=addr_full then
|
||||
begin
|
||||
hs:=o.ref^.symbol.name;
|
||||
if target_asm.dollarsign<>'$' then
|
||||
if asminfo^.dollarsign<>'$' then
|
||||
hs:=ReplaceForbiddenAsmSymbolChars(hs);
|
||||
if o.ref^.offset>0 then
|
||||
hs:=hs+'+'+tostr(o.ref^.offset)
|
||||
@ -245,7 +242,7 @@ unit agppcgas;
|
||||
getopstr:=hs;
|
||||
end
|
||||
else
|
||||
getopstr:=getreferencestring(o.ref^);
|
||||
getopstr:=getreferencestring(asminfo,o.ref^);
|
||||
else
|
||||
internalerror(2002070604);
|
||||
end;
|
||||
@ -367,7 +364,7 @@ unit agppcgas;
|
||||
{ first write the current contents of s, because the symbol }
|
||||
{ may be 255 characters }
|
||||
owner.writer.AsmWrite(s);
|
||||
s:=getopstr_jmp(taicpu(hp).oper[0]^);
|
||||
s:=getopstr_jmp(owner.asminfo,taicpu(hp).oper[0]^);
|
||||
end;
|
||||
end
|
||||
else
|
||||
@ -387,7 +384,7 @@ unit agppcgas;
|
||||
// debug code
|
||||
// writeln(s);
|
||||
// writeln(taicpu(hp).fileinfo.line);
|
||||
s:=s+sep+getopstr(taicpu(hp).oper[i]^);
|
||||
s:=s+sep+getopstr(owner.asminfo,taicpu(hp).oper[i]^);
|
||||
sep:=',';
|
||||
end;
|
||||
end;
|
||||
@ -400,9 +397,9 @@ unit agppcgas;
|
||||
{ GNU PPC Assembler writer }
|
||||
{****************************************************************************}
|
||||
|
||||
constructor TPPCGNUAssembler.create(smart: boolean);
|
||||
constructor TPPCGNUAssembler.create(info: pasminfo; smart: boolean);
|
||||
begin
|
||||
inherited create(smart);
|
||||
inherited;
|
||||
InstrWriter := TPPCInstrWriter.create(self);
|
||||
end;
|
||||
|
||||
@ -424,9 +421,9 @@ unit agppcgas;
|
||||
{ GNU/Apple PPC Assembler writer }
|
||||
{****************************************************************************}
|
||||
|
||||
constructor TPPCAppleGNUAssembler.create(smart: boolean);
|
||||
constructor TPPCAppleGNUAssembler.create(info: pasminfo; smart: boolean);
|
||||
begin
|
||||
inherited create(smart);
|
||||
inherited;
|
||||
InstrWriter := TPPCInstrWriter.create(self);
|
||||
end;
|
||||
|
||||
@ -453,9 +450,9 @@ unit agppcgas;
|
||||
{ AIX PPC Assembler writer }
|
||||
{****************************************************************************}
|
||||
|
||||
constructor TPPCAIXAssembler.create(smart: boolean);
|
||||
constructor TPPCAIXAssembler.create(info: pasminfo; smart: boolean);
|
||||
begin
|
||||
inherited create(smart);
|
||||
inherited;
|
||||
InstrWriter := TPPCInstrWriter.create(self);
|
||||
end;
|
||||
|
||||
|
@ -26,13 +26,13 @@ unit cpugas;
|
||||
interface
|
||||
|
||||
uses
|
||||
cpubase,
|
||||
cpubase,systems,
|
||||
aasmtai,aasmdata,aasmcpu,assemble,aggas,
|
||||
cgutils,globtype;
|
||||
|
||||
type
|
||||
TGasSPARC=class(TGnuAssembler)
|
||||
constructor create(smart: boolean); override;
|
||||
constructor create(info: pasminfo; smart: boolean); override;
|
||||
{# Constructs the command line for calling the assembler }
|
||||
function MakeCmdLine: TCmdStr; override;
|
||||
end;
|
||||
@ -46,7 +46,7 @@ interface
|
||||
implementation
|
||||
|
||||
uses
|
||||
cutils,systems,globals,cpuinfo,procinfo,
|
||||
cutils,globals,cpuinfo,procinfo,
|
||||
verbose,itcpugas,cgbase;
|
||||
|
||||
|
||||
@ -54,9 +54,9 @@ implementation
|
||||
{ GNU PPC Assembler writer }
|
||||
{****************************************************************************}
|
||||
|
||||
constructor TGasSPARC.create(smart: boolean);
|
||||
constructor TGasSPARC.create(info: pasminfo; smart: boolean);
|
||||
begin
|
||||
inherited create(smart);
|
||||
inherited;
|
||||
InstrWriter := TSPARCInstrWriter.create(self);
|
||||
end;
|
||||
|
||||
|
@ -28,22 +28,22 @@ unit agx86att;
|
||||
interface
|
||||
|
||||
uses
|
||||
cclasses,cpubase,
|
||||
cclasses,cpubase,systems,
|
||||
globals,globtype,cgutils,
|
||||
aasmbase,aasmtai,aasmdata,assemble,aggas;
|
||||
|
||||
type
|
||||
Tx86ATTAssembler=class(TGNUassembler)
|
||||
constructor create(smart: boolean); override;
|
||||
constructor create(info: pasminfo; smart: boolean); override;
|
||||
function MakeCmdLine: TCmdStr; override;
|
||||
end;
|
||||
|
||||
Tx86AppleGNUAssembler=class(TAppleGNUassembler)
|
||||
constructor create(smart: boolean); override;
|
||||
constructor create(info: pasminfo; smart: boolean); override;
|
||||
end;
|
||||
|
||||
Tx86AoutGNUAssembler=class(TAoutGNUassembler)
|
||||
constructor create(smart: boolean); override;
|
||||
constructor create(info: pasminfo; smart: boolean); override;
|
||||
end;
|
||||
|
||||
|
||||
@ -65,7 +65,7 @@ interface
|
||||
implementation
|
||||
|
||||
uses
|
||||
cutils,systems,
|
||||
cutils,
|
||||
verbose,
|
||||
itcpugas,
|
||||
cgbase,
|
||||
@ -76,9 +76,9 @@ interface
|
||||
Tx86ATTAssembler
|
||||
****************************************************************************}
|
||||
|
||||
constructor Tx86ATTAssembler.create(smart: boolean);
|
||||
constructor Tx86ATTAssembler.create(info: pasminfo; smart: boolean);
|
||||
begin
|
||||
inherited create(smart);
|
||||
inherited;
|
||||
InstrWriter := Tx86InstrWriter.create(self);
|
||||
end;
|
||||
|
||||
@ -124,9 +124,9 @@ interface
|
||||
Tx86AppleGNUAssembler
|
||||
****************************************************************************}
|
||||
|
||||
constructor Tx86AppleGNUAssembler.create(smart: boolean);
|
||||
constructor Tx86AppleGNUAssembler.create(info: pasminfo; smart: boolean);
|
||||
begin
|
||||
inherited create(smart);
|
||||
inherited;
|
||||
InstrWriter := Tx86InstrWriter.create(self);
|
||||
{ Apple's assembler does not support a size suffix for popcount }
|
||||
Tx86InstrWriter(InstrWriter).fskipPopcountSuffix := true;
|
||||
@ -138,9 +138,9 @@ interface
|
||||
Tx86AoutGNUAssembler
|
||||
****************************************************************************}
|
||||
|
||||
constructor Tx86AoutGNUAssembler.create(smart: boolean);
|
||||
constructor Tx86AoutGNUAssembler.create(info: pasminfo; smart: boolean);
|
||||
begin
|
||||
inherited create(smart);
|
||||
inherited;
|
||||
InstrWriter := Tx86InstrWriter.create(self);
|
||||
end;
|
||||
|
||||
|
@ -256,7 +256,7 @@ implementation
|
||||
writer.AsmWrite('[');
|
||||
if assigned(symbol) then
|
||||
begin
|
||||
if (target_asm.id = as_i386_tasm) then
|
||||
if (asminfo^.id = as_i386_tasm) then
|
||||
writer.AsmWrite('dword ptr ');
|
||||
writer.AsmWrite(symbol.name);
|
||||
first:=false;
|
||||
@ -269,7 +269,7 @@ implementation
|
||||
first:=false;
|
||||
{$ifdef x86_64}
|
||||
{ ml64 needs [$+foo] instead of [rip+foo] }
|
||||
if (base=NR_RIP) and (target_asm.id=as_x86_64_masm) then
|
||||
if (base=NR_RIP) and (asminfo^.id=as_x86_64_masm) then
|
||||
writer.AsmWrite('$')
|
||||
else
|
||||
{$endif x86_64}
|
||||
@ -398,7 +398,7 @@ implementation
|
||||
begin
|
||||
if o.ref^.refaddr=addr_no then
|
||||
begin
|
||||
if (target_asm.id <> as_i386_tasm) then
|
||||
if (asminfo^.id <> as_i386_tasm) then
|
||||
begin
|
||||
if s=S_FAR then
|
||||
writer.AsmWrite('far ptr ')
|
||||
@ -491,7 +491,7 @@ implementation
|
||||
case hp.typ of
|
||||
ait_comment :
|
||||
Begin
|
||||
writer.AsmWrite(target_asm.comment);
|
||||
writer.AsmWrite(asminfo^.comment);
|
||||
writer.AsmWritePChar(tai_comment(hp).str);
|
||||
writer.AsmLn;
|
||||
End;
|
||||
@ -499,7 +499,7 @@ implementation
|
||||
ait_regalloc :
|
||||
begin
|
||||
if (cs_asm_regalloc in current_settings.globalswitches) then
|
||||
writer.AsmWriteLn(target_asm.comment+'Register '+masm_regname(tai_regalloc(hp).reg)+
|
||||
writer.AsmWriteLn(asminfo^.comment+'Register '+masm_regname(tai_regalloc(hp).reg)+
|
||||
regallocstr[tai_regalloc(hp).ratype]);
|
||||
end;
|
||||
|
||||
@ -513,7 +513,7 @@ implementation
|
||||
begin
|
||||
if tai_section(hp).sectype<>sec_none then
|
||||
begin
|
||||
if target_asm.id=as_x86_64_masm then
|
||||
if asminfo^.id=as_x86_64_masm then
|
||||
begin
|
||||
if LasTSecType<>sec_none then
|
||||
writer.AsmWriteLn(secnamesml64[LasTSecType]+#9#9'ENDS');
|
||||
@ -756,7 +756,7 @@ implementation
|
||||
{ nasm prefers prefix on a line alone
|
||||
writer.AsmWriteln(#9#9+prefix); but not masm PM
|
||||
prefix:=''; }
|
||||
if target_asm.id in [as_i386_nasmcoff,as_i386_nasmwin32,as_i386_nasmwdosx,
|
||||
if asminfo^.id in [as_i386_nasmcoff,as_i386_nasmwin32,as_i386_nasmwdosx,
|
||||
as_i386_nasmelf,as_i386_nasmobj,as_i386_nasmbeos,as_i386_nasmhaiku] then
|
||||
begin
|
||||
writer.AsmWriteln(prefix);
|
||||
@ -765,7 +765,7 @@ implementation
|
||||
end
|
||||
else
|
||||
prefix:= '';
|
||||
if (target_asm.id = as_i386_wasm) and
|
||||
if (asminfo^.id = as_i386_wasm) and
|
||||
(taicpu(hp).opsize=S_W) and
|
||||
(fixed_opcode=A_PUSH) and
|
||||
(taicpu(hp).oper[0]^.typ=top_const) then
|
||||
@ -773,7 +773,7 @@ implementation
|
||||
writer.AsmWriteln(#9#9'DB 66h,68h ; pushw imm16');
|
||||
writer.AsmWrite(#9#9'DW');
|
||||
end
|
||||
else if (target_asm.id=as_x86_64_masm) and
|
||||
else if (asminfo^.id=as_x86_64_masm) and
|
||||
(fixed_opcode=A_MOVQ) then
|
||||
writer.AsmWrite(#9#9'mov')
|
||||
else
|
||||
@ -831,7 +831,7 @@ implementation
|
||||
{$endif i8086}
|
||||
{ I was told that this isn't necesarry because }
|
||||
{ the labels generated by FPC are unique (FK) }
|
||||
{ writer.AsmWriteLn(#9'LOCALS '+target_asm.labelprefix); }
|
||||
{ writer.AsmWriteLn(#9'LOCALS '+asminfo^.labelprefix); }
|
||||
{ TODO: PARA is incorrect, must use actual section align }
|
||||
if lasTSectype<>sec_none then
|
||||
writer.AsmWriteLn('_'+secnames[lasTSectype]+#9#9+
|
||||
@ -880,7 +880,7 @@ implementation
|
||||
sym:=TAsmSymbol(current_asmdata.AsmSymbolDict[i]);
|
||||
if sym.bind=AB_EXTERNAL then
|
||||
begin
|
||||
case target_asm.id of
|
||||
case asminfo^.id of
|
||||
as_i386_masm,
|
||||
as_i386_wasm :
|
||||
writer.AsmWriteln(#9'EXTRN'#9+sym.name+': NEAR');
|
||||
@ -900,7 +900,7 @@ implementation
|
||||
begin
|
||||
DoAssemble:=Inherited DoAssemble;
|
||||
{ masm does not seem to recognize specific extensions and uses .obj allways PM }
|
||||
if (target_asm.id in [as_i386_masm,as_i386_wasm]) then
|
||||
if (asminfo^.id in [as_i386_masm,as_i386_wasm]) then
|
||||
begin
|
||||
masmobjfn:=ChangeFileExt(objfilename,'.obj');
|
||||
if not(cs_asm_extern in current_settings.globalswitches) then
|
||||
@ -923,13 +923,13 @@ implementation
|
||||
if current_module.mainsource<>'' then
|
||||
comment(v_info,'Start writing intel-styled assembler output for '+current_module.mainsource);
|
||||
{$endif}
|
||||
if target_asm.id<>as_x86_64_masm then
|
||||
if asminfo^.id<>as_x86_64_masm then
|
||||
begin
|
||||
writer.AsmWriteLn(#9'.386p');
|
||||
{ masm 6.11 does not seem to like LOCALS PM }
|
||||
if (target_asm.id = as_i386_tasm) then
|
||||
if (asminfo^.id = as_i386_tasm) then
|
||||
begin
|
||||
writer.AsmWriteLn(#9'LOCALS '+target_asm.labelprefix);
|
||||
writer.AsmWriteLn(#9'LOCALS '+asminfo^.labelprefix);
|
||||
end;
|
||||
{$ifdef i8086}
|
||||
writer.AsmWriteLn('DGROUP'#9'GROUP'#9'_BSS,_DATA');
|
||||
@ -942,9 +942,9 @@ implementation
|
||||
|
||||
for hal:=low(TasmlistType) to high(TasmlistType) do
|
||||
begin
|
||||
writer.AsmWriteLn(target_asm.comment+'Begin asmlist '+AsmListTypeStr[hal]);
|
||||
writer.AsmWriteLn(asminfo^.comment+'Begin asmlist '+AsmListTypeStr[hal]);
|
||||
writetree(current_asmdata.asmlists[hal]);
|
||||
writer.AsmWriteLn(target_asm.comment+'End asmlist '+AsmListTypeStr[hal]);
|
||||
writer.AsmWriteLn(asminfo^.comment+'End asmlist '+AsmListTypeStr[hal]);
|
||||
end;
|
||||
|
||||
{ better do this at end of WriteTree, but then there comes a trouble with
|
||||
@ -952,7 +952,7 @@ implementation
|
||||
|
||||
if LastSecType <> sec_none then
|
||||
begin
|
||||
if target_asm.id=as_x86_64_masm then
|
||||
if asminfo^.id=as_x86_64_masm then
|
||||
writer.AsmWriteLn(secnamesml64[LasTSecType]+#9#9'ENDS')
|
||||
else
|
||||
writer.AsmWriteLn('_'+secnames[LasTSecType]+#9#9'ENDS');
|
||||
|
@ -668,7 +668,7 @@ interface
|
||||
case hp.typ of
|
||||
ait_comment :
|
||||
Begin
|
||||
writer.AsmWrite(target_asm.comment);
|
||||
writer.AsmWrite(asminfo^.comment);
|
||||
writer.AsmWritePChar(tai_comment(hp).str);
|
||||
writer.AsmLn;
|
||||
End;
|
||||
@ -676,7 +676,7 @@ interface
|
||||
ait_regalloc :
|
||||
begin
|
||||
if (cs_asm_regalloc in current_settings.globalswitches) then
|
||||
writer.AsmWriteLn(#9#9+target_asm.comment+'Register '+nasm_regname(tai_regalloc(hp).reg)+' '+
|
||||
writer.AsmWriteLn(#9#9+asminfo^.comment+'Register '+nasm_regname(tai_regalloc(hp).reg)+' '+
|
||||
regallocstr[tai_regalloc(hp).ratype]);
|
||||
end;
|
||||
|
||||
@ -743,7 +743,7 @@ interface
|
||||
aitconst_sleb128bit,
|
||||
aitconst_128bit:
|
||||
begin
|
||||
writer.AsmWriteLn(target_asm.comment+'Unsupported const type '+
|
||||
writer.AsmWriteLn(asminfo^.comment+'Unsupported const type '+
|
||||
ait_const2str[consttype]);
|
||||
end;
|
||||
{$ifdef i8086}
|
||||
@ -963,7 +963,7 @@ interface
|
||||
assigned(taicpu(hp).oper[1]^.ref^.symbol) and
|
||||
(taicpu(hp).oper[1]^.ref^.base=NR_NO)) then
|
||||
begin
|
||||
writer.AsmWrite(target_asm.comment);
|
||||
writer.AsmWrite(asminfo^.comment);
|
||||
writer.AsmWriteln('Converting LEA to MOV instruction');
|
||||
taicpu(hp).opcode:=A_MOV;
|
||||
end;
|
||||
@ -1082,10 +1082,10 @@ interface
|
||||
ait_varloc:
|
||||
begin
|
||||
if tai_varloc(hp).newlocationhi<>NR_NO then
|
||||
writer.AsmWriteLn(target_asm.comment+'Var '+tai_varloc(hp).varsym.realname+' located in register '+
|
||||
writer.AsmWriteLn(asminfo^.comment+'Var '+tai_varloc(hp).varsym.realname+' located in register '+
|
||||
std_regname(tai_varloc(hp).newlocationhi)+':'+std_regname(tai_varloc(hp).newlocation))
|
||||
else
|
||||
writer.AsmWriteLn(target_asm.comment+'Var '+tai_varloc(hp).varsym.realname+' located in register '+
|
||||
writer.AsmWriteLn(asminfo^.comment+'Var '+tai_varloc(hp).varsym.realname+' located in register '+
|
||||
std_regname(tai_varloc(hp).newlocation));
|
||||
end;
|
||||
else
|
||||
@ -1168,9 +1168,9 @@ interface
|
||||
begin
|
||||
if not (current_asmdata.asmlists[hal].empty) then
|
||||
begin
|
||||
writer.AsmWriteLn(target_asm.comment+'Begin asmlist '+AsmListTypeStr[hal]);
|
||||
writer.AsmWriteLn(asminfo^.comment+'Begin asmlist '+AsmListTypeStr[hal]);
|
||||
writetree(current_asmdata.asmlists[hal]);
|
||||
writer.AsmWriteLn(target_asm.comment+'End asmlist '+AsmListTypeStr[hal]);
|
||||
writer.AsmWriteLn(asminfo^.comment+'End asmlist '+AsmListTypeStr[hal]);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user