diff options
author | Chris Lattner <sabre@nondot.org> | 2008-10-16 17:04:31 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-10-16 17:04:31 +0000 |
commit | 3c3e2cc77fb14512e9f77b496c5844120dae110a (patch) | |
tree | 9aa792d071c5df46510d498f51d53745bd1162af /clang/lib/Basic/Targets.cpp | |
parent | ba88d86a65d085d7afc500756131b178369ae948 (diff) | |
download | bcm5719-llvm-3c3e2cc77fb14512e9f77b496c5844120dae110a.tar.gz bcm5719-llvm-3c3e2cc77fb14512e9f77b496c5844120dae110a.zip |
Add basic FreeBSD target support, patch by Roman Divacky!
llvm-svn: 57645
Diffstat (limited to 'clang/lib/Basic/Targets.cpp')
-rw-r--r-- | clang/lib/Basic/Targets.cpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index 531d0520ccf..7578b1b7d87 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -42,6 +42,26 @@ static void getSolarisDefines(std::vector<char> &Defs) { Define(Defs, "__SOLARIS__"); } +static void getFreeBSDDefines(std::vector<char> &Defs, bool is64Bit, const char *Triple) { + // FreeBSD defines; list based off of gcc output + + const char *FreeBSD = strstr(Triple, "-freebsd"); + FreeBSD += strlen("-freebsd"); + char release[] = "X"; + release[0] = FreeBSD[0]; + char version[] = "X00001"; + version[0] = FreeBSD[0]; + + Define(Defs, "__FreeBSD__", release); + Define(Defs, "__FreeBSD_cc_version", version); + Define(Defs, "__KPRINTF_ATTRIBUTE__"); + Define(Defs, "unix"); + Define(Defs, "bsd"); + if (is64Bit) { + Define(Defs, "__LP64__"); + } +} + static void getDragonFlyDefines(std::vector<char> &Defs) { // DragonFly defines; list based off of gcc output Define(Defs, "__DragonFly__"); @@ -509,6 +529,19 @@ public: } // end anonymous namespace namespace { +// x86-32 FreeBSD target +class FreeBSDX86_32TargetInfo : public X86_32TargetInfo { +public: + FreeBSDX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) { + } + virtual void getTargetDefines(std::vector<char> &Defines) const { + X86_32TargetInfo::getTargetDefines(Defines); + getFreeBSDDefines(Defines, 0, getTargetTriple()); + } +}; +} // end anonymous namespace + +namespace { // x86-32 DragonFly target class DragonFlyX86_32TargetInfo : public X86_32TargetInfo { public: @@ -588,6 +621,19 @@ public: } // end anonymous namespace namespace { +// x86-64 FreeBSD target +class FreeBSDX86_64TargetInfo : public X86_64TargetInfo { +public: + FreeBSDX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) { + } + virtual void getTargetDefines(std::vector<char> &Defines) const { + X86_64TargetInfo::getTargetDefines(Defines); + getFreeBSDDefines(Defines, 1, getTargetTriple()); + } +}; +} // end anonymous namespace + +namespace { // x86-64 Linux target class LinuxX86_64TargetInfo : public X86_64TargetInfo { public: @@ -798,6 +844,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 isFreeBSD = T.find("-freebsd") != std::string::npos; bool isSolaris = T.find("-solaris") != std::string::npos; bool isLinux = T.find("-linux") != std::string::npos; bool isWindows = T.find("-windows") != std::string::npos || @@ -833,6 +880,8 @@ TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) { return new DarwinX86_64TargetInfo(T); if (isLinux) return new LinuxX86_64TargetInfo(T); + if (isFreeBSD) + return new FreeBSDX86_64TargetInfo(T); return new X86_64TargetInfo(T); } @@ -846,6 +895,8 @@ TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) { return new LinuxX86_32TargetInfo(T); if (isDragonFly) return new DragonFlyX86_32TargetInfo(T); + if (isFreeBSD) + return new FreeBSDX86_32TargetInfo(T); if (isWindows) return new WindowsX86_32TargetInfo(T); return new X86_32TargetInfo(T); |