Index: llvm/trunk/include/llvm/ADT/Triple.h =================================================================== --- llvm/trunk/include/llvm/ADT/Triple.h +++ llvm/trunk/include/llvm/ADT/Triple.h @@ -144,6 +144,7 @@ Darwin, DragonFly, FreeBSD, + Fuchsia, IOS, KFreeBSD, Linux, @@ -462,6 +463,10 @@ return getOS() == Triple::FreeBSD; } + bool isOSFuchsia() const { + return getOS() == Triple::Fuchsia; + } + bool isOSDragonFly() const { return getOS() == Triple::DragonFly; } bool isOSSolaris() const { Index: llvm/trunk/lib/Support/Triple.cpp =================================================================== --- llvm/trunk/lib/Support/Triple.cpp +++ llvm/trunk/lib/Support/Triple.cpp @@ -168,6 +168,7 @@ case Darwin: return "darwin"; case DragonFly: return "dragonfly"; case FreeBSD: return "freebsd"; + case Fuchsia: return "fuchsia"; case IOS: return "ios"; case KFreeBSD: return "kfreebsd"; case Linux: return "linux"; @@ -438,6 +439,7 @@ .StartsWith("darwin", Triple::Darwin) .StartsWith("dragonfly", Triple::DragonFly) .StartsWith("freebsd", Triple::FreeBSD) + .StartsWith("fuchsia", Triple::Fuchsia) .StartsWith("ios", Triple::IOS) .StartsWith("kfreebsd", Triple::KFreeBSD) .StartsWith("linux", Triple::Linux) Index: llvm/trunk/lib/Target/X86/X86TargetMachine.cpp =================================================================== --- llvm/trunk/lib/Target/X86/X86TargetMachine.cpp +++ llvm/trunk/lib/Target/X86/X86TargetMachine.cpp @@ -54,6 +54,8 @@ return make_unique(); if (TT.isOSLinux() || TT.isOSNaCl()) return make_unique(); + if (TT.isOSFuchsia()) + return make_unique(); if (TT.isOSBinFormatELF()) return make_unique(); if (TT.isKnownWindowsMSVCEnvironment() || TT.isWindowsCoreCLREnvironment()) Index: llvm/trunk/lib/Target/X86/X86TargetObjectFile.h =================================================================== --- llvm/trunk/lib/Target/X86/X86TargetObjectFile.h +++ llvm/trunk/lib/Target/X86/X86TargetObjectFile.h @@ -55,6 +55,11 @@ void Initialize(MCContext &Ctx, const TargetMachine &TM) override; }; + /// \brief This implementation is used for Fuchsia on x86-64. + class X86FuchsiaTargetObjectFile : public X86ELFTargetObjectFile { + void Initialize(MCContext &Ctx, const TargetMachine &TM) override; + }; + /// X86LinuxNaClTargetObjectFile - This implementation is used for linux and /// Native Client on x86 and x86-64. class X86LinuxNaClTargetObjectFile : public X86ELFTargetObjectFile { Index: llvm/trunk/lib/Target/X86/X86TargetObjectFile.cpp =================================================================== --- llvm/trunk/lib/Target/X86/X86TargetObjectFile.cpp +++ llvm/trunk/lib/Target/X86/X86TargetObjectFile.cpp @@ -73,6 +73,13 @@ } void +X86FuchsiaTargetObjectFile::Initialize(MCContext &Ctx, + const TargetMachine &TM) { + TargetLoweringObjectFileELF::Initialize(Ctx, TM); + InitializeELF(TM.Options.UseInitArray); +} + +void X86LinuxNaClTargetObjectFile::Initialize(MCContext &Ctx, const TargetMachine &TM) { TargetLoweringObjectFileELF::Initialize(Ctx, TM); Index: llvm/trunk/unittests/ADT/TripleTest.cpp =================================================================== --- llvm/trunk/unittests/ADT/TripleTest.cpp +++ llvm/trunk/unittests/ADT/TripleTest.cpp @@ -200,6 +200,12 @@ EXPECT_EQ(Triple::CloudABI, T.getOS()); EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); + T = Triple("x86_64-unknown-fuchsia"); + EXPECT_EQ(Triple::x86_64, T.getArch()); + EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); + EXPECT_EQ(Triple::Fuchsia, T.getOS()); + EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); + T = Triple("wasm32-unknown-unknown"); EXPECT_EQ(Triple::wasm32, T.getArch()); EXPECT_EQ(Triple::UnknownVendor, T.getVendor());