diff options
-rw-r--r-- | include/clang/Basic/TargetInfo.h | 10 | ||||
-rw-r--r-- | lib/Basic/TargetInfo.cpp | 10 | ||||
-rw-r--r-- | lib/Basic/Targets.cpp | 31 |
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; } |