Path: blob/main/contrib/llvm-project/clang/lib/Driver/ToolChains/Arch/M68k.cpp
35294 views
//===--- M68k.cpp - M68k Helpers for Tools -------------------*- C++-*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "M68k.h"9#include "ToolChains/CommonArgs.h"10#include "clang/Driver/Driver.h"11#include "clang/Driver/DriverDiagnostic.h"12#include "clang/Driver/Options.h"13#include "llvm/ADT/SmallVector.h"14#include "llvm/ADT/StringSwitch.h"15#include "llvm/Option/ArgList.h"16#include "llvm/Support/Regex.h"17#include "llvm/TargetParser/Host.h"18#include <sstream>1920using namespace clang::driver;21using namespace clang::driver::tools;22using namespace clang;23using namespace llvm::opt;2425/// getM68kTargetCPU - Get the (LLVM) name of the 68000 cpu we are targeting.26std::string m68k::getM68kTargetCPU(const ArgList &Args) {27if (Arg *A = Args.getLastArg(clang::driver::options::OPT_mcpu_EQ)) {28// The canonical CPU name is captalize. However, we allow29// starting with lower case or numbers only30StringRef CPUName = A->getValue();3132if (CPUName == "native") {33std::string CPU = std::string(llvm::sys::getHostCPUName());34if (!CPU.empty() && CPU != "generic")35return CPU;36}3738if (CPUName == "common")39return "generic";4041return llvm::StringSwitch<std::string>(CPUName)42.Cases("m68000", "68000", "M68000")43.Cases("m68010", "68010", "M68010")44.Cases("m68020", "68020", "M68020")45.Cases("m68030", "68030", "M68030")46.Cases("m68040", "68040", "M68040")47.Cases("m68060", "68060", "M68060")48.Default(CPUName.str());49}50// FIXME: Throw error when multiple sub-architecture flag exist51if (Args.hasArg(clang::driver::options::OPT_m68000))52return "M68000";53if (Args.hasArg(clang::driver::options::OPT_m68010))54return "M68010";55if (Args.hasArg(clang::driver::options::OPT_m68020))56return "M68020";57if (Args.hasArg(clang::driver::options::OPT_m68030))58return "M68030";59if (Args.hasArg(clang::driver::options::OPT_m68040))60return "M68040";61if (Args.hasArg(clang::driver::options::OPT_m68060))62return "M68060";6364return "";65}6667static void addFloatABIFeatures(const llvm::opt::ArgList &Args,68std::vector<llvm::StringRef> &Features) {69Arg *A = Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,70options::OPT_m68881);71// Opt out FPU even for newer CPUs.72if (A && A->getOption().matches(options::OPT_msoft_float)) {73Features.push_back("-isa-68881");74Features.push_back("-isa-68882");75return;76}7778std::string CPU = m68k::getM68kTargetCPU(Args);79// Only enable M68881 for CPU < 68020 if the related flags are present.80if ((A && (CPU == "M68000" || CPU == "M68010")) ||81// Otherwise, by default we assume newer CPUs have M68881/2.82CPU == "M68020")83Features.push_back("+isa-68881");84else if (CPU == "M68030" || CPU == "M68040" || CPU == "M68060")85// Note that although CPU >= M68040 imply M68882, we still add `isa-68882`86// anyway so that it's easier to add or not add the corresponding macro87// definitions later, in case we want to disable 68881/2 in newer CPUs88// (with -msoft-float, for instance).89Features.push_back("+isa-68882");90}9192void m68k::getM68kTargetFeatures(const Driver &D, const llvm::Triple &Triple,93const ArgList &Args,94std::vector<StringRef> &Features) {95addFloatABIFeatures(Args, Features);9697// Handle '-ffixed-<register>' flags98if (Args.hasArg(options::OPT_ffixed_a0))99Features.push_back("+reserve-a0");100if (Args.hasArg(options::OPT_ffixed_a1))101Features.push_back("+reserve-a1");102if (Args.hasArg(options::OPT_ffixed_a2))103Features.push_back("+reserve-a2");104if (Args.hasArg(options::OPT_ffixed_a3))105Features.push_back("+reserve-a3");106if (Args.hasArg(options::OPT_ffixed_a4))107Features.push_back("+reserve-a4");108if (Args.hasArg(options::OPT_ffixed_a5))109Features.push_back("+reserve-a5");110if (Args.hasArg(options::OPT_ffixed_a6))111Features.push_back("+reserve-a6");112if (Args.hasArg(options::OPT_ffixed_d0))113Features.push_back("+reserve-d0");114if (Args.hasArg(options::OPT_ffixed_d1))115Features.push_back("+reserve-d1");116if (Args.hasArg(options::OPT_ffixed_d2))117Features.push_back("+reserve-d2");118if (Args.hasArg(options::OPT_ffixed_d3))119Features.push_back("+reserve-d3");120if (Args.hasArg(options::OPT_ffixed_d4))121Features.push_back("+reserve-d4");122if (Args.hasArg(options::OPT_ffixed_d5))123Features.push_back("+reserve-d5");124if (Args.hasArg(options::OPT_ffixed_d6))125Features.push_back("+reserve-d6");126if (Args.hasArg(options::OPT_ffixed_d7))127Features.push_back("+reserve-d7");128}129130131