//===--- 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');
}
static void getSolarisDefines(std::vector<char> &Defs) {
Define(Defs, "__SUN__");
Define(Defs, "__SOLARIS__");
}
static void getDarwinDefines(std::vector<char> &Defs) {
Define(Defs, "__APPLE__");
Define(Defs, "__MACH__");
if (0) // darwin_pascal_strings
Define(Defs, "__PASCAL_STRINGS__");
}
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__");
}
/// 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, "__POWERPC__");
if (is64Bit) {
Define(Defs, "_ARCH_PPC64");
Define(Defs, "_LP64");
Define(Defs, "__LP64__");
Define(Defs, "__ppc64__");
} else {
Define(Defs, "__ppc__");
}
// Target properties.
Define(Defs, "_BIG_ENDIAN");
Define(Defs, "__BIG_ENDIAN__");
if (is64Bit) {
Define(Defs, "__INTMAX_MAX__", "9223372036854775807L");
Define(Defs, "__INTMAX_TYPE__", "long int");
Define(Defs, "__LONG_MAX__", "9223372036854775807L");
Define(Defs, "__PTRDIFF_TYPE__", "long int");
Define(Defs, "__UINTMAX_TYPE__", "long unsigned int");
} else {
Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
Define(Defs, "__INTMAX_TYPE__", "long long int");
Define(Defs, "__LONG_MAX__", "2147483647L");
Define(Defs, "__PTRDIFF_TYPE__", "int");
Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
}
Define(Defs, "__INT_MAX__", "2147483647");
Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
Define(Defs, "__CHAR_BIT__", "8");
Define(Defs, "__SCHAR_MAX__", "127");
Define(Defs, "__SHRT_MAX__", "32767");
Define(Defs, "__SIZE_TYPE__", "long unsigned int");
// Subtarget options.
Define(Defs, "__USER_LABEL_PREFIX__", "_");
Define(Defs, "__NATURAL_ALIGNMENT__");
Define(Defs, "__REGISTER_PREFIX__", "");
Define(Defs, "__WCHAR_MAX__", "2147483647");
Define(Defs, "__WCHAR_TYPE__", "int");
Define(Defs