Index: lib/Basic/Targets.cpp =================================================================== --- lib/Basic/Targets.cpp +++ lib/Basic/Targets.cpp @@ -377,6 +377,29 @@ : OSTargetInfo(Triple, CGOpts) {} }; +// Haiku Target +template +class HaikuTargetInfo : public OSTargetInfo { +protected: + void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, + MacroBuilder &Builder) const override { + // Haiku defines; list based off of gcc output + Builder.defineMacro("__HAIKU__"); + Builder.defineMacro("__ELF__"); + DefineStd(Builder, "unix", Opts); + } +public: + HaikuTargetInfo(const llvm::Triple &Triple, const CodeGenOptions &CGOpts) + : OSTargetInfo(Triple, CGOpts) { + this->SizeType = TargetInfo::UnsignedLong; + this->IntPtrType = TargetInfo::SignedLong; + this->PtrDiffType = TargetInfo::SignedLong; + this->ProcessIDType = TargetInfo::SignedLong; + this->TLSSupported = false; + + } +}; + // Minix Target template class MinixTargetInfo : public OSTargetInfo { @@ -3993,22 +4016,15 @@ }; // x86-32 Haiku target -class HaikuX86_32TargetInfo : public X86_32TargetInfo { +class HaikuX86_32TargetInfo : public HaikuTargetInfo { public: - HaikuX86_32TargetInfo(const llvm::Triple &Triple, - const CodeGenOptions &CGOpts) - : X86_32TargetInfo(Triple, CGOpts) { - SizeType = UnsignedLong; - IntPtrType = SignedLong; - PtrDiffType = SignedLong; - ProcessIDType = SignedLong; - this->TLSSupported = false; + HaikuX86_32TargetInfo(const llvm::Triple &Triple, const CodeGenOptions &CGOpts) + : HaikuTargetInfo(Triple, CGOpts) { } void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override { - X86_32TargetInfo::getTargetDefines(Opts, Builder); + HaikuTargetInfo::getTargetDefines(Opts, Builder); Builder.defineMacro("__INTEL__"); - Builder.defineMacro("__HAIKU__"); } }; @@ -8238,6 +8254,8 @@ return new MicrosoftX86_64TargetInfo(Triple, CGOpts); } } + case llvm::Triple::Haiku: + return new HaikuTargetInfo(Triple, CGOpts); case llvm::Triple::NaCl: return new NaClTargetInfo(Triple, CGOpts); case llvm::Triple::PS4: Index: lib/Driver/Driver.cpp =================================================================== --- lib/Driver/Driver.cpp +++ lib/Driver/Driver.cpp @@ -2384,6 +2384,9 @@ ToolChain *&TC = ToolChains[Target.str()]; if (!TC) { switch (Target.getOS()) { + case llvm::Triple::Haiku: + TC = new toolchains::Haiku(*this, Target, Args); + break; case llvm::Triple::CloudABI: TC = new toolchains::CloudABI(*this, Target, Args); break; Index: lib/Driver/ToolChains.h =================================================================== --- lib/Driver/ToolChains.h +++ lib/Driver/ToolChains.h @@ -678,6 +678,18 @@ void findGccLibDir(); }; +class LLVM_LIBRARY_VISIBILITY Haiku : public Generic_ELF { +public: + Haiku(const Driver &D, const llvm::Triple &Triple, + const llvm::opt::ArgList &Args); + + bool isPIEDefault() const override { return getTriple().getArch() == llvm::Triple::x86_64; } + + void + AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const override; +}; + class LLVM_LIBRARY_VISIBILITY OpenBSD : public Generic_ELF { public: OpenBSD(const Driver &D, const llvm::Triple &Triple, Index: lib/Driver/ToolChains.cpp =================================================================== --- lib/Driver/ToolChains.cpp +++ lib/Driver/ToolChains.cpp @@ -2992,6 +2992,38 @@ return SanitizerKind::SafeStack; } +/// Haiku - Haiku tool chain which can call as(1) and ld(1) directly. + +Haiku::Haiku(const Driver &D, const llvm::Triple& Triple, const ArgList &Args) + : Generic_ELF(D, Triple, Args) { + +} + +void Haiku::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, + ArgStringList &CC1Args) const { + if (DriverArgs.hasArg(options::OPT_nostdlibinc) || + DriverArgs.hasArg(options::OPT_nostdincxx)) + return; + + switch (GetCXXStdlibType(DriverArgs)) { + case ToolChain::CST_Libcxx: + addSystemInclude(DriverArgs, CC1Args, + getDriver().SysRoot + "/system/develop/headers/c++/v1"); + break; + case ToolChain::CST_Libstdcxx: + addSystemInclude(DriverArgs, CC1Args, + getDriver().SysRoot + "/system/develop/headers/c++"); + addSystemInclude(DriverArgs, CC1Args, + getDriver().SysRoot + "/system/develop/headers/c++/backward"); + + StringRef Triple = getTriple().str(); + addSystemInclude(DriverArgs, CC1Args, + getDriver().SysRoot + "/system/develop/headers/c++/" + + Triple); + break; + } +} + /// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly. OpenBSD::OpenBSD(const Driver &D, const llvm::Triple &Triple, Index: lib/Frontend/InitHeaderSearch.cpp =================================================================== --- lib/Frontend/InitHeaderSearch.cpp +++ lib/Frontend/InitHeaderSearch.cpp @@ -267,38 +267,39 @@ } case llvm::Triple::Haiku: - AddPath("/boot/common/include", System, false); - AddPath("/boot/develop/headers/os", System, false); - AddPath("/boot/develop/headers/os/app", System, false); - AddPath("/boot/develop/headers/os/arch", System, false); - AddPath("/boot/develop/headers/os/device", System, false); - AddPath("/boot/develop/headers/os/drivers", System, false); - AddPath("/boot/develop/headers/os/game", System, false); - AddPath("/boot/develop/headers/os/interface", System, false); - AddPath("/boot/develop/headers/os/kernel", System, false); - AddPath("/boot/develop/headers/os/locale", System, false); - AddPath("/boot/develop/headers/os/mail", System, false); - AddPath("/boot/develop/headers/os/media", System, false); - AddPath("/boot/develop/headers/os/midi", System, false); - AddPath("/boot/develop/headers/os/midi2", System, false); - AddPath("/boot/develop/headers/os/net", System, false); - AddPath("/boot/develop/headers/os/storage", System, false); - AddPath("/boot/develop/headers/os/support", System, false); - AddPath("/boot/develop/headers/os/translation", System, false); - AddPath("/boot/develop/headers/os/add-ons/graphics", System, false); - AddPath("/boot/develop/headers/os/add-ons/input_server", System, false); - AddPath("/boot/develop/headers/os/add-ons/screen_saver", System, false); - AddPath("/boot/develop/headers/os/add-ons/tracker", System, false); - AddPath("/boot/develop/headers/os/be_apps/Deskbar", System, false); - AddPath("/boot/develop/headers/os/be_apps/NetPositive", System, false); - AddPath("/boot/develop/headers/os/be_apps/Tracker", System, false); - AddPath("/boot/develop/headers/cpp", System, false); - AddPath("/boot/develop/headers/cpp/i586-pc-haiku", System, false); - AddPath("/boot/develop/headers/3rdparty", System, false); - AddPath("/boot/develop/headers/bsd", System, false); - AddPath("/boot/develop/headers/glibc", System, false); - AddPath("/boot/develop/headers/posix", System, false); - AddPath("/boot/develop/headers", System, false); + AddPath("/boot/system/non-packaged/develop/headers", System, false); + AddPath("/boot/system/develop/headers/os", System, false); + AddPath("/boot/system/develop/headers/os/app", System, false); + AddPath("/boot/system/develop/headers/os/arch", System, false); + AddPath("/boot/system/develop/headers/os/device", System, false); + AddPath("/boot/system/develop/headers/os/drivers", System, false); + AddPath("/boot/system/develop/headers/os/game", System, false); + AddPath("/boot/system/develop/headers/os/interface", System, false); + AddPath("/boot/system/develop/headers/os/kernel", System, false); + AddPath("/boot/system/develop/headers/os/locale", System, false); + AddPath("/boot/system/develop/headers/os/mail", System, false); + AddPath("/boot/system/develop/headers/os/media", System, false); + AddPath("/boot/system/develop/headers/os/midi", System, false); + AddPath("/boot/system/develop/headers/os/midi2", System, false); + AddPath("/boot/system/develop/headers/os/net", System, false); + AddPath("/boot/system/develop/headers/os/opengl", System, false); + AddPath("/boot/system/develop/headers/os/storage", System, false); + AddPath("/boot/system/develop/headers/os/support", System, false); + AddPath("/boot/system/develop/headers/os/translation", System, false); + AddPath("/boot/system/develop/headers/os/add-ons/graphics", System, false); + AddPath("/boot/system/develop/headers/os/add-ons/input_server", System, false); + AddPath("/boot/system/develop/headers/os/add-ons/mail_daemon", System, false); + AddPath("/boot/system/develop/headers/os/add-ons/registrar", System, false); + AddPath("/boot/system/develop/headers/os/add-ons/screen_saver", System, false); + AddPath("/boot/system/develop/headers/os/add-ons/tracker", System, false); + AddPath("/boot/system/develop/headers/os/be_apps/Deskbar", System, false); + AddPath("/boot/system/develop/headers/os/be_apps/NetPositive", System, false); + AddPath("/boot/system/develop/headers/os/be_apps/Tracker", System, false); + AddPath("/boot/system/develop/headers/3rdparty", System, false); + AddPath("/boot/system/develop/headers/bsd", System, false); + AddPath("/boot/system/develop/headers/glibc", System, false); + AddPath("/boot/system/develop/headers/posix", System, false); + AddPath("/boot/system/develop/headers", System, false); break; case llvm::Triple::RTEMS: break; Index: test/Driver/haiku.c =================================================================== --- /dev/null +++ test/Driver/haiku.c @@ -0,0 +1,12 @@ +// RUN: %clang -no-canonical-prefixes -target x86_64-unknown-haiku %s -### 2> %t.log +// RUN: FileCheck --check-prefix=CHECK-X86_64 -input-file %t.log %s + +// CHECK-X86_64: clang{{.*}}" "-cc1" "-triple" "x86_64-unknown-haiku" +// CHECK-X86_64: gcc{{.*}}" "-o" "a.out" "{{.*}}.o" + +// RUN: %clang -no-canonical-prefixes -target i586-pc-haiku %s -### 2> %t.log +// RUN: FileCheck --check-prefix=CHECK-X86 -input-file %t.log %s + +// CHECK-X86: clang{{.*}}" "-cc1" "-triple" "i586-pc-haiku" +// CHECK-X86: gcc{{.*}}" "-o" "a.out" "{{.*}}.o" +