Browse Source

+ ARM: basic vasm support

git-svn-id: trunk@49347 -
florian 4 years ago
parent
commit
4ab310e0ed
4 changed files with 142 additions and 0 deletions
  1. 1 0
      .gitattributes
  2. 136 0
      compiler/arm/agarmvasm.pas
  3. 4 0
      compiler/arm/cputarg.pas
  4. 1 0
      compiler/systems.inc

+ 1 - 0
.gitattributes

@@ -64,6 +64,7 @@ compiler/aoptobj.pas svneol=native#text/plain
 compiler/aoptutils.pas svneol=native#text/pascal
 compiler/aoptutils.pas svneol=native#text/pascal
 compiler/arm/aasmcpu.pas svneol=native#text/plain
 compiler/arm/aasmcpu.pas svneol=native#text/plain
 compiler/arm/agarmgas.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/aoptcpu.pas svneol=native#text/plain
 compiler/arm/aoptcpub.pas svneol=native#text/plain
 compiler/arm/aoptcpub.pas svneol=native#text/plain
 compiler/arm/aoptcpud.pas svneol=native#text/plain
 compiler/arm/aoptcpud.pas svneol=native#text/plain

+ 136 - 0
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.

+ 4 - 0
compiler/arm/cputarg.pas

@@ -81,6 +81,10 @@ implementation
       ,agarmgas
       ,agarmgas
     {$endif}
     {$endif}
 
 
+    {$ifndef Noagrmvasm}
+      ,agarmvasm
+    {$endif Noagarmvasm}
+
       ,ogcoff
       ,ogcoff
       ,ogelf
       ,ogelf
       ,cpuelf
       ,cpuelf

+ 1 - 0
compiler/systems.inc

@@ -266,6 +266,7 @@
              ,as_z80_rel
              ,as_z80_rel
              ,as_wasm32_wabt
              ,as_wasm32_wabt
              ,as_wasm32_llvm_mc        { WebAssembly code assembled by llvm-mc (llvm machine code playground) }
              ,as_wasm32_llvm_mc        { WebAssembly code assembled by llvm-mc (llvm machine code playground) }
+             ,as_arm_vasm
        );
        );
 
 
        tlink = (ld_none,
        tlink = (ld_none,