From: Douglas Gregor Date: Fri, 1 Jul 2011 22:41:14 +0000 (+0000) Subject: Add initial *-*-rtems* target, from Joel Sherrill X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=dca5226598097add5d86d57b227aa31df27f0ba4;p=clang Add initial *-*-rtems* target, from Joel Sherrill git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@134283 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index afad27c66b..06bd1c031c 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -1665,6 +1665,65 @@ public: }; } // end anonymous namespace +// RTEMS Target +template +class RTEMSTargetInfo : public OSTargetInfo { +protected: + virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, + MacroBuilder &Builder) const { + // RTEMS defines; list based off of gcc output + + // FIXME: Move version number handling to llvm::Triple. + llvm::StringRef Release = Triple.getOSName().substr(strlen("rtems"), 1); + + Builder.defineMacro("__rtems__"); + Builder.defineMacro("__ELF__"); + } +public: + RTEMSTargetInfo(const std::string &triple) + : OSTargetInfo(triple) { + this->UserLabelPrefix = ""; + + llvm::Triple Triple(triple); + switch (Triple.getArch()) { + default: + case llvm::Triple::x86: + // this->MCountName = ".mcount"; + break; + case llvm::Triple::mips: + case llvm::Triple::mipsel: + case llvm::Triple::ppc: + case llvm::Triple::ppc64: + // this->MCountName = "_mcount"; + break; + case llvm::Triple::arm: + // this->MCountName = "__mcount"; + break; + } + + } +}; + +namespace { +// x86-32 RTEMS target +class RTEMSX86_32TargetInfo : public X86_32TargetInfo { +public: + RTEMSX86_32TargetInfo(const std::string& triple) + : X86_32TargetInfo(triple) { + SizeType = UnsignedLong; + IntPtrType = SignedLong; + PtrDiffType = SignedLong; + this->UserLabelPrefix = ""; + } + virtual void getTargetDefines(const LangOptions &Opts, + MacroBuilder &Builder) const { + X86_32TargetInfo::getTargetDefines(Opts, Builder); + Builder.defineMacro("__INTEL__"); + Builder.defineMacro("__rtems__"); + } +}; +} // end anonymous namespace + namespace { // x86-64 generic target class X86_64TargetInfo : public X86TargetInfo { @@ -2753,11 +2812,15 @@ static TargetInfo *AllocateTarget(const std::string &T) { return new LinuxTargetInfo(T); case llvm::Triple::FreeBSD: return new FreeBSDTargetInfo(T); + case llvm::Triple::RTEMS: + return new RTEMSTargetInfo(T); default: return new ARMTargetInfo(T); } case llvm::Triple::bfin: + if ( os == llvm::Triple::RTEMS ) + return new RTEMSTargetInfo(T); return new BlackfinTargetInfo(T); case llvm::Triple::msp430: @@ -2768,6 +2831,8 @@ static TargetInfo *AllocateTarget(const std::string &T) { return new PSPTargetInfo(T); if (os == llvm::Triple::Linux) return new LinuxTargetInfo(T); + if (os == llvm::Triple::RTEMS) + return new RTEMSTargetInfo(T); return new MipsTargetInfo(T); case llvm::Triple::mipsel: @@ -2775,6 +2840,8 @@ static TargetInfo *AllocateTarget(const std::string &T) { return new PSPTargetInfo(T); if (os == llvm::Triple::Linux) return new LinuxTargetInfo(T); + if (os == llvm::Triple::RTEMS) + return new RTEMSTargetInfo(T); return new MipselTargetInfo(T); case llvm::Triple::ppc: @@ -2782,6 +2849,8 @@ static TargetInfo *AllocateTarget(const std::string &T) { return new DarwinPPC32TargetInfo(T); else if (os == llvm::Triple::FreeBSD) return new FreeBSDTargetInfo(T); + if ( os == llvm::Triple::RTEMS ) + return new RTEMSTargetInfo(T); return new PPC32TargetInfo(T); case llvm::Triple::ppc64: @@ -2806,6 +2875,8 @@ static TargetInfo *AllocateTarget(const std::string &T) { return new AuroraUXSparcV8TargetInfo(T); if (os == llvm::Triple::Solaris) return new SolarisSparcV8TargetInfo(T); + if ( os == llvm::Triple::RTEMS ) + return new RTEMSTargetInfo(T); return new SparcV8TargetInfo(T); // FIXME: Need a real SPU target. @@ -2847,6 +2918,8 @@ static TargetInfo *AllocateTarget(const std::string &T) { return new VisualStudioWindowsX86_32TargetInfo(T); case llvm::Triple::Haiku: return new HaikuX86_32TargetInfo(T); + case llvm::Triple::RTEMS: + return new RTEMSX86_32TargetInfo(T); default: return new X86_32TargetInfo(T); } diff --git a/lib/Frontend/InitHeaderSearch.cpp b/lib/Frontend/InitHeaderSearch.cpp index 1bd7f8f291..85e30f80e7 100644 --- a/lib/Frontend/InitHeaderSearch.cpp +++ b/lib/Frontend/InitHeaderSearch.cpp @@ -553,6 +553,8 @@ void InitHeaderSearch::AddDefaultCIncludePaths(const llvm::Triple &triple, AddPath("/boot/develop/headers/posix", System, true, false, false); AddPath("/boot/develop/headers", System, true, false, false); break; + case llvm::Triple::RTEMS: + break; case llvm::Triple::Cygwin: AddPath("/usr/include/w32api", System, true, false, false); break; @@ -590,7 +592,8 @@ void InitHeaderSearch::AddDefaultCIncludePaths(const llvm::Triple &triple, break; } - AddPath("/usr/include", System, false, false, false); + if ( os != llvm::Triple::RTEMS ) + AddPath("/usr/include", System, false, false, false); } void InitHeaderSearch::