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