Skip to content

Commit 5509748

Browse files
committed
[cfe][driver][M68k](8/8) Clang driver support
Add M68k-specific toolchain and driver configurations / options. Authors: myhsu, m4yers, glaubitz Differential Revision: https://reviews.llvm.org/D88394
1 parent 5eb7a58 commit 5509748

File tree

10 files changed

+258
-0
lines changed

10 files changed

+258
-0
lines changed

clang/include/clang/Driver/Options.td

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,8 @@ def m_hexagon_Features_Group : OptionGroup<"<hexagon features group>">,
160160
// These are explicitly handled.
161161
def m_hexagon_Features_HVX_Group : OptionGroup<"<hexagon features group>">,
162162
Group<m_Group>, DocName<"Hexagon">;
163+
def m_m68k_Features_Group: OptionGroup<"<m68k features group>">,
164+
Group<m_Group>, DocName<"M68k">;
163165
def m_mips_Features_Group : OptionGroup<"<mips features group>">,
164166
Group<m_Group>, DocName<"MIPS">;
165167
def m_ppc_Features_Group : OptionGroup<"<ppc features group>">,
@@ -3895,6 +3897,13 @@ def mnvs : Flag<["-"], "mnvs">, Group<m_hexagon_Features_Group>,
38953897
def mno_nvs : Flag<["-"], "mno-nvs">, Group<m_hexagon_Features_Group>,
38963898
Flags<[CC1Option]>, HelpText<"Disable generation of new-value stores">;
38973899

3900+
// M68k features flags
3901+
def m68000 : Flag<["-"], "m68000">, Group<m_m68k_Features_Group>;
3902+
def m68010 : Flag<["-"], "m68010">, Group<m_m68k_Features_Group>;
3903+
def m68020 : Flag<["-"], "m68020">, Group<m_m68k_Features_Group>;
3904+
def m68030 : Flag<["-"], "m68030">, Group<m_m68k_Features_Group>;
3905+
def m68040 : Flag<["-"], "m68040">, Group<m_m68k_Features_Group>;
3906+
def m68060 : Flag<["-"], "m68060">, Group<m_m68k_Features_Group>;
38983907

38993908
// X86 feature flags
39003909
def mx87 : Flag<["-"], "mx87">, Group<m_x86_Features_Group>;

