Skip to content

[Clang] NFC: Move Arm type attributes to separate trailing object. #78424

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jan 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 43 additions & 16 deletions clang/include/clang/AST/Type.h
Original file line number Diff line number Diff line change
Expand Up @@ -4029,6 +4029,22 @@ class FunctionType : public Type {
/// because TrailingObjects cannot handle repeated types.
struct ExceptionType { QualType Type; };

/// 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 {
/// 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 : 10;

LLVM_PREFERRED_TYPE(bool)
unsigned HasArmTypeAttributes : 1;

FunctionTypeExtraBitfields()
: NumExceptionType(0), HasArmTypeAttributes(false) {}
};

/// The AArch64 SME ACLE (Arm C/C++ Language Extensions) define a number
/// of function type attributes that can be set on function types, including
/// function pointers.
Expand All @@ -4042,7 +4058,8 @@ class FunctionType : public Type {
SME_ZAMask = 0b111 << SME_ZAShift,

SME_AttributeMask = 0b111'111 // We only support maximum 6 bits because of
// the bitmask in FunctionTypeExtraBitfields.
// the bitmask in FunctionTypeArmAttributes
// and ExtProtoInfo.
};

enum ArmStateValue : unsigned {
Expand All @@ -4057,20 +4074,15 @@ class FunctionType : public Type {
return (ArmStateValue)((AttrBits & SME_ZAMask) >> SME_ZAShift);
}

/// 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 {
/// 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 : 10;

/// A holder for Arm type attributes as described in the Arm C/C++
/// Language extensions which are not particularly common to all
/// types and therefore accounted separately from FunctionTypeBitfields.
struct alignas(void *) FunctionTypeArmAttributes {
/// Any AArch64 SME ACLE type attributes that need to be propagated
/// on declarations and function pointers.
unsigned AArch64SMEAttributes : 6;
FunctionTypeExtraBitfields()
: NumExceptionType(0), AArch64SMEAttributes(SME_NormalFunction) {}

FunctionTypeArmAttributes() : AArch64SMEAttributes(SME_NormalFunction) {}
};

protected:
Expand Down Expand Up @@ -4169,7 +4181,8 @@ class FunctionProtoType final
public llvm::FoldingSetNode,
private llvm::TrailingObjects<
FunctionProtoType, QualType, SourceLocation,
FunctionType::FunctionTypeExtraBitfields, FunctionType::ExceptionType,
FunctionType::FunctionTypeExtraBitfields,
FunctionType::FunctionTypeArmAttributes, FunctionType::ExceptionType,
Expr *, FunctionDecl *, FunctionType::ExtParameterInfo, Qualifiers> {
friend class ASTContext; // ASTContext creates these.
friend TrailingObjects;
Expand Down Expand Up @@ -4276,7 +4289,11 @@ class FunctionProtoType final

bool requiresFunctionProtoTypeExtraBitfields() const {
return ExceptionSpec.Type == EST_Dynamic ||
AArch64SMEAttributes != SME_NormalFunction;
requiresFunctionProtoTypeArmAttributes();
}

bool requiresFunctionProtoTypeArmAttributes() const {
return AArch64SMEAttributes != SME_NormalFunction;
}

void setArmSMEAttribute(AArch64SMETypeAttributes Kind, bool Enable = true) {
Expand All @@ -4296,6 +4313,10 @@ class FunctionProtoType final
return isVariadic();
}

unsigned numTrailingObjects(OverloadToken<FunctionTypeArmAttributes>) const {
return hasArmTypeAttributes();
}

unsigned numTrailingObjects(OverloadToken<FunctionTypeExtraBitfields>) const {
return hasExtraBitfields();
}
Expand Down Expand Up @@ -4384,6 +4405,12 @@ class FunctionProtoType final

}

bool hasArmTypeAttributes() const {
return FunctionTypeBits.HasExtraBitfields &&
getTrailingObjects<FunctionTypeExtraBitfields>()
->HasArmTypeAttributes;
}

bool hasExtQualifiers() const {
return FunctionTypeBits.HasExtQuals;
}
Expand Down Expand Up @@ -4595,9 +4622,9 @@ class FunctionProtoType final
/// Return a bitmask describing the SME attributes on the function type, see
/// AArch64SMETypeAttributes for their values.
unsigned getAArch64SMEAttributes() const {
if (!hasExtraBitfields())
if (!hasArmTypeAttributes())
return SME_NormalFunction;
return getTrailingObjects<FunctionTypeExtraBitfields>()
return getTrailingObjects<FunctionTypeArmAttributes>()
->AArch64SMEAttributes;
}

Expand Down
7 changes: 4 additions & 3 deletions clang/lib/AST/ASTContext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4484,10 +4484,11 @@ QualType ASTContext::getFunctionTypeInternal(
EPI.ExceptionSpec.Type, EPI.ExceptionSpec.Exceptions.size());
size_t Size = FunctionProtoType::totalSizeToAlloc<
QualType, SourceLocation, FunctionType::FunctionTypeExtraBitfields,
FunctionType::ExceptionType, Expr *, FunctionDecl *,
FunctionProtoType::ExtParameterInfo, Qualifiers>(
FunctionType::FunctionTypeArmAttributes, FunctionType::ExceptionType,
Expr *, FunctionDecl *, FunctionProtoType::ExtParameterInfo, Qualifiers>(
NumArgs, EPI.Variadic, EPI.requiresFunctionProtoTypeExtraBitfields(),
ESH.NumExceptionType, ESH.NumExprPtr, ESH.NumFunctionDeclPtr,
EPI.requiresFunctionProtoTypeArmAttributes(), ESH.NumExceptionType,
ESH.NumExprPtr, ESH.NumFunctionDeclPtr,
EPI.ExtParameterInfos ? NumArgs : 0,
EPI.TypeQuals.hasNonFastQualifiers() ? 1 : 0);

Expand Down
12 changes: 10 additions & 2 deletions clang/lib/AST/Type.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3459,6 +3459,14 @@ FunctionProtoType::FunctionProtoType(QualType result, ArrayRef<QualType> params,
FunctionTypeBits.HasExtraBitfields = false;
}

if (epi.requiresFunctionProtoTypeArmAttributes()) {
auto &ArmTypeAttrs = *getTrailingObjects<FunctionTypeArmAttributes>();
ArmTypeAttrs = FunctionTypeArmAttributes();

// Also set the bit in FunctionTypeExtraBitfields
auto &ExtraBits = *getTrailingObjects<FunctionTypeExtraBitfields>();
ExtraBits.HasArmTypeAttributes = true;
}

// Fill in the trailing argument array.
auto *argSlot = getTrailingObjects<QualType>();
Expand All @@ -3470,10 +3478,10 @@ FunctionProtoType::FunctionProtoType(QualType result, ArrayRef<QualType> params,

// Propagate the SME ACLE attributes.
if (epi.AArch64SMEAttributes != SME_NormalFunction) {
auto &ExtraBits = *getTrailingObjects<FunctionTypeExtraBitfields>();
auto &ArmTypeAttrs = *getTrailingObjects<FunctionTypeArmAttributes>();
assert(epi.AArch64SMEAttributes <= SME_AttributeMask &&
"Not enough bits to encode SME attributes");
ExtraBits.AArch64SMEAttributes = epi.AArch64SMEAttributes;
ArmTypeAttrs.AArch64SMEAttributes = epi.AArch64SMEAttributes;
}

// Fill in the exception type array if present.
Expand Down