1 //===--- RISCV.cpp - RISCV Helpers for Tools --------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "RISCV.h"
11 #include "clang/Driver/Driver.h"
12 #include "clang/Driver/DriverDiagnostic.h"
13 #include "clang/Driver/Options.h"
14 #include "llvm/Option/ArgList.h"
15 #include "llvm/Support/TargetParser.h"
16 #include "llvm/Support/raw_ostream.h"
17 
18 using namespace clang::driver;
19 using namespace clang::driver::tools;
20 using namespace clang;
21 using namespace llvm::opt;
22 
23 void riscv::getRISCVTargetFeatures(const Driver &D, const ArgList &Args,
24                                    std::vector<StringRef> &Features) {
25   if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
26     StringRef MArch = A->getValue();
27     // TODO: handle rv64
28     std::pair<StringRef, StringRef> MArchSplit = StringRef(MArch).split("rv32");
29     if (!MArchSplit.second.size())
30       return;
31 
32     for (char c : MArchSplit.second) {
33       switch (c) {
34       case 'i':
35         break;
36       case 'm':
37         Features.push_back("+m");
38         break;
39       case 'a':
40         Features.push_back("+a");
41         break;
42       case 'f':
43         Features.push_back("+f");
44         break;
45       case 'd':
46         Features.push_back("+d");
47         break;
48       case 'c':
49         Features.push_back("+c");
50         break;
51       }
52     }
53   }
54 }
55 
56 StringRef riscv::getRISCVABI(const ArgList &Args, const llvm::Triple &Triple) {
57   if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
58     return A->getValue();
59 
60   return Triple.getArch() == llvm::Triple::riscv32 ? "ilp32" : "lp64";
61 }
62