10b57cec5SDimitry Andric //===--- SystemZ.cpp - SystemZ Helpers for Tools ----------------*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric
90b57cec5SDimitry Andric #include "SystemZ.h"
105ffd83dbSDimitry Andric #include "clang/Config/config.h"
115ffd83dbSDimitry Andric #include "clang/Driver/DriverDiagnostic.h"
120b57cec5SDimitry Andric #include "clang/Driver/Options.h"
130b57cec5SDimitry Andric #include "llvm/Option/ArgList.h"
1406c3fb27SDimitry Andric #include "llvm/TargetParser/Host.h"
150b57cec5SDimitry Andric
160b57cec5SDimitry Andric using namespace clang::driver;
170b57cec5SDimitry Andric using namespace clang::driver::tools;
180b57cec5SDimitry Andric using namespace clang;
190b57cec5SDimitry Andric using namespace llvm::opt;
200b57cec5SDimitry Andric
getSystemZFloatABI(const Driver & D,const ArgList & Args)215ffd83dbSDimitry Andric systemz::FloatABI systemz::getSystemZFloatABI(const Driver &D,
225ffd83dbSDimitry Andric const ArgList &Args) {
235ffd83dbSDimitry Andric // Hard float is the default.
245ffd83dbSDimitry Andric systemz::FloatABI ABI = systemz::FloatABI::Hard;
255ffd83dbSDimitry Andric if (Args.hasArg(options::OPT_mfloat_abi_EQ))
265ffd83dbSDimitry Andric D.Diag(diag::err_drv_unsupported_opt)
275ffd83dbSDimitry Andric << Args.getLastArg(options::OPT_mfloat_abi_EQ)->getAsString(Args);
285ffd83dbSDimitry Andric
295ffd83dbSDimitry Andric if (Arg *A = Args.getLastArg(clang::driver::options::OPT_msoft_float,
305ffd83dbSDimitry Andric options::OPT_mhard_float))
315ffd83dbSDimitry Andric if (A->getOption().matches(clang::driver::options::OPT_msoft_float))
325ffd83dbSDimitry Andric ABI = systemz::FloatABI::Soft;
335ffd83dbSDimitry Andric
345ffd83dbSDimitry Andric return ABI;
355ffd83dbSDimitry Andric }
365ffd83dbSDimitry Andric
getSystemZTargetCPU(const ArgList & Args)37480093f4SDimitry Andric std::string systemz::getSystemZTargetCPU(const ArgList &Args) {
38480093f4SDimitry Andric if (const Arg *A = Args.getLastArg(clang::driver::options::OPT_march_EQ)) {
39480093f4SDimitry Andric llvm::StringRef CPUName = A->getValue();
40480093f4SDimitry Andric
41480093f4SDimitry Andric if (CPUName == "native") {
425ffd83dbSDimitry Andric std::string CPU = std::string(llvm::sys::getHostCPUName());
43480093f4SDimitry Andric if (!CPU.empty() && CPU != "generic")
44480093f4SDimitry Andric return CPU;
45480093f4SDimitry Andric else
46480093f4SDimitry Andric return "";
47480093f4SDimitry Andric }
48480093f4SDimitry Andric
495ffd83dbSDimitry Andric return std::string(CPUName);
50480093f4SDimitry Andric }
515ffd83dbSDimitry Andric return CLANG_SYSTEMZ_DEFAULT_ARCH;
520b57cec5SDimitry Andric }
530b57cec5SDimitry Andric
getSystemZTargetFeatures(const Driver & D,const ArgList & Args,std::vector<llvm::StringRef> & Features)545ffd83dbSDimitry Andric void systemz::getSystemZTargetFeatures(const Driver &D, const ArgList &Args,
550b57cec5SDimitry Andric std::vector<llvm::StringRef> &Features) {
560b57cec5SDimitry Andric // -m(no-)htm overrides use of the transactional-execution facility.
570b57cec5SDimitry Andric if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
580b57cec5SDimitry Andric if (A->getOption().matches(options::OPT_mhtm))
590b57cec5SDimitry Andric Features.push_back("+transactional-execution");
600b57cec5SDimitry Andric else
610b57cec5SDimitry Andric Features.push_back("-transactional-execution");
620b57cec5SDimitry Andric }
630b57cec5SDimitry Andric // -m(no-)vx overrides use of the vector facility.
640b57cec5SDimitry Andric if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
650b57cec5SDimitry Andric if (A->getOption().matches(options::OPT_mvx))
660b57cec5SDimitry Andric Features.push_back("+vector");
670b57cec5SDimitry Andric else
680b57cec5SDimitry Andric Features.push_back("-vector");
690b57cec5SDimitry Andric }
705ffd83dbSDimitry Andric
715ffd83dbSDimitry Andric systemz::FloatABI FloatABI = systemz::getSystemZFloatABI(D, Args);
725ffd83dbSDimitry Andric if (FloatABI == systemz::FloatABI::Soft)
735ffd83dbSDimitry Andric Features.push_back("+soft-float");
74*0fca6ea1SDimitry Andric
75*0fca6ea1SDimitry Andric if (const Arg *A = Args.getLastArg(options::OPT_munaligned_symbols,
76*0fca6ea1SDimitry Andric options::OPT_mno_unaligned_symbols)) {
77*0fca6ea1SDimitry Andric if (A->getOption().matches(options::OPT_munaligned_symbols))
78*0fca6ea1SDimitry Andric Features.push_back("+unaligned-symbols");
79*0fca6ea1SDimitry Andric else
80*0fca6ea1SDimitry Andric Features.push_back("-unaligned-symbols");
81*0fca6ea1SDimitry Andric }
820b57cec5SDimitry Andric }
83