From 911add149af563a5a61458de0dd730e3f5348623 Mon Sep 17 00:00:00 2001 From: Erich Keane Date: Wed, 29 Apr 2020 13:15:04 -0700 Subject: [PATCH] Disable _ExtInt by default Since the _ExtInt type got into the repo, we've discovered that the ABI implications weren't completely understood. The other architectures are going to be audited (see D79118), however downstream targets aren't going to benefit from this audit. This patch disables the _ExtInt type by default and makes the target-info an opt-in. As it is audited, I'll re-enable these for all of our default targets. --- clang/include/clang/Basic/TargetInfo.h | 6 ++++++ clang/lib/Basic/Targets/X86.h | 4 ++++ clang/lib/Sema/SemaType.cpp | 3 +++ clang/test/Sema/ext-int-not-supported.c | 5 +++++ 4 files changed, 18 insertions(+) create mode 100644 clang/test/Sema/ext-int-not-supported.c diff --git a/clang/include/clang/Basic/TargetInfo.h b/clang/include/clang/Basic/TargetInfo.h index ab47954..910a4d6 100644 --- a/clang/include/clang/Basic/TargetInfo.h +++ b/clang/include/clang/Basic/TargetInfo.h @@ -547,6 +547,12 @@ public: return (getPointerWidth(0) >= 64) || getTargetOpts().ForceEnableInt128; } // FIXME + /// Determine whether the _ExtInt type is supported on this target. This + /// limitation is put into place for ABI reasons. + virtual bool hasExtIntType() const { + return false; + } + /// Determine whether _Float16 is supported on this target. virtual bool hasLegalHalfType() const { return HasLegalHalfType; } diff --git a/clang/lib/Basic/Targets/X86.h b/clang/lib/Basic/Targets/X86.h index a68109a..39ccac9 100644 --- a/clang/lib/Basic/Targets/X86.h +++ b/clang/lib/Basic/Targets/X86.h @@ -435,6 +435,8 @@ public: } ArrayRef getTargetBuiltins() const override; + + bool hasExtIntType() const override { return true; } }; class LLVM_LIBRARY_VISIBILITY NetBSDI386TargetInfo @@ -737,6 +739,8 @@ public: } ArrayRef getTargetBuiltins() const override; + + bool hasExtIntType() const override { return true; } }; // x86-64 Windows target diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index a96e1c1..338e335 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -1443,6 +1443,9 @@ static QualType ConvertDeclSpecToType(TypeProcessingState &state) { break; } case DeclSpec::TST_extint: { + if (!S.Context.getTargetInfo().hasExtIntType()) + S.Diag(DS.getTypeSpecTypeLoc(), diag::err_type_unsupported) + << "_ExtInt"; Result = S.BuildExtIntType(DS.getTypeSpecSign() == TSS_unsigned, DS.getRepAsExpr(), DS.getBeginLoc()); if (Result.isNull()) { diff --git a/clang/test/Sema/ext-int-not-supported.c b/clang/test/Sema/ext-int-not-supported.c new file mode 100644 index 0000000..23610b9 --- /dev/null +++ b/clang/test/Sema/ext-int-not-supported.c @@ -0,0 +1,5 @@ +// RUN: %clang_cc1 -triple armv7 -fsyntax-only -verify %s + +void foo() { + _ExtInt(33) a; // expected-error{{_ExtInt is not supported on this target}} +} -- 2.7.4