]> granicus.if.org Git - clang/commitdiff
[RISCV] Add FreeBSD targets
authorSam Elliott <selliott@lowrisc.org>
Thu, 1 Aug 2019 13:14:30 +0000 (13:14 +0000)
committerSam Elliott <selliott@lowrisc.org>
Thu, 1 Aug 2019 13:14:30 +0000 (13:14 +0000)
Reviewers: asb

Reviewed By: asb

Subscribers: simoncook, s.egerton, lenary, psnobl, benna, mhorne, emaste, kito-cheng, shiva0217, rogfer01, rkruppe, cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D57795

Patch by James Clarke (jrtc27)

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@367557 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Basic/Targets.cpp
lib/Driver/ToolChains/FreeBSD.cpp
test/Driver/freebsd.c

index a08e399e72700d47a5a5c38c9d5d9b1da922b86c..63a64ed2931a84b7f46eeb53b93a69dfeb269578 100644 (file)
@@ -363,15 +363,26 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple,
     return new AMDGPUTargetInfo(Triple, Opts);
 
   case llvm::Triple::riscv32:
-    // TODO: add cases for FreeBSD, NetBSD, RTEMS once tested.
-    if (os == llvm::Triple::Linux)
+    // TODO: add cases for NetBSD, RTEMS once tested.
+    switch (os) {
+    case llvm::Triple::FreeBSD:
+      return new FreeBSDTargetInfo<RISCV32TargetInfo>(Triple, Opts);
+    case llvm::Triple::Linux:
       return new LinuxTargetInfo<RISCV32TargetInfo>(Triple, Opts);
-    return new RISCV32TargetInfo(Triple, Opts);
+    default:
+      return new RISCV32TargetInfo(Triple, Opts);
+    }
+
   case llvm::Triple::riscv64:
-    // TODO: add cases for FreeBSD, NetBSD, RTEMS once tested.
-    if (os == llvm::Triple::Linux)
+    // TODO: add cases for NetBSD, RTEMS once tested.
+    switch (os) {
+    case llvm::Triple::FreeBSD:
+      return new FreeBSDTargetInfo<RISCV64TargetInfo>(Triple, Opts);
+    case llvm::Triple::Linux:
       return new LinuxTargetInfo<RISCV64TargetInfo>(Triple, Opts);
-    return new RISCV64TargetInfo(Triple, Opts);
+    default:
+      return new RISCV64TargetInfo(Triple, Opts);
+    }
 
   case llvm::Triple::sparc:
     switch (os) {
index 3a0bab8d07f52f10e5c1dbc534645abd5428a07e..e5542738d4d474f51dc8fd65087cb1572007a154 100644 (file)
@@ -197,6 +197,14 @@ void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
     else
       CmdArgs.push_back("elf64ltsmip_fbsd");
     break;
+  case llvm::Triple::riscv32:
+    CmdArgs.push_back("-m");
+    CmdArgs.push_back("elf32lriscv");
+    break;
+  case llvm::Triple::riscv64:
+    CmdArgs.push_back("-m");
+    CmdArgs.push_back("elf64lriscv");
+    break;
   default:
     break;
   }
index c772101233d2cf3bc18d06dcff1458d2e374e5e0..4a0a6bf5f39ce09966a63948e1db21bd485d30ba 100644 (file)
 // RUN:   | FileCheck --check-prefix=CHECK-MIPSN32EL-LD %s
 // CHECK-MIPSN32EL-LD: ld{{.*}}" {{.*}} "-m" "elf32ltsmipn32_fbsd"
 //
+// Check that RISC-V passes the correct linker emulation.
+//
+// RUN: %clang -target riscv32-freebsd %s -### %s 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-RV32I-LD %s
+// CHECK-RV32I-LD: ld{{.*}}" {{.*}} "-m" "elf32lriscv"
+// RUN: %clang -target riscv64-freebsd %s -### %s 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-RV64I-LD %s
+// CHECK-RV64I-LD: ld{{.*}}" {{.*}} "-m" "elf64lriscv"
+//
 // Check that the new linker flags are passed to FreeBSD
 // RUN: %clang -no-canonical-prefixes -target x86_64-pc-freebsd8 -m32 %s \
 // RUN:   --sysroot=%S/Inputs/multiarch_freebsd64_tree -### 2>&1 \