浏览代码

LLVM: separate as_clang_llvm_darwin

The Darwin local label prefix ('L') is different from that on most other
platforms ('.L). While LLVM generally handles that for us, for inline
assembly it's still FPC's job to adhere to the target conventions.
Jonas Maebe 3 年之前
父节点
当前提交
16cb409fbf
共有 5 个文件被更改,包括 28 次插入6 次删除
  1. 2 2
      compiler/assemble.pas
  2. 16 1
      compiler/llvm/agllvm.pas
  3. 8 2
      compiler/options.pas
  4. 1 0
      compiler/systems.inc
  5. 1 1
      compiler/systems.pas

+ 2 - 2
compiler/assemble.pas

@@ -785,7 +785,7 @@ Implementation
 {$ifdef hasunix}
         DoPipe:=(cs_asm_pipe in current_settings.globalswitches) and
                 (([cs_asm_extern,cs_asm_leave,cs_assemble_on_target] * current_settings.globalswitches) = []) and
-                ((asminfo^.id in [as_gas,as_ggas,as_darwin,as_powerpc_xcoff,as_clang_gas,as_clang_llvm,as_solaris_as,as_clang_asdarwin]));
+                ((asminfo^.id in [as_gas,as_ggas,as_darwin,as_powerpc_xcoff,as_clang_gas,as_clang_llvm,as_clang_llvm_darwin,as_solaris_as,as_clang_asdarwin]));
 {$else hasunix}
         DoPipe:=false;
 {$endif}
@@ -985,7 +985,7 @@ Implementation
          begin
 {$ifdef hasunix}
           if DoPipe then
-            if not(asminfo^.id in [as_clang_gas,as_clang_asdarwin,as_clang_llvm]) then
+            if not(asminfo^.id in [as_clang_gas,as_clang_asdarwin,as_clang_llvm,as_clang_llvm_darwin]) then
               Replace(result,'$ASM','')
             else
               Replace(result,'$ASM','-')

+ 16 - 1
compiler/llvm/agllvm.pas

@@ -1753,7 +1753,7 @@ implementation
           idtxt  : 'CLANG-LLVM';
           asmbin : 'clang';
           asmcmd: '-x ir $OPT -target $TRIPLET -c -o $OBJ $ASM $EXTRAOPT';
-          supported_targets : [system_x86_64_linux,system_x86_64_darwin,system_aarch64_darwin,system_aarch64_linux,system_arm_linux];
+          supported_targets : [system_x86_64_linux,system_aarch64_linux,system_arm_linux];
           flags : [af_smartlink_sections,af_llvm];
           labelprefix : '.L';
           labelmaxlen : -1;
@@ -1761,6 +1761,21 @@ implementation
           dollarsign: '$';
         );
 
+     as_clang_llvm_darwin_info : tasminfo =
+        (
+          id     : as_clang_llvm_darwin;
+          idtxt  : 'CLANG-LLVM-DARWIN';
+          asmbin : 'clang';
+          asmcmd: '-x ir $OPT -target $TRIPLET -c -o $OBJ $ASM $EXTRAOPT';
+          supported_targets : [system_x86_64_darwin,system_aarch64_darwin];
+          flags : [af_smartlink_sections,af_llvm];
+          labelprefix : 'L';
+          labelmaxlen : -1;
+          comment : '; ';
+          dollarsign: '$';
+        );
+
 begin
   RegisterAssembler(as_clang_llvm_info,TLLVMClangAssember);
+  RegisterAssembler(as_clang_llvm_darwin_info,TLLVMClangAssember);
 end.

+ 8 - 2
compiler/options.pas

@@ -4688,7 +4688,10 @@ begin
   { default to clang }
   if (option.paratargetasm=as_none) then
     begin
-      option.paratargetasm:=as_clang_llvm;
+      if not(target_info.system in systems_darwin) then
+        option.paratargetasm:=as_clang_llvm
+      else
+        option.paratargetasm:=as_clang_llvm_darwin;
     end;
 {$endif llvm}
   { maybe override assembler }
@@ -4740,7 +4743,10 @@ begin
    begin
      Message(option_switch_bin_to_src_assembler);
 {$ifdef llvm}
-     set_target_asm(as_clang_llvm);
+     if not(target_info.system in systems_darwin) then
+       set_target_asm(as_clang_llvm)
+     else
+       set_target_asm(as_clang_llvm_darwin);
 {$else}
      set_target_asm(target_info.assemextern);
 {$endif}

+ 1 - 0
compiler/systems.inc

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

+ 1 - 1
compiler/systems.pas

@@ -84,7 +84,7 @@ interface
        pasminfo = ^tasminfo;
        tasminfo = record
           id          : tasm;
-          idtxt       : string[12];
+          idtxt       : string[17];
           asmbin      : string[16];
           asmcmd      : string[121];
           supported_targets : set of tsystem;