diff options
Diffstat (limited to 'clang/lib/Basic')
-rw-r--r-- | clang/lib/Basic/Targets.cpp | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index 9ca014d4ff1..e156e2abd2e 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -70,6 +70,19 @@ static void getSolarisDefines(const LangOptions &Opts, std::vector<char> &Defs) Define(Defs, "__SVR4"); } +static void getOpenBSDDefines(const LangOptions &Opts, bool is64Bit, + const char *Triple, std::vector<char> &Defs) { + // OpenBSD defines; list based off of gcc output + + Define(Defs, "__OpenBSD__", "1"); + Define(Defs, "__KPRINTF_ATTRIBUTE__"); + DefineStd(Defs, "unix", Opts); + Define(Defs, "__ELF__", "1"); + if (is64Bit) { + Define(Defs, "__LP64__"); + } +} + static void getFreeBSDDefines(const LangOptions &Opts, bool is64Bit, const char *Triple, std::vector<char> &Defs) { // FreeBSD defines; list based off of gcc output @@ -866,6 +879,20 @@ public: } // end anonymous namespace namespace { +// x86-32 OpenBSD target +class OpenBSDX86_32TargetInfo : public X86_32TargetInfo { +public: + OpenBSDX86_32TargetInfo(const std::string& triple) : + X86_32TargetInfo(triple) { } + virtual void getTargetDefines(const LangOptions &Opts, + std::vector<char> &Defines) const { + X86_32TargetInfo::getTargetDefines(Opts, Defines); + getOpenBSDDefines(Opts, 0, getTargetTriple(), Defines); + } +}; +} // end anonymous namespace + +namespace { // x86-32 FreeBSD target class FreeBSDX86_32TargetInfo : public X86_32TargetInfo { public: @@ -987,6 +1014,20 @@ public: } // end anonymous namespace namespace { +// x86-64 OpenBSD target +class OpenBSDX86_64TargetInfo : public X86_64TargetInfo { +public: + OpenBSDX86_64TargetInfo(const std::string &triple) + : X86_64TargetInfo(triple) {} + virtual void getTargetDefines(const LangOptions &Opts, + std::vector<char> &Defines) const { + X86_64TargetInfo::getTargetDefines(Opts, Defines); + getOpenBSDDefines(Opts, 1, getTargetTriple(), Defines); + } +}; +} // end anonymous namespace + +namespace { // x86-64 FreeBSD target class FreeBSDX86_64TargetInfo : public X86_64TargetInfo { public: @@ -1457,6 +1498,7 @@ TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) { // Additions and corrections are welcome. bool isDarwin = T.find("-darwin") != std::string::npos; bool isDragonFly = T.find("-dragonfly") != std::string::npos; + bool isOpenBSD = T.find("-openbsd") != std::string::npos; bool isFreeBSD = T.find("-freebsd") != std::string::npos; bool isSolaris = T.find("-solaris") != std::string::npos; bool isLinux = T.find("-linux") != std::string::npos; @@ -1495,6 +1537,8 @@ TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) { return new DarwinX86_64TargetInfo(T); if (isLinux) return new LinuxX86_64TargetInfo(T); + if (isOpenBSD) + return new OpenBSDX86_64TargetInfo(T); if (isFreeBSD) return new FreeBSDX86_64TargetInfo(T); if (isSolaris) @@ -1515,6 +1559,8 @@ TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) { return new LinuxX86_32TargetInfo(T); if (isDragonFly) return new DragonFlyX86_32TargetInfo(T); + if (isOpenBSD) + return new OpenBSDX86_32TargetInfo(T); if (isFreeBSD) return new FreeBSDX86_32TargetInfo(T); if (isSolaris) |