//===--- 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.
//
//===----------------------------------------------------------------------===//
#include "clang/AST/Builtins.h"
#include "clang/AST/TargetBuiltins.h"
#include "clang/Basic/TargetInfo.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, "bsd");
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__");
}
static void getDarwinDefines(std::vector<char> &Defs, const char *Triple) {
Define(Defs, "__APPLE__");
Define(Defs, "__MACH__");
// Figure out which "darwin number" the target triple is. "darwin9" -> 10.5.
const char *Darwin = strstr(Triple, "-darwin");
if (Darwin) {
char DarwinStr[] = "1000";
Darwin += strlen("-darwin");
if (Darwin[0] >= '0' && Darwin[0] <= '9') {
unsigned DarwinNo = Darwin[0]-'0';
++Darwin;
// Handle "darwin11".
if (DarwinNo == 1 && Darwin[0] >= '0' && Darwin[0] <= '9') {
DarwinNo = 10+Darwin[0]-'0';
++Darwin;
}
if (DarwinNo >= 4 && DarwinNo <= 13) { // 10.0-10.9
// darwin7 -> 1030, darwin8 -> 1040, darwin9 -> 1050, etc.
DarwinStr[2] = '0' + DarwinNo-4;
}
// Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
if (Darwin[0] == '.' && Darwin[1] >= '0' && Darwin[1] <= '9' &&
Darwin[2] == '\0')
DarwinStr[3] = Darwin[1];
}
Define(Defs, "__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", DarwinStr);
}
}
//===----------------------------------------------------------------------===//
// Defines specific to certain architectures.
//===----------------------------------------------------------------------===//
/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
/// not tied to a specific subtarget.
static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
// Target identification.
Define(Defs, "__ppc__");
Define(Defs, "_ARCH_PPC");
Define(Defs,