1 //===--- SystemZ.cpp - SystemZ Helpers for Tools ----------------*- C++ -*-===//
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-exception
7 //===----------------------------------------------------------------------===//
10 #include "clang/Config/config.h"
11 #include "clang/Driver/DriverDiagnostic.h"
12 #include "clang/Driver/Options.h"
13 #include "llvm/Option/ArgList.h"
14 #include "llvm/Support/Host.h"
16 using namespace clang::driver
;
17 using namespace clang::driver::tools
;
18 using namespace clang
;
19 using namespace llvm::opt
;
21 systemz::FloatABI
systemz::getSystemZFloatABI(const Driver
&D
,
22 const ArgList
&Args
) {
23 // Hard float is the default.
24 systemz::FloatABI ABI
= systemz::FloatABI::Hard
;
25 if (Args
.hasArg(options::OPT_mfloat_abi_EQ
))
26 D
.Diag(diag::err_drv_unsupported_opt
)
27 << Args
.getLastArg(options::OPT_mfloat_abi_EQ
)->getAsString(Args
);
29 if (Arg
*A
= Args
.getLastArg(clang::driver::options::OPT_msoft_float
,
30 options::OPT_mhard_float
))
31 if (A
->getOption().matches(clang::driver::options::OPT_msoft_float
))
32 ABI
= systemz::FloatABI::Soft
;
37 std::string
systemz::getSystemZTargetCPU(const ArgList
&Args
) {
38 if (const Arg
*A
= Args
.getLastArg(clang::driver::options::OPT_march_EQ
)) {
39 llvm::StringRef CPUName
= A
->getValue();
41 if (CPUName
== "native") {
42 std::string CPU
= std::string(llvm::sys::getHostCPUName());
43 if (!CPU
.empty() && CPU
!= "generic")
49 return std::string(CPUName
);
51 return CLANG_SYSTEMZ_DEFAULT_ARCH
;
54 void systemz::getSystemZTargetFeatures(const Driver
&D
, const ArgList
&Args
,
55 std::vector
<llvm::StringRef
> &Features
) {
56 // -m(no-)htm overrides use of the transactional-execution facility.
57 if (Arg
*A
= Args
.getLastArg(options::OPT_mhtm
, options::OPT_mno_htm
)) {
58 if (A
->getOption().matches(options::OPT_mhtm
))
59 Features
.push_back("+transactional-execution");
61 Features
.push_back("-transactional-execution");
63 // -m(no-)vx overrides use of the vector facility.
64 if (Arg
*A
= Args
.getLastArg(options::OPT_mvx
, options::OPT_mno_vx
)) {
65 if (A
->getOption().matches(options::OPT_mvx
))
66 Features
.push_back("+vector");
68 Features
.push_back("-vector");
71 systemz::FloatABI FloatABI
= systemz::getSystemZFloatABI(D
, Args
);
72 if (FloatABI
== systemz::FloatABI::Soft
)
73 Features
.push_back("+soft-float");