https://github.com/eiytoq updated https://github.com/llvm/llvm-project/pull/196240
>From 3a82d0c07b68659499358fe4aed11ea0657ae032 Mon Sep 17 00:00:00 2001 From: eiytoq <[email protected]> Date: Thu, 7 May 2026 12:52:19 +0800 Subject: [PATCH] [Clang][ItaniumMangle][NFC] Refactor FunctionTypeDepthState --- clang/lib/AST/ItaniumMangle.cpp | 72 +++++++++++++-------------------- 1 file changed, 29 insertions(+), 43 deletions(-) diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp index f58faa03bfa8c..d07b4b38a0950 100644 --- a/clang/lib/AST/ItaniumMangle.cpp +++ b/clang/lib/AST/ItaniumMangle.cpp @@ -243,42 +243,34 @@ class CXXNameMangler { unsigned SeqID = 0; class FunctionTypeDepthState { - unsigned Bits = 0; - - enum { InResultTypeMask = 1 }; + unsigned Depth : 31; + unsigned InFunctionDeclSuffix : 1; public: - FunctionTypeDepthState() = default; - - /// The number of function types we're inside. - unsigned getDepth() const { - return Bits >> 1; - } - - /// True if we're in the return type of the innermost function type. - bool isInResultType() const { - return Bits & InResultTypeMask; + FunctionTypeDepthState() : Depth(0), InFunctionDeclSuffix(0) {} + + unsigned getNestingDepth(unsigned ParmDepth) const { + // ParmDepth does not include the declaring function prototype. + // FunctionTypeDepth does account for that. + assert(ParmDepth < Depth && + "ParmVarDecl is not visible in current parameter environment"); + return Depth - ParmDepth - InFunctionDeclSuffix; } FunctionTypeDepthState push() { - FunctionTypeDepthState tmp = *this; - Bits = (Bits & ~InResultTypeMask) + 2; - return tmp; - } - - void enterResultType() { - Bits |= InResultTypeMask; - } - - void leaveResultType() { - Bits &= ~InResultTypeMask; + FunctionTypeDepthState Saved = *this; + ++Depth; + InFunctionDeclSuffix = 0; + return Saved; } - void pop(FunctionTypeDepthState saved) { - assert(getDepth() == saved.getDepth() + 1); - Bits = saved.Bits; + void pop(FunctionTypeDepthState Saved) { + assert(Depth == Saved.Depth + 1 && "unbalanced function type depth pop"); + *this = Saved; } + void enterFunctionDeclSuffix() { InFunctionDeclSuffix = 1; } + void leaveFunctionDeclSuffix() { InFunctionDeclSuffix = 0; } } FunctionTypeDepth; // abi_tag is a gcc attribute, taking one or more strings called "tags". @@ -3752,9 +3744,9 @@ void CXXNameMangler::mangleType(const FunctionNoProtoType *T) { FunctionTypeDepthState saved = FunctionTypeDepth.push(); - FunctionTypeDepth.enterResultType(); + FunctionTypeDepth.enterFunctionDeclSuffix(); mangleType(T->getReturnType()); - FunctionTypeDepth.leaveResultType(); + FunctionTypeDepth.leaveFunctionDeclSuffix(); FunctionTypeDepth.pop(saved); Out << 'E'; @@ -3769,7 +3761,7 @@ void CXXNameMangler::mangleBareFunctionType(const FunctionProtoType *Proto, // <bare-function-type> ::= <signature type>+ if (MangleReturnType) { - FunctionTypeDepth.enterResultType(); + FunctionTypeDepth.enterFunctionDeclSuffix(); // Mangle ns_returns_retained as an order-sensitive qualifier here. if (Proto->getExtInfo().getProducesResult() && FD == nullptr) @@ -3784,7 +3776,7 @@ void CXXNameMangler::mangleBareFunctionType(const FunctionProtoType *Proto, } mangleType(ReturnTy); - FunctionTypeDepth.leaveResultType(); + FunctionTypeDepth.leaveFunctionDeclSuffix(); } if (Proto->getNumParams() == 0 && !Proto->isVariadic()) { @@ -3821,7 +3813,7 @@ void CXXNameMangler::mangleBareFunctionType(const FunctionProtoType *Proto, } if (FD) { - FunctionTypeDepth.enterResultType(); + FunctionTypeDepth.enterFunctionDeclSuffix(); mangleRequiresClause(FD->getTrailingRequiresClause().ConstraintExpr); } @@ -5716,7 +5708,7 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity, Out << '_'; // The rest of the mangling is in the immediate scope of the parameters. - FunctionTypeDepth.enterResultType(); + FunctionTypeDepth.enterFunctionDeclSuffix(); for (const concepts::Requirement *Req : RE->getRequirements()) mangleRequirement(RE->getExprLoc(), Req); FunctionTypeDepth.pop(saved); @@ -6013,14 +6005,8 @@ void CXXNameMangler::mangleFunctionParam(const ParmVarDecl *parm) { unsigned parmIndex = parm->getFunctionScopeIndex(); // Compute 'L'. - // parmDepth does not include the declaring function prototype. - // FunctionTypeDepth does account for that. - assert(parmDepth < FunctionTypeDepth.getDepth()); - unsigned nestingDepth = FunctionTypeDepth.getDepth() - parmDepth; - if (FunctionTypeDepth.isInResultType()) - nestingDepth--; - - if (nestingDepth == 0) { + if (unsigned nestingDepth = FunctionTypeDepth.getNestingDepth(parmDepth); + nestingDepth == 0) { Out << "fp"; } else { Out << "fL" << (nestingDepth - 1) << 'p'; @@ -7254,9 +7240,9 @@ CXXNameMangler::makeFunctionReturnTypeTags(const FunctionDecl *FD) { const FunctionProtoType *Proto = cast<FunctionProtoType>(FD->getType()->getAs<FunctionType>()); FunctionTypeDepthState saved = TrackReturnTypeTags.FunctionTypeDepth.push(); - TrackReturnTypeTags.FunctionTypeDepth.enterResultType(); + TrackReturnTypeTags.FunctionTypeDepth.enterFunctionDeclSuffix(); TrackReturnTypeTags.mangleType(Proto->getReturnType()); - TrackReturnTypeTags.FunctionTypeDepth.leaveResultType(); + TrackReturnTypeTags.FunctionTypeDepth.leaveFunctionDeclSuffix(); TrackReturnTypeTags.FunctionTypeDepth.pop(saved); return TrackReturnTypeTags.AbiTagsRoot.getSortedUniqueUsedAbiTags(); _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
