//===--- RISCV.cpp - RISCV Helpers for Tools --------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "RISCV.h" #include "clang/Driver/Driver.h" #include "clang/Driver/DriverDiagnostic.h" #include "clang/Driver/Options.h" #include "llvm/Option/ArgList.h" #include "llvm/Support/TargetParser.h" #include "llvm/Support/raw_ostream.h" using namespace clang::driver; using namespace clang::driver::tools; using namespace clang; using namespace llvm::opt; void riscv::getRISCVTargetFeatures(const Driver &D, const ArgList &Args, std::vector &Features) { if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) { StringRef MArch = A->getValue(); // TODO: handle rv64 std::pair MArchSplit = StringRef(MArch).split("rv32"); if (!MArchSplit.second.size()) return; for (char c : MArchSplit.second) { switch (c) { case 'i': break; case 'm': Features.push_back("+m"); break; case 'a': Features.push_back("+a"); break; case 'f': Features.push_back("+f"); break; case 'd': Features.push_back("+d"); break; case 'c': Features.push_back("+c"); break; } } } } StringRef riscv::getRISCVABI(const ArgList &Args, const llvm::Triple &Triple) { if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) return A->getValue(); return Triple.getArch() == llvm::Triple::riscv32 ? "ilp32" : "lp64"; }