diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/include/clang/Basic/TargetInfo.h | 4 | ||||
-rw-r--r-- | clang/lib/Basic/TargetInfo.cpp | 24 | ||||
-rw-r--r-- | clang/lib/Frontend/InitPreprocessor.cpp | 32 | ||||
-rw-r--r-- | clang/test/Preprocessor/stdint.c | 8 |
4 files changed, 50 insertions, 18 deletions
diff --git a/clang/include/clang/Basic/TargetInfo.h b/clang/include/clang/Basic/TargetInfo.h index 23c753260ed..16d312afa84 100644 --- a/clang/include/clang/Basic/TargetInfo.h +++ b/clang/include/clang/Basic/TargetInfo.h @@ -103,6 +103,10 @@ public: /// enum. For example, SignedInt -> getIntWidth(). unsigned getTypeWidth(IntType T) const; + /// getTypeAlign - Return the alignment (in bits) of the specified integer + /// type enum. For example, SignedInt -> getIntAlign(). + unsigned getTypeAlign(IntType T) const; + /// isTypeSigned - Return whether an integer types is signed. Returns true if /// the type is signed; false otherwise. bool isTypeSigned(IntType T) const; diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp index e965b9aec36..9ebacb240ee 100644 --- a/clang/lib/Basic/TargetInfo.cpp +++ b/clang/lib/Basic/TargetInfo.cpp @@ -96,17 +96,33 @@ const char *TargetInfo::getTypeConstantSuffix(IntType T) { unsigned TargetInfo::getTypeWidth(IntType T) const { switch (T) { default: assert(0 && "not an integer!"); - case SignedShort: return getShortWidth(); + case SignedShort: case UnsignedShort: return getShortWidth(); - case SignedInt: return getIntWidth(); + case SignedInt: case UnsignedInt: return getIntWidth(); - case SignedLong: return getLongWidth(); + case SignedLong: case UnsignedLong: return getLongWidth(); - case SignedLongLong: return getLongLongWidth(); + case SignedLongLong: case UnsignedLongLong: return getLongLongWidth(); }; } +/// getTypeAlign - Return the alignment (in bits) of the specified integer type +/// enum. For example, SignedInt -> getIntAlign(). +unsigned TargetInfo::getTypeAlign(IntType T) const { + switch (T) { + default: assert(0 && "not an integer!"); + case SignedShort: + case UnsignedShort: return getShortAlign(); + case SignedInt: + case UnsignedInt: return getIntAlign(); + case SignedLong: + case UnsignedLong: return getLongAlign(); + case SignedLongLong: + case UnsignedLongLong: return getLongLongAlign(); + }; +} + /// isTypeSigned - Return whether an integer types is signed. Returns true if /// the type is signed; false otherwise. bool TargetInfo::isTypeSigned(IntType T) const { diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 7139e55f0b6..b4b31c359f5 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -216,6 +216,14 @@ static void DefineTypeSize(const char *MacroName, unsigned TypeWidth, DefineBuiltinMacro(Buf, MacroBuf); } +/// DefineTypeSize - An overloaded helper that uses TargetInfo to determine +/// the width, suffix, and signedness of the given type +static void DefineTypeSize(const char *MacroName, TargetInfo::IntType Ty, + const TargetInfo &TI, std::vector<char> &Buf) { + DefineTypeSize(MacroName, TI.getTypeWidth(Ty), TI.getTypeConstantSuffix(Ty), + TI.isTypeSigned(Ty), Buf); +} + static void DefineType(const char *MacroName, TargetInfo::IntType Ty, std::vector<char> &Buf) { char MacroBuf[60]; @@ -346,14 +354,16 @@ static void InitializePredefinedMacros(const TargetInfo &TI, DefineBuiltinMacro(Buf, "__CHAR_BIT__=8"); DefineTypeSize("__SCHAR_MAX__", TI.getCharWidth(), "", true, Buf); - DefineTypeSize("__SHRT_MAX__", TI.getShortWidth(), "", true, Buf); - DefineTypeSize("__INT_MAX__", TI.getIntWidth(), "", true, Buf); - DefineTypeSize("__LONG_MAX__", TI.getLongWidth(), "L", true, Buf); - DefineTypeSize("__LONG_LONG_MAX__", TI.getLongLongWidth(), "LL", true, Buf); + DefineTypeSize("__SHRT_MAX__", TargetInfo::SignedShort, TI, Buf); + DefineTypeSize("__INT_MAX__", TargetInfo::SignedInt, TI, Buf); + DefineTypeSize("__LONG_MAX__", TargetInfo::SignedLong, TI, Buf); + DefineTypeSize("__LONG_LONG_MAX__", TargetInfo::SignedLongLong, TI, Buf); + // FIXME: TI.getWCharWidth() and TI.getTypeWidth(TI.getWCharType()) return + // different values on PIC16 and MSP430. TargetInfo needs to be corrected + // and the following line substituted for the one below it. + // DefineTypeSize("__WCHAR_MAX__", TI.getWCharType(), TI, Buf); DefineTypeSize("__WCHAR_MAX__", TI.getWCharWidth(), "", true, Buf); - TargetInfo::IntType IntMaxType = TI.getIntMaxType(); - DefineTypeSize("__INTMAX_MAX__", TI.getTypeWidth(IntMaxType), - TI.getTypeConstantSuffix(IntMaxType), true, Buf); + DefineTypeSize("__INTMAX_MAX__", TI.getIntMaxType(), TI, Buf); DefineType("__INTMAX_TYPE__", TI.getIntMaxType(), Buf); DefineType("__UINTMAX_TYPE__", TI.getUIntMaxType(), Buf); @@ -378,14 +388,16 @@ static void InitializePredefinedMacros(const TargetInfo &TI, assert(TI.getCharWidth() == 8 && "unsupported target types"); assert(TI.getShortWidth() == 16 && "unsupported target types"); DefineBuiltinMacro(Buf, "__INT8_TYPE__=char"); - DefineBuiltinMacro(Buf, "__INT16_TYPE__=short"); + DefineType("__INT16_TYPE__", TargetInfo::SignedShort, Buf); + TargetInfo::IntType Int32Type; if (TI.getIntWidth() == 32) - DefineBuiltinMacro(Buf, "__INT32_TYPE__=int"); + Int32Type = TargetInfo::SignedInt; else { assert(TI.getLongLongWidth() == 32 && "unsupported target types"); - DefineBuiltinMacro(Buf, "__INT32_TYPE__=long long"); + Int32Type = TargetInfo::SignedLongLong; } + DefineType("__INT32_TYPE__", Int32Type, Buf); // 16-bit targets doesn't necessarily have a 64-bit type. if (TI.getLongLongWidth() == 64) diff --git a/clang/test/Preprocessor/stdint.c b/clang/test/Preprocessor/stdint.c index d47b51dbc7b..2cda305dcbd 100644 --- a/clang/test/Preprocessor/stdint.c +++ b/clang/test/Preprocessor/stdint.c @@ -323,8 +323,8 @@ // // RUN: clang-cc -E -ffreestanding -triple=msp430-none-none %s | FileCheck -check-prefix MSP430 %s && // -// MSP430:typedef long long int32_t; -// MSP430:typedef unsigned long long uint32_t; +// MSP430:typedef long long int int32_t; +// MSP430:typedef unsigned long long int uint32_t; // MSP430:typedef int32_t int_least32_t; // MSP430:typedef uint32_t uint_least32_t; // MSP430:typedef int32_t int_fast32_t; @@ -423,8 +423,8 @@ // // RUN: clang-cc -E -ffreestanding -triple=pic16-none-none %s | FileCheck -check-prefix PIC16 %s && // -// PIC16:typedef long long int32_t; -// PIC16:typedef unsigned long long uint32_t; +// PIC16:typedef long long int int32_t; +// PIC16:typedef unsigned long long int uint32_t; // PIC16:typedef int32_t int_least32_t; // PIC16:typedef uint32_t uint_least32_t; // PIC16:typedef int32_t int_fast32_t; |