aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2008-05-20 14:21:01 +0000
committerEli Friedman <eli.friedman@gmail.com>2008-05-20 14:21:01 +0000
commit61538a7d1336f3ef3cb81e09f11a1cbb282bcf81 (patch)
treeb427d6930be7c7ac575c6a30aa7abef9b087abb3
parentc594b323555820a7088fb6d0af1803beccc86c44 (diff)
Some small changes to make the target info a bit more accurate.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@51319 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/Basic/TargetInfo.h10
-rw-r--r--lib/Basic/TargetInfo.cpp10
-rw-r--r--lib/Basic/Targets.cpp31
3 files changed, 36 insertions, 15 deletions
diff --git a/include/clang/Basic/TargetInfo.h b/include/clang/Basic/TargetInfo.h
index 36fbb0d1c2..0196de2d7e 100644
--- a/include/clang/Basic/TargetInfo.h
+++ b/include/clang/Basic/TargetInfo.h
@@ -38,7 +38,9 @@ protected:
unsigned char PointerWidth, PointerAlign;
unsigned char WCharWidth, WCharAlign;
unsigned char IntWidth, IntAlign;
+ unsigned char FloatWidth, FloatAlign;
unsigned char DoubleWidth, DoubleAlign;
+ unsigned char LongDoubleWidth, LongDoubleAlign;
unsigned char LongWidth, LongAlign;
unsigned char LongLongWidth, LongLongAlign;
@@ -114,8 +116,8 @@ public:
unsigned getWCharAlign() const { return WCharAlign; }
/// getFloatWidth/Align/Format - Return the size/align/format of 'float'.
- unsigned getFloatWidth() const { return 32; } // FIXME
- unsigned getFloatAlign() const { return 32; } // FIXME
+ unsigned getFloatWidth() const { return FloatWidth; }
+ unsigned getFloatAlign() const { return FloatAlign; }
const llvm::fltSemantics *getFloatFormat() const { return FloatFormat; }
/// getDoubleWidth/Align/Format - Return the size/align/format of 'double'.
@@ -125,8 +127,8 @@ public:
/// getLongDoubleWidth/Align/Format - Return the size/align/format of 'long
/// double'.
- unsigned getLongDoubleWidth() const { return 64; } // FIXME
- unsigned getLongDoubleAlign() const { return 64; } // FIXME
+ unsigned getLongDoubleWidth() const { return LongDoubleWidth; }
+ unsigned getLongDoubleAlign() const { return LongDoubleAlign; }
const llvm::fltSemantics *getLongDoubleFormat() const {
return LongDoubleFormat;
}
diff --git a/lib/Basic/TargetInfo.cpp b/lib/Basic/TargetInfo.cpp
index e8fc9232e1..6562911a33 100644
--- a/lib/Basic/TargetInfo.cpp
+++ b/lib/Basic/TargetInfo.cpp
@@ -21,15 +21,21 @@ using namespace clang;
// TargetInfo Constructor.
TargetInfo::TargetInfo(const std::string &T) : Triple(T) {
- // Set defaults. These should be overridden by concrete targets as needed.
+ // Set defaults. Defaults are set for a 32-bit RISC platform,
+ // like PPC or SPARC.
+ // These should be overridden by concrete targets as needed.
CharIsSigned = true;
PointerWidth = PointerAlign = 32;
WCharWidth = WCharAlign = 32;
IntWidth = IntAlign = 32;
LongWidth = LongAlign = 32;
LongLongWidth = LongLongAlign = 64;
+ FloatWidth = 32;
+ FloatAlign = 32;
DoubleWidth = 64;
- DoubleAlign = 32;
+ DoubleAlign = 64;
+ LongDoubleWidth = 64;
+ LongDoubleAlign = 64;
FloatFormat = &llvm::APFloat::IEEEsingle;
DoubleFormat = &llvm::APFloat::IEEEdouble;
LongDoubleFormat = &llvm::APFloat::IEEEdouble;
diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp
index d7bbe50618..8aa4a4fb7b 100644
--- a/lib/Basic/Targets.cpp
+++ b/lib/Basic/Targets.cpp
@@ -697,8 +697,13 @@ public:
namespace {
class DarwinI386TargetInfo : public DarwinTargetInfo {
public:
- DarwinI386TargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {}
-
+ DarwinI386TargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {
+ DoubleAlign = LongLongAlign = 32;
+ LongDoubleWidth = 96;
+ LongDoubleAlign = 32;
+ LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
+ }
+
virtual void getTargetDefines(std::vector<char> &Defines) const {
DarwinTargetInfo::getTargetDefines(Defines);
getX86Defines(Defines, false);
@@ -741,6 +746,9 @@ class DarwinX86_64TargetInfo : public DarwinTargetInfo {
public:
DarwinX86_64TargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {
LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
+ LongDoubleWidth = 128;
+ LongDoubleAlign = 128;
+ LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
}
virtual void getTargetDefines(std::vector<char> &Defines) const {
@@ -782,7 +790,9 @@ public:
namespace {
class DarwinARMTargetInfo : public DarwinTargetInfo {
public:
- DarwinARMTargetInfo(const std::string& triple) :DarwinTargetInfo(triple) {}
+ DarwinARMTargetInfo(const std::string& triple) :DarwinTargetInfo(triple) {
+ // FIXME: Are the defaults corrent for ARM?
+ }
virtual void getTargetDefines(std::vector<char> &Defines) const {
DarwinTargetInfo::getTargetDefines(Defines);
@@ -871,7 +881,10 @@ namespace {
class PIC16TargetInfo : public TargetInfo{
public:
PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
- IntWidth = IntAlign = 16;
+ // FIXME: Is IntAlign really supposed to be 16? There seems
+ // little point on a platform with 8-bit loads.
+ IntWidth = IntAlign = LongAlign = LongLongAlign = PointerWidth = 16;
+ PointerAlign = 8;
}
virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
@@ -909,25 +922,25 @@ static inline bool IsX86(const std::string& TT) {
TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
if (T.find("ppc-") == 0 || T.find("powerpc-") == 0)
return new DarwinPPCTargetInfo(T);
-
+
if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0)
return new DarwinPPC64TargetInfo(T);
-
+
if (T.find("armv6-") == 0 || T.find("arm-") == 0)
return new DarwinARMTargetInfo(T);
if (T.find("sparc-") == 0)
return new SolarisSparcV8TargetInfo(T); // ugly hack
-
+
if (T.find("x86_64-") == 0)
return new DarwinX86_64TargetInfo(T);
-
+
if (T.find("pic16-") == 0)
return new PIC16TargetInfo(T);
if (IsX86(T))
return new DarwinI386TargetInfo(T);
-
+
return NULL;
}