clang/lib/Driver/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ add_clang_library(clangDriver
2626
ToolChain.cpp
2727
ToolChains/Arch/AArch64.cpp
2828
ToolChains/Arch/ARM.cpp
29+
ToolChains/Arch/M68k.cpp
2930
ToolChains/Arch/Mips.cpp
3031
ToolChains/Arch/PPC.cpp
3132
ToolChains/Arch/RISCV.cpp
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
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-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#include "M68k.h"
10+
#include "ToolChains/CommonArgs.h"
11+
#include "clang/Driver/Driver.h"
12+
#include "clang/Driver/DriverDiagnostic.h"
13+
#include "clang/Driver/Options.h"
14+
#include "llvm/ADT/SmallVector.h"
15+
#include "llvm/ADT/StringSwitch.h"
16+
#include "llvm/Option/ArgList.h"
17+
#include "llvm/Support/Host.h"
18+
#include "llvm/Support/Regex.h"
19+
#include <sstream>
20+
21+
using namespace clang::driver;
22+
using namespace clang::driver::tools;
23+
using namespace clang;
24+
using namespace llvm::opt;
25+
26+
/// getM68kTargetCPU - Get the (LLVM) name of the 68000 cpu we are targeting.
27+
std::string m68k::getM68kTargetCPU(const ArgList &Args) {
28+
if (Arg *A = Args.getLastArg(clang::driver::options::OPT_mcpu_EQ)) {
29+
// The canonical CPU name is captalize. However, we allow
30+
// starting with lower case or numbers only
31+
StringRef CPUName = A->getValue();
32+
33+
if (CPUName == "native") {
34+
std::string CPU = std::string(llvm::sys::getHostCPUName());
35+
if (!CPU.empty() && CPU != "generic")
36+
return CPU;
37+
}
38+
39+
if (CPUName == "common")
40+
return "generic";
41+
42+
return llvm::StringSwitch<std::string>(CPUName)
43+
.Cases("m68000", "68000", "M68000")
44+
.Cases("m68010", "68010", "M68010")
45+
.Cases("m68020", "68020", "M68020")
46+
.Cases("m68030", "68030", "M68030")
47+
.Cases("m68040", "68040", "M68040")
48+
.Cases("m68060", "68060", "M68060")
49+
.Default(CPUName.str());
50+
}
51+
// FIXME: Throw error when multiple sub-architecture flag exist
52+
if (Args.hasArg(clang::driver::options::OPT_m68000))
53+
return "M68000";
54+
if (Args.hasArg(clang::driver::options::OPT_m68010))
55+
return "M68010";
56+
if (Args.hasArg(clang::driver::options::OPT_m68020))
57+
return "M68020";
58+
if (Args.hasArg(clang::driver::options::OPT_m68030))
59+
return "M68030";
60+
if (Args.hasArg(clang::driver::options::OPT_m68040))
61+
return "M68040";
62+
if (Args.hasArg(clang::driver::options::OPT_m68060))
63+
return "M68060";
64+
65+
return "";
66+
}
67+
68+
void m68k::getM68kTargetFeatures(const Driver &D, const llvm::Triple &Triple,
69+
const ArgList &Args,
70+
std::vector<StringRef> &Features) {
71+
72+
m68k::FloatABI FloatABI = m68k::getM68kFloatABI(D, Args);
73+
if (FloatABI == m68k::FloatABI::Soft)
74+
Features.push_back("-hard-float");
75+
}
76+
77+
m68k::FloatABI m68k::getM68kFloatABI(const Driver &D, const ArgList &Args) {
78+
m68k::FloatABI ABI = m68k::FloatABI::Invalid;
79+
if (Arg *A =
80+
Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
81+
82+
if (A->getOption().matches(options::OPT_msoft_float))
83+
ABI = m68k::FloatABI::Soft;
84+
else if (A->getOption().matches(options::OPT_mhard_float))
85+
ABI = m68k::FloatABI::Hard;
86+
}
87+
88+
// If unspecified, choose the default based on the platform.
89+
if (ABI == m68k::FloatABI::Invalid)
90+
ABI = m68k::FloatABI::Hard;
91+
92+
return ABI;
93+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
//===--- M68k.h - M68k-specific Tool Helpers -----------------*- 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+
#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_ARCH_M680X0_H
10+
#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_ARCH_M680X0_H
11+
12+
#include "clang/Driver/Driver.h"
13+
#include "llvm/ADT/StringRef.h"
14+
#include "llvm/Option/Option.h"
15+
#include <string>
16+
#include <vector>
17+
18+
namespace clang {
19+
namespace driver {
20+
namespace tools {
21+
namespace m68k {
22+
23+
enum class FloatABI {
24+
Invalid,
25+
Soft,
26+
Hard,
27+
};
28+
29+
FloatABI getM68kFloatABI(const Driver &D, const llvm::opt::ArgList &Args);
30+
31+
std::string getM68kTargetCPU(const llvm::opt::ArgList &Args);
32+
33+
void getM68kTargetFeatures(const Driver &D, const llvm::Triple &Triple,
34+
const llvm::opt::ArgList &Args,
35+
std::vector<llvm::StringRef> &Features);
36+
37+
} // end namespace m68k
38+
} // end namespace tools
39+
} // end namespace driver
40+
} // end namespace clang
41+
42+
#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_ARCH_M680X0_H

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "AMDGPU.h"
1111
#include "Arch/AArch64.h"
1212
#include "Arch/ARM.h"
13+
#include "Arch/M68k.h"
1314
#include "Arch/Mips.h"
1415
#include "Arch/PPC.h"
1516
#include "Arch/RISCV.h"
@@ -365,6 +366,9 @@ static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
365366
case llvm::Triple::amdgcn:
366367
amdgpu::getAMDGPUTargetFeatures(D, Triple, Args, Features);
367368
break;
369+
case llvm::Triple::m68k:
370+
m68k::getM68kTargetFeatures(D, Triple, Args, Features);
371+
break;
368372
case llvm::Triple::msp430:
369373
msp430::getMSP430TargetFeatures(D, Args, Features);
370374
break;

clang/lib/Driver/ToolChains/CommonArgs.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "CommonArgs.h"
1010
#include "Arch/AArch64.h"
1111
#include "Arch/ARM.h"
12+
#include "Arch/M68k.h"
1213
#include "Arch/Mips.h"
1314
#include "Arch/PPC.h"
1415
#include "Arch/SystemZ.h"
@@ -372,6 +373,9 @@ std::string tools::getCPUName(const ArgList &Args, const llvm::Triple &T,
372373
return A->getValue();
373374
return "";
374375

376+
case llvm::Triple::m68k:
377+
return m68k::getM68kTargetCPU(Args);
378+
375379
case llvm::Triple::mips:
376380
case llvm::Triple::mipsel:
377381
case llvm::Triple::mips64:

clang/lib/Driver/ToolChains/Gnu.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,8 @@ static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
254254
case llvm::Triple::armeb:
255255
case llvm::Triple::thumbeb:
256256
return isArmBigEndian(T, Args) ? "armelfb_linux_eabi" : "armelf_linux_eabi";
257+
case llvm::Triple::m68k:
258+
return "m68kelf";
257259
case llvm::Triple::ppc:
258260
if (T.isOSLinux())
259261
return "elf32ppclinux";
@@ -2114,6 +2116,10 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes(
21142116
"i686-linux-android", "i386-gnu", "i486-gnu",
21152117
"i586-gnu", "i686-gnu"};
21162118

2119+
static const char *const M68kLibDirs[] = {"/lib"};
2120+
static const char *const M68kTriples[] = {
2121+
"m68k-linux-gnu", "m68k-unknown-linux-gnu", "m68k-suse-linux"};
2122+
21172123
static const char *const MIPSLibDirs[] = {"/lib"};
21182124
static const char *const MIPSTriples[] = {
21192125
"mips-linux-gnu", "mips-mti-linux", "mips-mti-linux-gnu",
@@ -2353,6 +2359,10 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes(
23532359
BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
23542360
}
23552361
break;
2362+
case llvm::Triple::m68k:
2363+
LibDirs.append(begin(M68kLibDirs), end(M68kLibDirs));
2364+
TripleAliases.append(begin(M68kTriples), end(M68kTriples));
2365+
break;
23562366
case llvm::Triple::mips:
23572367
LibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
23582368
TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
@@ -2760,6 +2770,7 @@ bool Generic_GCC::IsIntegratedAssemblerDefault() const {
27602770
case llvm::Triple::mips64:
27612771
case llvm::Triple::mips64el:
27622772
case llvm::Triple::msp430:
2773+
case llvm::Triple::m68k:
27632774
return true;
27642775
case llvm::Triple::sparc:
27652776
case llvm::Triple::sparcel:

clang/lib/Driver/ToolChains/Linux.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,12 @@ std::string Linux::getMultiarchTriple(const Driver &D,
102102
if (D.getVFS().exists(SysRoot + "/lib/aarch64_be-linux-gnu"))
103103
return "aarch64_be-linux-gnu";
104104
break;
105+
106+
case llvm::Triple::m68k:
107+
if (D.getVFS().exists(SysRoot + "/lib/m68k-linux-gnu"))
108+
return "m68k-linux-gnu";
109+
break;
110+
105111
case llvm::Triple::mips: {
106112
std::string MT = IsMipsR6 ? "mipsisa32r6-linux-gnu" : "mips-linux-gnu";
107113
if (D.getVFS().exists(SysRoot + "/lib/" + MT))
@@ -476,6 +482,10 @@ std::string Linux::getDynamicLinker(const ArgList &Args) const {
476482
Loader = HF ? "ld-linux-armhf.so.3" : "ld-linux.so.3";
477483
break;
478484
}
485+
case llvm::Triple::m68k:
486+
LibDir = "lib";
487+
Loader = "ld.so.1";
488+
break;
479489
case llvm::Triple::mips:
480490
case llvm::Triple::mipsel:
481491
case llvm::Triple::mips64:
@@ -624,6 +634,7 @@ void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
624634
"/usr/include/armeb-linux-gnueabi"};
625635
const StringRef ARMEBHFMultiarchIncludeDirs[] = {
626636
"/usr/include/armeb-linux-gnueabihf"};
637+
const StringRef M68kMultiarchIncludeDirs[] = {"/usr/include/m68k-linux-gnu"};
627638
const StringRef MIPSMultiarchIncludeDirs[] = {"/usr/include/mips-linux-gnu"};
628639
const StringRef MIPSELMultiarchIncludeDirs[] = {
629640
"/usr/include/mipsel-linux-gnu"};
@@ -688,6 +699,9 @@ void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
688699
else
689700
MultiarchIncludeDirs = ARMEBMultiarchIncludeDirs;
690701
break;
702+
case llvm::Triple::m68k:
703+
MultiarchIncludeDirs = M68kMultiarchIncludeDirs;
704+
break;
691705
case llvm::Triple::mips:
692706
if (getTriple().getSubArch() == llvm::Triple::MipsSubArch_r6)
693707
MultiarchIncludeDirs = MIPSR6MultiarchIncludeDirs;

clang/test/Driver/m68k-features.cpp

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// Check macro definitions
2+
// RUN: %clang -target m68k-unknown-linux -m68000 -dM -E %s | FileCheck --check-prefix=CHECK-MX %s
3+
// CHECK-MX: #define __mc68000 1
4+
// CHECK-MX: #define __mc68000__ 1
5+
// CHECK-MX: #define mc68000 1
6+
7+
// RUN: %clang -target m68k-unknown-linux -m68010 -dM -E %s | FileCheck --check-prefix=CHECK-MX10 %s
8+
// CHECK-MX10: #define __mc68000 1
9+
// CHECK-MX10: #define __mc68000__ 1
10+
// CHECK-MX10: #define __mc68010 1
11+
// CHECK-MX10: #define __mc68010__ 1
12+
// CHECK-MX10: #define mc68000 1
13+
// CHECK-MX10: #define mc68010 1
14+
15+
// RUN: %clang -target m68k-unknown-linux -m68020 -dM -E %s | FileCheck --check-prefix=CHECK-MX20 %s
16+
// CHECK-MX20: #define __mc68000 1
17+
// CHECK-MX20: #define __mc68000__ 1
18+
// CHECK-MX20: #define __mc68020 1
19+
// CHECK-MX20: #define __mc68020__ 1
20+
// CHECK-MX20: #define mc68000 1
21+
// CHECK-MX20: #define mc68020 1
22+
23+
// RUN: %clang -target m68k-unknown-linux -m68030 -dM -E %s | FileCheck --check-prefix=CHECK-MX30 %s
24+
// CHECK-MX30: #define __mc68000 1
25+
// CHECK-MX30: #define __mc68000__ 1
26+
// CHECK-MX30: #define __mc68030 1
27+
// CHECK-MX30: #define __mc68030__ 1
28+
// CHECK-MX30: #define mc68000 1
29+
// CHECK-MX30: #define mc68030 1
30+
31+
// RUN: %clang -target m68k-unknown-linux -m68040 -dM -E %s | FileCheck --check-prefix=CHECK-MX40 %s
32+
// CHECK-MX40: #define __mc68000 1
33+
// CHECK-MX40: #define __mc68000__ 1
34+
// CHECK-MX40: #define __mc68040 1
35+
// CHECK-MX40: #define __mc68040__ 1
36+
// CHECK-MX40: #define mc68000 1
37+
// CHECK-MX40: #define mc68040 1
38+
39+
// RUN: %clang -target m68k-unknown-linux -m68060 -dM -E %s | FileCheck --check-prefix=CHECK-MX60 %s
40+
// CHECK-MX60: #define __mc68000 1
41+
// CHECK-MX60: #define __mc68000__ 1
42+
// CHECK-MX60: #define __mc68060 1
43+
// CHECK-MX60: #define __mc68060__ 1
44+
// CHECK-MX60: #define mc68000 1
45+
// CHECK-MX60: #define mc68060 1

clang/test/Driver/m68k-sub-archs.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// RUN: %clang -### -target m68k-unknown-linux -mcpu=68000 %s 2>&1 | FileCheck --check-prefix=CHECK-M00 %s
2+
// RUN: %clang -### -target m68k-unknown-linux -mcpu=m68000 %s 2>&1 | FileCheck --check-prefix=CHECK-M00 %s
3+
// RUN: %clang -### -target m68k-unknown-linux -mcpu=M68000 %s 2>&1 | FileCheck --check-prefix=CHECK-M00 %s
4+
// RUN: %clang -### -target m68k-unknown-linux -m68000 %s 2>&1 | FileCheck --check-prefix=CHECK-M00 %s
5+
// CHECK-M00: "-target-cpu" "M68000"
6+
7+
// RUN: %clang -### -target m68k-unknown-linux -mcpu=68010 %s 2>&1 | FileCheck --check-prefix=CHECK-M10 %s
8+
// RUN: %clang -### -target m68k-unknown-linux -mcpu=m68010 %s 2>&1 | FileCheck --check-prefix=CHECK-M10 %s
9+
// RUN: %clang -### -target m68k-unknown-linux -mcpu=M68010 %s 2>&1 | FileCheck --check-prefix=CHECK-M10 %s
10+
// RUN: %clang -### -target m68k-unknown-linux -m68010 %s 2>&1 | FileCheck --check-prefix=CHECK-M10 %s
11+
// CHECK-M10: "-target-cpu" "M68010"
12+
13+
// RUN: %clang -### -target m68k-unknown-linux -mcpu=68020 %s 2>&1 | FileCheck --check-prefix=CHECK-M20 %s
14+
// RUN: %clang -### -target m68k-unknown-linux -mcpu=m68020 %s 2>&1 | FileCheck --check-prefix=CHECK-M20 %s
15+
// RUN: %clang -### -target m68k-unknown-linux -mcpu=M68020 %s 2>&1 | FileCheck --check-prefix=CHECK-M20 %s
16+
// RUN: %clang -### -target m68k-unknown-linux -m68020 %s 2>&1 | FileCheck --check-prefix=CHECK-M20 %s
17+
// CHECK-M20: "-target-cpu" "M68020"
18+
19+
// RUN: %clang -### -target m68k-unknown-linux -mcpu=68030 %s 2>&1 | FileCheck --check-prefix=CHECK-M30 %s
20+
// RUN: %clang -### -target m68k-unknown-linux -mcpu=m68030 %s 2>&1 | FileCheck --check-prefix=CHECK-M30 %s
21+
// RUN: %clang -### -target m68k-unknown-linux -mcpu=M68030 %s 2>&1 | FileCheck --check-prefix=CHECK-M30 %s
22+
// RUN: %clang -### -target m68k-unknown-linux -m68030 %s 2>&1 | FileCheck --check-prefix=CHECK-M30 %s
23+
// CHECK-M30: "-target-cpu" "M68030"
24+
25+
// RUN: %clang -### -target m68k-unknown-linux -mcpu=68040 %s 2>&1 | FileCheck --check-prefix=CHECK-M40 %s
26+
// RUN: %clang -### -target m68k-unknown-linux -mcpu=m68040 %s 2>&1 | FileCheck --check-prefix=CHECK-M40 %s
27+
// RUN: %clang -### -target m68k-unknown-linux -mcpu=M68040 %s 2>&1 | FileCheck --check-prefix=CHECK-M40 %s
28+
// RUN: %clang -### -target m68k-unknown-linux -m68040 %s 2>&1 | FileCheck --check-prefix=CHECK-M40 %s
29+
// CHECK-M40: "-target-cpu" "M68040"
30+
31+
// RUN: %clang -### -target m68k-unknown-linux -mcpu=68060 %s 2>&1 | FileCheck --check-prefix=CHECK-M60 %s
32+
// RUN: %clang -### -target m68k-unknown-linux -mcpu=m68060 %s 2>&1 | FileCheck --check-prefix=CHECK-M60 %s
33+
// RUN: %clang -### -target m68k-unknown-linux -mcpu=M68060 %s 2>&1 | FileCheck --check-prefix=CHECK-M60 %s
34+
// RUN: %clang -### -target m68k-unknown-linux -m68060 %s 2>&1 | FileCheck --check-prefix=CHECK-M60 %s
35+
// CHECK-M60: "-target-cpu" "M68060"

0 commit comments

Comments
 (0)