[clang] 4c6cba3 - [clang][NFC] Specify Type and ExtQuals as having 16-byte alignment (#68377)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Oct 12 10:54:12 PDT 2023
Author: Vlad Serebrennikov
Date: 2023-10-12T21:54:07+04:00
New Revision: 4c6cba31aaaa767cdb7f83ec4ca0eab9b6eae127
URL: https://github.com/llvm/llvm-project/commit/4c6cba31aaaa767cdb7f83ec4ca0eab9b6eae127
DIFF: https://github.com/llvm/llvm-project/commit/4c6cba31aaaa767cdb7f83ec4ca0eab9b6eae127.diff
LOG: [clang][NFC] Specify Type and ExtQuals as having 16-byte alignment (#68377)
While working on LLDB visualizer for `QualType`, I stumbled upon `Type` and `ExtQuals` defined with `alignas(8)`. Such alignment leaves only 3 lower bits available for pointer tagging, whereas `QualType` requires 4 (3 qualifiers + discriminator between `Type *` and `ExtQuals *`). Turns out `Type` and its derived classes are allocated with `TypeAlignment == 16` passed to `Allocate()`. So I'm removing misleading `alignas(8)` and fixing corresponding static asserts. Since they are already allocated with 16-byte alignment, this is a non-functional change.
Added:
Modified:
clang/include/clang/AST/Type.h
Removed:
################################################################################
diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h
index a78d8f60462b231..3e7e4f4f75b58b1 100644
--- a/clang/include/clang/AST/Type.h
+++ b/clang/include/clang/AST/Type.h
@@ -1482,7 +1482,8 @@ class ExtQualsTypeCommonBase {
/// in three low bits on the QualType pointer; a fourth bit records whether
/// the pointer is an ExtQuals node. The extended qualifiers (address spaces,
/// Objective-C GC attributes) are much more rare.
-class ExtQuals : public ExtQualsTypeCommonBase, public llvm::FoldingSetNode {
+class alignas(TypeAlignment) ExtQuals : public ExtQualsTypeCommonBase,
+ public llvm::FoldingSetNode {
// NOTE: changing the fast qualifiers should be straightforward as
// long as you don't make 'const' non-fast.
// 1. Qualifiers:
@@ -1594,7 +1595,7 @@ enum class AutoTypeKeyword {
///
/// Types, once created, are immutable.
///
-class alignas(8) Type : public ExtQualsTypeCommonBase {
+class alignas(TypeAlignment) Type : public ExtQualsTypeCommonBase {
public:
enum TypeClass {
#define TYPE(Class, Base) Class,
@@ -1982,9 +1983,10 @@ class alignas(8) Type : public ExtQualsTypeCommonBase {
Type(TypeClass tc, QualType canon, TypeDependence Dependence)
: ExtQualsTypeCommonBase(this,
canon.isNull() ? QualType(this_(), 0) : canon) {
- static_assert(sizeof(*this) <= 8 + sizeof(ExtQualsTypeCommonBase),
+ static_assert(sizeof(*this) <=
+ alignof(decltype(*this)) + sizeof(ExtQualsTypeCommonBase),
"changing bitfields changed sizeof(Type)!");
- static_assert(alignof(decltype(*this)) % sizeof(void *) == 0,
+ static_assert(alignof(decltype(*this)) % TypeAlignment == 0,
"Insufficient alignment!");
TypeBits.TC = tc;
TypeBits.Dependence = static_cast<unsigned>(Dependence);
@@ -5348,7 +5350,7 @@ class DeducedType : public Type {
/// Represents a C++11 auto or C++14 decltype(auto) type, possibly constrained
/// by a type-constraint.
-class alignas(8) AutoType : public DeducedType, public llvm::FoldingSetNode {
+class AutoType : public DeducedType, public llvm::FoldingSetNode {
friend class ASTContext; // ASTContext creates these
ConceptDecl *TypeConstraintConcept;
@@ -5456,9 +5458,7 @@ class DeducedTemplateSpecializationType : public DeducedType,
/// TemplateArguments, followed by a QualType representing the
/// non-canonical aliased type when the template is a type alias
/// template.
-class alignas(8) TemplateSpecializationType
- : public Type,
- public llvm::FoldingSetNode {
+class TemplateSpecializationType : public Type, public llvm::FoldingSetNode {
friend class ASTContext; // ASTContext creates these
/// The name of the template being specialized. This is
@@ -5872,9 +5872,8 @@ class DependentNameType : public TypeWithKeyword, public llvm::FoldingSetNode {
/// Represents a template specialization type whose template cannot be
/// resolved, e.g.
/// A<T>::template B<T>
-class alignas(8) DependentTemplateSpecializationType
- : public TypeWithKeyword,
- public llvm::FoldingSetNode {
+class DependentTemplateSpecializationType : public TypeWithKeyword,
+ public llvm::FoldingSetNode {
friend class ASTContext; // ASTContext creates these
/// The nested name specifier containing the qualifier.
More information about the cfe-commits
mailing list