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-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #include "SystemZ.h" |
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/TargetParser/Host.h" |
15 | |
16 | using namespace clang::driver; |
17 | using namespace clang::driver::tools; |
18 | using namespace clang; |
19 | using namespace llvm::opt; |
20 | |
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(Ids: options::OPT_mfloat_abi_EQ)) |
26 | D.Diag(DiagID: diag::err_drv_unsupported_opt) |
27 | << Args.getLastArg(Ids: options::OPT_mfloat_abi_EQ)->getAsString(Args); |
28 | |
29 | if (Arg *A = Args.getLastArg(Ids: clang::driver::options::OPT_msoft_float, |
30 | Ids: options::OPT_mhard_float)) |
31 | if (A->getOption().matches(ID: clang::driver::options::OPT_msoft_float)) |
32 | ABI = systemz::FloatABI::Soft; |
33 | |
34 | return ABI; |
35 | } |
36 | |
37 | std::string systemz::getSystemZTargetCPU(const ArgList &Args) { |
38 | if (const Arg *A = Args.getLastArg(Ids: clang::driver::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 | else |
46 | return ""; |
47 | } |
48 | |
49 | return std::string(CPUName); |
50 | } |
51 | return CLANG_SYSTEMZ_DEFAULT_ARCH; |
52 | } |
53 | |
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(Ids: options::OPT_mhtm, Ids: options::OPT_mno_htm)) { |
58 | if (A->getOption().matches(ID: options::OPT_mhtm)) |
59 | Features.push_back(x: "+transactional-execution"); |
60 | else |
61 | Features.push_back(x: "-transactional-execution"); |
62 | } |
63 | // -m(no-)vx overrides use of the vector facility. |
64 | if (Arg *A = Args.getLastArg(Ids: options::OPT_mvx, Ids: options::OPT_mno_vx)) { |
65 | if (A->getOption().matches(ID: options::OPT_mvx)) |
66 | Features.push_back(x: "+vector"); |
67 | else |
68 | Features.push_back(x: "-vector"); |
69 | } |
70 | |
71 | systemz::FloatABI FloatABI = systemz::getSystemZFloatABI(D, Args); |
72 | if (FloatABI == systemz::FloatABI::Soft) |
73 | Features.push_back(x: "+soft-float"); |
74 | |
75 | if (const Arg *A = Args.getLastArg(Ids: options::OPT_munaligned_symbols, |
76 | Ids: options::OPT_mno_unaligned_symbols)) { |
77 | if (A->getOption().matches(ID: options::OPT_munaligned_symbols)) |
78 | Features.push_back(x: "+unaligned-symbols"); |
79 | else |
80 | Features.push_back(x: "-unaligned-symbols"); |
81 | } |
82 | } |
83 |