126 lines · cpp
1//===--- M68k.cpp - M68k 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-exception6//7//===----------------------------------------------------------------------===//8 9#include "M68k.h"10#include "clang/Driver/Driver.h"11#include "clang/Options/Options.h"12#include "llvm/ADT/StringSwitch.h"13#include "llvm/Option/ArgList.h"14#include "llvm/Support/Regex.h"15#include "llvm/TargetParser/Host.h"16 17using namespace clang::driver;18using namespace clang::driver::tools;19using namespace clang;20using namespace llvm::opt;21 22/// getM68kTargetCPU - Get the (LLVM) name of the 68000 cpu we are targeting.23std::string m68k::getM68kTargetCPU(const ArgList &Args) {24 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {25 // The canonical CPU name is captalize. However, we allow26 // starting with lower case or numbers only27 StringRef CPUName = A->getValue();28 29 if (CPUName == "native") {30 std::string CPU = std::string(llvm::sys::getHostCPUName());31 if (!CPU.empty() && CPU != "generic")32 return CPU;33 }34 35 if (CPUName == "common")36 return "generic";37 38 return llvm::StringSwitch<std::string>(CPUName)39 .Cases({"m68000", "68000"}, "M68000")40 .Cases({"m68010", "68010"}, "M68010")41 .Cases({"m68020", "68020"}, "M68020")42 .Cases({"m68030", "68030"}, "M68030")43 .Cases({"m68040", "68040"}, "M68040")44 .Cases({"m68060", "68060"}, "M68060")45 .Default(CPUName.str());46 }47 // FIXME: Throw error when multiple sub-architecture flag exist48 if (Args.hasArg(options::OPT_m68000))49 return "M68000";50 if (Args.hasArg(options::OPT_m68010))51 return "M68010";52 if (Args.hasArg(options::OPT_m68020))53 return "M68020";54 if (Args.hasArg(options::OPT_m68030))55 return "M68030";56 if (Args.hasArg(options::OPT_m68040))57 return "M68040";58 if (Args.hasArg(options::OPT_m68060))59 return "M68060";60 61 return "";62}63 64static void addFloatABIFeatures(const llvm::opt::ArgList &Args,65 std::vector<llvm::StringRef> &Features) {66 Arg *A = Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,67 options::OPT_m68881);68 // Opt out FPU even for newer CPUs.69 if (A && A->getOption().matches(options::OPT_msoft_float)) {70 Features.push_back("-isa-68881");71 Features.push_back("-isa-68882");72 return;73 }74 75 std::string CPU = m68k::getM68kTargetCPU(Args);76 // Only enable M68881 for CPU < 68020 if the related flags are present.77 if ((A && (CPU == "M68000" || CPU == "M68010")) ||78 // Otherwise, by default we assume newer CPUs have M68881/2.79 CPU == "M68020")80 Features.push_back("+isa-68881");81 else if (CPU == "M68030" || CPU == "M68040" || CPU == "M68060")82 // Note that although CPU >= M68040 imply M68882, we still add `isa-68882`83 // anyway so that it's easier to add or not add the corresponding macro84 // definitions later, in case we want to disable 68881/2 in newer CPUs85 // (with -msoft-float, for instance).86 Features.push_back("+isa-68882");87}88 89void m68k::getM68kTargetFeatures(const Driver &D, const llvm::Triple &Triple,90 const ArgList &Args,91 std::vector<StringRef> &Features) {92 addFloatABIFeatures(Args, Features);93 94 // Handle '-ffixed-<register>' flags95 if (Args.hasArg(options::OPT_ffixed_a0))96 Features.push_back("+reserve-a0");97 if (Args.hasArg(options::OPT_ffixed_a1))98 Features.push_back("+reserve-a1");99 if (Args.hasArg(options::OPT_ffixed_a2))100 Features.push_back("+reserve-a2");101 if (Args.hasArg(options::OPT_ffixed_a3))102 Features.push_back("+reserve-a3");103 if (Args.hasArg(options::OPT_ffixed_a4))104 Features.push_back("+reserve-a4");105 if (Args.hasArg(options::OPT_ffixed_a5))106 Features.push_back("+reserve-a5");107 if (Args.hasArg(options::OPT_ffixed_a6))108 Features.push_back("+reserve-a6");109 if (Args.hasArg(options::OPT_ffixed_d0))110 Features.push_back("+reserve-d0");111 if (Args.hasArg(options::OPT_ffixed_d1))112 Features.push_back("+reserve-d1");113 if (Args.hasArg(options::OPT_ffixed_d2))114 Features.push_back("+reserve-d2");115 if (Args.hasArg(options::OPT_ffixed_d3))116 Features.push_back("+reserve-d3");117 if (Args.hasArg(options::OPT_ffixed_d4))118 Features.push_back("+reserve-d4");119 if (Args.hasArg(options::OPT_ffixed_d5))120 Features.push_back("+reserve-d5");121 if (Args.hasArg(options::OPT_ffixed_d6))122 Features.push_back("+reserve-d6");123 if (Args.hasArg(options::OPT_ffixed_d7))124 Features.push_back("+reserve-d7");125}126