85 lines · cpp
1//===--- SystemZ.cpp - SystemZ Helpers for Tools ----------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "SystemZ.h"10#include "clang/Config/config.h"11#include "clang/Options/Options.h"12#include "llvm/Option/ArgList.h"13#include "llvm/TargetParser/Host.h"14 15using namespace clang::driver;16using namespace clang::driver::tools;17using namespace clang;18using namespace llvm::opt;19 20systemz::FloatABI systemz::getSystemZFloatABI(const Driver &D,21 const ArgList &Args) {22 // Hard float is the default.23 systemz::FloatABI ABI = systemz::FloatABI::Hard;24 if (Args.hasArg(options::OPT_mfloat_abi_EQ))25 D.Diag(diag::err_drv_unsupported_opt)26 << Args.getLastArg(options::OPT_mfloat_abi_EQ)->getAsString(Args);27 28 if (Arg *A =29 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float))30 if (A->getOption().matches(options::OPT_msoft_float))31 ABI = systemz::FloatABI::Soft;32 33 return ABI;34}35 36std::string systemz::getSystemZTargetCPU(const ArgList &Args,37 const llvm::Triple &T) {38 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {39 llvm::StringRef CPUName = A->getValue();40 41 if (CPUName == "native") {42 std::string CPU = std::string(llvm::sys::getHostCPUName());43 if (!CPU.empty() && CPU != "generic")44 return CPU;45 else46 return "";47 }48 49 return std::string(CPUName);50 }51 if (T.isOSzOS())52 return "zEC12";53 return CLANG_SYSTEMZ_DEFAULT_ARCH;54}55 56void systemz::getSystemZTargetFeatures(const Driver &D, const ArgList &Args,57 std::vector<llvm::StringRef> &Features) {58 // -m(no-)htm overrides use of the transactional-execution facility.59 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {60 if (A->getOption().matches(options::OPT_mhtm))61 Features.push_back("+transactional-execution");62 else63 Features.push_back("-transactional-execution");64 }65 // -m(no-)vx overrides use of the vector facility.66 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {67 if (A->getOption().matches(options::OPT_mvx))68 Features.push_back("+vector");69 else70 Features.push_back("-vector");71 }72 73 systemz::FloatABI FloatABI = systemz::getSystemZFloatABI(D, Args);74 if (FloatABI == systemz::FloatABI::Soft)75 Features.push_back("+soft-float");76 77 if (const Arg *A = Args.getLastArg(options::OPT_munaligned_symbols,78 options::OPT_mno_unaligned_symbols)) {79 if (A->getOption().matches(options::OPT_munaligned_symbols))80 Features.push_back("+unaligned-symbols");81 else82 Features.push_back("-unaligned-symbols");83 }84}85