Selaa lähdekoodia

Set defdynlinker depending on selected ABI for riscv32 and riscv64

Pierre Muller 2 vuotta sitten
vanhempi
commit
7c64bce04e
1 muutettua tiedostoa jossa 43 lisäystä ja 2 poistoa
  1. 43 2
      compiler/systems/t_linux.pas

+ 43 - 2
compiler/systems/t_linux.pas

@@ -267,11 +267,20 @@ const defdynlinker='/lib/ld-linux-aarch64.so.1';
 {$endif sparc64}
 
 {$ifdef riscv32}
-  const defdynlinker='/lib32/ld.so.1';
+  const defdynlinker_generic='/lib32/ld.so.1';
+  const defdynlinker_soft_float='/lib/ld-linux-riscv32-ilp32.so.1';
+  const defdynlinker_single_float='/lib/ld-linux-riscv32-ilp32f.so.1';
+  const defdynlinker_double_float='/lib/ld-linux-riscv32-ilp32d.so.1';
+  { const defdynlinker_quad_float='/lib/ld-linux-riscv32-ilp32q.so.1'; not yet in ABI list }
+  var defdynlinker : string;
 {$endif riscv32}
 
 {$ifdef riscv64}
-  const defdynlinker='/lib/ld-linux-riscv64-lp64d.so.1';
+  const defdynlinker_soft_float='/lib/ld-linux-riscv64-lp64.so.1';
+  const defdynlinker_single_float='/lib/ld-linux-riscv64-lp64f.so.1';
+  const defdynlinker_double_float='/lib/ld-linux-riscv64-lp64d.so.1';
+  { const defdynlinker_quad_float='/lib/ld-linux-riscv64-lp64q.so.1'; not yet in ABI list }
+  var defdynlinker : string;
 {$endif riscv64}
 
 {$ifdef xtensa}
@@ -291,6 +300,38 @@ begin
     else
       defdynlinker:=defdynlinkerv2;
 {$endif powerpc64}
+{$ifdef riscv32}
+  if defdynlinker='' then
+    begin
+      case target_info.abi of
+        abi_riscv_ilp32:
+          defdynlinker:=defdynlinker_soft_float;
+        abi_riscv_ilp32f:
+          defdynlinker:=defdynlinker_single_float;
+        abi_riscv_hf,
+        abi_riscv_ilp32d:
+          defdynlinker:=defdynlinker_double_float;
+      else
+        defdynlinker:=defdynlinker_generic;
+      end;
+    end;
+{$endif riscv32}
+{$ifdef riscv64}
+  if defdynlinker='' then
+    begin
+      case target_info.abi of
+        abi_riscv_lp64:
+          defdynlinker:=defdynlinker_soft_float;
+        abi_riscv_lp64f:
+          defdynlinker:=defdynlinker_single_float;
+        abi_riscv_hf,
+        abi_riscv_lp64d:
+          defdynlinker:=defdynlinker_double_float;
+      else
+        defdynlinker:=defdynlinker_double_float;
+      end;
+    end;
+{$endif riscv64}
   {
     Search order:
     glibc 2.1+