Skip to content

Commit e6157bb

Browse files
committed
[Clang][MIPS] Create specific targets for MIPS PE/COFF
Implement GNU and MSVC variants. When using them, _WIN32 and _M_MRX000/_MIPS_ macros are correctly defined.
1 parent 607f719 commit e6157bb

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: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,3 +304,63 @@ 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+
313+
void WindowsMipsTargetInfo::getVisualStudioDefines(const LangOptions &Opts,
314+
MacroBuilder &Builder) const {
315+
Builder.defineMacro("_M_MRX000", "4000");
316+
}
317+
318+
TargetInfo::BuiltinVaListKind
319+
WindowsMipsTargetInfo::getBuiltinVaListKind() const {
320+
return TargetInfo::CharPtrBuiltinVaList;
321+
}
322+
323+
TargetInfo::CallingConvCheckResult
324+
WindowsMipsTargetInfo::checkCallingConvention(CallingConv CC) const {
325+
switch (CC) {
326+
case CC_X86StdCall:
327+
case CC_X86ThisCall:
328+
case CC_X86FastCall:
329+
case CC_X86VectorCall:
330+
return CCCR_Ignore;
331+
case CC_C:
332+
case CC_OpenCLKernel:
333+
case CC_PreserveMost:
334+
case CC_PreserveAll:
335+
case CC_Swift:
336+
case CC_SwiftAsync:
337+
return CCCR_OK;
338+
default:
339+
return CCCR_Warning;
340+
}
341+
}
342+
343+
// Windows MIPS, MS (C++) ABI
344+
MicrosoftMipsTargetInfo::MicrosoftMipsTargetInfo(const llvm::Triple &Triple,
345+
const TargetOptions &Opts)
346+
: WindowsMipsTargetInfo(Triple, Opts) {
347+
TheCXXABI.set(TargetCXXABI::Microsoft);
348+
}
349+
350+
void MicrosoftMipsTargetInfo::getTargetDefines(const LangOptions &Opts,
351+
MacroBuilder &Builder) const {
352+
WindowsMipsTargetInfo::getTargetDefines(Opts, Builder);
353+
WindowsMipsTargetInfo::getVisualStudioDefines(Opts, Builder);
354+
}
355+
356+
MinGWMipsTargetInfo::MinGWMipsTargetInfo(const llvm::Triple &Triple,
357+
const TargetOptions &Opts)
358+
: WindowsMipsTargetInfo(Triple, Opts) {
359+
TheCXXABI.set(TargetCXXABI::GenericMIPS);
360+
}
361+
362+
void MinGWMipsTargetInfo::getTargetDefines(const LangOptions &Opts,
363+
MacroBuilder &Builder) const {
364+
WindowsMipsTargetInfo::getTargetDefines(Opts, Builder);
365+
Builder.defineMacro("_MIPS_");
366+
}

clang/lib/Basic/Targets/Mips.h

Lines changed: 36 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,41 @@ 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 : public WindowsMipsTargetInfo {
483+
public:
484+
MinGWMipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
485+
486+
void getTargetDefines(const LangOptions &Opts,
487+
MacroBuilder &Builder) const override;
488+
};
453489
} // namespace targets
454490
} // namespace clang
455491

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,13 @@
108108
// CHECK-ARM64EC-WIN: #define _WIN32 1
109109
// CHECK-ARM64EC-WIN: #define _WIN64 1
110110

111+
// RUN: %clang_cc1 -triple mipsel-windows %s -E -dM -o - \
112+
// RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-MIPSEL-WIN
113+
114+
// CHECK-MIPSEL-WIN: #define _M_MRX000 4000
115+
// CHECK-MIPSEL-WIN: #define _WIN32 1
116+
// CHECK-MIPSEL-WIN-NOT: #define _MIPS_ 1
117+
111118
// RUN: %clang_cc1 -triple i686-windows-gnu %s -E -dM -o - \
112119
// RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-X86-MINGW
113120

@@ -168,3 +175,12 @@
168175
// CHECK-ARM64EC-MINGW: #define __arm64ec__ 1
169176
// CHECK-ARM64EC-MINGW: #define __x86_64 1
170177
// CHECK-ARM64EC-MINGW: #define __x86_64__ 1
178+
179+
// RUN: %clang_cc1 -triple mipsel-windows-gnu %s -E -dM -o - \
180+
// RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-MIPSEL-MINGW
181+
182+
// CHECK-MIPSEL-MINGW-NOT: #define _M_MRX000 4000
183+
// CHECK-MIPSEL-MINGW: #define _MIPS_ 1
184+
// CHECK-MIPSEL-MINGW: #define _WIN32 1
185+
// CHECK-MIPSEL-MINGW: #define __mips 32
186+
// CHECK-MIPSEL-MINGW: #define __mips__ 1

0 commit comments

Comments
 (0)