diff --git a/.gitattributes b/.gitattributes index 196fae90b91..7b3dd1d7e7e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -64,6 +64,7 @@ compiler/aoptobj.pas svneol=native#text/plain compiler/aoptutils.pas svneol=native#text/pascal compiler/arm/aasmcpu.pas svneol=native#text/plain compiler/arm/agarmgas.pas svneol=native#text/plain +compiler/arm/agarmvasm.pas svneol=native#text/pascal compiler/arm/aoptcpu.pas svneol=native#text/plain compiler/arm/aoptcpub.pas svneol=native#text/plain compiler/arm/aoptcpud.pas svneol=native#text/plain diff --git a/compiler/arm/agarmvasm.pas b/compiler/arm/agarmvasm.pas new file mode 100644 index 00000000000..e903e1b298f --- /dev/null +++ b/compiler/arm/agarmvasm.pas @@ -0,0 +1,136 @@ +{ + Copyright (c) 2016 by the Free Pascal development team + + This unit is the VASM assembler writer for ARM + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + **************************************************************************** +} + +unit agarmvasm; + +{$i fpcdefs.inc} + + interface + + uses + aasmbase,systems, + aasmtai,aasmdata, + assemble,aggas,agarmgas, + cpubase,cgutils, + globtype; + + type + TARMVASM = class(TARMGNUAssembler) + protected + function sectionattrs(atype:TAsmSectiontype):string; override; + public + constructor CreateWithWriter(info: pasminfo; wr: TExternalAssemblerOutputFile; freewriter, smart: boolean); override; + function MakeCmdLine: TCmdStr; override; + end; + + implementation + + uses + cutils,cfileutl,globals,verbose, + cgbase, + cscript, + itcpugas,cpuinfo, + aasmcpu; + + +{****************************************************************************} +{ VASM m68k Assembler writer } +{****************************************************************************} + + + constructor TARMVASM.CreateWithWriter(info: pasminfo; wr: TExternalAssemblerOutputFile; freewriter, smart: boolean); + begin + inherited; + InstrWriter := TARMInstrWriter.create(self); + end; + + function TARMVASM.sectionattrs(atype:TAsmSectiontype):string; + begin + case atype of + sec_code, sec_fpc, sec_init, sec_fini: + result:='acrx'; + { map sec_rodata as read-write, otherwise the linker (vlink) complains if it + has to write into the relocations in a rodata section. (KB) } + sec_data, sec_rodata: + result:='adrw'; + sec_rodata_norel: + case target_info.system of + { stop vlink from complaining when it merges ro sections into rw ones (KB) } + system_m68k_atari: result:='adrw'; + system_m68k_amiga: result:='adrw'; + else + result:='adr'; + end; + sec_bss, sec_threadvar: + result:='aurw'; + sec_stab, sec_stabstr: + result:='dr'; + else + result:=''; + end; + end; + + function TARMVASM.MakeCmdLine: TCmdStr; + var + objtype: string; + begin + result:=asminfo^.asmcmd; + + case target_info.system of + { a.out doesn't support named sections, lets use ELF for interoperability } + system_arm_linux: objtype:='-Felf'; + else + internalerror(2016052601); + end; + + Replace(result,'$ASM',maybequoted(ScriptFixFileName(AsmFileName))); + Replace(result,'$OBJ',maybequoted(ScriptFixFileName(ObjFileName))); + Replace(result,'$ARCH','-m'+cputype_to_gas_march[current_settings.cputype]); + Replace(result,'$OTYPE',objtype); + Replace(result,'$EXTRAOPT',asmextraopt); + end; + + + +{***************************************************************************** + Initialize +*****************************************************************************} + + const + as_arm_vasm_info : tasminfo = + ( + id : as_arm_vasm; + + idtxt : 'VASM'; + asmbin : 'vasmarm_std'; + asmcmd: '-quiet -elfregs -gas $OTYPE $ARCH -o $OBJ $EXTRAOPT $ASM'; + supported_targets : [system_arm_linux]; + flags : [af_needar,af_smartlink_sections]; + labelprefix : '.L'; + labelmaxlen : -1; + comment : '# '; + dollarsign: '$'; + ); + +begin + RegisterAssembler(as_arm_vasm_info,TARMVASM); +end. diff --git a/compiler/arm/cputarg.pas b/compiler/arm/cputarg.pas index 5e3f3c31a65..de7aa01c524 100644 --- a/compiler/arm/cputarg.pas +++ b/compiler/arm/cputarg.pas @@ -81,6 +81,10 @@ implementation ,agarmgas {$endif} + {$ifndef Noagrmvasm} + ,agarmvasm + {$endif Noagarmvasm} + ,ogcoff ,ogelf ,cpuelf diff --git a/compiler/systems.inc b/compiler/systems.inc index 446d6a5f4e2..70bc884f49d 100644 --- a/compiler/systems.inc +++ b/compiler/systems.inc @@ -266,6 +266,7 @@ ,as_z80_rel ,as_wasm32_wabt ,as_wasm32_llvm_mc { WebAssembly code assembled by llvm-mc (llvm machine code playground) } + ,as_arm_vasm ); tlink = (ld_none,