diff options
| author | Alexander Taylor <alex@vector35.com> | 2026-06-03 19:15:35 -0400 |
|---|---|---|
| committer | Alexander Taylor <alex@vector35.com> | 2026-06-06 12:32:32 -0400 |
| commit | 6bc36d9f834900d8b9b15ecc6956aaa3d39bf153 (patch) | |
| tree | efb3b81646f995c968fa1c438866a9702ffe2940 /platform | |
| parent | c1b0eb7bf58e7234d5930c1c2b4d0987b71c99d1 (diff) | |
Better MIPS n32 support.
Diffstat (limited to 'platform')
| -rw-r--r-- | platform/linux/platform_linux.cpp | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/platform/linux/platform_linux.cpp b/platform/linux/platform_linux.cpp index f2902068..ff8134f7 100644 --- a/platform/linux/platform_linux.cpp +++ b/platform/linux/platform_linux.cpp @@ -275,12 +275,16 @@ public: class LinuxMips64Platform: public Platform { +private: + size_t m_addressSize; + public: - LinuxMips64Platform(Architecture* arch, const std::string& name): Platform(arch, name) + LinuxMips64Platform(Architecture* arch, const std::string& name, const std::string& callingConventionName = "n64", size_t addressSize = 0): + Platform(arch, name), m_addressSize(addressSize) { Ref<CallingConvention> cc; - cc = arch->GetCallingConventionByName("n64"); + cc = arch->GetCallingConventionByName(callingConventionName); if (cc) { RegisterDefaultCallingConvention(cc); @@ -293,6 +297,13 @@ public: if (cc) SetSystemCallConvention(cc); } + + virtual size_t GetAddressSize() const override + { + if (m_addressSize) + return m_addressSize; + return GetArchitecture()->GetAddressSize(); + } }; @@ -543,17 +554,21 @@ extern "C" Ref<Architecture> mipseb = Architecture::GetByName("mips32"); Ref<Architecture> mips3el = Architecture::GetByName("mipsel3"); Ref<Architecture> mips3eb = Architecture::GetByName("mips3"); + Ref<Architecture> mips64el = Architecture::GetByName("mipsel64"); Ref<Architecture> mips64eb = Architecture::GetByName("mips64"); Ref<Architecture> cnmips64eb = Architecture::GetByName("cavium-mips64"); Ref<Architecture> cnmips64el = Architecture::GetByName("cavium-mipsel64"); - if (mipsel && mipseb && mips64eb && cnmips64eb && cnmips64el && mips3el && mips3eb) + if (mipsel && mipseb && mips64el && mips64eb && cnmips64eb && cnmips64el && mips3el && mips3eb) { - Ref<Platform> platformLE, platformBE, platformBE64, platformBE64cn, platformLE64cn, platform3LE, platform3BE; + Ref<Platform> platformLE, platformBE, platformBE64, platformBE64cn, platformLE64cn, platform3LE, platform3BE, + platformN32LE, platformN32BE; platformLE = new LinuxMipsPlatform(mipsel, "linux-mipsel"); platformBE = new LinuxMipsPlatform(mipseb, "linux-mips"); platform3LE = new LinuxMipsPlatform(mips3el, "linux-mipsel3"); platform3BE = new LinuxMipsPlatform(mips3eb, "linux-mips3"); + platformN32LE = new LinuxMips64Platform(mips64el, "linux-mipsn32el", "n32", 4); + platformN32BE = new LinuxMips64Platform(mips64eb, "linux-mipsn32", "n32", 4); platformBE64 = new LinuxMips64Platform(mips64eb, "linux-mips64"); platformBE64cn = new LinuxMips64Platform(cnmips64eb, "linux-cnmips64"); platformLE64cn = new LinuxMips64Platform(cnmips64el, "linux-cnmipsel64"); @@ -561,6 +576,8 @@ extern "C" Platform::Register("linux", platformBE); Platform::Register("linux", platform3LE); Platform::Register("linux", platform3BE); + Platform::Register("linux", platformN32LE); + Platform::Register("linux", platformN32BE); Platform::Register("linux", platformBE64); Platform::Register("linux", platformBE64cn); Platform::Register("linux", platformLE64cn); |
