Skip to content

Commit 970f65a

Browse files
authored
[Clang][MIPS] Create specific targets for MIPS PE/COFF (#121040)
Implement GNU and MSVC variants. When using them, _WIN32 and _M_MRX000/_MIPS_ macros are correctly defined.
1 parent 34f8573 commit 970f65a

File tree

4 files changed

+120
-0
lines changed

4 files changed

+120
-0
lines changed

clang/lib/Basic/Targets.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,14 @@ std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple,
297297
case llvm::Triple::NaCl:
298298
return std::make_unique<NaClTargetInfo<NaClMips32TargetInfo>>(Triple,
299299
Opts);
300+
case llvm::Triple::Win32:
301+
switch (Triple.getEnvironment()) {
302+
case llvm::Triple::GNU:
303+
return std::make_unique<MinGWMipsTargetInfo>(Triple, Opts);
304+
case llvm::Triple::MSVC:
305+
default: // Assume MSVC for unknown environments
306+
return std::make_unique<MicrosoftMipsTargetInfo>(Triple, Opts);
307+
}
300308
default:
301309
return std::make_unique<MipsTargetInfo>(Triple, Opts);
302310
}

clang/lib/Basic/Targets/Mips.cpp

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,3 +304,62 @@ bool MipsTargetInfo::validateTarget(DiagnosticsEngine &Diags) const {
304304

305305
return true;
306306
}
307+
308+
WindowsMipsTargetInfo::WindowsMipsTargetInfo(const llvm::Triple &Triple,
309+
const TargetOptions &Opts)
310+
: WindowsTargetInfo<MipsTargetInfo>(Triple, Opts), Triple(Triple) {}
311+
312+
void WindowsMipsTargetInfo::getVisualStudioDefines(
313+
const LangOptions &Opts, MacroBuilder &Builder) const {
314+
Builder.defineMacro("_M_MRX000", "4000");
315+
}
316+
317+
TargetInfo::BuiltinVaListKind
318+
WindowsMipsTargetInfo::getBuiltinVaListKind() const {
319+
return TargetInfo::CharPtrBuiltinVaList;
320+
}
321+
322+
TargetInfo::CallingConvCheckResult
323+
WindowsMipsTargetInfo::checkCallingConvention(CallingConv CC) const {
324+
switch (CC) {
325+
case CC_X86StdCall:
326+
case CC_X86ThisCall:
327+
case CC_X86FastCall:
328+
case CC_X86VectorCall:
329+
return CCCR_Ignore;
330+
case CC_C:
331+
case CC_OpenCLKernel:
332+
case CC_PreserveMost:
333+
case CC_PreserveAll:
334+
case CC_Swift:
335+
case CC_SwiftAsync:
336+
return CCCR_OK;
337+
default:
338+
return CCCR_Warning;
339+
}
340+
}
341+
342+
// Windows MIPS, MS (C++) ABI
343+
MicrosoftMipsTargetInfo::MicrosoftMipsTargetInfo(const llvm::Triple &Triple,
344+
const TargetOptions &Opts)
345+
: WindowsMipsTargetInfo(Triple, Opts) {
346+
TheCXXABI.set(TargetCXXABI::Microsoft);
347+
}
348+
349+
void MicrosoftMipsTargetInfo::getTargetDefines(const LangOptions &Opts,
350+
MacroBuilder &Builder) const {
351+
WindowsMipsTargetInfo::getTargetDefines(Opts, Builder);
352+
WindowsMipsTargetInfo::getVisualStudioDefines(Opts, Builder);
353+
}
354+
355+
MinGWMipsTargetInfo::MinGWMipsTargetInfo(const llvm::Triple &Triple,
356+
const TargetOptions &Opts)
357+
: WindowsMipsTargetInfo(Triple, Opts) {
358+
TheCXXABI.set(TargetCXXABI::GenericMIPS);
359+
}
360+
361+
void MinGWMipsTargetInfo::getTargetDefines(const LangOptions &Opts,
362+
MacroBuilder &Builder) const {
363+
WindowsMipsTargetInfo::getTargetDefines(Opts, Builder);
364+
Builder.defineMacro("_MIPS_");
365+
}

clang/lib/Basic/Targets/Mips.h

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#ifndef LLVM_CLANG_LIB_BASIC_TARGETS_MIPS_H
1414
#define LLVM_CLANG_LIB_BASIC_TARGETS_MIPS_H
1515

16+
#include "OSTargets.h"
1617
#include "clang/Basic/TargetInfo.h"
1718
#include "clang/Basic/TargetOptions.h"
1819
#include "llvm/Support/Compiler.h"
@@ -450,6 +451,42 @@ class LLVM_LIBRARY_VISIBILITY MipsTargetInfo : public TargetInfo {
450451
return std::make_pair(32, 32);
451452
}
452453
};
454+
455+
class LLVM_LIBRARY_VISIBILITY WindowsMipsTargetInfo
456+
: public WindowsTargetInfo<MipsTargetInfo> {
457+
const llvm::Triple Triple;
458+
459+
public:
460+
WindowsMipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
461+
462+
void getVisualStudioDefines(const LangOptions &Opts,
463+
MacroBuilder &Builder) const;
464+
465+
BuiltinVaListKind getBuiltinVaListKind() const override;
466+
467+
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override;
468+
};
469+
470+
// Windows MIPS, MS (C++) ABI
471+
class LLVM_LIBRARY_VISIBILITY MicrosoftMipsTargetInfo
472+
: public WindowsMipsTargetInfo {
473+
public:
474+
MicrosoftMipsTargetInfo(const llvm::Triple &Triple,
475+
const TargetOptions &Opts);
476+
477+
void getTargetDefines(const LangOptions &Opts,
478+
MacroBuilder &Builder) const override;
479+
};
480+
481+
// MIPS MinGW target
482+
class LLVM_LIBRARY_VISIBILITY MinGWMipsTargetInfo
483+
: public WindowsMipsTargetInfo {
484+
public:
485+
MinGWMipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
486+
487+
void getTargetDefines(const LangOptions &Opts,
488+
MacroBuilder &Builder) const override;
489+
};
453490
} // namespace targets
454491
} // namespace clang
455492

clang/test/Preprocessor/predefined-win-macros.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,13 @@
113113
// CHECK-ARM64EC-WIN: #define _WIN32 1
114114
// CHECK-ARM64EC-WIN: #define _WIN64 1
115115

116+
// RUN: %clang_cc1 -triple mipsel-windows %s -E -dM -o - \
117+
// RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-MIPSEL-WIN
118+
119+
// CHECK-MIPSEL-WIN: #define _M_MRX000 4000
120+
// CHECK-MIPSEL-WIN: #define _WIN32 1
121+
// CHECK-MIPSEL-WIN-NOT: #define _MIPS_ 1
122+
116123
// RUN: %clang_cc1 -triple i686-windows-gnu %s -E -dM -o - \
117124
// RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-X86-MINGW
118125

@@ -173,3 +180,12 @@
173180
// CHECK-ARM64EC-MINGW: #define __arm64ec__ 1
174181
// CHECK-ARM64EC-MINGW: #define __x86_64 1
175182
// CHECK-ARM64EC-MINGW: #define __x86_64__ 1
183+
184+
// RUN: %clang_cc1 -triple mipsel-windows-gnu %s -E -dM -o - \
185+
// RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-MIPSEL-MINGW
186+
187+
// CHECK-MIPSEL-MINGW-NOT: #define _M_MRX000 4000
188+
// CHECK-MIPSEL-MINGW: #define _MIPS_ 1
189+
// CHECK-MIPSEL-MINGW: #define _WIN32 1
190+
// CHECK-MIPSEL-MINGW: #define __mips 32
191+
// CHECK-MIPSEL-MINGW: #define __mips__ 1

0 commit comments

Comments
 (0)