[PATCH] D152140: [Clang] Limit FunctionTypeExtraBitfields::NumExceptionType to 16 bits.

Sander de Smalen via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Jun 5 03:21:48 PDT 2023


sdesmalen created this revision.
sdesmalen added reviewers: erichkeane, aaron.ballman.
Herald added a project: All.
sdesmalen requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

In https://reviews.llvm.org/D127762#4102578 @erichkeane suggested to
limit size of this field to 16bits, such that the field that encodes the
SME attributes for a function fall within the alignment of the struct for
32bit platforms.

Standard implimits defines the minimum handlers per try block to 256,
which suggests that 16bits should be more than sufficient for most
programs. Erich also pointed out that exception specs are being
deprecated and are rarely used, so hopefully this change is safe to make.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D152140

Files:
  clang/include/clang/AST/Type.h
  clang/lib/AST/Type.cpp


Index: clang/lib/AST/Type.cpp
===================================================================
--- clang/lib/AST/Type.cpp
+++ clang/lib/AST/Type.cpp
@@ -3371,7 +3371,7 @@
   // Fill in the exception type array if present.
   if (getExceptionSpecType() == EST_Dynamic) {
     auto &ExtraBits = *getTrailingObjects<FunctionTypeExtraBitfields>();
-    ExtraBits.NumExceptionType = epi.ExceptionSpec.Exceptions.size();
+    ExtraBits.setNumExceptionType(epi.ExceptionSpec.Exceptions.size());
 
     assert(hasExtraBitfields() && "missing trailing extra bitfields!");
     auto *exnSlot =
Index: clang/include/clang/AST/Type.h
===================================================================
--- clang/include/clang/AST/Type.h
+++ clang/include/clang/AST/Type.h
@@ -3949,11 +3949,20 @@
   /// A simple holder for various uncommon bits which do not fit in
   /// FunctionTypeBitfields. Aligned to alignof(void *) to maintain the
   /// alignment of subsequent objects in TrailingObjects.
-  struct alignas(void *) FunctionTypeExtraBitfields {
+  class alignas(void *) FunctionTypeExtraBitfields {
     /// The number of types in the exception specification.
     /// A whole unsigned is not needed here and according to
     /// [implimits] 8 bits would be enough here.
-    unsigned NumExceptionType = 0;
+    unsigned NumExceptionType : 16;
+
+  public:
+    FunctionTypeExtraBitfields() : NumExceptionType(0) {}
+
+    void setNumExceptionType(unsigned N) {
+      assert(N < 65536 && "Not enough bits to encode exceptions");
+      NumExceptionType = N;
+    }
+    unsigned getNumExceptionType() const { return NumExceptionType; }
   };
 
 protected:
@@ -4329,7 +4338,7 @@
   unsigned getNumExceptions() const {
     return getExceptionSpecType() == EST_Dynamic
                ? getTrailingObjects<FunctionTypeExtraBitfields>()
-                     ->NumExceptionType
+                     ->getNumExceptionType()
                : 0;
   }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D152140.528363.patch
Type: text/x-patch
Size: 1949 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230605/0d04bb52/attachment.bin>


More information about the cfe-commits mailing list