//===--- Targets.cpp - Implement -arch option and targets -----------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file implements construction of a TargetInfo object from a
// target triple.
//
//===----------------------------------------------------------------------===//
// FIXME: Layering violation
#include "clang/AST/Builtins.h"
#include "clang/AST/TargetBuiltins.h"
#include "clang/Basic/TargetInfo.h"
#include "clang/Basic/LangOptions.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/APFloat.h"
using namespace clang;
//===----------------------------------------------------------------------===//
// Common code shared among targets.
//===----------------------------------------------------------------------===//
static void Define(std::vector<char> &Buf, const char *Macro,
const char *Val = "1") {
const char *Def = "#define ";
Buf.insert(Buf.end(), Def, Def+strlen(Def));
Buf.insert(Buf.end(), Macro, Macro+strlen(Macro));
Buf.push_back(' ');
Buf.insert(Buf.end(), Val, Val+strlen(Val));
Buf.push_back('\n');
}
//===----------------------------------------------------------------------===//
// Defines specific to certain operating systems.
//===----------------------------------------------------------------------===//
static void getSolarisDefines(std::vector<char> &Defs) {
Define(Defs, "__SUN__");
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, "__ELF__", "1");
if (is64Bit) {
Define(Defs, "__LP64__");
}
}
static void getDragonFlyDefines(std::vector<char> &Defs) {
// DragonFly defines; list based off of gcc output
Define(Defs, "__DragonFly__");
Define(Defs, "__DragonFly_cc_version", "100001");
Define(Defs, "__ELF__");
Define(Defs, "__KPRINTF_ATTRIBUTE__");
Define(Defs, "__tune_i386__");
Define(Defs, "unix");
Define(Defs, "__unix");
Define(Defs, "__unix__");
}
static void getLinuxDefines(std::vector<char> &Defs) {
// Linux defines; list based off of gcc output
Define(Defs, "__unix__");
Define(Defs, "__unix");
Define(Defs, "unix");
Define(Defs, "__linux__");
Define(Defs, "__linux");
Define(Defs, "linux");
Define(Defs, "__gnu_linux__");
Define(Defs, "__ELF__", "1");
}
/// getDarwinNumber - Parse the 'darwin number' out of the specific targe
/// triple. For example, if we have darwin8.5 return 8,5,4. If any entry is
/// not defined, return 0's. Return true if we have -darwin in the string or
/// false otherwise.
static bool getDarwinNumber(const char *Triple, unsigned &Maj, unsigned &Min) {
Maj = Min = 0;
const char *Darwin = strstr(Triple, "-darwin");
if (Darwin == 0) return false;
Darwin += strlen("-darwin");
if (Darwin[0] < '0' || Darwin[0] > '9')
return true;
Maj = Darwin[0]