//===--- 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/Diagnostic.h"
#include "clang/Basic/TargetInfo.h"
#include "llvm/ADT/STLExtras.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');
}
namespace {
class DarwinTargetInfo : public TargetInfo {
public:
DarwinTargetInfo(const std::string& triple) : TargetInfo(triple) {}
virtual void getTargetDefines(std::vector<char> &Defs) const {
// FIXME: we need a real target configuration system. For now, only define
// __APPLE__ if the host has it.
#ifdef __APPLE__
Define(Defs, "__APPLE__");
Define(Defs, "__MACH__");
#endif
if (1) {// -fobjc-gc controls this.
Define(Defs, "__weak", "");
Define(Defs, "__strong", "");
} else {
Define(Defs, "__weak", "__attribute__((objc_gc(weak)))");
Define(Defs, "__strong", "__attribute__((objc_gc(strong)))");
Define(Defs, "__OBJC_GC__");
}
// darwin_constant_cfstrings controls this.
Define(Defs, "__CONSTANT_CFSTRINGS__");
if (0) // darwin_pascal_strings
Define(Defs, "__PASCAL_STRINGS__");
}
};
class SolarisTargetInfo : public TargetInfo {
public:
SolarisTargetInfo(const std::string& triple) : TargetInfo(triple) {}
virtual void getTargetDefines(std::vector<char> &Defs) const {
// FIXME: we need a real target configuration system. For now, only define
// __SUN__ if the host has it.
#ifdef __SUN__
Define(Defs, "__SUN__");
Define(Defs, "__SOLARIS__");
#endif
if (1) {// -fobjc-gc controls this.
Define(Defs, "__weak", "");
Define(Defs, "__strong", "");
} else {
Define(Defs, "__weak", "__attribute__((objc_gc(weak)))");
Define(Defs, "__strong", "__attribute__((objc_gc(strong)))");
Define(Defs, "__OBJC_GC__");
}
}
};
} // end anonymous namespace.
/// 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