xref: /freebsd/contrib/llvm-project/clang/lib/Driver/ToolChains/Arch/SystemZ.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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