forked from OSchip/llvm-project
Give TargetInfo a new IntPtrType to hold the intptr_t type for
a target. Make Preprocessor.cpp define a new __INTPTR_TYPE__ macro based on this. On linux/32, set intptr_t to int, instead of long. This fixes PR3563. llvm-svn: 64495
This commit is contained in:
parent
02b63b4287
commit
7e4c81c8c6
|
@ -72,7 +72,7 @@ public:
|
|||
UnsignedLongLong
|
||||
};
|
||||
protected:
|
||||
IntType SizeType, IntMaxType, UIntMaxType, PtrDiffType, WCharType;
|
||||
IntType SizeType, IntMaxType, UIntMaxType, PtrDiffType, IntPtrType, WCharType;
|
||||
public:
|
||||
IntType getSizeType() const { return SizeType; }
|
||||
IntType getIntMaxType() const { return IntMaxType; }
|
||||
|
@ -80,6 +80,7 @@ public:
|
|||
IntType getPtrDiffType(unsigned AddrSpace) const {
|
||||
return AddrSpace == 0 ? PtrDiffType : getPtrDiffTypeV(AddrSpace);
|
||||
}
|
||||
IntType getIntPtrType() const { return IntPtrType; }
|
||||
IntType getWCharType() const { return WCharType; }
|
||||
|
||||
/// isCharSigned - Return true if 'char' is 'signed char' or false if it is
|
||||
|
|
|
@ -39,6 +39,7 @@ TargetInfo::TargetInfo(const std::string &T) : Triple(T) {
|
|||
PtrDiffType = SignedLong;
|
||||
IntMaxType = SignedLongLong;
|
||||
UIntMaxType = UnsignedLongLong;
|
||||
IntPtrType = SignedLong;
|
||||
WCharType = SignedInt;
|
||||
FloatFormat = &llvm::APFloat::IEEEsingle;
|
||||
DoubleFormat = &llvm::APFloat::IEEEdouble;
|
||||
|
|
|
@ -629,6 +629,7 @@ public:
|
|||
UserLabelPrefix = "";
|
||||
SizeType = UnsignedInt;
|
||||
PtrDiffType = SignedInt;
|
||||
IntPtrType = SignedInt;
|
||||
}
|
||||
virtual void getTargetDefines(std::vector<char> &Defines) const {
|
||||
X86_32TargetInfo::getTargetDefines(Defines);
|
||||
|
@ -937,6 +938,7 @@ namespace {
|
|||
SizeType = UnsignedInt;
|
||||
IntMaxType = SignedLong;
|
||||
UIntMaxType = UnsignedLong;
|
||||
IntPtrType = SignedShort;
|
||||
PtrDiffType = SignedInt;
|
||||
DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
|
||||
}
|
||||
|
|
|
@ -70,25 +70,8 @@ typedef uint64_t uint_fast64_t;
|
|||
|
||||
/* C99 7.18.1.4 Integer types capable of holding object pointers.
|
||||
*/
|
||||
#if (1LL << (__POINTER_WIDTH__-1))-1 == __LONG_MAX__
|
||||
/* If the pointer size is equal to long, use long. This is for compatibility
|
||||
* with many systems which just use long and expect it to work in 32-bit and
|
||||
* 64-bit mode. If long is not suitable, we use a fixed size type below.
|
||||
*/
|
||||
typedef long intptr_t;
|
||||
typedef unsigned long uintptr_t;
|
||||
#elif __POINTER_WIDTH__ == 64
|
||||
typedef int64_t intptr_t;
|
||||
typedef uint64_t uintptr_t;
|
||||
#elif __POINTER_WIDTH__ == 32
|
||||
typedef int32_t intptr_t;
|
||||
typedef uint32_t uintptr_t;
|
||||
#elif __POINTER_WIDTH__ == 16
|
||||
typedef int16_t intptr_t;
|
||||
typedef uint16_t uintptr_t;
|
||||
#else
|
||||
#error "unknown or unset pointer width!"
|
||||
#endif
|
||||
typedef __INTPTR_TYPE__ intptr_t;
|
||||
typedef unsigned __INTPTR_TYPE__ uintptr_t;
|
||||
|
||||
/* C99 7.18.1.5 Greatest-width integer types.
|
||||
*/
|
||||
|
|
|
@ -557,6 +557,7 @@ static void InitializePredefinedMacros(Preprocessor &PP,
|
|||
DefineType("__INTMAX_TYPE__", TI.getIntMaxType(), Buf);
|
||||
DefineType("__UINTMAX_TYPE__", TI.getUIntMaxType(), Buf);
|
||||
DefineType("__PTRDIFF_TYPE__", TI.getPtrDiffType(0), Buf);
|
||||
DefineType("__INTPTR_TYPE__", TI.getIntPtrType(), Buf);
|
||||
DefineType("__SIZE_TYPE__", TI.getSizeType(), Buf);
|
||||
DefineType("__WCHAR_TYPE__", TI.getWCharType(), Buf);
|
||||
// FIXME: TargetInfo hookize __WINT_TYPE__.
|
||||
|
|
Loading…
Reference in New Issue