@@ -275,12 +275,16 @@ class LinuxMipsPlatform: public Platform
275275
276276class LinuxMips64Platform : public Platform
277277{
278+ private:
279+ size_t m_addressSize;
280+
278281public:
279- LinuxMips64Platform (Architecture* arch, const std::string& name): Platform(arch, name)
282+ LinuxMips64Platform (Architecture* arch, const std::string& name, const std::string& callingConventionName = " n64" , size_t addressSize = 0 ):
283+ Platform (arch, name), m_addressSize(addressSize)
280284 {
281285 Ref<CallingConvention> cc;
282286
283- cc = arch->GetCallingConventionByName (" n64 " );
287+ cc = arch->GetCallingConventionByName (callingConventionName );
284288 if (cc)
285289 {
286290 RegisterDefaultCallingConvention (cc);
@@ -293,6 +297,13 @@ class LinuxMips64Platform: public Platform
293297 if (cc)
294298 SetSystemCallConvention (cc);
295299 }
300+
301+ virtual size_t GetAddressSize () const override
302+ {
303+ if (m_addressSize)
304+ return m_addressSize;
305+ return GetArchitecture ()->GetAddressSize ();
306+ }
296307};
297308
298309
@@ -543,24 +554,30 @@ extern "C"
543554 Ref<Architecture> mipseb = Architecture::GetByName (" mips32" );
544555 Ref<Architecture> mips3el = Architecture::GetByName (" mipsel3" );
545556 Ref<Architecture> mips3eb = Architecture::GetByName (" mips3" );
557+ Ref<Architecture> mips64el = Architecture::GetByName (" mipsel64" );
546558 Ref<Architecture> mips64eb = Architecture::GetByName (" mips64" );
547559 Ref<Architecture> cnmips64eb = Architecture::GetByName (" cavium-mips64" );
548560 Ref<Architecture> cnmips64el = Architecture::GetByName (" cavium-mipsel64" );
549- if (mipsel && mipseb && mips64eb && cnmips64eb && cnmips64el && mips3el && mips3eb)
561+ if (mipsel && mipseb && mips64el && mips64eb && cnmips64eb && cnmips64el && mips3el && mips3eb)
550562 {
551- Ref<Platform> platformLE, platformBE, platformBE64, platformBE64cn, platformLE64cn, platform3LE, platform3BE;
563+ Ref<Platform> platformLE, platformBE, platformBE64, platformBE64cn, platformLE64cn, platform3LE, platform3BE,
564+ platformN32LE, platformN32BE;
552565
553566 platformLE = new LinuxMipsPlatform (mipsel, " linux-mipsel" );
554567 platformBE = new LinuxMipsPlatform (mipseb, " linux-mips" );
555568 platform3LE = new LinuxMipsPlatform (mips3el, " linux-mipsel3" );
556569 platform3BE = new LinuxMipsPlatform (mips3eb, " linux-mips3" );
570+ platformN32LE = new LinuxMips64Platform (mips64el, " linux-mipsn32el" , " n32" , 4 );
571+ platformN32BE = new LinuxMips64Platform (mips64eb, " linux-mipsn32" , " n32" , 4 );
557572 platformBE64 = new LinuxMips64Platform (mips64eb, " linux-mips64" );
558573 platformBE64cn = new LinuxMips64Platform (cnmips64eb, " linux-cnmips64" );
559574 platformLE64cn = new LinuxMips64Platform (cnmips64el, " linux-cnmipsel64" );
560575 Platform::Register (" linux" , platformLE);
561576 Platform::Register (" linux" , platformBE);
562577 Platform::Register (" linux" , platform3LE);
563578 Platform::Register (" linux" , platform3BE);
579+ Platform::Register (" linux" , platformN32LE);
580+ Platform::Register (" linux" , platformN32BE);
564581 Platform::Register (" linux" , platformBE64);
565582 Platform::Register (" linux" , platformBE64cn);
566583 Platform::Register (" linux" , platformLE64cn);
0 commit comments