gollvm: encode platform info in CallingConvId

Previously gollvm encodes platform info in llvm::CallingConv::Id which
may not be unique among all platforms. Replacing it with a local enum
solves the problem.

Change-Id: Ief01878a8c0b3a1200b575087196a758314c5c22
Reviewed-on: https://go-review.googlesource.com/c/gollvm/+/427737
Reviewed-by: Ian Lance Taylor <iant@google.com>
Reviewed-by: Than McIntosh <thanm@google.com>
diff --git a/README.md b/README.md
index 0c563c9..1ba6551 100644
--- a/README.md
+++ b/README.md
@@ -218,7 +218,7 @@
   Type *ft = Type::getFloatTy(C);
   Type *dt = Type::getDoubleTy(C);
 
-  std::unique_ptr<Backend> be(go_get_backend(C, llvm::CallingConv::X86_64_SysV));
+  std::unique_ptr<Backend> be(go_get_backend(C, gollvm::driver::CallingConvId::X86_64_SysV));
   Btype *c32 = be->complex_type(64);
   ASSERT_TRUE(c32 != NULL);
   ASSERT_EQ(c32->type(), mkTwoFieldLLvmStruct(C, ft, ft));
diff --git a/bridge/CMakeLists.txt b/bridge/CMakeLists.txt
index 29b71c1..e4bc389 100644
--- a/bridge/CMakeLists.txt
+++ b/bridge/CMakeLists.txt
@@ -61,4 +61,4 @@
 
 include_directories(${EXTINSTALLDIR}/include)
 include_directories(${GOFRONTEND_SOURCE_DIR})
-
+include_directories(${DRIVER_UTILS_SOURCE_DIR})
diff --git a/bridge/go-llvm-backend.h b/bridge/go-llvm-backend.h
index 9c7f7e4..bb0bf0d 100644
--- a/bridge/go-llvm-backend.h
+++ b/bridge/go-llvm-backend.h
@@ -19,6 +19,6 @@
 
 class Backend;
 
-extern Backend *go_get_backend(llvm::LLVMContext &Context, llvm::CallingConv::ID cconv);
+extern Backend *go_get_backend(llvm::LLVMContext &Context, gollvm::driver::CallingConvId cconv);
 
 #endif // !defined(GO_LLVM_BACKEND_H)
diff --git a/bridge/go-llvm-cabi-oracle.cpp b/bridge/go-llvm-cabi-oracle.cpp
index 45c2406..7ba851f 100644
--- a/bridge/go-llvm-cabi-oracle.cpp
+++ b/bridge/go-llvm-cabi-oracle.cpp
@@ -16,6 +16,8 @@
 #include "llvm/IR/DataLayout.h"
 #include "llvm/Support/raw_ostream.h"
 
+#include "CallingConv.h"
+
 //......................................................................
 
 // Given an LLVM type, classify it according to whether it would
@@ -146,12 +148,12 @@
     : typeManager_(tmgr)
 {
   explode(bt);
-  llvm::CallingConv::ID cconv = tmgr->callingConv();
+  gollvm::driver::CallingConvId cconv = tmgr->callingConv();
   switch (cconv) {
-  case llvm::CallingConv::X86_64_SysV:
+  case gollvm::driver::CallingConvId::X86_64_SysV:
     determineABITypesForX86_64_SysV();
     break;
-  case llvm::CallingConv::ARM_AAPCS:
+  case gollvm::driver::CallingConvId::ARM_AAPCS:
     setHFA();
     if (getHFA().number == 0 && tmgr->typeSize(bt) <= 16) {
       // For HFA and indirect cases, we don't need do this.
@@ -159,7 +161,7 @@
     }
     break;
   default:
-    llvm::errs() << "unsupported llvm::CallingConv::ID " << cconv << "\n";
+    llvm::errs() << "unsupported gollvm::driver::CallingConvId " << static_cast<int>(cconv) << "\n";
     break;
   }
 }
@@ -544,18 +546,18 @@
 public:
   ABIState(TypeManager *typm) : argCount_(0) {
     assert(typm != nullptr);
-    llvm::CallingConv::ID cconv = typm->callingConv();
+    gollvm::driver::CallingConvId cconv = typm->callingConv();
     switch (cconv) {
-    case llvm::CallingConv::X86_64_SysV:
+    case gollvm::driver::CallingConvId::X86_64_SysV:
       availIntRegs_ = 6;
       availSSERegs_ = 8;
       break;
-    case llvm::CallingConv::ARM_AAPCS:
+    case gollvm::driver::CallingConvId::ARM_AAPCS:
       availIntRegs_ = 8;
       availSIMDFPRegs_ = 8;
       break;
     default:
-      llvm::errs() << "unsupported llvm::CallingConv::ID " << cconv << "\n";
+      llvm::errs() << "unsupported gollvm::driver::CallingConvId " << static_cast<int>(cconv) << "\n";
       break;
     }
   }
