Index: lib/Basic/Targets/ARM.cpp =================================================================== --- lib/Basic/Targets/ARM.cpp +++ lib/Basic/Targets/ARM.cpp @@ -28,14 +28,6 @@ DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64; const llvm::Triple &T = getTriple(); - // size_t is unsigned long on MachO-derived environments, NetBSD, and - // OpenBSD. - if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD || - T.getOS() == llvm::Triple::OpenBSD) - SizeType = UnsignedLong; - else - SizeType = UnsignedInt; - bool IsNetBSD = T.getOS() == llvm::Triple::NetBSD; bool IsOpenBSD = T.getOS() == llvm::Triple::OpenBSD; if (!T.isOSWindows() && !IsNetBSD && !IsOpenBSD) @@ -83,12 +75,6 @@ else DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32; - // size_t is unsigned int on FreeBSD. - if (T.getOS() == llvm::Triple::FreeBSD) - SizeType = UnsignedInt; - else - SizeType = UnsignedLong; - WCharType = SignedInt; // Do not respect the alignment of bit-field types when laying out @@ -225,22 +211,25 @@ const TargetOptions &Opts) : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0), HW_FP(0) { - - switch (getTriple().getOS()) { - case llvm::Triple::NetBSD: - case llvm::Triple::OpenBSD: - PtrDiffType = SignedLong; - break; - default: - PtrDiffType = SignedInt; - break; - } - bool IsOpenBSD = Triple.getOS() == llvm::Triple::OpenBSD; bool IsNetBSD = Triple.getOS() == llvm::Triple::NetBSD; - IntPtrType = + + PtrDiffType = IntPtrType = (Triple.isOSDarwin() || IsOpenBSD || IsNetBSD) ? SignedLong : SignedInt; + // FIXME: the isOSBinFormatMachO is a workaround for identifying a Darwin-like + // environment where size_t is `unsigned long` rather than `unsigned int` + SizeType = (Triple.isOSDarwin() || Triple.isOSBinFormatMachO() || IsOpenBSD || + IsNetBSD) + ? UnsignedLong + : UnsignedInt; + + // ptrdiff_t is inconsistent on Darwin + if (Triple.isOSDarwin()) + PtrDiffType = SignedInt; + else if (Triple.isWatchABI()) + PtrDiffType = SignedLong; + // Cache arch related info. setArchInfo(); @@ -927,7 +916,6 @@ WindowsARMTargetInfo::WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) : WindowsTargetInfo(Triple, Opts), Triple(Triple) { - SizeType = UnsignedInt; } void WindowsARMTargetInfo::getVisualStudioDefines(const LangOptions &Opts, @@ -1047,10 +1035,6 @@ // Darwin on iOS uses a variant of the ARM C++ ABI. TheCXXABI.set(TargetCXXABI::WatchOS); - // The 32-bit ABI is silent on what ptrdiff_t should be, but given that - // size_t is long, it's a bit weird for it to be int. - PtrDiffType = SignedLong; - // BOOL should be a real boolean on the new ABI UseSignedCharForObjCBool = false; } else Index: test/Preprocessor/init.c =================================================================== --- test/Preprocessor/init.c +++ test/Preprocessor/init.c @@ -1791,6 +1791,11 @@ // ARM:#define __arm 1 // ARM:#define __arm__ 1 +// RUN: %clang_cc1 -dM -ffreestanding -triple arm-none-none -target-abi apcs-gnu -E /dev/null -o - | FileCheck -match-full-lines -check-prefix ARM-APCS-GNU %s +// ARM-APCS-GNU: #define __INTPTR_TYPE__ int +// ARM-APCS-GNU: #define __PTRDIFF_TYPE__ int +// ARM-APCS-GNU: #define __SIZE_TYPE__ unsigned int + // RUN: %clang_cc1 -E -dM -ffreestanding -triple=armeb-none-none < /dev/null | FileCheck -match-full-lines -check-prefix ARM-BE %s // // ARM-BE-NOT:#define _LP64