brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.9 KiB · 1ef6a72 Raw
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