@@ -610,7 +612,7 @@
     , fcnTypeForABI_(nullptr)
     , typeManager_(typeManager)
     , followsCabi_(followsCabi)
-    , ccID_(llvm::CallingConv::MaxID)
+    , ccID_(gollvm::driver::CallingConvId::MaxID)
     , cc_(nullptr)
 {
   setCC();
@@ -624,7 +626,7 @@
     , fcnTypeForABI_(nullptr)
     , typeManager_(typeManager)
     , followsCabi_(ft->followsCabi())
-    , ccID_(llvm::CallingConv::MaxID)
+    , ccID_(gollvm::driver::CallingConvId::MaxID)
     , cc_(nullptr)
 {
   setCC();
@@ -636,21 +638,22 @@
   assert(typeManager_ != nullptr);
   ccID_ = typeManager_->callingConv();
   // Supported architectures at present.
-  assert(ccID_ == llvm::CallingConv::X86_64_SysV ||
-         ccID_ == llvm::CallingConv::ARM_AAPCS);
+  assert(ccID_ == gollvm::driver::CallingConvId::X86_64_SysV ||
+         ccID_ == gollvm::driver::CallingConvId::ARM_AAPCS ||
+         ccID_ == gollvm::driver::CallingConvId::RISCV64_C);
 
   if (cc_ != nullptr) {
     return;
   }
   switch (ccID_) {
-  case llvm::CallingConv::X86_64_SysV:
+  case gollvm::driver::CallingConvId::X86_64_SysV:
     cc_ = std::unique_ptr<CABIOracleArgumentAnalyzer>(new CABIOracleX86_64_SysV(typeManager_));
     break;
-  case llvm::CallingConv::ARM_AAPCS:
+  case gollvm::driver::CallingConvId::ARM_AAPCS:
     cc_ = std::unique_ptr<CABIOracleArgumentAnalyzer>(new CABIOracleARM_AAPCS(typeManager_));
     break;
   default:
-    llvm::errs() << "unsupported llvm::CallingConv::ID " << ccID_ << "\n";
+    llvm::errs() << "unsupported gollvm::driver::CallingConvId " << static_cast<int>(ccID_) << "\n";
     break;
   }
 }
diff --git a/bridge/go-llvm-cabi-oracle.h b/bridge/go-llvm-cabi-oracle.h
index c186c38..86b79f5 100644
--- a/bridge/go-llvm-cabi-oracle.h
+++ b/bridge/go-llvm-cabi-oracle.h
@@ -20,8 +20,8 @@
 #ifndef LLVMGOFRONTEND_GO_LLVM_CABI_ORACLE_H
 #define LLVMGOFRONTEND_GO_LLVM_CABI_ORACLE_H
 
+#include "CallingConv.h"
 #include "go-llvm-btype.h"
-#include "llvm/IR/CallingConv.h"
 
 class TypeManager;
 class EightByteInfo;
@@ -198,7 +198,7 @@
   TypeManager *typeManager_;
   std::vector<CABIParamInfo> infov_;
   bool followsCabi_;
-  llvm::CallingConv::ID ccID_;
+  gollvm::driver::CallingConvId ccID_;
   std::unique_ptr<CABIOracleArgumentAnalyzer> cc_;
 
   // The main entry for cabi analysis.
diff --git a/bridge/go-llvm-typemanager.cpp b/bridge/go-llvm-typemanager.cpp
index ba57edc..4301233 100644
--- a/bridge/go-llvm-typemanager.cpp
+++ b/bridge/go-llvm-typemanager.cpp
@@ -23,7 +23,7 @@
 #include "llvm/IR/Type.h"
 
 TypeManager::TypeManager(llvm::LLVMContext &context,
-                         llvm::CallingConv::ID conv,
+                         gollvm::driver::CallingConvId conv,
                          unsigned addrspace)
     : context_(context)
     , datalayout_(nullptr)
diff --git a/bridge/go-llvm-typemanager.h b/bridge/go-llvm-typemanager.h
index 789b5d5..d77a3ab 100644
--- a/bridge/go-llvm-typemanager.h
+++ b/bridge/go-llvm-typemanager.h
@@ -20,7 +20,7 @@
 #include "namegen.h"
 #include "backend.h"
 
-#include "llvm/IR/CallingConv.h"
+#include "CallingConv.h"
 
 namespace llvm {
 class DataLayout;
@@ -43,7 +43,7 @@
 class TypeManager {
  public:
   TypeManager(llvm::LLVMContext &context,
-              llvm::CallingConv::ID cconv,
+              gollvm::driver::CallingConvId cconv,
               unsigned addrspace);
   ~TypeManager();
 
@@ -246,7 +246,7 @@
   const llvm::DataLayout *datalayout() const { return datalayout_; }
 
   // Calling convention
-  llvm::CallingConv::ID callingConv() const { return cconv_; }
+  gollvm::driver::CallingConvId callingConv() const { return cconv_; }
 
   // For named types, this returns the declared type name. If a type
   // is unnamed, then it returns a stringified representation of the
@@ -287,7 +287,7 @@
   // Context information needed for the LLVM backend.
   llvm::LLVMContext &context_;
   const llvm::DataLayout *datalayout_;
-  llvm::CallingConv::ID cconv_;
+  gollvm::driver::CallingConvId cconv_;
   unsigned addressSpace_;
   unsigned traceLevel_;
 
diff --git a/bridge/go-llvm.cpp b/bridge/go-llvm.cpp
index 312b38b..8ee5a24 100644
--- a/bridge/go-llvm.cpp
+++ b/bridge/go-llvm.cpp
@@ -45,7 +45,7 @@
                            Llvm_linemap *linemap,
                            unsigned addrspace,
                            llvm::Triple triple,
-                           llvm::CallingConv::ID cconv)
+                           gollvm::driver::CallingConvId cconv)
     : TypeManager(context, cconv, addrspace)
     , context_(context)
     , module_(module)
@@ -83,16 +83,21 @@
   if (!module_) {
     ownModule_.reset(new llvm::Module("gomodule", context));
     switch (cconv) {
-      case llvm::CallingConv::X86_64_SysV:
+      case gollvm::driver::CallingConvId::X86_64_SysV:
         ownModule_->setTargetTriple("x86_64-unknown-linux-gnu");
         ownModule_->setDataLayout("e-m:e-i64:64-f80:128-n8:16:32:64-S128");
         triple_ = llvm::Triple("x86_64-unknown-linux-gnu");
         break;
-      case llvm::CallingConv::ARM_AAPCS:
+      case gollvm::driver::CallingConvId::ARM_AAPCS:
         ownModule_->setTargetTriple("aarch64-unknown-linux-gnu");
         ownModule_->setDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
         triple_ = llvm::Triple("aarch64-unknown-linux-gnu");
         break;
+      case gollvm::driver::CallingConvId::RISCV64_C:
+        ownModule_->setTargetTriple("riscv64-unknown-linux-gnu");
+        ownModule_->setDataLayout("e-m:e-p:64:64-i64:64-i128:128-n64-S128");
+        triple_ = llvm::Triple("riscv64-unknown-linux-gnu");
+        break;
       default:
         std::cerr <<"Unsupported calling convention\n";
     }
@@ -4158,6 +4163,6 @@
 
 // Return a new backend generator.
 
-Backend *go_get_backend(llvm::LLVMContext &context, llvm::CallingConv::ID cconv) {
+Backend *go_get_backend(llvm::LLVMContext &context, gollvm::driver::CallingConvId cconv) {
   return new Llvm_backend(context, nullptr, nullptr, 0, llvm::Triple(), cconv);
 }
diff --git a/bridge/go-llvm.h b/bridge/go-llvm.h
index 880ae39..cd4d855 100644
--- a/bridge/go-llvm.h
+++ b/bridge/go-llvm.h
@@ -82,7 +82,7 @@
                unsigned addrspace,
                llvm::Triple triple,
                /* Temporarily set the parameter as optional to workaround the unit tests. */
-               llvm::CallingConv::ID cconv=llvm::CallingConv::X86_64_SysV);
+               gollvm::driver::CallingConvId cconv=gollvm::driver::CallingConvId::X86_64_SysV);
   ~Llvm_backend();
 
   // Types.
diff --git a/driver/CallingConv.h b/driver/CallingConv.h
new file mode 100644
index 0000000..cfd791f
--- /dev/null
+++ b/driver/CallingConv.h
@@ -0,0 +1,25 @@
+//===-- CallingConv.h -----------------------------------------------------===//
+//
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+//
+//===----------------------------------------------------------------------===//
+//
+// Defines the CallingConvId type.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef GOLLVM_DRIVER_CALLINGCONV_H
+#define GOLLVM_DRIVER_CALLINGCONV_H
+
+namespace gollvm {
+namespace driver {
+
+// Used inplace of llvm::CallingConv::Id which does not record arch and cpu
+enum class CallingConvId { X86_64_SysV, ARM_AAPCS, RISCV64_C, MaxID };
+
+} // end namespace driver
+} // end namespace gollvm
+
+#endif // GOLLVM_DRIVER_CALLINGCONV_H
diff --git a/driver/CompileGo.cpp b/driver/CompileGo.cpp
index b317c9b..3312a7a 100644
--- a/driver/CompileGo.cpp
+++ b/driver/CompileGo.cpp
@@ -24,6 +24,7 @@
 #include "Action.h"
 #include "ArchCpuSetup.h"
 #include "Artifact.h"
+#include "CallingConv.h"
 #include "Driver.h"
 #include "ToolChain.h"
 
@@ -105,7 +106,7 @@
   Triple triple_;
   const ToolChain &toolchain_;
   Driver &driver_;
-  CallingConv::ID cconv_;
+  CallingConvId cconv_;
   LLVMContext context_;
   const char *progname_;
   std::string executablePath_;
@@ -154,7 +155,7 @@
       triple_(tc.driver().triple()),
       toolchain_(tc),
       driver_(tc.driver()),
-      cconv_(CallingConv::MaxID),
+      cconv_(CallingConvId::MaxID),
       progname_(tc.driver().progname()),
       executablePath_(executablePath),
       args_(tc.driver().args()),
@@ -723,10 +724,13 @@
   assert(triple_.getArch() != Triple::UnknownArch);
   switch (triple_.getArch()) {
     case Triple::x86_64:
-      cconv_ = CallingConv::X86_64_SysV;
+      cconv_ = CallingConvId::X86_64_SysV;
       break;
     case Triple::aarch64:
-      cconv_ = CallingConv::ARM_AAPCS;
+      cconv_ = CallingConvId::ARM_AAPCS;
+      break;
+    case Triple::riscv64:
+      cconv_ = CallingConvId::RISCV64_C;
       break;
     default:
       errs() << "currently Gollvm is not supported on architecture "
diff --git a/passes/CMakeLists.txt b/passes/CMakeLists.txt
index b70279c..af9c25a 100644
--- a/passes/CMakeLists.txt
+++ b/passes/CMakeLists.txt
@@ -18,3 +18,5 @@
 
   DEPENDS intrinsics_gen
 )
+
+include_directories(${DRIVER_UTILS_SOURCE_DIR})
diff --git a/passes/GoStatepoints.cpp b/passes/GoStatepoints.cpp
index 3542a4f..6453db4 100644
--- a/passes/GoStatepoints.cpp
+++ b/passes/GoStatepoints.cpp
@@ -12,6 +12,7 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "CallingConv.h"
 #include "GoStatepoints.h"
 #include "GoStackMap.h"
 #include "GollvmPasses.h"
@@ -35,7 +36,6 @@
 #include "llvm/IR/Argument.h"
 #include "llvm/IR/Attributes.h"
 #include "llvm/IR/BasicBlock.h"
-#include "llvm/IR/CallingConv.h"
 #include "llvm/IR/Constant.h"
 #include "llvm/IR/Constants.h"
 #include "llvm/IR/DataLayout.h"
diff --git a/unittests/BackendCore/BackendArrayStruct.cpp b/unittests/BackendCore/BackendArrayStruct.cpp
index 4f40d9c..a488338 100644
--- a/unittests/BackendCore/BackendArrayStruct.cpp
+++ b/unittests/BackendCore/BackendArrayStruct.cpp
@@ -18,11 +18,11 @@
 namespace {
 
 class BackendArrayStructTests
-    : public testing::TestWithParam<llvm::CallingConv::ID> {};
+    : public testing::TestWithParam<gollvm::driver::CallingConvId> {};
 
 INSTANTIATE_TEST_SUITE_P(
     UnitTest, BackendArrayStructTests,
-    goBackendUnitTests::CConvs,
+    goBackendUnitTests::cconvs(),
     [](const testing::TestParamInfo<BackendArrayStructTests::ParamType> &info) {
       std::string name = goBackendUnitTests::ccName(info.param);
       return name;
diff --git a/unittests/BackendCore/BackendCABIOracleTests.cpp b/unittests/BackendCore/BackendCABIOracleTests.cpp
index c1535ba..3f3c902 100644
--- a/unittests/BackendCore/BackendCABIOracleTests.cpp
+++ b/unittests/BackendCore/BackendCABIOracleTests.cpp
@@ -19,11 +19,11 @@
 namespace {
 
 class BackendCABIOracleTests
-    : public testing::TestWithParam<llvm::CallingConv::ID> {};
+    : public testing::TestWithParam<gollvm::driver::CallingConvId> {};
 
 INSTANTIATE_TEST_SUITE_P(
     UnitTest, BackendCABIOracleTests,
-    goBackendUnitTests::CConvs,
+    goBackendUnitTests::cconvs(),
     [](const testing::TestParamInfo<BackendCABIOracleTests::ParamType> &info) {
       std::string name = goBackendUnitTests::ccName(info.param);
       return name;
@@ -72,7 +72,7 @@
 TEST(BackendCABIOracleTests, ExtendedAmd64) {
   LLVMContext C;
   std::unique_ptr<Llvm_backend> bep(
-      new Llvm_backend(C, nullptr, nullptr, 0, llvm::Triple(), llvm::CallingConv::X86_64_SysV));
+      new Llvm_backend(C, nullptr, nullptr, 0, llvm::Triple(), gollvm::driver::CallingConvId::X86_64_SysV));
   Llvm_backend *be = bep.get();
 
   Btype *bi8t = be->integer_type(false, 8);
@@ -256,7 +256,7 @@
 TEST(BackendCABIOracleTests, ExtendedArm64) {
   LLVMContext C;
   std::unique_ptr<Llvm_backend> bep(
-      new Llvm_backend(C, nullptr, nullptr, 0, llvm::Triple(), llvm::CallingConv::ARM_AAPCS));
+      new Llvm_backend(C, nullptr, nullptr, 0, llvm::Triple(), gollvm::driver::CallingConvId::ARM_AAPCS));
   Llvm_backend *be = bep.get();
 
   Btype *bi8t = be->integer_type(false, 8);
@@ -439,7 +439,7 @@
 }
 
 TEST(BackendCABIOracleTests, RecursiveCall1Amd64) {
-  FcnTestHarness h(llvm::CallingConv::X86_64_SysV);
+  FcnTestHarness h(gollvm::driver::CallingConvId::X86_64_SysV);
   Llvm_backend *be = h.be();
 
   // type s1 struct {
@@ -564,7 +564,7 @@
 }
 
 TEST(BackendCABIOracleTests, RecursiveCall1Arm64) {
-  FcnTestHarness h(llvm::CallingConv::ARM_AAPCS);
+  FcnTestHarness h(gollvm::driver::CallingConvId::ARM_AAPCS);
   Llvm_backend *be = h.be();
 
   // type s1 struct {
@@ -686,7 +686,7 @@
 }
 
 TEST(BackendCABIOracleTests, PassAndReturnArraysAmd64) {
-  FcnTestHarness h(llvm::CallingConv::X86_64_SysV);
+  FcnTestHarness h(gollvm::driver::CallingConvId::X86_64_SysV);
   Llvm_backend *be = h.be();
 
   Btype *bf32t = be->float_type(32);
@@ -733,7 +733,7 @@
 }
 
 TEST(BackendCABIOracleTests, PassAndReturnArraysArm64) {
-  FcnTestHarness h(llvm::CallingConv::ARM_AAPCS);
+  FcnTestHarness h(gollvm::driver::CallingConvId::ARM_AAPCS);
   Llvm_backend *be = h.be();
 
   Btype *bf32t = be->float_type(32);
@@ -850,7 +850,7 @@
 }
 
 TEST(BackendCABIOracleTests, PassAndReturnComplexAmd64) {
-  FcnTestHarness h(llvm::CallingConv::X86_64_SysV);
+  FcnTestHarness h(gollvm::driver::CallingConvId::X86_64_SysV);
   Llvm_backend *be = h.be();
 
   Btype *bc64t = be->complex_type(64);
@@ -926,7 +926,7 @@
 }
 
 TEST(BackendCABIOracleTests, PassAndReturnComplexArm64) {
-  FcnTestHarness h(llvm::CallingConv::ARM_AAPCS);
+  FcnTestHarness h(gollvm::driver::CallingConvId::ARM_AAPCS);
   Llvm_backend *be = h.be();
 
   Btype *bc64t = be->complex_type(64);
diff --git a/unittests/BackendCore/BackendCallTests.cpp b/unittests/BackendCore/BackendCallTests.cpp
index e835bde..b8d7eaf 100644
--- a/unittests/BackendCore/BackendCallTests.cpp
+++ b/unittests/BackendCore/BackendCallTests.cpp
@@ -17,12 +17,12 @@
 
 namespace {
 
-class BackendCallTests : public testing::TestWithParam<llvm::CallingConv::ID> {
+class BackendCallTests : public testing::TestWithParam<gollvm::driver::CallingConvId> {
 };
 
 INSTANTIATE_TEST_SUITE_P(
     UnitTest, BackendCallTests,
-    goBackendUnitTests::CConvs,
+    goBackendUnitTests::cconvs(),
     [](const testing::TestParamInfo<BackendCallTests::ParamType> &info) {
       std::string name = goBackendUnitTests::ccName(info.param);
       return name;
@@ -235,7 +235,7 @@
 // expected result. However, the processing method of static link and dynamic
 // link is the same, but the instruction is slightly different.
 TEST(BackendCallTests, TestMakeGetgDynamicArm64) {
-  FcnTestHarness h(llvm::CallingConv::ARM_AAPCS, "foo");
+  FcnTestHarness h(gollvm::driver::CallingConvId::ARM_AAPCS, "foo");
   Llvm_backend *be = h.be();
   be->module().setPICLevel(llvm::PICLevel::BigPIC);
   Bfunction *func = h.func();
diff --git a/unittests/BackendCore/BackendCoreTests.cpp b/unittests/BackendCore/BackendCoreTests.cpp
index dbed58b..30923a0 100644
--- a/unittests/BackendCore/BackendCoreTests.cpp
+++ b/unittests/BackendCore/BackendCoreTests.cpp
@@ -15,12 +15,12 @@
 
 namespace {
 
-class BackendCoreTests : public testing::TestWithParam<llvm::CallingConv::ID> {
+class BackendCoreTests : public testing::TestWithParam<gollvm::driver::CallingConvId> {
 };
 
 INSTANTIATE_TEST_SUITE_P(
     UnitTest, BackendCoreTests,
-    goBackendUnitTests::CConvs,
+    goBackendUnitTests::cconvs(),
     [](const testing::TestParamInfo<BackendCoreTests::ParamType> &info) {
       std::string name = goBackendUnitTests::ccName(info.param);
       return name;
diff --git a/unittests/BackendCore/BackendDebugEmit.cpp b/unittests/BackendCore/BackendDebugEmit.cpp
index 2875ba4..7859104 100644
--- a/unittests/BackendCore/BackendDebugEmit.cpp
+++ b/unittests/BackendCore/BackendDebugEmit.cpp
@@ -20,12 +20,12 @@
 // changed). Perhaps there is some other way to verify this
 // functionality.
 
-class BackendDebugEmit : public testing::TestWithParam<llvm::CallingConv::ID> {
+class BackendDebugEmit : public testing::TestWithParam<gollvm::driver::CallingConvId> {
 };
 
 INSTANTIATE_TEST_SUITE_P(
     UnitTest, BackendDebugEmit,
-    goBackendUnitTests::CConvs,
+    goBackendUnitTests::cconvs(),
     [](const testing::TestParamInfo<BackendDebugEmit::ParamType> &info) {
       std::string name = goBackendUnitTests::ccName(info.param);
       return name;
@@ -60,7 +60,7 @@
 
 TEST(BackendDebugEmit, TestSimpleDecl2Amd64) {
   // Test that parameters of empty function are handled correctly.
-  FcnTestHarness h(llvm::CallingConv::X86_64_SysV);
+  FcnTestHarness h(gollvm::driver::CallingConvId::X86_64_SysV);
   Llvm_backend *be = h.be();
   Btype *bi64t = be->integer_type(false, 64);
   Btype *bst = mkBackendStruct(be, bi64t, "f1",
@@ -89,7 +89,7 @@
 
 TEST(BackendDebugEmit, TestSimpleDecl2Arm64) {
   // Test that parameters of empty function are handled correctly.
-  FcnTestHarness h(llvm::CallingConv::ARM_AAPCS);
+  FcnTestHarness h(gollvm::driver::CallingConvId::ARM_AAPCS);
   Llvm_backend *be = h.be();
   Btype *bi64t = be->integer_type(false, 64);
   Btype *bst = mkBackendStruct(be, bi64t, "f1", bi64t, "f2", bi64t, "f3",
diff --git a/unittests/BackendCore/BackendExprTests.cpp b/unittests/BackendCore/BackendExprTests.cpp
index eab503f..a476f06 100644
--- a/unittests/BackendCore/BackendExprTests.cpp
+++ b/unittests/BackendCore/BackendExprTests.cpp
@@ -17,12 +17,12 @@
 
 namespace {
 
-class BackendExprTests : public testing::TestWithParam<llvm::CallingConv::ID> {
+class BackendExprTests : public testing::TestWithParam<gollvm::driver::CallingConvId> {
 };
 
 INSTANTIATE_TEST_SUITE_P(
     UnitTest, BackendExprTests,
-    goBackendUnitTests::CConvs,
+    goBackendUnitTests::cconvs(),
     [](const testing::TestParamInfo<BackendExprTests::ParamType> &info) {
       std::string name = goBackendUnitTests::ccName(info.param);
       return name;
@@ -1429,7 +1429,7 @@
 }
 
 TEST(BackendExprTests, TestConditionalExpression3Amd64) {
-  FcnTestHarness h(llvm::CallingConv::X86_64_SysV);
+  FcnTestHarness h(gollvm::driver::CallingConvId::X86_64_SysV);
   Llvm_backend *be = h.be();
   Btype *bi32t = be->integer_type(false, 32);
   Btype *abt = be->array_type(bi32t, mkInt64Const(be, int64_t(16)));
@@ -1494,7 +1494,7 @@
 }
 
 TEST(BackendExprTests, TestConditionalExpression3Arm64) {
-  FcnTestHarness h(llvm::CallingConv::ARM_AAPCS);
+  FcnTestHarness h(gollvm::driver::CallingConvId::ARM_AAPCS);
   Llvm_backend *be = h.be();
   Btype *bi32t = be->integer_type(false, 32);
   Btype *abt = be->array_type(bi32t, mkInt64Const(be, int64_t(16)));
diff --git a/unittests/BackendCore/BackendFcnTests.cpp b/unittests/BackendCore/BackendFcnTests.cpp
index 0cf95db..2af5163 100644
--- a/unittests/BackendCore/BackendFcnTests.cpp
+++ b/unittests/BackendCore/BackendFcnTests.cpp
@@ -16,11 +16,11 @@
 
 namespace {
 
-class BackendFcnTests : public testing::TestWithParam<llvm::CallingConv::ID> {};
+class BackendFcnTests : public testing::TestWithParam<gollvm::driver::CallingConvId> {};
 
 INSTANTIATE_TEST_SUITE_P(
     UnitTest, BackendFcnTests,
-    goBackendUnitTests::CConvs,
+    goBackendUnitTests::cconvs(),
     [](const testing::TestParamInfo<BackendFcnTests::ParamType> &info) {
       std::string name = goBackendUnitTests::ccName(info.param);
       return name;
diff --git a/unittests/BackendCore/BackendNodeTests.cpp b/unittests/BackendCore/BackendNodeTests.cpp
index 34255bf..13a3a5a 100644
--- a/unittests/BackendCore/BackendNodeTests.cpp
+++ b/unittests/BackendCore/BackendNodeTests.cpp
@@ -18,12 +18,12 @@
 
 namespace {
 
-class BackendNodeTests : public testing::TestWithParam<llvm::CallingConv::ID> {
+class BackendNodeTests : public testing::TestWithParam<gollvm::driver::CallingConvId> {
 };
 
 INSTANTIATE_TEST_SUITE_P(
     UnitTest, BackendNodeTests,
-    goBackendUnitTests::CConvs,
+    goBackendUnitTests::cconvs(),
     [](const testing::TestParamInfo<BackendNodeTests::ParamType> &info) {
       std::string name = goBackendUnitTests::ccName(info.param);
       return name;
diff --git a/unittests/BackendCore/BackendPointerExprTests.cpp b/unittests/BackendCore/BackendPointerExprTests.cpp
index 58978ec..f5882ca 100644
--- a/unittests/BackendCore/BackendPointerExprTests.cpp
+++ b/unittests/BackendCore/BackendPointerExprTests.cpp
@@ -18,11 +18,11 @@
 namespace {
 
 class BackendPointerExprTests
-    : public testing::TestWithParam<llvm::CallingConv::ID> {};
+    : public testing::TestWithParam<gollvm::driver::CallingConvId> {};
 
 INSTANTIATE_TEST_SUITE_P(
     UnitTest, BackendPointerExprTests,
-    goBackendUnitTests::CConvs,
+    goBackendUnitTests::cconvs(),
     [](const testing::TestParamInfo<BackendPointerExprTests::ParamType> &info) {
       std::string name = goBackendUnitTests::ccName(info.param);
       return name;
diff --git a/unittests/BackendCore/BackendStmtTests.cpp b/unittests/BackendCore/BackendStmtTests.cpp
index 866f3ed..7e47928 100644
--- a/unittests/BackendCore/BackendStmtTests.cpp
+++ b/unittests/BackendCore/BackendStmtTests.cpp
@@ -15,12 +15,12 @@
 
 namespace {
 
-class BackendStmtTests : public testing::TestWithParam<llvm::CallingConv::ID> {
+class BackendStmtTests : public testing::TestWithParam<gollvm::driver::CallingConvId> {
 };
 
 INSTANTIATE_TEST_SUITE_P(
     UnitTest, BackendStmtTests,
-    goBackendUnitTests::CConvs,
+    goBackendUnitTests::cconvs(),
     [](const testing::TestParamInfo<BackendStmtTests::ParamType> &info) {
       std::string name = goBackendUnitTests::ccName(info.param);
       return name;
diff --git a/unittests/BackendCore/BackendTreeIntegrity.cpp b/unittests/BackendCore/BackendTreeIntegrity.cpp
index df6b32b..0c52b9c 100644
--- a/unittests/BackendCore/BackendTreeIntegrity.cpp
+++ b/unittests/BackendCore/BackendTreeIntegrity.cpp
@@ -16,11 +16,11 @@
 namespace {
 
 class BackendTreeIntegrity
-    : public testing::TestWithParam<llvm::CallingConv::ID> {};
+    : public testing::TestWithParam<gollvm::driver::CallingConvId> {};
 
 INSTANTIATE_TEST_SUITE_P(
     UnitTest, BackendTreeIntegrity,
-    goBackendUnitTests::CConvs,
+    goBackendUnitTests::cconvs(),
     [](const testing::TestParamInfo<BackendTreeIntegrity::ParamType> &info) {
       std::string name = goBackendUnitTests::ccName(info.param);
       return name;
diff --git a/unittests/BackendCore/BackendVarTests.cpp b/unittests/BackendCore/BackendVarTests.cpp
index 763602e..526cd9d 100644
--- a/unittests/BackendCore/BackendVarTests.cpp
+++ b/unittests/BackendCore/BackendVarTests.cpp
@@ -20,11 +20,11 @@
 
 namespace {
 
-class BackendVarTests : public testing::TestWithParam<llvm::CallingConv::ID> {};
+class BackendVarTests : public testing::TestWithParam<gollvm::driver::CallingConvId> {};
 
 INSTANTIATE_TEST_SUITE_P(
     UnitTest, BackendVarTests,
-    goBackendUnitTests::CConvs,
+    goBackendUnitTests::cconvs(),
     [](const testing::TestParamInfo<BackendVarTests::ParamType> &info) {
       std::string name = goBackendUnitTests::ccName(info.param);
       return name;
diff --git a/unittests/BackendCore/TestUtils.cpp b/unittests/BackendCore/TestUtils.cpp
index bfca6c1..73475e1 100644
--- a/unittests/BackendCore/TestUtils.cpp
+++ b/unittests/BackendCore/TestUtils.cpp
@@ -12,14 +12,17 @@
 
 namespace goBackendUnitTests {
 
-std::string ccName(llvm::CallingConv::ID cc) {
-  assert(cc == llvm::CallingConv::X86_64_SysV ||
-         cc == llvm::CallingConv::ARM_AAPCS);
+std::string ccName(gollvm::driver::CallingConvId cc) {
+  assert(cc == gollvm::driver::CallingConvId::X86_64_SysV ||
+         cc == gollvm::driver::CallingConvId::ARM_AAPCS ||
+         cc == gollvm::driver::CallingConvId::RISCV64_C);
   switch (cc) {
-  case llvm::CallingConv::X86_64_SysV:
+  case gollvm::driver::CallingConvId::X86_64_SysV:
     return "X8664SysV";
-  case llvm::CallingConv::ARM_AAPCS:
+  case gollvm::driver::CallingConvId::ARM_AAPCS:
     return "ARMAAPCS";
+  case gollvm::driver::CallingConvId::RISCV64_C:
+    return "RISCV64C";
   default:
     return "";
   }
@@ -384,7 +387,7 @@
   return trimsp(vis.result());
 }
 
-FcnTestHarness::FcnTestHarness(llvm::CallingConv::ID cconv, const char *fcnName)
+FcnTestHarness::FcnTestHarness(gollvm::driver::CallingConvId cconv, const char *fcnName)
     : context_()
     , be_(new Llvm_backend(context_, nullptr, nullptr, 0, llvm::Triple(), cconv))
     , func_(nullptr)
diff --git a/unittests/BackendCore/TestUtils.h b/unittests/BackendCore/TestUtils.h
index 366fbf7..fa6774e 100644
--- a/unittests/BackendCore/TestUtils.h
+++ b/unittests/BackendCore/TestUtils.h
@@ -32,11 +32,13 @@
 namespace goBackendUnitTests {
 
 // All supported calling conventions
-auto CConvs = testing::Values(llvm::CallingConv::X86_64_SysV,
-                              llvm::CallingConv::ARM_AAPCS);
+inline auto cconvs() {
+  return testing::Values(gollvm::driver::CallingConvId::X86_64_SysV,
+                         gollvm::driver::CallingConvId::ARM_AAPCS);
+}
 
-// Convert llvm::CallingConv::ID to its coresponding string name.
-std::string ccName(llvm::CallingConv::ID);
+// Convert gollvm::driver::CallingConvId to its coresponding string name.
+std::string ccName(gollvm::driver::CallingConvId);
 
 // Return string representation of LLVM value (handling null ptr)
 std::string repr(llvm::Value *val);
@@ -158,7 +160,7 @@
  public:
   // Create test harness. If name specified, then create a
   // default function "fcnName(i1, i2 int32) int64".
-  FcnTestHarness(llvm::CallingConv::ID cconv, const char *fcnName = nullptr);
+  FcnTestHarness(gollvm::driver::CallingConvId cconv, const char *fcnName = nullptr);
   ~FcnTestHarness();
 
   // Create function to work on
diff --git a/unittests/CMakeLists.txt b/unittests/CMakeLists.txt
index cac798a..b20037a 100644
--- a/unittests/CMakeLists.txt
+++ b/unittests/CMakeLists.txt
@@ -24,6 +24,7 @@
 include_directories(${EXTINSTALLDIR}/include)
 include_directories(${BRIDGE_SOURCE_DIR})
 include_directories(${GOFRONTEND_SOURCE_DIR})
+include_directories(${DRIVER_UTILS_SOURCE_DIR})
 
 add_subdirectory(DriverUtils)
 add_subdirectory(Driver)