[clang] [Clang][MIPS] Create correct linker arguments for Windows toolchains (PR #121041)
hpoussin wrote: Ping https://github.com/llvm/llvm-project/pull/121041 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][MIPS] Send correct architecture for MinGW toolchains (PR #121042)
hpoussin wrote: Ping https://github.com/llvm/llvm-project/pull/121042 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][MIPS] Create specific targets for MIPS PE/COFF (PR #121040)
https://github.com/hpoussin created https://github.com/llvm/llvm-project/pull/121040 Implement GNU and MSVC variants. When using them, _WIN32 and _M_MRX000/_MIPS_ macros are correctly defined. From cc5d9af37b0d78f4caeb05ce4f7203a8bcde644b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Sun, 22 Oct 2023 17:01:02 +0200 Subject: [PATCH] [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. --- clang/lib/Basic/Targets.cpp | 8 +++ clang/lib/Basic/Targets/Mips.cpp | 59 +++ clang/lib/Basic/Targets/Mips.h| 37 .../test/Preprocessor/predefined-win-macros.c | 16 + 4 files changed, 120 insertions(+) diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index 706a391023b3a3..d0815ad33bc759 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -297,6 +297,14 @@ std::unique_ptr AllocateTarget(const llvm::Triple &Triple, case llvm::Triple::NaCl: return std::make_unique>(Triple, Opts); +case llvm::Triple::Win32: + switch (Triple.getEnvironment()) { + case llvm::Triple::GNU: +return std::make_unique(Triple, Opts); + case llvm::Triple::MSVC: + default: // Assume MSVC for unknown environments +return std::make_unique(Triple, Opts); + } default: return std::make_unique(Triple, Opts); } diff --git a/clang/lib/Basic/Targets/Mips.cpp b/clang/lib/Basic/Targets/Mips.cpp index 174bc9d2ab9967..d56995e3ccc48e 100644 --- a/clang/lib/Basic/Targets/Mips.cpp +++ b/clang/lib/Basic/Targets/Mips.cpp @@ -304,3 +304,62 @@ bool MipsTargetInfo::validateTarget(DiagnosticsEngine &Diags) const { return true; } + +WindowsMipsTargetInfo::WindowsMipsTargetInfo(const llvm::Triple &Triple, + const TargetOptions &Opts) +: WindowsTargetInfo(Triple, Opts), Triple(Triple) {} + +void WindowsMipsTargetInfo::getVisualStudioDefines( +const LangOptions &Opts, MacroBuilder &Builder) const { + Builder.defineMacro("_M_MRX000", "4000"); +} + +TargetInfo::BuiltinVaListKind +WindowsMipsTargetInfo::getBuiltinVaListKind() const { + return TargetInfo::CharPtrBuiltinVaList; +} + +TargetInfo::CallingConvCheckResult +WindowsMipsTargetInfo::checkCallingConvention(CallingConv CC) const { + switch (CC) { + case CC_X86StdCall: + case CC_X86ThisCall: + case CC_X86FastCall: + case CC_X86VectorCall: +return CCCR_Ignore; + case CC_C: + case CC_OpenCLKernel: + case CC_PreserveMost: + case CC_PreserveAll: + case CC_Swift: + case CC_SwiftAsync: +return CCCR_OK; + default: +return CCCR_Warning; + } +} + +// Windows MIPS, MS (C++) ABI +MicrosoftMipsTargetInfo::MicrosoftMipsTargetInfo(const llvm::Triple &Triple, + const TargetOptions &Opts) +: WindowsMipsTargetInfo(Triple, Opts) { + TheCXXABI.set(TargetCXXABI::Microsoft); +} + +void MicrosoftMipsTargetInfo::getTargetDefines(const LangOptions &Opts, + MacroBuilder &Builder) const { + WindowsMipsTargetInfo::getTargetDefines(Opts, Builder); + WindowsMipsTargetInfo::getVisualStudioDefines(Opts, Builder); +} + +MinGWMipsTargetInfo::MinGWMipsTargetInfo(const llvm::Triple &Triple, + const TargetOptions &Opts) +: WindowsMipsTargetInfo(Triple, Opts) { + TheCXXABI.set(TargetCXXABI::GenericMIPS); +} + +void MinGWMipsTargetInfo::getTargetDefines(const LangOptions &Opts, + MacroBuilder &Builder) const { + WindowsMipsTargetInfo::getTargetDefines(Opts, Builder); + Builder.defineMacro("_MIPS_"); +} diff --git a/clang/lib/Basic/Targets/Mips.h b/clang/lib/Basic/Targets/Mips.h index 8acaf56523b218..7ddcd57053cb2b 100644 --- a/clang/lib/Basic/Targets/Mips.h +++ b/clang/lib/Basic/Targets/Mips.h @@ -13,6 +13,7 @@ #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_MIPS_H #define LLVM_CLANG_LIB_BASIC_TARGETS_MIPS_H +#include "OSTargets.h" #include "clang/Basic/TargetInfo.h" #include "clang/Basic/TargetOptions.h" #include "llvm/Support/Compiler.h" @@ -450,6 +451,42 @@ class LLVM_LIBRARY_VISIBILITY MipsTargetInfo : public TargetInfo { return std::make_pair(32, 32); } }; + +class LLVM_LIBRARY_VISIBILITY WindowsMipsTargetInfo +: public WindowsTargetInfo { + const llvm::Triple Triple; + +public: + WindowsMipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts); + + void getVisualStudioDefines(const LangOptions &Opts, + MacroBuilder &Builder) const; + + BuiltinVaListKind getBuiltinVaListKind() const override; + + CallingConvCheckResult checkCallingConvention(CallingConv CC) const override; +}; + +// Windows MIPS, MS (C++) ABI +class LLVM_L
[clang] [Clang][MIPS] Create correct linker arguments for Windows toolchains (PR #121041)
https://github.com/hpoussin created https://github.com/llvm/llvm-project/pull/121041 None From 63841bfbc4367d7ffca989d5cdecf74cdc32db2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Fri, 10 Nov 2023 23:06:52 +0100 Subject: [PATCH] [Clang][MIPS] Create correct linker arguments for Windows toolchains --- clang/lib/CodeGen/CodeGenModule.cpp | 2 ++ clang/lib/CodeGen/TargetInfo.h | 3 +++ clang/lib/CodeGen/Targets/Mips.cpp | 23 +++ clang/test/CodeGen/pragma-comment.c | 1 + 4 files changed, 29 insertions(+) diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index c49f7631488285..2ec12eb8b7b04e 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -119,6 +119,8 @@ createTargetCodeGenInfo(CodeGenModule &CGM) { case llvm::Triple::mipsel: if (Triple.getOS() == llvm::Triple::NaCl) return createPNaClTargetCodeGenInfo(CGM); +else if (Triple.getOS() == llvm::Triple::Win32) + return createWindowsMIPSTargetCodeGenInfo(CGM, /*IsOS32=*/true); return createMIPSTargetCodeGenInfo(CGM, /*IsOS32=*/true); case llvm::Triple::mips64: diff --git a/clang/lib/CodeGen/TargetInfo.h b/clang/lib/CodeGen/TargetInfo.h index ab3142bdea684e..4a66683a3b91fd 100644 --- a/clang/lib/CodeGen/TargetInfo.h +++ b/clang/lib/CodeGen/TargetInfo.h @@ -522,6 +522,9 @@ createM68kTargetCodeGenInfo(CodeGenModule &CGM); std::unique_ptr createMIPSTargetCodeGenInfo(CodeGenModule &CGM, bool IsOS32); +std::unique_ptr +createWindowsMIPSTargetCodeGenInfo(CodeGenModule &CGM, bool IsOS32); + std::unique_ptr createMSP430TargetCodeGenInfo(CodeGenModule &CGM); diff --git a/clang/lib/CodeGen/Targets/Mips.cpp b/clang/lib/CodeGen/Targets/Mips.cpp index 06d9b6d4a57615..e7601564f67d1d 100644 --- a/clang/lib/CodeGen/Targets/Mips.cpp +++ b/clang/lib/CodeGen/Targets/Mips.cpp @@ -105,6 +105,24 @@ class MIPSTargetCodeGenInfo : public TargetCodeGenInfo { return SizeOfUnwindException; } }; + +class WindowsMIPSTargetCodeGenInfo : public MIPSTargetCodeGenInfo { +public: + WindowsMIPSTargetCodeGenInfo(CodeGenTypes &CGT, bool IsO32) +: MIPSTargetCodeGenInfo(CGT, IsO32) {} + + void getDependentLibraryOption(llvm::StringRef Lib, + llvm::SmallString<24> &Opt) const override { +Opt = "/DEFAULTLIB:"; +Opt += qualifyWindowsLibrary(Lib); + } + + void getDetectMismatchOption(llvm::StringRef Name, + llvm::StringRef Value, + llvm::SmallString<32> &Opt) const override { +Opt = "/FAILIFMISMATCH:\"" + Name.str() + "=" + Value.str() + "\""; + } +}; } void MipsABIInfo::CoerceToIntArgs( @@ -436,3 +454,8 @@ std::unique_ptr CodeGen::createMIPSTargetCodeGenInfo(CodeGenModule &CGM, bool IsOS32) { return std::make_unique(CGM.getTypes(), IsOS32); } + +std::unique_ptr +CodeGen::createWindowsMIPSTargetCodeGenInfo(CodeGenModule &CGM, bool IsOS32) { + return std::make_unique(CGM.getTypes(), IsOS32); +} diff --git a/clang/test/CodeGen/pragma-comment.c b/clang/test/CodeGen/pragma-comment.c index a4746f5c47bf6b..a966840f7c26fc 100644 --- a/clang/test/CodeGen/pragma-comment.c +++ b/clang/test/CodeGen/pragma-comment.c @@ -6,6 +6,7 @@ // RUN: %clang_cc1 %s -triple x86_64-scei-ps4 -fms-extensions -emit-llvm -o - | FileCheck -check-prefix ELF %s --implicit-check-not llvm.linker.options // RUN: %clang_cc1 %s -triple x86_64-sie-ps5 -fms-extensions -emit-llvm -o - | FileCheck -check-prefix ELF %s --implicit-check-not llvm.linker.options // RUN: %clang_cc1 %s -triple aarch64-windows-msvc -fms-extensions -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 %s -triple mipsel-windows-msvc -fms-extensions -emit-llvm -o - | FileCheck %s #pragma comment(lib, "msvcrt.lib") #pragma comment(lib, "kernel32") ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][MIPS] Send correct architecture for MinGW toolchains (PR #121042)
https://github.com/hpoussin created https://github.com/llvm/llvm-project/pull/121042 'mipspe' name was chosen by binutils, when the project was able to create executables for Windows CE/MIPS. From 932c9cea721b45ffeee2e3f77be903241beab33a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Fri, 10 Nov 2023 23:09:05 +0100 Subject: [PATCH] [Clang][MIPS] Send correct architecture for MinGW toolchains 'mipspe' name was chosen by binutils, when the project was able to create executables for Windows CE/MIPS. --- clang/lib/Driver/ToolChains/MinGW.cpp | 3 +++ clang/test/Driver/mingw.cpp | 4 2 files changed, 7 insertions(+) diff --git a/clang/lib/Driver/ToolChains/MinGW.cpp b/clang/lib/Driver/ToolChains/MinGW.cpp index 963de81027ca9f..9f0c6160a309ec 100644 --- a/clang/lib/Driver/ToolChains/MinGW.cpp +++ b/clang/lib/Driver/ToolChains/MinGW.cpp @@ -138,6 +138,9 @@ void tools::MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA, else CmdArgs.push_back("arm64pe"); break; + case llvm::Triple::mipsel: +CmdArgs.push_back("mipspe"); +break; default: D.Diag(diag::err_target_unknown_triple) << TC.getEffectiveTriple().str(); } diff --git a/clang/test/Driver/mingw.cpp b/clang/test/Driver/mingw.cpp index 9790c86a364f85..66da0c97f41668 100644 --- a/clang/test/Driver/mingw.cpp +++ b/clang/test/Driver/mingw.cpp @@ -85,6 +85,10 @@ // RUN: | FileCheck %s --check-prefix CHECK_MINGW_EC_LINK // CHECK_MINGW_EC_LINK: "-m" "arm64ecpe" +// RUN: %clang --target=mipsel-windows-gnu -### -o /dev/null %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix CHECK_MINGW_MIPSPE +// CHECK_MINGW_MIPSPE: "-m" "mipspe" + // RUN: %clang --target=i686-windows-gnu -fms-hotpatch -### -- %s 2>&1 \ // RUN:| FileCheck %s --check-prefix=FUNCTIONPADMIN // FUNCTIONPADMIN: "--functionpadmin" ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][MIPS] Create correct linker arguments for Windows toolchains (PR #121041)
https://github.com/hpoussin updated https://github.com/llvm/llvm-project/pull/121041 From 946baa36101b99bfd512a0b7dbca757a93f68891 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Fri, 10 Nov 2023 23:06:52 +0100 Subject: [PATCH] [Clang][MIPS] Create correct linker arguments for Windows toolchains --- clang/lib/CodeGen/CodeGenModule.cpp | 2 ++ clang/lib/CodeGen/TargetInfo.h | 3 +++ clang/lib/CodeGen/Targets/Mips.cpp | 22 ++ clang/test/CodeGen/pragma-comment.c | 1 + 4 files changed, 28 insertions(+) diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index c49f7631488285..2ec12eb8b7b04e 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -119,6 +119,8 @@ createTargetCodeGenInfo(CodeGenModule &CGM) { case llvm::Triple::mipsel: if (Triple.getOS() == llvm::Triple::NaCl) return createPNaClTargetCodeGenInfo(CGM); +else if (Triple.getOS() == llvm::Triple::Win32) + return createWindowsMIPSTargetCodeGenInfo(CGM, /*IsOS32=*/true); return createMIPSTargetCodeGenInfo(CGM, /*IsOS32=*/true); case llvm::Triple::mips64: diff --git a/clang/lib/CodeGen/TargetInfo.h b/clang/lib/CodeGen/TargetInfo.h index ab3142bdea684e..4a66683a3b91fd 100644 --- a/clang/lib/CodeGen/TargetInfo.h +++ b/clang/lib/CodeGen/TargetInfo.h @@ -522,6 +522,9 @@ createM68kTargetCodeGenInfo(CodeGenModule &CGM); std::unique_ptr createMIPSTargetCodeGenInfo(CodeGenModule &CGM, bool IsOS32); +std::unique_ptr +createWindowsMIPSTargetCodeGenInfo(CodeGenModule &CGM, bool IsOS32); + std::unique_ptr createMSP430TargetCodeGenInfo(CodeGenModule &CGM); diff --git a/clang/lib/CodeGen/Targets/Mips.cpp b/clang/lib/CodeGen/Targets/Mips.cpp index 06d9b6d4a57615..771a85c84b3571 100644 --- a/clang/lib/CodeGen/Targets/Mips.cpp +++ b/clang/lib/CodeGen/Targets/Mips.cpp @@ -105,6 +105,23 @@ class MIPSTargetCodeGenInfo : public TargetCodeGenInfo { return SizeOfUnwindException; } }; + +class WindowsMIPSTargetCodeGenInfo : public MIPSTargetCodeGenInfo { +public: + WindowsMIPSTargetCodeGenInfo(CodeGenTypes &CGT, bool IsO32) + : MIPSTargetCodeGenInfo(CGT, IsO32) {} + + void getDependentLibraryOption(llvm::StringRef Lib, + llvm::SmallString<24> &Opt) const override { +Opt = "/DEFAULTLIB:"; +Opt += qualifyWindowsLibrary(Lib); + } + + void getDetectMismatchOption(llvm::StringRef Name, llvm::StringRef Value, + llvm::SmallString<32> &Opt) const override { +Opt = "/FAILIFMISMATCH:\"" + Name.str() + "=" + Value.str() + "\""; + } +}; } void MipsABIInfo::CoerceToIntArgs( @@ -436,3 +453,8 @@ std::unique_ptr CodeGen::createMIPSTargetCodeGenInfo(CodeGenModule &CGM, bool IsOS32) { return std::make_unique(CGM.getTypes(), IsOS32); } + +std::unique_ptr +CodeGen::createWindowsMIPSTargetCodeGenInfo(CodeGenModule &CGM, bool IsOS32) { + return std::make_unique(CGM.getTypes(), IsOS32); +} diff --git a/clang/test/CodeGen/pragma-comment.c b/clang/test/CodeGen/pragma-comment.c index a4746f5c47bf6b..a966840f7c26fc 100644 --- a/clang/test/CodeGen/pragma-comment.c +++ b/clang/test/CodeGen/pragma-comment.c @@ -6,6 +6,7 @@ // RUN: %clang_cc1 %s -triple x86_64-scei-ps4 -fms-extensions -emit-llvm -o - | FileCheck -check-prefix ELF %s --implicit-check-not llvm.linker.options // RUN: %clang_cc1 %s -triple x86_64-sie-ps5 -fms-extensions -emit-llvm -o - | FileCheck -check-prefix ELF %s --implicit-check-not llvm.linker.options // RUN: %clang_cc1 %s -triple aarch64-windows-msvc -fms-extensions -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 %s -triple mipsel-windows-msvc -fms-extensions -emit-llvm -o - | FileCheck %s #pragma comment(lib, "msvcrt.lib") #pragma comment(lib, "kernel32") ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][MIPS] Send correct architecture for MinGW toolchains (PR #121042)
@@ -85,6 +85,10 @@ // RUN: | FileCheck %s --check-prefix CHECK_MINGW_EC_LINK // CHECK_MINGW_EC_LINK: "-m" "arm64ecpe" +// RUN: %clang --target=mipsel-windows-gnu -### -o /dev/null %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix CHECK_MINGW_MIPSPE +// CHECK_MINGW_MIPSPE: "-m" "mipspe" hpoussin wrote: No, binutils removed support for "mipspe" target in 2.31 (2018) https://github.com/llvm/llvm-project/pull/121042 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [lld] [llvm] [clang][MIPS] Add support for mipsel-windows-* targets (PR #107744)
hpoussin wrote: Current list of PRs to have a usable toolchain (except linker): - #120876 [MC][Mips] Generate required IMAGE_REL_MIPS_PAIR relocation - #120877 [MC][CodeGen][Mips] Add CodeView mapping - #120912 [Mips] Handle declspec(dllimport) on mipsel-windows-* triples - #121041 [Clang][MIPS] Create correct linker arguments for Windows toolchains - #121042 [Clang][MIPS] Send correct architecture for MinGW toolchains - #121254 [llvm-lib] Handle MIPS architecture https://github.com/llvm/llvm-project/pull/107744 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][MIPS] Create correct linker arguments for Windows toolchains (PR #121041)
hpoussin wrote: Ping https://github.com/llvm/llvm-project/pull/121041 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [Mips] Implement MipsInstrInfo::getNop() operation (PR #135524)
https://github.com/hpoussin created https://github.com/llvm/llvm-project/pull/135524 Previously, this was calling TargetInstrInfo::getNop(), which contains: llvm_unreachable("Not implemented"); Fixes #134913. From 34f79c8ba4b8a906a68f4058f0b09d5e7f9e932a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Sun, 13 Apr 2025 07:47:35 +0200 Subject: [PATCH] [Mips] Implement getNop() operation Previously, this was calling TargetInstrInfo::getNop(), which contains: llvm_unreachable("Not implemented"); Fixes #134913. --- clang/test/CodeGen/Mips/unreachable.cpp | 13 + llvm/lib/Target/Mips/MipsInstrInfo.cpp | 7 +++ llvm/lib/Target/Mips/MipsInstrInfo.h| 2 ++ 3 files changed, 22 insertions(+) create mode 100644 clang/test/CodeGen/Mips/unreachable.cpp diff --git a/clang/test/CodeGen/Mips/unreachable.cpp b/clang/test/CodeGen/Mips/unreachable.cpp new file mode 100644 index 0..04fec8598088d --- /dev/null +++ b/clang/test/CodeGen/Mips/unreachable.cpp @@ -0,0 +1,13 @@ +// REQUIRES: mips-registered-target +// RUN: %clang_cc1 -triple mipsel-w64-windows-gnu -x c++ -mrelocation-model static -emit-obj %s -o - | llvm-objdump -a - | FileCheck %s +// CHECK: file format coff-mips + +[[__noreturn__]] inline void g() { + __builtin_unreachable(); +} + +void f(int i) +{ + if (i == 0) +g(); +} diff --git a/llvm/lib/Target/Mips/MipsInstrInfo.cpp b/llvm/lib/Target/Mips/MipsInstrInfo.cpp index b81bb1186de72..0abe228b7547a 100644 --- a/llvm/lib/Target/Mips/MipsInstrInfo.cpp +++ b/llvm/lib/Target/Mips/MipsInstrInfo.cpp @@ -87,6 +87,13 @@ MipsInstrInfo::GetMemOperand(MachineBasicBlock &MBB, int FI, MFI.getObjectAlign(FI)); } +MCInst MipsInstrInfo::getNop() const { + MCInst Nop; + // using Mips::NOP gives "fatal error: error in backend: Not supported instr: " + Nop.setOpcode(Mips::SSNOP); + return Nop; +} + //===--===// // Branch Analysis //===--===// diff --git a/llvm/lib/Target/Mips/MipsInstrInfo.h b/llvm/lib/Target/Mips/MipsInstrInfo.h index 06964c0161b4b..367f0ac5e8390 100644 --- a/llvm/lib/Target/Mips/MipsInstrInfo.h +++ b/llvm/lib/Target/Mips/MipsInstrInfo.h @@ -59,6 +59,8 @@ class MipsInstrInfo : public MipsGenInstrInfo { static const MipsInstrInfo *create(MipsSubtarget &STI); + MCInst getNop() const override; + /// Branch Analysis bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [Mips] Implement MipsInstrInfo::getNop() operation (PR #135524)
https://github.com/hpoussin updated https://github.com/llvm/llvm-project/pull/135524 From 70a55685e63a60f6a8ee65e61eff2bd5f0488c5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Sun, 13 Apr 2025 07:47:35 +0200 Subject: [PATCH] [Mips] Implement getNop() operation Previously, this was calling TargetInstrInfo::getNop(), which contains: llvm_unreachable("Not implemented"); Fixes #134913. --- clang/test/CodeGen/Mips/unreachable.cpp | 13 + llvm/lib/Target/Mips/MipsInstrInfo.cpp | 8 llvm/lib/Target/Mips/MipsInstrInfo.h| 2 ++ 3 files changed, 23 insertions(+) create mode 100644 clang/test/CodeGen/Mips/unreachable.cpp diff --git a/clang/test/CodeGen/Mips/unreachable.cpp b/clang/test/CodeGen/Mips/unreachable.cpp new file mode 100644 index 0..04fec8598088d --- /dev/null +++ b/clang/test/CodeGen/Mips/unreachable.cpp @@ -0,0 +1,13 @@ +// REQUIRES: mips-registered-target +// RUN: %clang_cc1 -triple mipsel-w64-windows-gnu -x c++ -mrelocation-model static -emit-obj %s -o - | llvm-objdump -a - | FileCheck %s +// CHECK: file format coff-mips + +[[__noreturn__]] inline void g() { + __builtin_unreachable(); +} + +void f(int i) +{ + if (i == 0) +g(); +} diff --git a/llvm/lib/Target/Mips/MipsInstrInfo.cpp b/llvm/lib/Target/Mips/MipsInstrInfo.cpp index b81bb1186de72..7f7bb259000a5 100644 --- a/llvm/lib/Target/Mips/MipsInstrInfo.cpp +++ b/llvm/lib/Target/Mips/MipsInstrInfo.cpp @@ -87,6 +87,14 @@ MipsInstrInfo::GetMemOperand(MachineBasicBlock &MBB, int FI, MFI.getObjectAlign(FI)); } +MCInst MipsInstrInfo::getNop() const { + MCInst Nop; + // using Mips::NOP gives + // "fatal error: error in backend: Not supported instr: " + Nop.setOpcode(Mips::SSNOP); + return Nop; +} + //===--===// // Branch Analysis //===--===// diff --git a/llvm/lib/Target/Mips/MipsInstrInfo.h b/llvm/lib/Target/Mips/MipsInstrInfo.h index 06964c0161b4b..367f0ac5e8390 100644 --- a/llvm/lib/Target/Mips/MipsInstrInfo.h +++ b/llvm/lib/Target/Mips/MipsInstrInfo.h @@ -59,6 +59,8 @@ class MipsInstrInfo : public MipsGenInstrInfo { static const MipsInstrInfo *create(MipsSubtarget &STI); + MCInst getNop() const override; + /// Branch Analysis bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [Mips] Implement MipsInstrInfo::getNop() operation (PR #135524)
@@ -87,6 +87,14 @@ MipsInstrInfo::GetMemOperand(MachineBasicBlock &MBB, int FI, MFI.getObjectAlign(FI)); } +MCInst MipsInstrInfo::getNop() const { + MCInst Nop; + // using Mips::NOP gives + // "fatal error: error in backend: Not supported instr: " hpoussin wrote: This patch is already an improvement, because it replaces a compiler crash by the use of a valid instruction (although deprecated in recent architectures). However, you're right that it will be better to address this error and use Mips::NOP. Unfortunately, I think I won't be able to do it myself. https://github.com/llvm/llvm-project/pull/135524 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits