From 7346173c585b16d86d292989b5014ffb85a2f644 Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Wed, 7 May 2025 21:47:32 +0200 Subject: [PATCH 01/20] 64-bit source location fix Reduce the Stmt size back to 8 bytes. Reduce the CallExpr size Fix the ObjCContainerDecl bit field Change the SourceLocation::UIntTy to uint64_t Update other SourceManager's getDecomposedSpellingLoc APIs, and fix many failing tests. Remaining failures: Clang :: Index/IBOutletCollection.m Clang :: Index/annotate-macro-args.m Clang :: Index/annotate-module.m Clang :: Index/annotate-tokens-pp.c Clang :: Index/annotate-tokens.c Clang :: Index/annotate-toplevel-in-objccontainer.m Clang :: Index/hidden-redecls.m Clang :: Index/index-module-with-vfs.m Clang :: Index/index-module.m Clang :: Index/index-pch-objc.m Clang :: Index/index-pch-with-module.m Clang :: Index/index-pch.cpp Clang :: Index/targeted-annotation.c Clang :: Lexer/SourceLocationsOverflow.c Clang-Unit :: ./AllClangUnitTests/PPMemoryAllocationsTest/PPMacroDefinesAllocations Clang-Unit :: ./AllClangUnitTests/SourceLocationEncoding/Individual Clang-Unit :: ./AllClangUnitTests/SourceLocationEncoding/Sequence Clang-Unit :: libclang/./libclangTests/14/53 Clang-Unit :: libclang/./libclangTests/45/53 Clang-Unit :: libclang/./libclangTests/47/53 Clang-Unit :: libclang/./libclangTests/48/53 Clang-Unit :: libclang/./libclangTests/49/53 Clang-Unit :: libclang/./libclangTests/50/53 Clang-Unit :: libclang/./libclangTests/52/53 Fix libclang failures Fix Rewrite APIs Fix PPMemoryAllocationsTest Fix SourceLocationEncodingTest More unsigned -> SourceLocation::UIntTy changes in the SourceManager APIs Update the type of std::pair in CIndex.cpp Fix SourceLocationEncodingTest Tweak the SourceLocation Implementation. The source location has a Bit which specify the number of bits used for the offset. 40 by default; Make MathExtra templates constexpr Test Bits=64 perf Try 48 bits No bitfields Fix CallExpr optimization. --- clang/include/clang/AST/DeclBase.h | 10 +- clang/include/clang/AST/DeclObjC.h | 5 +- clang/include/clang/AST/Expr.h | 72 ++++--- clang/include/clang/AST/ExprCXX.h | 74 ++++--- clang/include/clang/AST/ExprConcepts.h | 6 +- clang/include/clang/AST/ExternalASTSource.h | 2 +- clang/include/clang/AST/Stmt.h | 189 +++++++++--------- clang/include/clang/Basic/Diagnostic.h | 8 +- clang/include/clang/Basic/SourceLocation.h | 31 ++- clang/include/clang/Basic/SourceManager.h | 11 +- clang/include/clang/Rewrite/Core/Rewriter.h | 3 +- .../clang/Sema/MultiplexExternalSemaSource.h | 2 +- .../include/clang/Serialization/ASTBitCodes.h | 2 +- clang/include/clang/Serialization/ASTReader.h | 2 +- .../Serialization/SourceLocationEncoding.h | 12 +- clang/lib/AST/Expr.cpp | 33 +-- clang/lib/AST/ExprCXX.cpp | 6 +- clang/lib/AST/ExprConcepts.cpp | 2 +- clang/lib/AST/ExternalASTSource.cpp | 2 +- clang/lib/AST/Stmt.cpp | 2 +- clang/lib/Basic/Diagnostic.cpp | 2 +- clang/lib/Basic/SourceLocation.cpp | 23 +++ clang/lib/Basic/SourceManager.cpp | 8 +- clang/lib/Format/FormatTokenLexer.cpp | 3 +- clang/lib/Parse/ParseStmtAsm.cpp | 3 +- clang/lib/Rewrite/Rewriter.cpp | 2 +- .../lib/Sema/MultiplexExternalSemaSource.cpp | 2 +- clang/lib/Serialization/ASTReader.cpp | 2 +- clang/lib/Serialization/ASTReaderStmt.cpp | 26 +-- clang/lib/Serialization/ASTWriter.cpp | 2 +- clang/lib/Serialization/ASTWriterDecl.cpp | 2 +- clang/lib/Serialization/ASTWriterStmt.cpp | 2 +- clang/test/Lexer/SourceLocationsOverflow.c | 38 ---- clang/tools/libclang/CIndex.cpp | 92 +++++++-- clang/tools/libclang/CXIndexDataConsumer.cpp | 10 +- clang/tools/libclang/CXSourceLocation.cpp | 69 ++++--- clang/tools/libclang/CXSourceLocation.h | 25 ++- clang/tools/libclang/Indexing.cpp | 27 ++- .../unittests/Lex/PPMemoryAllocationsTest.cpp | 2 +- .../SourceLocationEncodingTest.cpp | 11 +- 40 files changed, 474 insertions(+), 351 deletions(-) delete mode 100644 clang/test/Lexer/SourceLocationsOverflow.c diff --git a/clang/include/clang/AST/DeclBase.h b/clang/include/clang/AST/DeclBase.h index dd67ebc9873ff..b136329fce15a 100644 --- a/clang/include/clang/AST/DeclBase.h +++ b/clang/include/clang/AST/DeclBase.h @@ -1953,16 +1953,10 @@ class DeclContext { /// For the bits in DeclContextBitfields LLVM_PREFERRED_TYPE(DeclContextBitfields) uint32_t : NumDeclContextBits; - - // Not a bitfield but this saves space. - // Note that ObjCContainerDeclBitfields is full. - SourceLocation AtStart; }; /// Number of inherited and non-inherited bits in ObjCContainerDeclBitfields. - /// Note that here we rely on the fact that SourceLocation is 32 bits - /// wide. We check this with the static_assert in the ctor of DeclContext. - enum { NumObjCContainerDeclBits = 64 }; + enum { NumObjCContainerDeclBits = NumDeclContextBits }; /// Stores the bits used by LinkageSpecDecl. /// If modified NumLinkageSpecDeclBits and the accessor @@ -2070,7 +2064,7 @@ class DeclContext { "CXXConstructorDeclBitfields is larger than 8 bytes!"); static_assert(sizeof(ObjCMethodDeclBitfields) <= 8, "ObjCMethodDeclBitfields is larger than 8 bytes!"); - static_assert(sizeof(ObjCContainerDeclBitfields) <= 8, + static_assert(sizeof(ObjCContainerDeclBitfields) <= 16, "ObjCContainerDeclBitfields is larger than 8 bytes!"); static_assert(sizeof(LinkageSpecDeclBitfields) <= 8, "LinkageSpecDeclBitfields is larger than 8 bytes!"); diff --git a/clang/include/clang/AST/DeclObjC.h b/clang/include/clang/AST/DeclObjC.h index 9014d76f8433b..56fc4ba4177da 100644 --- a/clang/include/clang/AST/DeclObjC.h +++ b/clang/include/clang/AST/DeclObjC.h @@ -946,6 +946,7 @@ class ObjCContainerDecl : public NamedDecl, public DeclContext { // This class stores some data in DeclContext::ObjCContainerDeclBits // to save some space. Use the provided accessors to access it. + SourceLocation AtStart; // These two locations in the range mark the end of the method container. // The first points to the '@' token, and the second to the 'end' token. SourceRange AtEnd; @@ -1090,10 +1091,10 @@ class ObjCContainerDecl : public NamedDecl, public DeclContext { /// Note, the superclass's properties are not included in the list. virtual void collectPropertiesToImplement(PropertyMap &PM) const {} - SourceLocation getAtStartLoc() const { return ObjCContainerDeclBits.AtStart; } + SourceLocation getAtStartLoc() const { return AtStart; } void setAtStartLoc(SourceLocation Loc) { - ObjCContainerDeclBits.AtStart = Loc; + AtStart = Loc; } // Marks the end of the container. diff --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h index d95396fd59b95..0955b54163de3 100644 --- a/clang/include/clang/AST/Expr.h +++ b/clang/include/clang/AST/Expr.h @@ -1175,6 +1175,8 @@ class ConstantExpr final /// context. class OpaqueValueExpr : public Expr { friend class ASTStmtReader; + + SourceLocation Loc; Expr *SourceExpr; public: @@ -1182,7 +1184,7 @@ class OpaqueValueExpr : public Expr { ExprObjectKind OK = OK_Ordinary, Expr *SourceExpr = nullptr) : Expr(OpaqueValueExprClass, T, VK, OK), SourceExpr(SourceExpr) { setIsUnique(false); - OpaqueValueExprBits.Loc = Loc; + this->Loc = Loc; setDependence(computeDependence(this)); } @@ -1195,7 +1197,7 @@ class OpaqueValueExpr : public Expr { : Expr(OpaqueValueExprClass, Empty) {} /// Retrieve the location of this expression. - SourceLocation getLocation() const { return OpaqueValueExprBits.Loc; } + SourceLocation getLocation() const { return Loc; } SourceLocation getBeginLoc() const LLVM_READONLY { return SourceExpr ? SourceExpr->getBeginLoc() : getLocation(); @@ -1269,6 +1271,9 @@ class DeclRefExpr final friend class ASTStmtReader; friend class ASTStmtWriter; friend TrailingObjects; + + /// The location of the declaration name itself. + SourceLocation Loc; /// The declaration that we are referencing. ValueDecl *D; @@ -1341,13 +1346,13 @@ class DeclRefExpr final return DeclarationNameInfo(getDecl()->getDeclName(), getLocation(), DNLoc); } - SourceLocation getLocation() const { return DeclRefExprBits.Loc; } - void setLocation(SourceLocation L) { DeclRefExprBits.Loc = L; } + SourceLocation getLocation() const { return Loc; } + void setLocation(SourceLocation L) { Loc = L; } SourceLocation getBeginLoc() const { if (hasQualifier()) return getQualifierLoc().getBeginLoc(); - return DeclRefExprBits.Loc; + return Loc; } SourceLocation getEndLoc() const LLVM_READONLY; @@ -2003,7 +2008,8 @@ class PredefinedExpr final private llvm::TrailingObjects { friend class ASTStmtReader; friend TrailingObjects; - + /// The location of this PredefinedExpr. + SourceLocation Loc; // PredefinedExpr is optionally followed by a single trailing // "Stmt *" for the predefined identifier. It is present if and only if // hasFunctionName() is true and is always a "StringLiteral *". @@ -2041,8 +2047,8 @@ class PredefinedExpr final bool isTransparent() const { return PredefinedExprBits.IsTransparent; } - SourceLocation getLocation() const { return PredefinedExprBits.Loc; } - void setLocation(SourceLocation L) { PredefinedExprBits.Loc = L; } + SourceLocation getLocation() const { return Loc; } + void setLocation(SourceLocation L) { Loc = L; } StringLiteral *getFunctionName() { return hasFunctionName() @@ -2240,6 +2246,7 @@ class ParenExpr : public Expr { class UnaryOperator final : public Expr, private llvm::TrailingObjects { + SourceLocation Loc; Stmt *Val; FPOptionsOverride &getTrailingFPFeatures() { @@ -2284,8 +2291,8 @@ class UnaryOperator final void setSubExpr(Expr *E) { Val = E; } /// getOperatorLoc - Return the location of the operator. - SourceLocation getOperatorLoc() const { return UnaryOperatorBits.Loc; } - void setOperatorLoc(SourceLocation L) { UnaryOperatorBits.Loc = L; } + SourceLocation getOperatorLoc() const { return Loc; } + void setOperatorLoc(SourceLocation L) { Loc = L; } /// Returns true if the unary operator can cause an overflow. For instance, /// signed int i = INT_MAX; i++; @@ -2718,6 +2725,7 @@ class UnaryExprOrTypeTraitExpr : public Expr { /// ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting. class ArraySubscriptExpr : public Expr { enum { LHS, RHS, END_EXPR }; + SourceLocation RBracketLoc; Stmt *SubExprs[END_EXPR]; bool lhsIsBase() const { return getRHS()->getType()->isIntegerType(); } @@ -2728,7 +2736,7 @@ class ArraySubscriptExpr : public Expr { : Expr(ArraySubscriptExprClass, t, VK, OK) { SubExprs[LHS] = lhs; SubExprs[RHS] = rhs; - ArrayOrMatrixSubscriptExprBits.RBracketLoc = rbracketloc; + this->RBracketLoc = rbracketloc; setDependence(computeDependence(this)); } @@ -2765,10 +2773,10 @@ class ArraySubscriptExpr : public Expr { SourceLocation getEndLoc() const { return getRBracketLoc(); } SourceLocation getRBracketLoc() const { - return ArrayOrMatrixSubscriptExprBits.RBracketLoc; + return RBracketLoc; } void setRBracketLoc(SourceLocation L) { - ArrayOrMatrixSubscriptExprBits.RBracketLoc = L; + RBracketLoc = L; } SourceLocation getExprLoc() const LLVM_READONLY { @@ -2796,6 +2804,7 @@ class ArraySubscriptExpr : public Expr { /// exist during the initial construction of the AST. class MatrixSubscriptExpr : public Expr { enum { BASE, ROW_IDX, COLUMN_IDX, END_EXPR }; + SourceLocation RBracketLoc; Stmt *SubExprs[END_EXPR]; public: @@ -2806,7 +2815,7 @@ class MatrixSubscriptExpr : public Expr { SubExprs[BASE] = Base; SubExprs[ROW_IDX] = RowIdx; SubExprs[COLUMN_IDX] = ColumnIdx; - ArrayOrMatrixSubscriptExprBits.RBracketLoc = RBracketLoc; + this->RBracketLoc = RBracketLoc; setDependence(computeDependence(this)); } @@ -2847,10 +2856,10 @@ class MatrixSubscriptExpr : public Expr { } SourceLocation getRBracketLoc() const { - return ArrayOrMatrixSubscriptExprBits.RBracketLoc; + return RBracketLoc; } void setRBracketLoc(SourceLocation L) { - ArrayOrMatrixSubscriptExprBits.RBracketLoc = L; + RBracketLoc = L; } static bool classof(const Stmt *T) { @@ -2875,9 +2884,6 @@ class MatrixSubscriptExpr : public Expr { class CallExpr : public Expr { enum { FN = 0, PREARGS_START = 1 }; - /// The number of arguments in the call expression. - unsigned NumArgs; - /// The location of the right parentheses. This has a different meaning for /// the derived classes of CallExpr. SourceLocation RParenLoc; @@ -2897,19 +2903,19 @@ class CallExpr : public Expr { // // * An optional of type FPOptionsOverride. // - // CallExpr subclasses are asssumed to be 32 bytes or less, and CallExpr + // CallExpr subclasses are asssumed to be 40 bytes or less, and CallExpr // itself is 24 bytes. To avoid having to recompute or store the offset of the - // trailing objects, we put it at 32 bytes (such that it is suitable for all + // trailing objects, we put it at 40 bytes (such that it is suitable for all // subclasses) We use the 8 bytes gap left for instances of CallExpr to store // the begin source location, which has a significant impact on perf as // getBeginLoc is assumed to be cheap. // The layourt is as follow: - // CallExpr | Begin | 4 bytes left | Trailing Objects + // CallExpr | Begin | 8 bytes left | Trailing Objects // CXXMemberCallExpr | Trailing Objects // A bit in CallExprBitfields indicates if source locations are present. protected: - static constexpr unsigned OffsetToTrailingObjects = 32; + static constexpr unsigned OffsetToTrailingObjects = 40; template static constexpr unsigned sizeToAllocateForCallExprSubclass(unsigned SizeOfTrailingObjects) { @@ -3063,7 +3069,7 @@ class CallExpr : public Expr { } /// getNumArgs - Return the number of actual arguments to this call. - unsigned getNumArgs() const { return NumArgs; } + unsigned getNumArgs() const { return CallExprBits.NumArgs; } /// Retrieve the call arguments. Expr **getArgs() { @@ -3111,13 +3117,13 @@ class CallExpr : public Expr { void shrinkNumArgs(unsigned NewNumArgs) { assert((NewNumArgs <= getNumArgs()) && "shrinkNumArgs cannot increase the number of arguments!"); - NumArgs = NewNumArgs; + CallExprBits.NumArgs = NewNumArgs; } /// Bluntly set a new number of arguments without doing any checks whatsoever. /// Only used during construction of a CallExpr in a few places in Sema. /// FIXME: Find a way to remove it. - void setNumArgsUnsafe(unsigned NewNumArgs) { NumArgs = NewNumArgs; } + void setNumArgsUnsafe(unsigned NewNumArgs) { CallExprBits.NumArgs = NewNumArgs; } typedef ExprIterator arg_iterator; typedef ConstExprIterator const_arg_iterator; @@ -3302,6 +3308,8 @@ class MemberExpr final /// MemberLoc - This is the location of the member name. SourceLocation MemberLoc; + + SourceLocation OperatorLoc; size_t numTrailingObjects(OverloadToken) const { return hasQualifier(); @@ -3464,7 +3472,7 @@ class MemberExpr final MemberLoc, MemberDNLoc); } - SourceLocation getOperatorLoc() const { return MemberExprBits.OperatorLoc; } + SourceLocation getOperatorLoc() const { return OperatorLoc; } bool isArrow() const { return MemberExprBits.IsArrow; } void setArrow(bool A) { MemberExprBits.IsArrow = A; } @@ -3958,6 +3966,7 @@ class CStyleCastExpr final class BinaryOperator : public Expr { enum { LHS, RHS, END_EXPR }; Stmt *SubExprs[END_EXPR]; + SourceLocation OpLoc; public: typedef BinaryOperatorKind Opcode; @@ -3997,8 +4006,8 @@ class BinaryOperator : public Expr { ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures); SourceLocation getExprLoc() const { return getOperatorLoc(); } - SourceLocation getOperatorLoc() const { return BinaryOperatorBits.OpLoc; } - void setOperatorLoc(SourceLocation L) { BinaryOperatorBits.OpLoc = L; } + SourceLocation getOperatorLoc() const { return OpLoc; } + void setOperatorLoc(SourceLocation L) { OpLoc = L; } Opcode getOpcode() const { return static_cast(BinaryOperatorBits.Opc); @@ -6099,7 +6108,8 @@ class GenericSelectionExpr final friend class ASTStmtReader; friend class ASTStmtWriter; friend TrailingObjects; - + /// The location of the "_Generic". + SourceLocation GenericLoc; /// The number of association expressions and the index of the result /// expression in the case where the generic selection expression is not /// result-dependent. The result index is equal to ResultDependentIndex @@ -6449,7 +6459,7 @@ class GenericSelectionExpr final } SourceLocation getGenericLoc() const { - return GenericSelectionExprBits.GenericLoc; + return GenericLoc; } SourceLocation getDefaultLoc() const { return DefaultLoc; } SourceLocation getRParenLoc() const { return RParenLoc; } diff --git a/clang/include/clang/AST/ExprCXX.h b/clang/include/clang/AST/ExprCXX.h index 477373f07f25d..2e2f4dd175d0c 100644 --- a/clang/include/clang/AST/ExprCXX.h +++ b/clang/include/clang/AST/ExprCXX.h @@ -720,11 +720,13 @@ class UserDefinedLiteral final : public CallExpr { /// A boolean literal, per ([C++ lex.bool] Boolean literals). class CXXBoolLiteralExpr : public Expr { + SourceLocation Loc; + public: CXXBoolLiteralExpr(bool Val, QualType Ty, SourceLocation Loc) : Expr(CXXBoolLiteralExprClass, Ty, VK_PRValue, OK_Ordinary) { CXXBoolLiteralExprBits.Value = Val; - CXXBoolLiteralExprBits.Loc = Loc; + this->Loc = Loc; setDependence(ExprDependence::None); } @@ -742,8 +744,8 @@ class CXXBoolLiteralExpr : public Expr { SourceLocation getBeginLoc() const { return getLocation(); } SourceLocation getEndLoc() const { return getLocation(); } - SourceLocation getLocation() const { return CXXBoolLiteralExprBits.Loc; } - void setLocation(SourceLocation L) { CXXBoolLiteralExprBits.Loc = L; } + SourceLocation getLocation() const { return Loc; } + void setLocation(SourceLocation L) { Loc = L; } static bool classof(const Stmt *T) { return T->getStmtClass() == CXXBoolLiteralExprClass; @@ -765,10 +767,11 @@ class CXXBoolLiteralExpr : public Expr { /// This also implements the null pointer literal in C23 (C23 6.4.1) which is /// intended to have the same semantics as the feature in C++. class CXXNullPtrLiteralExpr : public Expr { + SourceLocation Loc; public: CXXNullPtrLiteralExpr(QualType Ty, SourceLocation Loc) : Expr(CXXNullPtrLiteralExprClass, Ty, VK_PRValue, OK_Ordinary) { - CXXNullPtrLiteralExprBits.Loc = Loc; + this->Loc = Loc; setDependence(ExprDependence::None); } @@ -778,8 +781,8 @@ class CXXNullPtrLiteralExpr : public Expr { SourceLocation getBeginLoc() const { return getLocation(); } SourceLocation getEndLoc() const { return getLocation(); } - SourceLocation getLocation() const { return CXXNullPtrLiteralExprBits.Loc; } - void setLocation(SourceLocation L) { CXXNullPtrLiteralExprBits.Loc = L; } + SourceLocation getLocation() const { return Loc; } + void setLocation(SourceLocation L) { Loc = L; } static bool classof(const Stmt *T) { return T->getStmtClass() == CXXNullPtrLiteralExprClass; @@ -1152,11 +1155,14 @@ class CXXUuidofExpr : public Expr { /// }; /// \endcode class CXXThisExpr : public Expr { + /// The location of the "this". + SourceLocation Loc; + CXXThisExpr(SourceLocation L, QualType Ty, bool IsImplicit, ExprValueKind VK) : Expr(CXXThisExprClass, Ty, VK, OK_Ordinary) { CXXThisExprBits.IsImplicit = IsImplicit; CXXThisExprBits.CapturedByCopyInLambdaWithExplicitObjectParameter = false; - CXXThisExprBits.Loc = L; + Loc = L; setDependence(computeDependence(this)); } @@ -1168,8 +1174,8 @@ class CXXThisExpr : public Expr { static CXXThisExpr *CreateEmpty(const ASTContext &Ctx); - SourceLocation getLocation() const { return CXXThisExprBits.Loc; } - void setLocation(SourceLocation L) { CXXThisExprBits.Loc = L; } + SourceLocation getLocation() const { return Loc; } + void setLocation(SourceLocation L) { Loc = L; } SourceLocation getBeginLoc() const { return getLocation(); } SourceLocation getEndLoc() const { return getLocation(); } @@ -1210,6 +1216,8 @@ class CXXThrowExpr : public Expr { /// The optional expression in the throw statement. Stmt *Operand; + /// The location of the "throw". + SourceLocation ThrowLoc; public: // \p Ty is the void type which is used as the result type of the @@ -1219,7 +1227,7 @@ class CXXThrowExpr : public Expr { CXXThrowExpr(Expr *Operand, QualType Ty, SourceLocation Loc, bool IsThrownVariableInScope) : Expr(CXXThrowExprClass, Ty, VK_PRValue, OK_Ordinary), Operand(Operand) { - CXXThrowExprBits.ThrowLoc = Loc; + ThrowLoc = Loc; CXXThrowExprBits.IsThrownVariableInScope = IsThrownVariableInScope; setDependence(computeDependence(this)); } @@ -1228,7 +1236,7 @@ class CXXThrowExpr : public Expr { const Expr *getSubExpr() const { return cast_or_null(Operand); } Expr *getSubExpr() { return cast_or_null(Operand); } - SourceLocation getThrowLoc() const { return CXXThrowExprBits.ThrowLoc; } + SourceLocation getThrowLoc() const { return ThrowLoc; } /// Determines whether the variable thrown by this expression (if any!) /// is within the innermost try block. @@ -1277,7 +1285,9 @@ class CXXDefaultArgExpr final /// The context where the default argument expression was used. DeclContext *UsedContext; - + + /// The location where the default argument expression was used. + SourceLocation Loc; CXXDefaultArgExpr(StmtClass SC, SourceLocation Loc, ParmVarDecl *Param, Expr *RewrittenExpr, DeclContext *UsedContext) : Expr(SC, @@ -1287,7 +1297,7 @@ class CXXDefaultArgExpr final Param->getDefaultArg()->getValueKind(), Param->getDefaultArg()->getObjectKind()), Param(Param), UsedContext(UsedContext) { - CXXDefaultArgExprBits.Loc = Loc; + this->Loc = Loc; CXXDefaultArgExprBits.HasRewrittenInit = RewrittenExpr != nullptr; if (RewrittenExpr) *getTrailingObjects() = RewrittenExpr; @@ -1341,7 +1351,7 @@ class CXXDefaultArgExpr final DeclContext *getUsedContext() { return UsedContext; } /// Retrieve the location where this default argument was actually used. - SourceLocation getUsedLocation() const { return CXXDefaultArgExprBits.Loc; } + SourceLocation getUsedLocation() const { return Loc; } /// Default argument expressions have no representation in the /// source, so they have an empty source range. @@ -1384,7 +1394,8 @@ class CXXDefaultInitExpr final /// The context where the default initializer expression was used. DeclContext *UsedContext; - + /// The location where the default initializer expression was used. + SourceLocation Loc; CXXDefaultInitExpr(const ASTContext &Ctx, SourceLocation Loc, FieldDecl *Field, QualType Ty, DeclContext *UsedContext, Expr *RewrittenInitExpr); @@ -1438,8 +1449,8 @@ class CXXDefaultInitExpr final /// actually used. SourceLocation getUsedLocation() const { return getBeginLoc(); } - SourceLocation getBeginLoc() const { return CXXDefaultInitExprBits.Loc; } - SourceLocation getEndLoc() const { return CXXDefaultInitExprBits.Loc; } + SourceLocation getBeginLoc() const { return Loc; } + SourceLocation getEndLoc() const { return Loc; } static bool classof(const Stmt *T) { return T->getStmtClass() == CXXDefaultInitExprClass; @@ -1555,7 +1566,7 @@ class CXXConstructExpr : public Expr { /// The number of arguments. unsigned NumArgs; - + SourceLocation Loc; // We would like to stash the arguments of the constructor call after // CXXConstructExpr. However CXXConstructExpr is used as a base class of // CXXTemporaryObjectExpr which makes the use of llvm::TrailingObjects @@ -1610,8 +1621,8 @@ class CXXConstructExpr : public Expr { /// Get the constructor that this expression will (ultimately) call. CXXConstructorDecl *getConstructor() const { return Constructor; } - SourceLocation getLocation() const { return CXXConstructExprBits.Loc; } - void setLocation(SourceLocation Loc) { CXXConstructExprBits.Loc = Loc; } + SourceLocation getLocation() const { return Loc; } + void setLocation(SourceLocation Loc) { this->Loc = Loc; } /// Whether this construction is elidable. bool isElidable() const { return CXXConstructExprBits.Elidable; } @@ -2185,6 +2196,7 @@ class CXXScalarValueInitExpr : public Expr { friend class ASTStmtReader; TypeSourceInfo *TypeInfo; + SourceLocation RParenLoc; public: /// Create an explicitly-written scalar-value initialization @@ -2193,7 +2205,7 @@ class CXXScalarValueInitExpr : public Expr { SourceLocation RParenLoc) : Expr(CXXScalarValueInitExprClass, Type, VK_PRValue, OK_Ordinary), TypeInfo(TypeInfo) { - CXXScalarValueInitExprBits.RParenLoc = RParenLoc; + this->RParenLoc = RParenLoc; setDependence(computeDependence(this)); } @@ -2205,7 +2217,7 @@ class CXXScalarValueInitExpr : public Expr { } SourceLocation getRParenLoc() const { - return CXXScalarValueInitExprBits.RParenLoc; + return RParenLoc; } SourceLocation getBeginLoc() const LLVM_READONLY; @@ -2611,7 +2623,8 @@ class CXXDeleteExpr : public Expr { /// The pointer expression to be deleted. Stmt *Argument = nullptr; - + /// Location of the expression. + SourceLocation Loc; public: CXXDeleteExpr(QualType Ty, bool GlobalDelete, bool ArrayForm, bool ArrayFormAsWritten, bool UsualArrayDeleteWantsSize, @@ -2622,7 +2635,7 @@ class CXXDeleteExpr : public Expr { CXXDeleteExprBits.ArrayForm = ArrayForm; CXXDeleteExprBits.ArrayFormAsWritten = ArrayFormAsWritten; CXXDeleteExprBits.UsualArrayDeleteWantsSize = UsualArrayDeleteWantsSize; - CXXDeleteExprBits.Loc = Loc; + this->Loc = Loc; setDependence(computeDependence(this)); } @@ -2653,7 +2666,7 @@ class CXXDeleteExpr : public Expr { /// be a pointer, return an invalid type. QualType getDestroyedType() const; - SourceLocation getBeginLoc() const { return CXXDeleteExprBits.Loc; } + SourceLocation getBeginLoc() const { return Loc; } SourceLocation getEndLoc() const LLVM_READONLY { return Argument->getEndLoc(); } @@ -3829,6 +3842,9 @@ class CXXDependentScopeMemberExpr final /// FIXME: could also be a template-id DeclarationNameInfo MemberNameInfo; + /// The location of the '->' or '.' operator. + SourceLocation OperatorLoc; + // CXXDependentScopeMemberExpr is followed by several trailing objects, // some of which optional. They are in order: // @@ -3908,7 +3924,7 @@ class CXXDependentScopeMemberExpr final /// Retrieve the location of the '->' or '.' operator. SourceLocation getOperatorLoc() const { - return CXXDependentScopeMemberExprBits.OperatorLoc; + return OperatorLoc; } /// Retrieve the nested-name-specifier that qualifies the member name. @@ -4602,6 +4618,8 @@ class PackIndexingExpr final class SubstNonTypeTemplateParmExpr : public Expr { friend class ASTReader; friend class ASTStmtReader; + /// The location of the non-type template parameter reference. + SourceLocation NameLoc; /// The replacement expression. Stmt *Replacement; @@ -4630,12 +4648,12 @@ class SubstNonTypeTemplateParmExpr : public Expr { AssociatedDeclAndRef(AssociatedDecl, RefParam), Index(Index), PackIndex(PackIndex.toInternalRepresentation()), Final(Final) { assert(AssociatedDecl != nullptr); - SubstNonTypeTemplateParmExprBits.NameLoc = Loc; + NameLoc = Loc; setDependence(computeDependence(this)); } SourceLocation getNameLoc() const { - return SubstNonTypeTemplateParmExprBits.NameLoc; + return NameLoc; } SourceLocation getBeginLoc() const { return getNameLoc(); } SourceLocation getEndLoc() const { return getNameLoc(); } diff --git a/clang/include/clang/AST/ExprConcepts.h b/clang/include/clang/AST/ExprConcepts.h index 8df5cdcaa9d75..9d1fc29a2753e 100644 --- a/clang/include/clang/AST/ExprConcepts.h +++ b/clang/include/clang/AST/ExprConcepts.h @@ -502,6 +502,8 @@ class RequiresExpr final : public Expr, concepts::Requirement *> { friend TrailingObjects; friend class ASTStmtReader; + friend class ASTStmtWriter; + SourceLocation RequiresKWLoc; unsigned NumLocalParameters; unsigned NumRequirements; @@ -560,7 +562,7 @@ class RequiresExpr final : public Expr, } SourceLocation getRequiresKWLoc() const { - return RequiresExprBits.RequiresKWLoc; + return RequiresKWLoc; } SourceLocation getLParenLoc() const { return LParenLoc; } @@ -572,7 +574,7 @@ class RequiresExpr final : public Expr, } SourceLocation getBeginLoc() const LLVM_READONLY { - return RequiresExprBits.RequiresKWLoc; + return RequiresKWLoc; } SourceLocation getEndLoc() const LLVM_READONLY { return RBraceLoc; diff --git a/clang/include/clang/AST/ExternalASTSource.h b/clang/include/clang/AST/ExternalASTSource.h index e91d5132da10f..01dd56b576200 100644 --- a/clang/include/clang/AST/ExternalASTSource.h +++ b/clang/include/clang/AST/ExternalASTSource.h @@ -110,7 +110,7 @@ class ExternalASTSource : public RefCountedBase { /// returns non-zero for GetNumKnownSelectors(). /// /// The default implementation of this method is a no-op. - virtual Selector GetExternalSelector(uint32_t ID); + virtual Selector GetExternalSelector(uint64_t ID); /// Returns the number of selectors known to the external AST /// source. diff --git a/clang/include/clang/AST/Stmt.h b/clang/include/clang/AST/Stmt.h index a5b0d5053003f..83c1f646c6701 100644 --- a/clang/include/clang/AST/Stmt.h +++ b/clang/include/clang/AST/Stmt.h @@ -138,8 +138,7 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(bool) unsigned HasLeadingEmptyMacro : 1; - /// The location of the semi-colon. - SourceLocation SemiLoc; + }; class CompoundStmtBitfields { @@ -163,7 +162,7 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(StmtBitfields) unsigned : NumStmtBits; - SourceLocation IdentLoc; + }; class AttributedStmtBitfields { @@ -176,8 +175,7 @@ class alignas(void *) Stmt { /// Number of attributes. unsigned NumAttrs : 32 - NumStmtBits; - /// The location of the attribute. - SourceLocation AttrLoc; + }; class IfStmtBitfields { @@ -203,8 +201,7 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(bool) unsigned HasInit : 1; - /// The location of the "if". - SourceLocation IfLoc; + }; class SwitchStmtBitfields { @@ -227,8 +224,7 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(bool) unsigned AllEnumCasesCovered : 1; - /// The location of the "switch". - SourceLocation SwitchLoc; + }; class WhileStmtBitfields { @@ -242,8 +238,7 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(bool) unsigned HasVar : 1; - /// The location of the "while". - SourceLocation WhileLoc; + }; class DoStmtBitfields { @@ -252,8 +247,7 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(StmtBitfields) unsigned : NumStmtBits; - /// The location of the "do". - SourceLocation DoLoc; + }; class ForStmtBitfields { @@ -262,8 +256,7 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(StmtBitfields) unsigned : NumStmtBits; - /// The location of the "for". - SourceLocation ForLoc; + }; class GotoStmtBitfields { @@ -273,8 +266,7 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(StmtBitfields) unsigned : NumStmtBits; - /// The location of the "goto". - SourceLocation GotoLoc; + }; class ContinueStmtBitfields { @@ -283,8 +275,7 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(StmtBitfields) unsigned : NumStmtBits; - /// The location of the "continue". - SourceLocation ContinueLoc; + }; class BreakStmtBitfields { @@ -293,8 +284,7 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(StmtBitfields) unsigned : NumStmtBits; - /// The location of the "break". - SourceLocation BreakLoc; + }; class ReturnStmtBitfields { @@ -307,8 +297,7 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(bool) unsigned HasNRVOCandidate : 1; - /// The location of the "return". - SourceLocation RetLoc; + }; class SwitchCaseBitfields { @@ -323,8 +312,7 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(bool) unsigned CaseStmtIsGNURange : 1; - /// The location of the "case" or "default" keyword. - SourceLocation KeywordLoc; + }; //===--- Expression bitfields classes ---===// @@ -422,8 +410,7 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(bool) unsigned IsTransparent : 1; - /// The location of this PredefinedExpr. - SourceLocation Loc; + }; class DeclRefExprBitfields { @@ -450,8 +437,7 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(bool) unsigned IsImmediateEscalating : 1; - /// The location of the declaration name itself. - SourceLocation Loc; + }; @@ -522,7 +508,7 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(bool) unsigned HasFPFeatures : 1; - SourceLocation Loc; + }; class UnaryExprOrTypeTraitExprBitfields { @@ -544,7 +530,7 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(ExprBitfields) unsigned : NumExprBits; - SourceLocation RBracketLoc; + }; class CallExprBitfields { @@ -576,9 +562,10 @@ class alignas(void *) Stmt { /// Trailing objects. See the definition of CallExpr. LLVM_PREFERRED_TYPE(bool) unsigned HasTrailingSourceLoc : 1; + + unsigned NumArgs:20; }; - - enum { NumCallExprBits = 25 }; + enum { NumCallExprBits = 52 }; class MemberExprBitfields { friend class ASTStmtReader; @@ -620,9 +607,10 @@ class alignas(void *) Stmt { unsigned NonOdrUseReason : 2; /// This is the location of the -> or . in the expression. - SourceLocation OperatorLoc; + // SourceLocation OperatorLoc; }; - + + // 8 bytes class CastExprBitfields { friend class CastExpr; friend class ImplicitCastExpr; @@ -663,8 +651,6 @@ class alignas(void *) Stmt { /// overflow sanitization. LLVM_PREFERRED_TYPE(bool) unsigned ExcludedOverflowPattern : 1; - - SourceLocation OpLoc; }; class InitListExprBitfields { @@ -697,8 +683,7 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(ExprBitfields) unsigned : NumExprBits; - /// The location of the "_Generic". - SourceLocation GenericLoc; + }; class PseudoObjectExprBitfields { @@ -805,9 +790,6 @@ class alignas(void *) Stmt { /// The value of the boolean literal. LLVM_PREFERRED_TYPE(bool) unsigned Value : 1; - - /// The location of the boolean literal. - SourceLocation Loc; }; class CXXNullPtrLiteralExprBitfields { @@ -817,7 +799,6 @@ class alignas(void *) Stmt { unsigned : NumExprBits; /// The location of the null pointer literal. - SourceLocation Loc; }; class CXXThisExprBitfields { @@ -835,8 +816,6 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(bool) unsigned CapturedByCopyInLambdaWithExplicitObjectParameter : 1; - /// The location of the "this". - SourceLocation Loc; }; class CXXThrowExprBitfields { @@ -850,8 +829,6 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(bool) unsigned IsThrownVariableInScope : 1; - /// The location of the "throw". - SourceLocation ThrowLoc; }; class CXXDefaultArgExprBitfields { @@ -865,8 +842,7 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(bool) unsigned HasRewrittenInit : 1; - /// The location where the default argument expression was used. - SourceLocation Loc; + }; class CXXDefaultInitExprBitfields { @@ -881,8 +857,7 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(bool) unsigned HasRewrittenInit : 1; - /// The location where the default initializer expression was used. - SourceLocation Loc; + }; class CXXScalarValueInitExprBitfields { @@ -892,7 +867,6 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(ExprBitfields) unsigned : NumExprBits; - SourceLocation RParenLoc; }; class CXXNewExprBitfields { @@ -967,8 +941,7 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(bool) unsigned UsualArrayDeleteWantsSize : 1; - /// Location of the expression. - SourceLocation Loc; + }; class TypeTraitExprBitfields { @@ -1032,7 +1005,7 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(bool) unsigned IsImmediateEscalating : 1; - SourceLocation Loc; + }; class ExprWithCleanupsBitfields { @@ -1082,8 +1055,7 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(bool) unsigned HasFirstQualifierFoundInScope : 1; - /// The location of the '->' or '.' operator. - SourceLocation OperatorLoc; + }; class OverloadExprBitfields { @@ -1162,8 +1134,7 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(ExprBitfields) unsigned : NumExprBits; - /// The location of the non-type template parameter reference. - SourceLocation NameLoc; + }; class LambdaExprBitfields { @@ -1202,7 +1173,6 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(bool) unsigned IsSatisfied : 1; - SourceLocation RequiresKWLoc; }; class ArrayTypeTraitExprBitfields { @@ -1294,7 +1264,6 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(bool) unsigned IsUnique : 1; - SourceLocation Loc; }; class ConvertVectorExprBitfields { @@ -1692,6 +1661,8 @@ class DeclStmt : public Stmt { /// NullStmt - This is the null statement ";": C99 6.8.3p3. /// class NullStmt : public Stmt { + /// The location of the semi-colon. + SourceLocation SemiLoc; public: NullStmt(SourceLocation L, bool hasLeadingEmptyMacro = false) : Stmt(NullStmtClass) { @@ -1702,8 +1673,8 @@ class NullStmt : public Stmt { /// Build an empty null statement. explicit NullStmt(EmptyShell Empty) : Stmt(NullStmtClass, Empty) {} - SourceLocation getSemiLoc() const { return NullStmtBits.SemiLoc; } - void setSemiLoc(SourceLocation L) { NullStmtBits.SemiLoc = L; } + SourceLocation getSemiLoc() const { return SemiLoc; } + void setSemiLoc(SourceLocation L) { SemiLoc = L; } bool hasLeadingEmptyMacro() const { return NullStmtBits.HasLeadingEmptyMacro; @@ -1883,6 +1854,8 @@ class CompoundStmt final // SwitchCase is the base class for CaseStmt and DefaultStmt, class SwitchCase : public Stmt { protected: + /// The location of the "case" or "default" keyword. + SourceLocation KeywordLoc; /// The location of the ":". SourceLocation ColonLoc; @@ -1905,8 +1878,8 @@ class SwitchCase : public Stmt { SwitchCase *getNextSwitchCase() { return NextSwitchCase; } void setNextSwitchCase(SwitchCase *SC) { NextSwitchCase = SC; } - SourceLocation getKeywordLoc() const { return SwitchCaseBits.KeywordLoc; } - void setKeywordLoc(SourceLocation L) { SwitchCaseBits.KeywordLoc = L; } + SourceLocation getKeywordLoc() const { return KeywordLoc; } + void setKeywordLoc(SourceLocation L) { KeywordLoc = L; } SourceLocation getColonLoc() const { return ColonLoc; } void setColonLoc(SourceLocation L) { ColonLoc = L; } @@ -1948,7 +1921,8 @@ class CaseStmt final // with a range. Present if and only if caseStmtIsGNURange() is true. enum { LhsOffset = 0, SubStmtOffsetFromRhs = 1 }; enum { NumMandatoryStmtPtr = 2 }; - + /// The location of the "case" or "default" keyword. + SourceLocation KeywordLoc; unsigned numTrailingObjects(OverloadToken) const { return NumMandatoryStmtPtr + caseStmtIsGNURange(); } @@ -2155,9 +2129,10 @@ class ValueStmt : public Stmt { /// LabelStmt - Represents a label, which has a substatement. For example: /// foo: return; class LabelStmt : public ValueStmt { + SourceLocation IdentLoc; LabelDecl *TheDecl; Stmt *SubStmt; - bool SideEntry = false; + bool SideEntry = false; // FIXME: could improve public: /// Build a label statement. @@ -2169,8 +2144,8 @@ class LabelStmt : public ValueStmt { /// Build an empty label statement. explicit LabelStmt(EmptyShell Empty) : ValueStmt(LabelStmtClass, Empty) {} - SourceLocation getIdentLoc() const { return LabelStmtBits.IdentLoc; } - void setIdentLoc(SourceLocation L) { LabelStmtBits.IdentLoc = L; } + SourceLocation getIdentLoc() const { return IdentLoc; } + void setIdentLoc(SourceLocation L) { IdentLoc = L; } LabelDecl *getDecl() const { return TheDecl; } void setDecl(LabelDecl *D) { TheDecl = D; } @@ -2206,21 +2181,22 @@ class AttributedStmt final private llvm::TrailingObjects { friend class ASTStmtReader; friend TrailingObjects; - + /// The location of the attribute. + SourceLocation AttrLoc; Stmt *SubStmt; AttributedStmt(SourceLocation Loc, ArrayRef Attrs, Stmt *SubStmt) : ValueStmt(AttributedStmtClass), SubStmt(SubStmt) { AttributedStmtBits.NumAttrs = Attrs.size(); - AttributedStmtBits.AttrLoc = Loc; - llvm::copy(Attrs, getAttrArrayPtr()); + AttrLoc = Loc; + std::copy(Attrs.begin(), Attrs.end(), getAttrArrayPtr()); } explicit AttributedStmt(EmptyShell Empty, unsigned NumAttrs) : ValueStmt(AttributedStmtClass, Empty) { AttributedStmtBits.NumAttrs = NumAttrs; - AttributedStmtBits.AttrLoc = SourceLocation{}; + AttrLoc = SourceLocation{}; std::fill_n(getAttrArrayPtr(), NumAttrs, nullptr); } @@ -2234,7 +2210,7 @@ class AttributedStmt final // Build an empty attributed statement. static AttributedStmt *CreateEmpty(const ASTContext &C, unsigned NumAttrs); - SourceLocation getAttrLoc() const { return AttributedStmtBits.AttrLoc; } + SourceLocation getAttrLoc() const { return AttrLoc; } ArrayRef getAttrs() const { return {getAttrArrayPtr(), AttributedStmtBits.NumAttrs}; } @@ -2286,6 +2262,8 @@ class IfStmt final // Present if and only if hasElseStorage(). enum { InitOffset = 0, ThenOffsetFromCond = 1, ElseOffsetFromCond = 2 }; enum { NumMandatoryStmtPtr = 2 }; + /// The location of the "if". + SourceLocation IfLoc; SourceLocation LParenLoc; SourceLocation RParenLoc; @@ -2425,8 +2403,8 @@ class IfStmt final getTrailingObjects()[initOffset()] = Init; } - SourceLocation getIfLoc() const { return IfStmtBits.IfLoc; } - void setIfLoc(SourceLocation IfLoc) { IfStmtBits.IfLoc = IfLoc; } + SourceLocation getIfLoc() const { return IfLoc; } + void setIfLoc(SourceLocation IfLoc) { this->IfLoc = IfLoc; } SourceLocation getElseLoc() const { return hasElseStorage() ? *getTrailingObjects() @@ -2511,7 +2489,8 @@ class IfStmt final class SwitchStmt final : public Stmt, private llvm::TrailingObjects { friend TrailingObjects; - + /// The location of the "switch". + SourceLocation SwitchLoc; /// Points to a linked list of case and default statements. SwitchCase *FirstCase = nullptr; @@ -2644,8 +2623,8 @@ class SwitchStmt final : public Stmt, const SwitchCase *getSwitchCaseList() const { return FirstCase; } void setSwitchCaseList(SwitchCase *SC) { FirstCase = SC; } - SourceLocation getSwitchLoc() const { return SwitchStmtBits.SwitchLoc; } - void setSwitchLoc(SourceLocation L) { SwitchStmtBits.SwitchLoc = L; } + SourceLocation getSwitchLoc() const { return SwitchLoc; } + void setSwitchLoc(SourceLocation L) { SwitchLoc = L; } SourceLocation getLParenLoc() const { return LParenLoc; } void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; } SourceLocation getRParenLoc() const { return RParenLoc; } @@ -2717,7 +2696,8 @@ class WhileStmt final : public Stmt, // enum { VarOffset = 0, BodyOffsetFromCond = 1 }; enum { NumMandatoryStmtPtr = 2 }; - + /// The location of the "while". + SourceLocation WhileLoc; SourceLocation LParenLoc, RParenLoc; unsigned varOffset() const { return VarOffset; } @@ -2802,8 +2782,8 @@ class WhileStmt final : public Stmt, getTrailingObjects()[varOffset()] = CondVar; } - SourceLocation getWhileLoc() const { return WhileStmtBits.WhileLoc; } - void setWhileLoc(SourceLocation L) { WhileStmtBits.WhileLoc = L; } + SourceLocation getWhileLoc() const { return WhileLoc; } + void setWhileLoc(SourceLocation L) { WhileLoc = L; } SourceLocation getLParenLoc() const { return LParenLoc; } void setLParenLoc(SourceLocation L) { LParenLoc = L; } @@ -2837,7 +2817,8 @@ class DoStmt : public Stmt { Stmt *SubExprs[END_EXPR]; SourceLocation WhileLoc; SourceLocation RParenLoc; // Location of final ')' in do stmt condition. - + /// The location of the "do". + SourceLocation DoLoc; public: DoStmt(Stmt *Body, Expr *Cond, SourceLocation DL, SourceLocation WL, SourceLocation RP) @@ -2861,8 +2842,8 @@ class DoStmt : public Stmt { const Stmt *getBody() const { return SubExprs[BODY]; } void setBody(Stmt *Body) { SubExprs[BODY] = Body; } - SourceLocation getDoLoc() const { return DoStmtBits.DoLoc; } - void setDoLoc(SourceLocation L) { DoStmtBits.DoLoc = L; } + SourceLocation getDoLoc() const { return DoLoc; } + void setDoLoc(SourceLocation L) { DoLoc = L; } SourceLocation getWhileLoc() const { return WhileLoc; } void setWhileLoc(SourceLocation L) { WhileLoc = L; } SourceLocation getRParenLoc() const { return RParenLoc; } @@ -2892,6 +2873,8 @@ class ForStmt : public Stmt { friend class ASTStmtReader; enum { INIT, CONDVAR, COND, INC, BODY, END_EXPR }; + /// The location of the "for". + SourceLocation ForLoc; Stmt* SubExprs[END_EXPR]; // SubExprs[INIT] is an expression or declstmt. SourceLocation LParenLoc, RParenLoc; @@ -2944,8 +2927,8 @@ class ForStmt : public Stmt { void setInc(Expr *E) { SubExprs[INC] = reinterpret_cast(E); } void setBody(Stmt *S) { SubExprs[BODY] = S; } - SourceLocation getForLoc() const { return ForStmtBits.ForLoc; } - void setForLoc(SourceLocation L) { ForStmtBits.ForLoc = L; } + SourceLocation getForLoc() const { return ForLoc; } + void setForLoc(SourceLocation L) { ForLoc = L; } SourceLocation getLParenLoc() const { return LParenLoc; } void setLParenLoc(SourceLocation L) { LParenLoc = L; } SourceLocation getRParenLoc() const { return RParenLoc; } @@ -2971,6 +2954,8 @@ class ForStmt : public Stmt { /// GotoStmt - This represents a direct goto. class GotoStmt : public Stmt { LabelDecl *Label; + /// The location of the "goto". + SourceLocation GotoLoc; SourceLocation LabelLoc; public: @@ -2985,8 +2970,8 @@ class GotoStmt : public Stmt { LabelDecl *getLabel() const { return Label; } void setLabel(LabelDecl *D) { Label = D; } - SourceLocation getGotoLoc() const { return GotoStmtBits.GotoLoc; } - void setGotoLoc(SourceLocation L) { GotoStmtBits.GotoLoc = L; } + SourceLocation getGotoLoc() const { return GotoLoc; } + void setGotoLoc(SourceLocation L) { GotoLoc = L; } SourceLocation getLabelLoc() const { return LabelLoc; } void setLabelLoc(SourceLocation L) { LabelLoc = L; } @@ -3009,6 +2994,8 @@ class GotoStmt : public Stmt { /// IndirectGotoStmt - This represents an indirect goto. class IndirectGotoStmt : public Stmt { + /// The location of the "goto". + SourceLocation GotoLoc; SourceLocation StarLoc; Stmt *Target; @@ -3023,8 +3010,8 @@ class IndirectGotoStmt : public Stmt { explicit IndirectGotoStmt(EmptyShell Empty) : Stmt(IndirectGotoStmtClass, Empty) {} - void setGotoLoc(SourceLocation L) { GotoStmtBits.GotoLoc = L; } - SourceLocation getGotoLoc() const { return GotoStmtBits.GotoLoc; } + void setGotoLoc(SourceLocation L) { GotoLoc = L; } + SourceLocation getGotoLoc() const { return GotoLoc; } void setStarLoc(SourceLocation L) { StarLoc = L; } SourceLocation getStarLoc() const { return StarLoc; } @@ -3058,7 +3045,10 @@ class IndirectGotoStmt : public Stmt { /// ContinueStmt - This represents a continue. class ContinueStmt : public Stmt { + /// The location of the "continue". + SourceLocation ContinueLoc; public: + ContinueStmt(SourceLocation CL) : Stmt(ContinueStmtClass) { setContinueLoc(CL); } @@ -3066,8 +3056,8 @@ class ContinueStmt : public Stmt { /// Build an empty continue statement. explicit ContinueStmt(EmptyShell Empty) : Stmt(ContinueStmtClass, Empty) {} - SourceLocation getContinueLoc() const { return ContinueStmtBits.ContinueLoc; } - void setContinueLoc(SourceLocation L) { ContinueStmtBits.ContinueLoc = L; } + SourceLocation getContinueLoc() const { return ContinueLoc; } + void setContinueLoc(SourceLocation L) { ContinueLoc = L; } SourceLocation getBeginLoc() const { return getContinueLoc(); } SourceLocation getEndLoc() const { return getContinueLoc(); } @@ -3088,6 +3078,8 @@ class ContinueStmt : public Stmt { /// BreakStmt - This represents a break. class BreakStmt : public Stmt { + /// The location of the "break". + SourceLocation BreakLoc; public: BreakStmt(SourceLocation BL) : Stmt(BreakStmtClass) { setBreakLoc(BL); @@ -3096,8 +3088,8 @@ class BreakStmt : public Stmt { /// Build an empty break statement. explicit BreakStmt(EmptyShell Empty) : Stmt(BreakStmtClass, Empty) {} - SourceLocation getBreakLoc() const { return BreakStmtBits.BreakLoc; } - void setBreakLoc(SourceLocation L) { BreakStmtBits.BreakLoc = L; } + SourceLocation getBreakLoc() const { return BreakLoc; } + void setBreakLoc(SourceLocation L) { BreakLoc = L; } SourceLocation getBeginLoc() const { return getBreakLoc(); } SourceLocation getEndLoc() const { return getBreakLoc(); } @@ -3128,7 +3120,8 @@ class ReturnStmt final : public Stmt, private llvm::TrailingObjects { friend TrailingObjects; - + /// The location of the "return". + SourceLocation RetLoc; /// The return expression. Stmt *RetExpr; @@ -3175,8 +3168,8 @@ class ReturnStmt final *getTrailingObjects() = Var; } - SourceLocation getReturnLoc() const { return ReturnStmtBits.RetLoc; } - void setReturnLoc(SourceLocation L) { ReturnStmtBits.RetLoc = L; } + SourceLocation getReturnLoc() const { return RetLoc; } + void setReturnLoc(SourceLocation L) { RetLoc = L; } SourceLocation getBeginLoc() const { return getReturnLoc(); } SourceLocation getEndLoc() const LLVM_READONLY { diff --git a/clang/include/clang/Basic/Diagnostic.h b/clang/include/clang/Basic/Diagnostic.h index 7ae4ef7df138c..8fdf1bc01bdd5 100644 --- a/clang/include/clang/Basic/Diagnostic.h +++ b/clang/include/clang/Basic/Diagnostic.h @@ -454,9 +454,9 @@ class DiagnosticsEngine : public RefCountedBase { /// modifications done through the command-line. struct DiagStatePoint { DiagState *State; - unsigned Offset; + SourceLocation::UIntTy Offset; - DiagStatePoint(DiagState *State, unsigned Offset) + DiagStatePoint(DiagState *State, SourceLocation::UIntTy Offset) : State(State), Offset(Offset) {} }; @@ -469,7 +469,7 @@ class DiagnosticsEngine : public RefCountedBase { File *Parent = nullptr; /// The offset of this file within its parent. - unsigned ParentOffset = 0; + SourceLocation::UIntTy ParentOffset = 0; /// Whether this file has any local (not imported from an AST file) /// diagnostic state transitions. @@ -479,7 +479,7 @@ class DiagnosticsEngine : public RefCountedBase { /// be at least one of these (the state on entry to the file). llvm::SmallVector StateTransitions; - DiagState *lookup(unsigned Offset) const; + DiagState *lookup(SourceLocation::UIntTy Offset) const; }; /// The diagnostic states for each file. diff --git a/clang/include/clang/Basic/SourceLocation.h b/clang/include/clang/Basic/SourceLocation.h index 14543cc41a38e..91352a4aa0ab6 100644 --- a/clang/include/clang/Basic/SourceLocation.h +++ b/clang/include/clang/Basic/SourceLocation.h @@ -17,6 +17,7 @@ #include "clang/Basic/FileEntry.h" #include "clang/Basic/LLVM.h" #include "llvm/ADT/StringRef.h" +#include "llvm/Support/MathExtras.h" #include #include #include @@ -70,8 +71,6 @@ class FileID { int getOpaqueValue() const { return ID; } }; -using FileIDAndOffset = std::pair; - /// Encodes a location in the source. The SourceManager can decode this /// to get at the full include stack, line and column information. /// @@ -95,13 +94,14 @@ class SourceLocation { friend class SourceLocationEncoding; public: - using UIntTy = uint32_t; - using IntTy = int32_t; + using UIntTy = uint64_t; + using IntTy = int64_t; + static constexpr unsigned Bits = 40; private: - UIntTy ID = 0; + uint64_t ID = 0; - enum : UIntTy { MacroIDBit = 1ULL << (8 * sizeof(UIntTy) - 1) }; + enum : UIntTy { MacroIDBit = 1ULL << (Bits - 1) }; public: bool isFileID() const { return (ID & MacroIDBit) == 0; } @@ -160,6 +160,24 @@ class SourceLocation { return X; } + static SourceLocation getFromRawEncoding32(const SourceManager &SM, + uint32_t Encoding32); + + bool getRawEncoding32(uint32_t &Result) const { + // A mask that isolates this check to the required range higher of bits. + static constexpr uint64_t RangeMask = llvm::maskTrailingOnes(Bits - 32) << 31; + + // Check if the ID can be safely compressed to a 32-bit integer. + // The truncation is only possible if all higher bits of the ID are all identical: + // all 0s for the local offset, or all 1s for loaded offset + if ((ID ^ (ID << 1)) & RangeMask) + return false; // won't fit + uint32_t Lower31Bits = ID & llvm::maskTrailingOnes(31); + // Restore the top macro bit. + Result = Lower31Bits | ((ID & MacroIDBit) >> (Bits - 32)); + return true; + } + /// When a SourceLocation itself cannot be used, this returns /// an (opaque) pointer encoding for it. /// @@ -210,6 +228,7 @@ inline bool operator<=(const SourceLocation &LHS, const SourceLocation &RHS) { inline bool operator>=(const SourceLocation &LHS, const SourceLocation &RHS) { return LHS.getRawEncoding() >= RHS.getRawEncoding(); } +using FileIDAndOffset = std::pair; /// A trivial tuple used to represent a source range. class SourceRange { diff --git a/clang/include/clang/Basic/SourceManager.h b/clang/include/clang/Basic/SourceManager.h index eefd4885534c8..21a1eaaee1e3b 100644 --- a/clang/include/clang/Basic/SourceManager.h +++ b/clang/include/clang/Basic/SourceManager.h @@ -745,7 +745,7 @@ class SourceManager : public RefCountedBase { /// The highest possible offset is 2^31-1 (2^63-1 for 64-bit source /// locations), so CurrentLoadedOffset starts at 2^31 (2^63 resp.). static const SourceLocation::UIntTy MaxLoadedOffset = - 1ULL << (8 * sizeof(SourceLocation::UIntTy) - 1); + 1ULL << (SourceLocation::Bits - 1); /// A bitmap that indicates whether the entries of LoadedSLocEntryTable /// have already been loaded from the external source. @@ -1255,7 +1255,8 @@ class SourceManager : public RefCountedBase { SourceLocation getImmediateSpellingLoc(SourceLocation Loc) const; /// Form a SourceLocation from a FileID and Offset pair. - SourceLocation getComposedLoc(FileID FID, unsigned Offset) const { + SourceLocation getComposedLoc(FileID FID, + SourceLocation::UIntTy Offset) const { auto *Entry = getSLocEntryOrNull(FID); if (!Entry) return SourceLocation(); @@ -1287,7 +1288,7 @@ class SourceManager : public RefCountedBase { if (!E) return std::make_pair(FileID(), 0); - unsigned Offset = Loc.getOffset()-E->getOffset(); + auto Offset = Loc.getOffset()-E->getOffset(); if (Loc.isFileID()) return std::make_pair(FID, Offset); @@ -1304,7 +1305,7 @@ class SourceManager : public RefCountedBase { if (!E) return std::make_pair(FileID(), 0); - unsigned Offset = Loc.getOffset()-E->getOffset(); + auto Offset = Loc.getOffset()-E->getOffset(); if (Loc.isFileID()) return std::make_pair(FID, Offset); return getDecomposedSpellingLocSlowCase(E, Offset); @@ -1318,7 +1319,7 @@ class SourceManager : public RefCountedBase { /// specified SourceLocation represents. /// /// This is not very meaningful for a macro ID. - unsigned getFileOffset(SourceLocation SpellingLoc) const { + SourceLocation::UIntTy getFileOffset(SourceLocation SpellingLoc) const { return getDecomposedLoc(SpellingLoc).second; } diff --git a/clang/include/clang/Rewrite/Core/Rewriter.h b/clang/include/clang/Rewrite/Core/Rewriter.h index 4e96f6fcca919..02f9f2a60240b 100644 --- a/clang/include/clang/Rewrite/Core/Rewriter.h +++ b/clang/include/clang/Rewrite/Core/Rewriter.h @@ -216,7 +216,8 @@ class Rewriter { bool overwriteChangedFiles(); private: - unsigned getLocationOffsetAndFileID(SourceLocation Loc, FileID &FID) const; + SourceLocation::UIntTy getLocationOffsetAndFileID(SourceLocation Loc, + FileID &FID) const; }; } // namespace clang diff --git a/clang/include/clang/Sema/MultiplexExternalSemaSource.h b/clang/include/clang/Sema/MultiplexExternalSemaSource.h index 7c66c26a17a13..449166881d207 100644 --- a/clang/include/clang/Sema/MultiplexExternalSemaSource.h +++ b/clang/include/clang/Sema/MultiplexExternalSemaSource.h @@ -72,7 +72,7 @@ class MultiplexExternalSemaSource : public ExternalSemaSource { void CompleteRedeclChain(const Decl *D) override; /// Resolve a selector ID into a selector. - Selector GetExternalSelector(uint32_t ID) override; + Selector GetExternalSelector(uint64_t ID) override; /// Returns the number of selectors known to the external AST /// source. diff --git a/clang/include/clang/Serialization/ASTBitCodes.h b/clang/include/clang/Serialization/ASTBitCodes.h index 9d265f27b8e31..ed92a9319742f 100644 --- a/clang/include/clang/Serialization/ASTBitCodes.h +++ b/clang/include/clang/Serialization/ASTBitCodes.h @@ -164,7 +164,7 @@ using LocalMacroID = uint32_t; const unsigned int NUM_PREDEF_MACRO_IDS = 1; /// An ID number that refers to an ObjC selector in an AST file. -using SelectorID = uint32_t; +using SelectorID = uint64_t; /// The number of predefined selector IDs. const unsigned int NUM_PREDEF_SELECTOR_IDS = 1; diff --git a/clang/include/clang/Serialization/ASTReader.h b/clang/include/clang/Serialization/ASTReader.h index 7d4b4467eb97d..43b4576093cf4 100644 --- a/clang/include/clang/Serialization/ASTReader.h +++ b/clang/include/clang/Serialization/ASTReader.h @@ -525,7 +525,7 @@ class ASTReader ContinuousRangeMap GlobalSLocEntryMap; using GlobalSLocOffsetMapType = - ContinuousRangeMap; + ContinuousRangeMap; /// A map of reversed (SourceManager::MaxLoadedOffset - SLocOffset) /// SourceLocation offsets to the modules containing them. diff --git a/clang/include/clang/Serialization/SourceLocationEncoding.h b/clang/include/clang/Serialization/SourceLocationEncoding.h index 5b2485dbc719f..e18e1e2d042fd 100644 --- a/clang/include/clang/Serialization/SourceLocationEncoding.h +++ b/clang/include/clang/Serialization/SourceLocationEncoding.h @@ -46,10 +46,12 @@ class SourceLocationEncoding { constexpr static unsigned UIntBits = CHAR_BIT * sizeof(UIntTy); static UIntTy encodeRaw(UIntTy Raw) { - return (Raw << 1) | (Raw >> (UIntBits - 1)); + return ((Raw & llvm::maskTrailingOnes(SourceLocation::Bits - 1)) + << 1) | + (Raw >> (SourceLocation::Bits - 1)); } static UIntTy decodeRaw(UIntTy Raw) { - return (Raw >> 1) | (Raw << (UIntBits - 1)); + return (Raw >> 1) | ((Raw & 1) << (SourceLocation::Bits - 1)); } public: @@ -79,18 +81,18 @@ SourceLocationEncoding::encode(SourceLocation Loc, UIntTy BaseOffset, // 16 bits should be sufficient to store the module file index. assert(BaseModuleFileIndex < (1 << 16)); - Encoded |= (RawLocEncoding)BaseModuleFileIndex << 32; + Encoded |= (RawLocEncoding)BaseModuleFileIndex << (SourceLocation::Bits + 1); return Encoded; } inline std::pair SourceLocationEncoding::decode(RawLocEncoding Encoded) { - unsigned ModuleFileIndex = Encoded >> 32; + unsigned ModuleFileIndex = Encoded >> (SourceLocation::Bits + 1); if (!ModuleFileIndex) return {SourceLocation::getFromRawEncoding(decodeRaw(Encoded)), ModuleFileIndex}; - Encoded &= llvm::maskTrailingOnes(32); + Encoded &= llvm::maskTrailingOnes((SourceLocation::Bits + 1)); SourceLocation Loc = SourceLocation::getFromRawEncoding(decodeRaw(Encoded)); return {Loc, ModuleFileIndex}; diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 149b274f36b63..3258ac2195aab 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -441,7 +441,7 @@ DeclRefExpr::DeclRefExpr(const ASTContext &Ctx, ValueDecl *D, DeclRefExprBits.CapturedByCopyInLambdaWithExplicitObjectParameter = false; DeclRefExprBits.NonOdrUseReason = NOUR; DeclRefExprBits.IsImmediateEscalating = false; - DeclRefExprBits.Loc = L; + Loc = L; setDependence(computeDependence(this, Ctx)); } @@ -454,7 +454,7 @@ DeclRefExpr::DeclRefExpr(const ASTContext &Ctx, QualType T, ExprValueKind VK, NonOdrUseReason NOUR) : Expr(DeclRefExprClass, T, VK, OK_Ordinary), D(D), DNLoc(NameInfo.getInfo()) { - DeclRefExprBits.Loc = NameInfo.getLoc(); + Loc = NameInfo.getLoc(); DeclRefExprBits.HasQualifier = QualifierLoc ? 1 : 0; if (QualifierLoc) new (getTrailingObjects()) @@ -618,7 +618,7 @@ PredefinedExpr::PredefinedExpr(SourceLocation L, QualType FNTy, bool HasFunctionName = SL != nullptr; PredefinedExprBits.HasFunctionName = HasFunctionName; PredefinedExprBits.IsTransparent = IsTransparent; - PredefinedExprBits.Loc = L; + Loc = L; if (HasFunctionName) setFunctionName(SL); setDependence(computeDependence(this)); @@ -1466,15 +1466,15 @@ static unsigned SizeOfCallExprInstance(Expr::StmtClass SC) { // changing the size of SourceLocation, CallExpr, and // subclasses requires careful considerations -static_assert(sizeof(SourceLocation) == 4 && sizeof(CXXOperatorCallExpr) <= 32, - "we assume CXXOperatorCallExpr is at most 32 bytes"); +static_assert(sizeof(SourceLocation) == 8 && sizeof(CXXOperatorCallExpr) <= 40, + "we assume CXXOperatorCallExpr is at most 40 bytes"); CallExpr::CallExpr(StmtClass SC, Expr *Fn, ArrayRef PreArgs, ArrayRef Args, QualType Ty, ExprValueKind VK, SourceLocation RParenLoc, FPOptionsOverride FPFeatures, unsigned MinNumArgs, ADLCallKind UsesADL) : Expr(SC, Ty, VK, OK_Ordinary), RParenLoc(RParenLoc) { - NumArgs = std::max(Args.size(), MinNumArgs); + CallExprBits.NumArgs = std::max(Args.size(), MinNumArgs); unsigned NumPreArgs = PreArgs.size(); CallExprBits.NumPreArgs = NumPreArgs; assert((NumPreArgs == getNumPreArgs()) && "NumPreArgs overflow!"); @@ -1488,7 +1488,7 @@ CallExpr::CallExpr(StmtClass SC, Expr *Fn, ArrayRef PreArgs, setPreArg(I, PreArgs[I]); for (unsigned I = 0; I != Args.size(); ++I) setArg(I, Args[I]); - for (unsigned I = Args.size(); I != NumArgs; ++I) + for (unsigned I = Args.size(); I != CallExprBits.NumArgs; ++I) setArg(I, nullptr); this->computeDependence(); @@ -1504,7 +1504,8 @@ CallExpr::CallExpr(StmtClass SC, Expr *Fn, ArrayRef PreArgs, CallExpr::CallExpr(StmtClass SC, unsigned NumPreArgs, unsigned NumArgs, bool HasFPFeatures, EmptyShell Empty) - : Expr(SC, Empty), NumArgs(NumArgs) { + : Expr(SC, Empty) { + CallExprBits.NumArgs = NumArgs; CallExprBits.NumPreArgs = NumPreArgs; assert((NumPreArgs == getNumPreArgs()) && "NumPreArgs overflow!"); CallExprBits.HasFPFeatures = HasFPFeatures; @@ -1727,7 +1728,7 @@ MemberExpr::MemberExpr(Expr *Base, bool IsArrow, SourceLocation OperatorLoc, TemplateArgs || TemplateKWLoc.isValid(); MemberExprBits.HadMultipleCandidates = false; MemberExprBits.NonOdrUseReason = NOUR; - MemberExprBits.OperatorLoc = OperatorLoc; + this->OperatorLoc = OperatorLoc; if (hasQualifier()) new (getTrailingObjects()) @@ -4420,7 +4421,7 @@ GenericSelectionExpr::GenericSelectionExpr( " and TypeSourceInfo!"); assert(ResultIndex < NumAssocs && "ResultIndex is out-of-bounds!"); - GenericSelectionExprBits.GenericLoc = GenericLoc; + this->GenericLoc = GenericLoc; getTrailingObjects()[getIndexOfControllingExpression()] = ControllingExpr; llvm::copy(AssocExprs, @@ -4447,7 +4448,7 @@ GenericSelectionExpr::GenericSelectionExpr( " and TypeSourceInfo!"); assert(ResultIndex < NumAssocs && "ResultIndex is out-of-bounds!"); - GenericSelectionExprBits.GenericLoc = GenericLoc; + this->GenericLoc = GenericLoc; getTrailingObjects()[getIndexOfControllingType()] = ControllingType; llvm::copy(AssocExprs, @@ -4471,7 +4472,7 @@ GenericSelectionExpr::GenericSelectionExpr( "Must have the same number of association expressions" " and TypeSourceInfo!"); - GenericSelectionExprBits.GenericLoc = GenericLoc; + this->GenericLoc = GenericLoc; getTrailingObjects()[getIndexOfControllingExpression()] = ControllingExpr; llvm::copy(AssocExprs, @@ -4495,7 +4496,7 @@ GenericSelectionExpr::GenericSelectionExpr( "Must have the same number of association expressions" " and TypeSourceInfo!"); - GenericSelectionExprBits.GenericLoc = GenericLoc; + this->GenericLoc = GenericLoc; getTrailingObjects()[getIndexOfControllingType()] = ControllingType; llvm::copy(AssocExprs, @@ -4850,7 +4851,7 @@ BinaryOperator::BinaryOperator(const ASTContext &Ctx, Expr *lhs, Expr *rhs, BinaryOperatorBits.Opc = opc; assert(!isCompoundAssignmentOp() && "Use CompoundAssignOperator for compound assignments"); - BinaryOperatorBits.OpLoc = opLoc; + this->OpLoc = opLoc; BinaryOperatorBits.ExcludedOverflowPattern = false; SubExprs[LHS] = lhs; SubExprs[RHS] = rhs; @@ -4870,7 +4871,7 @@ BinaryOperator::BinaryOperator(const ASTContext &Ctx, Expr *lhs, Expr *rhs, BinaryOperatorBits.ExcludedOverflowPattern = false; assert(isCompoundAssignmentOp() && "Use CompoundAssignOperator for compound assignments"); - BinaryOperatorBits.OpLoc = opLoc; + this->OpLoc = opLoc; SubExprs[LHS] = lhs; SubExprs[RHS] = rhs; BinaryOperatorBits.HasFPFeatures = FPFeatures.requiresTrailingStorage(); @@ -4937,7 +4938,7 @@ UnaryOperator::UnaryOperator(const ASTContext &Ctx, Expr *input, Opcode opc, : Expr(UnaryOperatorClass, type, VK, OK), Val(input) { UnaryOperatorBits.Opc = opc; UnaryOperatorBits.CanOverflow = CanOverflow; - UnaryOperatorBits.Loc = l; + this->Loc = l; UnaryOperatorBits.HasFPFeatures = FPFeatures.requiresTrailingStorage(); if (hasStoredFPFeatures()) setStoredFPFeatures(FPFeatures); diff --git a/clang/lib/AST/ExprCXX.cpp b/clang/lib/AST/ExprCXX.cpp index 063eb1738a046..d65746c185c4f 100644 --- a/clang/lib/AST/ExprCXX.cpp +++ b/clang/lib/AST/ExprCXX.cpp @@ -1060,7 +1060,7 @@ CXXDefaultInitExpr::CXXDefaultInitExpr(const ASTContext &Ctx, : VK_PRValue, /*FIXME*/ OK_Ordinary), Field(Field), UsedContext(UsedContext) { - CXXDefaultInitExprBits.Loc = Loc; + this->Loc = Loc; CXXDefaultInitExprBits.HasRewrittenInit = RewrittenInitExpr != nullptr; if (CXXDefaultInitExprBits.HasRewrittenInit) @@ -1204,7 +1204,7 @@ CXXConstructExpr::CXXConstructExpr( CXXConstructExprBits.ZeroInitialization = ZeroInitialization; CXXConstructExprBits.ConstructionKind = llvm::to_underlying(ConstructKind); CXXConstructExprBits.IsImmediateEscalating = false; - CXXConstructExprBits.Loc = Loc; + this->Loc = Loc; Stmt **TrailingArgs = getTrailingArgs(); llvm::copy(Args, TrailingArgs); @@ -1508,7 +1508,7 @@ CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr( (TemplateArgs != nullptr) || TemplateKWLoc.isValid(); CXXDependentScopeMemberExprBits.HasFirstQualifierFoundInScope = FirstQualifierFoundInScope != nullptr; - CXXDependentScopeMemberExprBits.OperatorLoc = OperatorLoc; + this->OperatorLoc = OperatorLoc; if (TemplateArgs) { auto Deps = TemplateArgumentDependence::None; diff --git a/clang/lib/AST/ExprConcepts.cpp b/clang/lib/AST/ExprConcepts.cpp index a2cf431a312af..4dce391116729 100644 --- a/clang/lib/AST/ExprConcepts.cpp +++ b/clang/lib/AST/ExprConcepts.cpp @@ -123,7 +123,7 @@ RequiresExpr::RequiresExpr(ASTContext &C, SourceLocation RequiresKWLoc, NumRequirements(Requirements.size()), Body(Body), LParenLoc(LParenLoc), RParenLoc(RParenLoc), RBraceLoc(RBraceLoc) { RequiresExprBits.IsSatisfied = false; - RequiresExprBits.RequiresKWLoc = RequiresKWLoc; + this->RequiresKWLoc = RequiresKWLoc; bool Dependent = false; bool ContainsUnexpandedParameterPack = false; for (ParmVarDecl *P : LocalParameters) { diff --git a/clang/lib/AST/ExternalASTSource.cpp b/clang/lib/AST/ExternalASTSource.cpp index e8c1004089713..9f714f8a8d455 100644 --- a/clang/lib/AST/ExternalASTSource.cpp +++ b/clang/lib/AST/ExternalASTSource.cpp @@ -72,7 +72,7 @@ bool ExternalASTSource::layoutRecordType( Decl *ExternalASTSource::GetExternalDecl(GlobalDeclID ID) { return nullptr; } -Selector ExternalASTSource::GetExternalSelector(uint32_t ID) { +Selector ExternalASTSource::GetExternalSelector(uint64_t ID) { return Selector(); } diff --git a/clang/lib/AST/Stmt.cpp b/clang/lib/AST/Stmt.cpp index 4fc4a99ad2405..e0bfcb93313cc 100644 --- a/clang/lib/AST/Stmt.cpp +++ b/clang/lib/AST/Stmt.cpp @@ -1072,7 +1072,7 @@ ForStmt::ForStmt(const ASTContext &C, Stmt *Init, Expr *Cond, VarDecl *condVar, SubExprs[COND] = Cond; SubExprs[INC] = Inc; SubExprs[BODY] = Body; - ForStmtBits.ForLoc = FL; + ForLoc = FL; } VarDecl *ForStmt::getConditionVariable() const { diff --git a/clang/lib/Basic/Diagnostic.cpp b/clang/lib/Basic/Diagnostic.cpp index ab0525e96f3ba..9e176c1bc7b1d 100644 --- a/clang/lib/Basic/Diagnostic.cpp +++ b/clang/lib/Basic/Diagnostic.cpp @@ -205,7 +205,7 @@ DiagnosticsEngine::DiagStateMap::lookup(SourceManager &SrcMgr, } DiagnosticsEngine::DiagState * -DiagnosticsEngine::DiagStateMap::File::lookup(unsigned Offset) const { +DiagnosticsEngine::DiagStateMap::File::lookup(SourceLocation::UIntTy Offset) const { auto OnePastIt = llvm::partition_point(StateTransitions, [=](const DiagStatePoint &P) { return P.Offset <= Offset; diff --git a/clang/lib/Basic/SourceLocation.cpp b/clang/lib/Basic/SourceLocation.cpp index 3e26f75d25b10..2a4e9f3e70681 100644 --- a/clang/lib/Basic/SourceLocation.cpp +++ b/clang/lib/Basic/SourceLocation.cpp @@ -17,6 +17,8 @@ #include "llvm/ADT/DenseMapInfo.h" #include "llvm/ADT/FoldingSet.h" #include "llvm/Support/Compiler.h" +#include "llvm/Support/MathExtras.h" +#include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/raw_ostream.h" #include #include @@ -48,6 +50,27 @@ static_assert(std::is_trivially_destructible_v, "SourceRange must be trivially destructible because it is " "used in unions"); +SourceLocation SourceLocation::getFromRawEncoding32(const SourceManager &SM, + uint32_t Encoding32) { + uint32_t Lower31Bits = Encoding32 & llvm::maskTrailingOnes(31); + uint64_t MacroBit = + (static_cast(Encoding32) & llvm::maskLeadingOnes(1)) + << (Bits - 32); + + if (Lower31Bits < SM.getNextLocalOffset()) { + // This is local offset, 32-to-64 offset mapping is identical. + UIntTy Raw64 = Lower31Bits | MacroBit; + return getFromRawEncoding(Raw64); + } + // Offset of loaded source location. + // 2^63 -> 2^31 + // 2^63 - 1 -> 2^31 - 1 + static constexpr uint64_t RangeMask = + llvm::maskTrailingOnes(Bits - 32) << 31; + UIntTy Raw64 = (RangeMask + Lower31Bits) | MacroBit; + return getFromRawEncoding(Raw64); +} + unsigned SourceLocation::getHashValue() const { return llvm::DenseMapInfo::getHashValue(ID); } diff --git a/clang/lib/Basic/SourceManager.cpp b/clang/lib/Basic/SourceManager.cpp index a05d6c16caa32..defba0a351498 100644 --- a/clang/lib/Basic/SourceManager.cpp +++ b/clang/lib/Basic/SourceManager.cpp @@ -938,7 +938,7 @@ FileIDAndOffset SourceManager::getDecomposedExpansionLocSlowCase( // If this is an expansion record, walk through all the expansion points. FileID FID; SourceLocation Loc; - unsigned Offset; + SourceLocation::UIntTy Offset; do { Loc = E->getExpansion().getExpansionLocStart(); @@ -952,7 +952,7 @@ FileIDAndOffset SourceManager::getDecomposedExpansionLocSlowCase( FileIDAndOffset SourceManager::getDecomposedSpellingLocSlowCase(const SrcMgr::SLocEntry *E, - unsigned Offset) const { + SourceLocation::UIntTy Offset) const { // If this is an expansion record, walk through all the expansion points. FileID FID; SourceLocation Loc; @@ -1887,9 +1887,7 @@ SourceManager::getMacroArgExpandedLocation(SourceLocation Loc) const { if (Loc.isInvalid() || !Loc.isFileID()) return Loc; - FileID FID; - unsigned Offset; - std::tie(FID, Offset) = getDecomposedLoc(Loc); + auto [FID, Offset] = getDecomposedLoc(Loc); if (FID.isInvalid()) return Loc; diff --git a/clang/lib/Format/FormatTokenLexer.cpp b/clang/lib/Format/FormatTokenLexer.cpp index 06f68ec8b0fc1..9b0dda81f02a8 100644 --- a/clang/lib/Format/FormatTokenLexer.cpp +++ b/clang/lib/Format/FormatTokenLexer.cpp @@ -1243,7 +1243,8 @@ FormatToken *FormatTokenLexer::getNextToken() { FormatTok = new (Allocator.Allocate()) FormatToken; readRawToken(*FormatTok); SourceLocation WhitespaceStart = - FormatTok->Tok.getLocation().getLocWithOffset(-TrailingWhitespace); + FormatTok->Tok.getLocation().getLocWithOffset( + -static_cast(TrailingWhitespace)); FormatTok->IsFirst = IsFirstToken; IsFirstToken = false; diff --git a/clang/lib/Parse/ParseStmtAsm.cpp b/clang/lib/Parse/ParseStmtAsm.cpp index c679aa6fe7b27..9c1e497867a6e 100644 --- a/clang/lib/Parse/ParseStmtAsm.cpp +++ b/clang/lib/Parse/ParseStmtAsm.cpp @@ -183,7 +183,8 @@ ClangAsmParserCallback::translateLocation(const llvm::SourceMgr &LSM, if (TokIndex < AsmToks.size()) { const Token &Tok = AsmToks[TokIndex]; Loc = Tok.getLocation(); - Loc = Loc.getLocWithOffset(Offset - TokOffset); + Loc = Loc.getLocWithOffset(static_cast(Offset) - + TokOffset); } return Loc; } diff --git a/clang/lib/Rewrite/Rewriter.cpp b/clang/lib/Rewrite/Rewriter.cpp index ae21a10f81c35..e4dca072bad70 100644 --- a/clang/lib/Rewrite/Rewriter.cpp +++ b/clang/lib/Rewrite/Rewriter.cpp @@ -130,7 +130,7 @@ std::string Rewriter::getRewrittenText(CharSourceRange Range) const { return std::string(Start, End); } -unsigned Rewriter::getLocationOffsetAndFileID(SourceLocation Loc, +SourceLocation::UIntTy Rewriter::getLocationOffsetAndFileID(SourceLocation Loc, FileID &FID) const { assert(Loc.isValid() && "Invalid location"); FileIDAndOffset V = SourceMgr->getDecomposedLoc(Loc); diff --git a/clang/lib/Sema/MultiplexExternalSemaSource.cpp b/clang/lib/Sema/MultiplexExternalSemaSource.cpp index 9f19f13592e86..fa7cb3ec07b76 100644 --- a/clang/lib/Sema/MultiplexExternalSemaSource.cpp +++ b/clang/lib/Sema/MultiplexExternalSemaSource.cpp @@ -58,7 +58,7 @@ void MultiplexExternalSemaSource::CompleteRedeclChain(const Decl *D) { Sources[i]->CompleteRedeclChain(D); } -Selector MultiplexExternalSemaSource::GetExternalSelector(uint32_t ID) { +Selector MultiplexExternalSemaSource::GetExternalSelector(uint64_t ID) { Selector Sel; for(size_t i = 0; i < Sources.size(); ++i) { Sel = Sources[i]->GetExternalSelector(ID); diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 486971818f109..04c0a0e28fe7c 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -6967,7 +6967,7 @@ void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) { auto &F = Diag.DiagStatesByLoc.Files[FID]; F.StateTransitions.reserve(F.StateTransitions.size() + Transitions); for (unsigned I = 0; I != Transitions; ++I) { - unsigned Offset = Record[Idx++]; + SourceLocation::UIntTy Offset = Record[Idx++]; auto *State = ReadDiagState(*FirstState, false); F.StateTransitions.push_back({State, Offset}); } diff --git a/clang/lib/Serialization/ASTReaderStmt.cpp b/clang/lib/Serialization/ASTReaderStmt.cpp index 8945407cf666e..089391eaeb9e2 100644 --- a/clang/lib/Serialization/ASTReaderStmt.cpp +++ b/clang/lib/Serialization/ASTReaderStmt.cpp @@ -209,7 +209,7 @@ void ASTStmtReader::VisitAttributedStmt(AttributedStmt *S) { assert(NumAttrs == Attrs.size()); std::copy(Attrs.begin(), Attrs.end(), S->getAttrArrayPtr()); S->SubStmt = Record.readSubStmt(); - S->AttributedStmtBits.AttrLoc = readSourceLocation(); + S->AttrLoc = readSourceLocation(); } void ASTStmtReader::VisitIfStmt(IfStmt *S) { @@ -843,7 +843,7 @@ void ASTStmtReader::VisitRequiresExpr(RequiresExpr *E) { VisitExpr(E); unsigned NumLocalParameters = Record.readInt(); unsigned NumRequirements = Record.readInt(); - E->RequiresExprBits.RequiresKWLoc = Record.readSourceLocation(); + E->RequiresKWLoc = Record.readSourceLocation(); E->RequiresExprBits.IsSatisfied = Record.readInt(); E->Body = Record.readDeclAs(); llvm::SmallVector LocalParameters; @@ -1071,7 +1071,7 @@ void ASTStmtReader::VisitMemberExpr(MemberExpr *E) { E->MemberExprBits.HadMultipleCandidates = CurrentUnpackingBits->getNextBit(); E->MemberExprBits.NonOdrUseReason = CurrentUnpackingBits->getNextBits(/*Width=*/2); - E->MemberExprBits.OperatorLoc = Record.readSourceLocation(); + E->OperatorLoc = Record.readSourceLocation(); if (HasQualifier) new (E->getTrailingObjects()) @@ -1410,7 +1410,7 @@ void ASTStmtReader::VisitGenericSelectionExpr(GenericSelectionExpr *E) { assert(NumAssocs == E->getNumAssocs() && "Wrong NumAssocs!"); E->IsExprPredicate = Record.readInt(); E->ResultIndex = Record.readInt(); - E->GenericSelectionExprBits.GenericLoc = readSourceLocation(); + E->GenericLoc = readSourceLocation(); E->DefaultLoc = readSourceLocation(); E->RParenLoc = readSourceLocation(); @@ -1756,7 +1756,7 @@ void ASTStmtReader::VisitCXXConstructExpr(CXXConstructExpr *E) { E->CXXConstructExprBits.ZeroInitialization = Record.readInt(); E->CXXConstructExprBits.ConstructionKind = Record.readInt(); E->CXXConstructExprBits.IsImmediateEscalating = Record.readInt(); - E->CXXConstructExprBits.Loc = readSourceLocation(); + E->Loc = readSourceLocation(); E->Constructor = readDeclAs(); E->ParenOrBraceRange = readSourceRange(); @@ -1880,7 +1880,7 @@ void ASTStmtReader::VisitCXXThisExpr(CXXThisExpr *E) { void ASTStmtReader::VisitCXXThrowExpr(CXXThrowExpr *E) { VisitExpr(E); - E->CXXThrowExprBits.ThrowLoc = readSourceLocation(); + E->ThrowLoc = readSourceLocation(); E->Operand = Record.readSubExpr(); E->CXXThrowExprBits.IsThrownVariableInScope = Record.readInt(); } @@ -1889,7 +1889,7 @@ void ASTStmtReader::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) { VisitExpr(E); E->Param = readDeclAs(); E->UsedContext = readDeclAs(); - E->CXXDefaultArgExprBits.Loc = readSourceLocation(); + E->Loc = readSourceLocation(); E->CXXDefaultArgExprBits.HasRewrittenInit = Record.readInt(); if (E->CXXDefaultArgExprBits.HasRewrittenInit) *E->getTrailingObjects() = Record.readSubExpr(); @@ -1900,7 +1900,7 @@ void ASTStmtReader::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E) { E->CXXDefaultInitExprBits.HasRewrittenInit = Record.readInt(); E->Field = readDeclAs(); E->UsedContext = readDeclAs(); - E->CXXDefaultInitExprBits.Loc = readSourceLocation(); + E->Loc = readSourceLocation(); if (E->CXXDefaultInitExprBits.HasRewrittenInit) *E->getTrailingObjects() = Record.readSubExpr(); } @@ -1914,7 +1914,7 @@ void ASTStmtReader::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { void ASTStmtReader::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) { VisitExpr(E); E->TypeInfo = readTypeSourceInfo(); - E->CXXScalarValueInitExprBits.RParenLoc = readSourceLocation(); + E->RParenLoc = readSourceLocation(); } void ASTStmtReader::VisitCXXNewExpr(CXXNewExpr *E) { @@ -1964,7 +1964,7 @@ void ASTStmtReader::VisitCXXDeleteExpr(CXXDeleteExpr *E) { E->CXXDeleteExprBits.UsualArrayDeleteWantsSize = Record.readInt(); E->OperatorDelete = readDeclAs(); E->Argument = Record.readSubExpr(); - E->CXXDeleteExprBits.Loc = readSourceLocation(); + E->Loc = readSourceLocation(); } void ASTStmtReader::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) { @@ -2040,7 +2040,7 @@ void ASTStmtReader::VisitCXXDependentScopeMemberExpr( else E->Base = nullptr; - E->CXXDependentScopeMemberExprBits.OperatorLoc = readSourceLocation(); + E->OperatorLoc = readSourceLocation(); if (HasFirstQualifierFoundInScope) *E->getTrailingObjects() = readDeclAs(); @@ -2227,7 +2227,7 @@ void ASTStmtReader::VisitSubstNonTypeTemplateParmExpr( E->Index = CurrentUnpackingBits->getNextBits(/*Width=*/12); E->PackIndex = Record.readUnsignedOrNone().toInternalRepresentation(); E->Final = CurrentUnpackingBits->getNextBit(); - E->SubstNonTypeTemplateParmExprBits.NameLoc = readSourceLocation(); + E->NameLoc = readSourceLocation(); E->Replacement = Record.readSubExpr(); } @@ -2305,7 +2305,7 @@ void ASTStmtReader::VisitCXXParenListInitExpr(CXXParenListInitExpr *E) { void ASTStmtReader::VisitOpaqueValueExpr(OpaqueValueExpr *E) { VisitExpr(E); E->SourceExpr = Record.readSubExpr(); - E->OpaqueValueExprBits.Loc = readSourceLocation(); + E->Loc = readSourceLocation(); E->setIsUnique(Record.readInt()); } diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index 06cd6c7305114..874b24b532b06 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -6652,7 +6652,7 @@ void ASTWriter::AddFileID(FileID FID, RecordDataImpl &Record) { SourceLocationEncoding::RawLocEncoding ASTWriter::getRawSourceLocationEncoding(SourceLocation Loc) { - unsigned BaseOffset = 0; + SourceLocation::UIntTy BaseOffset = 0; unsigned ModuleFileIndex = 0; // See SourceLocationEncoding.h for the encoding details. diff --git a/clang/lib/Serialization/ASTWriterDecl.cpp b/clang/lib/Serialization/ASTWriterDecl.cpp index 2e390dbe79ec6..6d3af86230c5b 100644 --- a/clang/lib/Serialization/ASTWriterDecl.cpp +++ b/clang/lib/Serialization/ASTWriterDecl.cpp @@ -1022,7 +1022,7 @@ void ASTDeclWriter::VisitObjCTypeParamDecl(ObjCTypeParamDecl *D) { } void ASTDeclWriter::VisitObjCContainerDecl(ObjCContainerDecl *D) { - static_assert(DeclContext::NumObjCContainerDeclBits == 64, + static_assert(DeclContext::NumObjCContainerDeclBits == 13, "You need to update the serializer after you change the " "ObjCContainerDeclBits"); diff --git a/clang/lib/Serialization/ASTWriterStmt.cpp b/clang/lib/Serialization/ASTWriterStmt.cpp index 87536be8c8d98..edbd4f6c7fc41 100644 --- a/clang/lib/Serialization/ASTWriterStmt.cpp +++ b/clang/lib/Serialization/ASTWriterStmt.cpp @@ -514,7 +514,7 @@ void ASTStmtWriter::VisitRequiresExpr(RequiresExpr *E) { VisitExpr(E); Record.push_back(E->getLocalParameters().size()); Record.push_back(E->getRequirements().size()); - Record.AddSourceLocation(E->RequiresExprBits.RequiresKWLoc); + Record.AddSourceLocation(E->RequiresKWLoc); Record.push_back(E->RequiresExprBits.IsSatisfied); Record.AddDeclRef(E->getBody()); for (ParmVarDecl *P : E->getLocalParameters()) diff --git a/clang/test/Lexer/SourceLocationsOverflow.c b/clang/test/Lexer/SourceLocationsOverflow.c deleted file mode 100644 index 26b0d204c49ff..0000000000000 --- a/clang/test/Lexer/SourceLocationsOverflow.c +++ /dev/null @@ -1,38 +0,0 @@ -// RUN: not %clang %s -S -o - 2>&1 | FileCheck %s -// CHECK: In file included from {{.*}}SourceLocationsOverflow.c -// CHECK-NEXT: inc1.h{{.*}}: fatal error: translation unit is too large for Clang to process: ran out of source locations -// CHECK-NEXT: #include "inc2.h" -// CHECK-NEXT: ^ -// CHECK-NEXT: note: 214{{.......}}B (2.15GB) in local locations, 0B (0B) in locations loaded from AST files, for a total of 214{{.......}}B (2.15GB) (99% of available space) -// CHECK-NEXT: {{.*}}inc2.h:1:1: note: file entered 214{{..}} times using 214{{.......}}B (2.15GB) of space -// CHECK-NEXT: /*................................................................................................. -// CHECK-NEXT: ^ -// CHECK-NEXT: {{.*}}inc1.h:1:1: note: file entered 15 times using 39{{....}}B (396.92kB) of space -// CHECK-NEXT: #include "inc2.h" -// CHECK-NEXT: ^ -// CHECK-NEXT: :1:1: note: file entered {{.*}} times using {{.*}}B ({{.*}}B) of space -// CHECK-NEXT: # {{.*}} -// CHECK-NEXT: ^ -// CHECK-NEXT: {{.*}}SourceLocationsOverflow.c:1:1: note: file entered 1 time using {{.*}}B ({{.*}}B) of space -// CHECK-NEXT: // RUN: not %clang %s -S -o - 2>&1 | FileCheck %s -// CHECK-NEXT: ^ -// CHECK-NEXT: 1 error generated. -#include "Inputs/inc1.h" -#include "Inputs/inc1.h" -#include "Inputs/inc1.h" -#include "Inputs/inc1.h" -#include "Inputs/inc1.h" -#include "Inputs/inc1.h" -#include "Inputs/inc1.h" -#include "Inputs/inc1.h" -#include "Inputs/inc1.h" -#include "Inputs/inc1.h" -#include "Inputs/inc1.h" -#include "Inputs/inc1.h" -#include "Inputs/inc1.h" -#include "Inputs/inc1.h" -#include "Inputs/inc1.h" -#include "Inputs/inc1.h" -#include "Inputs/inc1.h" -#include "Inputs/inc1.h" -#include "Inputs/inc1.h" diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index 9089984fa4a54..01b5b8fb31ad6 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -166,16 +166,22 @@ CXSourceRange cxloc::translateSourceRange(const SourceManager &SM, Lexer::MeasureTokenLength(SM.getSpellingLoc(EndLoc), SM, LangOpts); EndLoc = EndLoc.getLocWithOffset(Length); } - - CXSourceRange Result = { - {&SM, &LangOpts}, R.getBegin().getRawEncoding(), EndLoc.getRawEncoding()}; + unsigned BeginRaw, EndRaw; + if (!R.getBegin().getRawEncoding32(BeginRaw) || + !EndLoc.getRawEncoding32(EndRaw)) + return clang_getNullRange(); // location is too big for libclang ABI + CXSourceRange Result = {{&SM, &LangOpts}, BeginRaw, EndRaw}; return Result; } CharSourceRange cxloc::translateCXRangeToCharRange(CXSourceRange R) { + if (!R.ptr_data[0]) + return CharSourceRange(); + const SourceManager &SM = + *static_cast(R.ptr_data[0]); return CharSourceRange::getCharRange( - SourceLocation::getFromRawEncoding(R.begin_int_data), - SourceLocation::getFromRawEncoding(R.end_int_data)); + SourceLocation::getFromRawEncoding32(SM, R.begin_int_data), + SourceLocation::getFromRawEncoding32(SM, R.end_int_data)); } //===----------------------------------------------------------------------===// @@ -270,10 +276,15 @@ bool CursorVisitor::visitFileRegion() { ASTUnit *Unit = cxtu::getASTUnit(TU); SourceManager &SM = Unit->getSourceManager(); +<<<<<<< HEAD FileIDAndOffset Begin = SM.getDecomposedLoc( SM.getFileLoc(RegionOfInterest.getBegin())), End = SM.getDecomposedLoc( SM.getFileLoc(RegionOfInterest.getEnd())); +======= + auto Begin = SM.getDecomposedLoc(SM.getFileLoc(RegionOfInterest.getBegin())), + End = SM.getDecomposedLoc(SM.getFileLoc(RegionOfInterest.getEnd())); +>>>>>>> 795e9705ad62 (64-bit source location) if (End.first != Begin.first) { // If the end does not reside in the same file, try to recover by @@ -2122,7 +2133,9 @@ class MemberRefVisit : public VisitorJob { return static_cast(data[0]); } SourceLocation getLoc() const { - return SourceLocation::getFromRawEncoding( + // this->get()->getASTContext().getSourceManager(); + return SourceLocation::getFromRawEncoding32( + this->get()->getASTContext().getSourceManager(), (SourceLocation::UIntTy)(uintptr_t)data[1]); } }; @@ -7635,8 +7648,13 @@ CXString clang_getTokenSpelling(CXTranslationUnit TU, CXToken CXTok) { if (!CXXUnit) return cxstring::createEmpty(); +<<<<<<< HEAD SourceLocation Loc = SourceLocation::getFromRawEncoding(CXTok.int_data[1]); FileIDAndOffset LocInfo = +======= + SourceLocation Loc = SourceLocation::getFromRawEncoding32(CXXUnit->getSourceManager(), CXTok.int_data[1]); + auto LocInfo = +>>>>>>> 795e9705ad62 (64-bit source location) CXXUnit->getSourceManager().getDecomposedSpellingLoc(Loc); bool Invalid = false; StringRef Buffer = @@ -7659,7 +7677,7 @@ CXSourceLocation clang_getTokenLocation(CXTranslationUnit TU, CXToken CXTok) { return cxloc::translateSourceLocation( CXXUnit->getASTContext(), - SourceLocation::getFromRawEncoding(CXTok.int_data[1])); + SourceLocation::getFromRawEncoding32(CXXUnit->getSourceManager(), CXTok.int_data[1])); } CXSourceRange clang_getTokenExtent(CXTranslationUnit TU, CXToken CXTok) { @@ -7674,26 +7692,32 @@ CXSourceRange clang_getTokenExtent(CXTranslationUnit TU, CXToken CXTok) { return cxloc::translateSourceRange( CXXUnit->getASTContext(), - SourceLocation::getFromRawEncoding(CXTok.int_data[1])); + SourceLocation::getFromRawEncoding32(CXXUnit->getSourceManager(), CXTok.int_data[1])); } -static void getTokens(ASTUnit *CXXUnit, SourceRange Range, +static bool getTokens(ASTUnit *CXXUnit, SourceRange Range, SmallVectorImpl &CXTokens) { SourceManager &SourceMgr = CXXUnit->getSourceManager(); +<<<<<<< HEAD FileIDAndOffset BeginLocInfo = SourceMgr.getDecomposedSpellingLoc(Range.getBegin()); FileIDAndOffset EndLocInfo = +======= + auto BeginLocInfo = + SourceMgr.getDecomposedSpellingLoc(Range.getBegin()); + auto EndLocInfo = +>>>>>>> 795e9705ad62 (64-bit source location) SourceMgr.getDecomposedSpellingLoc(Range.getEnd()); // Cannot tokenize across files. if (BeginLocInfo.first != EndLocInfo.first) - return; + return false; // Create a lexer bool Invalid = false; StringRef Buffer = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid); if (Invalid) - return; + return false; Lexer Lex(SourceMgr.getLocForStartOfFile(BeginLocInfo.first), CXXUnit->getASTContext().getLangOpts(), Buffer.begin(), @@ -7714,7 +7738,12 @@ static void getTokens(ASTUnit *CXXUnit, SourceRange Range, CXToken CXTok; // - Common fields - CXTok.int_data[1] = Tok.getLocation().getRawEncoding(); + // CXTok.int_data[1] = Tok.getLocation().getRawEncoding(); + uint32_t TokLocRaw; + if (!Tok.getLocation().getRawEncoding32(TokLocRaw)) + return false; // location is too big for libclang ABI + CXTok.int_data[1] = TokLocRaw; + CXTok.int_data[2] = Tok.getLength(); CXTok.int_data[3] = 0; @@ -7743,6 +7772,8 @@ static void getTokens(ASTUnit *CXXUnit, SourceRange Range, CXTokens.push_back(CXTok); previousWasAt = Tok.is(tok::at); } while (Lex.getBufferLocation() < EffectiveBufferEnd); + + return true; } CXToken *clang_getToken(CXTranslationUnit TU, CXSourceLocation Location) { @@ -7761,7 +7792,11 @@ CXToken *clang_getToken(CXTranslationUnit TU, CXSourceLocation Location) { if (Begin.isInvalid()) return nullptr; SourceManager &SM = CXXUnit->getSourceManager(); +<<<<<<< HEAD FileIDAndOffset DecomposedEnd = SM.getDecomposedLoc(Begin); +======= + auto DecomposedEnd = SM.getDecomposedLoc(Begin); +>>>>>>> 795e9705ad62 (64-bit source location) DecomposedEnd.second += Lexer::MeasureTokenLength(Begin, SM, CXXUnit->getLangOpts()); @@ -7769,7 +7804,8 @@ CXToken *clang_getToken(CXTranslationUnit TU, CXSourceLocation Location) { SM.getComposedLoc(DecomposedEnd.first, DecomposedEnd.second); SmallVector CXTokens; - getTokens(CXXUnit, SourceRange(Begin, End), CXTokens); + if (!getTokens(CXXUnit, SourceRange(Begin, End), CXTokens)) + return nullptr; if (CXTokens.empty()) return nullptr; @@ -7806,7 +7842,8 @@ void clang_tokenize(CXTranslationUnit TU, CXSourceRange Range, CXToken **Tokens, return; SmallVector CXTokens; - getTokens(CXXUnit, R, CXTokens); + if (!getTokens(CXXUnit, R, CXTokens)) + return; if (CXTokens.empty()) return; @@ -7870,13 +7907,15 @@ class AnnotateTokensWorker { unsigned NextToken() const { return TokIdx; } void AdvanceToken() { ++TokIdx; } SourceLocation GetTokenLoc(unsigned tokI) { - return SourceLocation::getFromRawEncoding(getTok(tokI).int_data[1]); + return SourceLocation::getFromRawEncoding32(SrcMgr, + getTok(tokI).int_data[1]); } bool isFunctionMacroToken(unsigned tokI) const { return getTok(tokI).int_data[3] != 0; } SourceLocation getFunctionMacroTokenLoc(unsigned tokI) const { - return SourceLocation::getFromRawEncoding(getTok(tokI).int_data[3]); + return SourceLocation::getFromRawEncoding32(SrcMgr, + getTok(tokI).int_data[3]); } void annotateAndAdvanceTokens(CXCursor, RangeComparisonResult, SourceRange); @@ -8371,13 +8410,16 @@ class MarkMacroArgTokensVisitor { } SourceLocation getTokenLoc(unsigned tokI) { - return SourceLocation::getFromRawEncoding(getTok(tokI).int_data[1]); + return SourceLocation::getFromRawEncoding32(SM, getTok(tokI).int_data[1]); } void setFunctionMacroTokenLoc(unsigned tokI, SourceLocation loc) { // The third field is reserved and currently not used. Use it here // to mark macro arg expanded tokens with their expanded locations. - getTok(tokI).int_data[3] = loc.getRawEncoding(); + uint32_t Raw; + if (!loc.getRawEncoding32(Raw)) + Raw = 0; // invalid source location + getTok(tokI).int_data[3] = Raw; } }; @@ -8410,9 +8452,15 @@ static void annotatePreprocessorTokens(CXTranslationUnit TU, Preprocessor &PP = CXXUnit->getPreprocessor(); SourceManager &SourceMgr = CXXUnit->getSourceManager(); +<<<<<<< HEAD FileIDAndOffset BeginLocInfo = SourceMgr.getDecomposedSpellingLoc(RegionOfInterest.getBegin()); FileIDAndOffset EndLocInfo = +======= + auto BeginLocInfo = + SourceMgr.getDecomposedSpellingLoc(RegionOfInterest.getBegin()); + auto EndLocInfo = +>>>>>>> 795e9705ad62 (64-bit source location) SourceMgr.getDecomposedSpellingLoc(RegionOfInterest.getEnd()); if (BeginLocInfo.first != EndLocInfo.first) @@ -8437,8 +8485,8 @@ static void annotatePreprocessorTokens(CXTranslationUnit TU, if (lexNext(Lex, Tok, NextIdx, NumTokens)) break; unsigned TokIdx = NextIdx - 1; - assert(Tok.getLocation() == - SourceLocation::getFromRawEncoding(Tokens[TokIdx].int_data[1])); + assert(Tok.getLocation() == SourceLocation::getFromRawEncoding32( + SourceMgr, Tokens[TokIdx].int_data[1])); reprocess: if (Tok.is(tok::hash) && Tok.isAtStartOfLine()) { @@ -8488,8 +8536,8 @@ static void annotatePreprocessorTokens(CXTranslationUnit TU, unsigned LastIdx = finished ? NextIdx - 1 : NextIdx - 2; assert(TokIdx <= LastIdx); - SourceLocation EndLoc = - SourceLocation::getFromRawEncoding(Tokens[LastIdx].int_data[1]); + SourceLocation EndLoc = SourceLocation::getFromRawEncoding32( + SourceMgr, Tokens[LastIdx].int_data[1]); CXCursor Cursor = MakePreprocessingDirectiveCursor(SourceRange(BeginLoc, EndLoc), TU); diff --git a/clang/tools/libclang/CXIndexDataConsumer.cpp b/clang/tools/libclang/CXIndexDataConsumer.cpp index f0d92e8c40124..938dd85737a35 100644 --- a/clang/tools/libclang/CXIndexDataConsumer.cpp +++ b/clang/tools/libclang/CXIndexDataConsumer.cpp @@ -988,8 +988,8 @@ bool CXIndexDataConsumer::handleCXXRecordDecl(const CXXRecordDecl *RD, const CXIdxBaseClassInfo *baseInfo = BaseList.getBases()[i]; if (baseInfo->base) { const NamedDecl *BaseD = BaseList.BaseEntities[i].Dcl; - SourceLocation - Loc = SourceLocation::getFromRawEncoding(baseInfo->loc.int_data); + SourceLocation Loc = SourceLocation::getFromRawEncoding32( + Ctx->getSourceManager(), baseInfo->loc.int_data); markEntityOccurrenceInFile(BaseD, Loc); } } @@ -1077,9 +1077,11 @@ CXIdxLoc CXIndexDataConsumer::getIndexLoc(SourceLocation Loc) const { CXIdxLoc idxLoc = { {nullptr, nullptr}, 0 }; if (Loc.isInvalid()) return idxLoc; - + uint32_t LocRaw; + if (!Loc.getRawEncoding32(LocRaw)) + return idxLoc; idxLoc.ptr_data[0] = const_cast(this); - idxLoc.int_data = Loc.getRawEncoding(); + idxLoc.int_data = LocRaw; return idxLoc; } diff --git a/clang/tools/libclang/CXSourceLocation.cpp b/clang/tools/libclang/CXSourceLocation.cpp index 4c16e5de4498a..6ea42f795310f 100644 --- a/clang/tools/libclang/CXSourceLocation.cpp +++ b/clang/tools/libclang/CXSourceLocation.cpp @@ -211,24 +211,27 @@ static void createNullLocation(CXString *filename, unsigned *line, } int clang_Location_isInSystemHeader(CXSourceLocation location) { + if (!location.ptr_data[0]) + return 0; + const SourceManager &SM = + *static_cast(location.ptr_data[0]); const SourceLocation Loc = - SourceLocation::getFromRawEncoding(location.int_data); + SourceLocation::getFromRawEncoding32(SM, location.int_data); if (Loc.isInvalid()) return 0; - const SourceManager &SM = - *static_cast(location.ptr_data[0]); return SM.isInSystemHeader(Loc); } int clang_Location_isFromMainFile(CXSourceLocation location) { + if (!location.ptr_data[0]) + return 0; + const SourceManager &SM = + *static_cast(location.ptr_data[0]); const SourceLocation Loc = - SourceLocation::getFromRawEncoding(location.int_data); + SourceLocation::getFromRawEncoding32(SM, location.int_data); if (Loc.isInvalid()) return 0; - - const SourceManager &SM = - *static_cast(location.ptr_data[0]); return SM.isWrittenInMainFile(Loc); } @@ -241,16 +244,21 @@ void clang_getExpansionLocation(CXSourceLocation location, CXLoadedDiagnostic::decodeLocation(location, file, line, column, offset); return; } + if (!location.ptr_data[0]) { + createNullLocation(file, line, column, offset); + return; + } - SourceLocation Loc = SourceLocation::getFromRawEncoding(location.int_data); + const SourceManager &SM = + *static_cast(location.ptr_data[0]); + SourceLocation Loc = + SourceLocation::getFromRawEncoding32(SM, location.int_data); - if (!location.ptr_data[0] || Loc.isInvalid()) { + if (Loc.isInvalid()) { createNullLocation(file, line, column, offset); return; } - const SourceManager &SM = - *static_cast(location.ptr_data[0]); SourceLocation ExpansionLoc = SM.getExpansionLoc(Loc); // Check that the FileID is invalid on the expansion location. @@ -283,16 +291,21 @@ void clang_getPresumedLocation(CXSourceLocation location, createNullLocation(filename, line, column); return; } - - SourceLocation Loc = SourceLocation::getFromRawEncoding(location.int_data); - - if (!location.ptr_data[0] || Loc.isInvalid()) { + if (!location.ptr_data[0]) { createNullLocation(filename, line, column); return; } const SourceManager &SM = *static_cast(location.ptr_data[0]); + SourceLocation Loc = + SourceLocation::getFromRawEncoding32(SM, location.int_data); + + if (Loc.isInvalid()) { + createNullLocation(filename, line, column); + return; + } + PresumedLoc PreLoc = SM.getPresumedLoc(Loc); if (PreLoc.isInvalid()) { createNullLocation(filename, line, column); @@ -323,14 +336,16 @@ void clang_getSpellingLocation(CXSourceLocation location, column, offset); return; } - - SourceLocation Loc = SourceLocation::getFromRawEncoding(location.int_data); - - if (!location.ptr_data[0] || Loc.isInvalid()) + if (!location.ptr_data[0]) return createNullLocation(file, line, column, offset); - const SourceManager &SM = - *static_cast(location.ptr_data[0]); + *static_cast(location.ptr_data[0]); + SourceLocation Loc = + SourceLocation::getFromRawEncoding32(SM, location.int_data); + + if (Loc.isInvalid()) + return createNullLocation(file, line, column, offset); + SourceLocation SpellLoc = SM.getSpellingLoc(Loc); FileIDAndOffset LocInfo = SM.getDecomposedLoc(SpellLoc); FileID FID = LocInfo.first; @@ -360,13 +375,17 @@ void clang_getFileLocation(CXSourceLocation location, return; } - SourceLocation Loc = SourceLocation::getFromRawEncoding(location.int_data); - - if (!location.ptr_data[0] || Loc.isInvalid()) + if (!location.ptr_data[0]) return createNullLocation(file, line, column, offset); const SourceManager &SM = - *static_cast(location.ptr_data[0]); + *static_cast(location.ptr_data[0]); + SourceLocation Loc = + SourceLocation::getFromRawEncoding32(SM, location.int_data); + + if (Loc.isInvalid()) + return createNullLocation(file, line, column, offset); + SourceLocation FileLoc = SM.getFileLoc(Loc); FileIDAndOffset LocInfo = SM.getDecomposedLoc(FileLoc); FileID FID = LocInfo.first; diff --git a/clang/tools/libclang/CXSourceLocation.h b/clang/tools/libclang/CXSourceLocation.h index c86f6850375bb..bc36db3571b63 100644 --- a/clang/tools/libclang/CXSourceLocation.h +++ b/clang/tools/libclang/CXSourceLocation.h @@ -30,9 +30,15 @@ translateSourceLocation(const SourceManager &SM, const LangOptions &LangOpts, SourceLocation Loc) { if (Loc.isInvalid()) return clang_getNullLocation(); + uint32_t LocRaw; + if (!Loc.getRawEncoding32(LocRaw)) + return clang_getNullLocation(); // location is too big for libclang ABI - CXSourceLocation Result = { { &SM, &LangOpts, }, - Loc.getRawEncoding() }; + CXSourceLocation Result = {{ + &SM, + &LangOpts, + }, + LocRaw}; return Result; } @@ -63,12 +69,21 @@ static inline CXSourceRange translateSourceRange(ASTContext &Context, } static inline SourceLocation translateSourceLocation(CXSourceLocation L) { - return SourceLocation::getFromRawEncoding(L.int_data); + if (!L.ptr_data[0]) { + return SourceLocation(); + } + const SourceManager &SM = + *static_cast(L.ptr_data[0]); + return SourceLocation::getFromRawEncoding32(SM, L.int_data); } static inline SourceRange translateCXSourceRange(CXSourceRange R) { - return SourceRange(SourceLocation::getFromRawEncoding(R.begin_int_data), - SourceLocation::getFromRawEncoding(R.end_int_data)); + if (!R.ptr_data[0]) { + return SourceRange(); + } + const SourceManager &SM = *static_cast(R.ptr_data[0]); + return SourceRange(SourceLocation::getFromRawEncoding32(SM, R.begin_int_data), + SourceLocation::getFromRawEncoding32(SM, R.end_int_data)); } /// Translates CXSourceRange to CharSourceRange. diff --git a/clang/tools/libclang/Indexing.cpp b/clang/tools/libclang/Indexing.cpp index 3cd49bf90235b..da3f3f973a675 100644 --- a/clang/tools/libclang/Indexing.cpp +++ b/clang/tools/libclang/Indexing.cpp @@ -979,23 +979,30 @@ void clang_indexLoc_getFileLocation(CXIdxLoc location, if (file) *file = nullptr; if (line) *line = 0; if (column) *column = 0; - if (offset) *offset = 0; - - SourceLocation Loc = SourceLocation::getFromRawEncoding(location.int_data); - if (!location.ptr_data[0] || Loc.isInvalid()) + if (offset) + *offset = 0; + if (!location.ptr_data[0]) return; - CXIndexDataConsumer &DataConsumer = - *static_cast(location.ptr_data[0]); + *static_cast(location.ptr_data[0]); + SourceLocation Loc = SourceLocation::getFromRawEncoding32( + DataConsumer.getASTContext().getSourceManager(), location.int_data); + if (Loc.isInvalid()) + return; + DataConsumer.translateLoc(Loc, indexFile, file, line, column, offset); } CXSourceLocation clang_indexLoc_getCXSourceLocation(CXIdxLoc location) { - SourceLocation Loc = SourceLocation::getFromRawEncoding(location.int_data); - if (!location.ptr_data[0] || Loc.isInvalid()) - return clang_getNullLocation(); + if (!location.ptr_data[0]) + return clang_getNullLocation(); CXIndexDataConsumer &DataConsumer = - *static_cast(location.ptr_data[0]); + *static_cast(location.ptr_data[0]); + const auto &SM = DataConsumer.getASTContext().getSourceManager(); + SourceLocation Loc = + SourceLocation::getFromRawEncoding32(SM, location.int_data); + if (Loc.isInvalid()) + return clang_getNullLocation(); return cxloc::translateSourceLocation(DataConsumer.getASTContext(), Loc); } diff --git a/clang/unittests/Lex/PPMemoryAllocationsTest.cpp b/clang/unittests/Lex/PPMemoryAllocationsTest.cpp index 4d83003e28b36..7b36d5f3326e9 100644 --- a/clang/unittests/Lex/PPMemoryAllocationsTest.cpp +++ b/clang/unittests/Lex/PPMemoryAllocationsTest.cpp @@ -87,7 +87,7 @@ TEST_F(PPMemoryAllocationsTest, PPMacroDefinesAllocations) { // Assume a reasonable upper bound based on that number that we don't want // to exceed when storing information about a macro #define with 1 or 3 // tokens. - EXPECT_LT(BytesPerDefine, 130.0f); + EXPECT_LT(BytesPerDefine, 150.0f); } } // anonymous namespace diff --git a/clang/unittests/Serialization/SourceLocationEncodingTest.cpp b/clang/unittests/Serialization/SourceLocationEncodingTest.cpp index 18fedd4de3973..63aec9a94981b 100644 --- a/clang/unittests/Serialization/SourceLocationEncodingTest.cpp +++ b/clang/unittests/Serialization/SourceLocationEncodingTest.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// #include "clang/Serialization/SourceLocationEncoding.h" +#include "llvm/Support/MathExtras.h" #include "gtest/gtest.h" #include @@ -31,11 +32,13 @@ void roundTrip(SourceLocation::UIntTy Loc, SourceLocation::UIntTy DecodedEncoded = SourceLocationEncoding::decode(ActualEncoded).first.getRawEncoding(); ASSERT_EQ(DecodedEncoded, Loc) << "Decoding " << ActualEncoded; -} +} constexpr SourceLocation::UIntTy MacroBit = - 1 << (sizeof(SourceLocation::UIntTy) * CHAR_BIT - 1); -constexpr SourceLocation::UIntTy Big = MacroBit >> 1; + 1ull << (SourceLocation::Bits - 1); +constexpr SourceLocation::UIntTy Big = 1ull << (SourceLocation::Bits - 2); +constexpr SourceLocation::UIntTy Biggest = + llvm::maskTrailingOnes(SourceLocation::Bits - 1); TEST(SourceLocationEncoding, Individual) { roundTrip(1, 2); @@ -46,6 +49,8 @@ TEST(SourceLocationEncoding, Individual) { roundTrip(Big + 1); roundTrip(MacroBit | Big); roundTrip(MacroBit | (Big + 1)); + roundTrip(Biggest); + roundTrip(MacroBit | Biggest); } } // namespace From 5a2700eb2902e4a8e19bc2a6bd39f6b71b34f5eb Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Wed, 25 Jun 2025 08:40:49 +0200 Subject: [PATCH 02/20] Test Bits=64 perf --- clang/include/clang/Basic/SourceLocation.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/include/clang/Basic/SourceLocation.h b/clang/include/clang/Basic/SourceLocation.h index 91352a4aa0ab6..5be7b2f261b1e 100644 --- a/clang/include/clang/Basic/SourceLocation.h +++ b/clang/include/clang/Basic/SourceLocation.h @@ -96,7 +96,7 @@ class SourceLocation { public: using UIntTy = uint64_t; using IntTy = int64_t; - static constexpr unsigned Bits = 40; + static constexpr unsigned Bits = 64; private: uint64_t ID = 0; From 755e67144d97faef5fe20b1d67a768ace6313ce5 Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Wed, 25 Jun 2025 09:22:12 +0200 Subject: [PATCH 03/20] Switch Bits back to 40. --- clang/include/clang/Basic/SourceLocation.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/include/clang/Basic/SourceLocation.h b/clang/include/clang/Basic/SourceLocation.h index 5be7b2f261b1e..91352a4aa0ab6 100644 --- a/clang/include/clang/Basic/SourceLocation.h +++ b/clang/include/clang/Basic/SourceLocation.h @@ -96,7 +96,7 @@ class SourceLocation { public: using UIntTy = uint64_t; using IntTy = int64_t; - static constexpr unsigned Bits = 64; + static constexpr unsigned Bits = 40; private: uint64_t ID = 0; From 68ffab3a717aea3829dfae8110e78e1c897d8f49 Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Wed, 25 Jun 2025 10:09:12 +0200 Subject: [PATCH 04/20] Reduce SubstNonTypeTemplateParmExpr size: 48 -> 40 bytes --- clang/include/clang/AST/ExprCXX.h | 6 ++---- clang/include/clang/AST/Stmt.h | 7 ++++--- clang/lib/Serialization/ASTReaderStmt.cpp | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/clang/include/clang/AST/ExprCXX.h b/clang/include/clang/AST/ExprCXX.h index 2e2f4dd175d0c..5deccb8e47630 100644 --- a/clang/include/clang/AST/ExprCXX.h +++ b/clang/include/clang/AST/ExprCXX.h @@ -4618,8 +4618,6 @@ class PackIndexingExpr final class SubstNonTypeTemplateParmExpr : public Expr { friend class ASTReader; friend class ASTStmtReader; - /// The location of the non-type template parameter reference. - SourceLocation NameLoc; /// The replacement expression. Stmt *Replacement; @@ -4648,12 +4646,12 @@ class SubstNonTypeTemplateParmExpr : public Expr { AssociatedDeclAndRef(AssociatedDecl, RefParam), Index(Index), PackIndex(PackIndex.toInternalRepresentation()), Final(Final) { assert(AssociatedDecl != nullptr); - NameLoc = Loc; + SubstNonTypeTemplateParmExprBits.NameLoc = Loc.getRawEncoding(); setDependence(computeDependence(this)); } SourceLocation getNameLoc() const { - return NameLoc; + return SourceLocation::getFromRawEncoding(SubstNonTypeTemplateParmExprBits.NameLoc); } SourceLocation getBeginLoc() const { return getNameLoc(); } SourceLocation getEndLoc() const { return getNameLoc(); } diff --git a/clang/include/clang/AST/Stmt.h b/clang/include/clang/AST/Stmt.h index 83c1f646c6701..bdf92d57e0c25 100644 --- a/clang/include/clang/AST/Stmt.h +++ b/clang/include/clang/AST/Stmt.h @@ -1130,11 +1130,12 @@ class alignas(void *) Stmt { class SubstNonTypeTemplateParmExprBitfields { friend class ASTStmtReader; friend class SubstNonTypeTemplateParmExpr; - + LLVM_PREFERRED_TYPE(ExprBitfields) unsigned : NumExprBits; - - + /// The location of the non-type template parameter reference. + LLVM_PREFERRED_TYPE(SourceLocation) + unsigned long NameLoc : SourceLocation::Bits; }; class LambdaExprBitfields { diff --git a/clang/lib/Serialization/ASTReaderStmt.cpp b/clang/lib/Serialization/ASTReaderStmt.cpp index 089391eaeb9e2..85b8165e9f9c3 100644 --- a/clang/lib/Serialization/ASTReaderStmt.cpp +++ b/clang/lib/Serialization/ASTReaderStmt.cpp @@ -2227,7 +2227,7 @@ void ASTStmtReader::VisitSubstNonTypeTemplateParmExpr( E->Index = CurrentUnpackingBits->getNextBits(/*Width=*/12); E->PackIndex = Record.readUnsignedOrNone().toInternalRepresentation(); E->Final = CurrentUnpackingBits->getNextBit(); - E->NameLoc = readSourceLocation(); + E->SubstNonTypeTemplateParmExprBits.NameLoc = readSourceLocation().getRawEncoding(); E->Replacement = Record.readSubExpr(); } From b1f620593bb71878468b739de1547c0aea65acda Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Wed, 25 Jun 2025 10:34:08 +0200 Subject: [PATCH 05/20] Reduce OpaqueValueExpr: 32 -> 24 bytes --- clang/include/clang/AST/Expr.h | 6 ++---- clang/include/clang/AST/Stmt.h | 5 ++++- clang/lib/Serialization/ASTReaderStmt.cpp | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h index 0955b54163de3..994274d9eea0b 100644 --- a/clang/include/clang/AST/Expr.h +++ b/clang/include/clang/AST/Expr.h @@ -1175,8 +1175,6 @@ class ConstantExpr final /// context. class OpaqueValueExpr : public Expr { friend class ASTStmtReader; - - SourceLocation Loc; Expr *SourceExpr; public: @@ -1184,7 +1182,7 @@ class OpaqueValueExpr : public Expr { ExprObjectKind OK = OK_Ordinary, Expr *SourceExpr = nullptr) : Expr(OpaqueValueExprClass, T, VK, OK), SourceExpr(SourceExpr) { setIsUnique(false); - this->Loc = Loc; + OpaqueValueExprBits.Loc = Loc.getRawEncoding(); setDependence(computeDependence(this)); } @@ -1197,7 +1195,7 @@ class OpaqueValueExpr : public Expr { : Expr(OpaqueValueExprClass, Empty) {} /// Retrieve the location of this expression. - SourceLocation getLocation() const { return Loc; } + SourceLocation getLocation() const { return SourceLocation::getFromRawEncoding(OpaqueValueExprBits.Loc); } SourceLocation getBeginLoc() const LLVM_READONLY { return SourceExpr ? SourceExpr->getBeginLoc() : getLocation(); diff --git a/clang/include/clang/AST/Stmt.h b/clang/include/clang/AST/Stmt.h index bdf92d57e0c25..a935f7f64f931 100644 --- a/clang/include/clang/AST/Stmt.h +++ b/clang/include/clang/AST/Stmt.h @@ -1264,7 +1264,10 @@ class alignas(void *) Stmt { /// bit is set to true. LLVM_PREFERRED_TYPE(bool) unsigned IsUnique : 1; - + + /// The location of the non-type template parameter reference. + LLVM_PREFERRED_TYPE(SourceLocation) + unsigned long Loc : SourceLocation::Bits; }; class ConvertVectorExprBitfields { diff --git a/clang/lib/Serialization/ASTReaderStmt.cpp b/clang/lib/Serialization/ASTReaderStmt.cpp index 85b8165e9f9c3..bfb798c1604d8 100644 --- a/clang/lib/Serialization/ASTReaderStmt.cpp +++ b/clang/lib/Serialization/ASTReaderStmt.cpp @@ -2305,7 +2305,7 @@ void ASTStmtReader::VisitCXXParenListInitExpr(CXXParenListInitExpr *E) { void ASTStmtReader::VisitOpaqueValueExpr(OpaqueValueExpr *E) { VisitExpr(E); E->SourceExpr = Record.readSubExpr(); - E->Loc = readSourceLocation(); + E->OpaqueValueExprBits.Loc = readSourceLocation().getRawEncoding(); E->setIsUnique(Record.readInt()); } From 86f0440fb3b463d6d2d4f9dfb07ce30b916c6432 Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Wed, 25 Jun 2025 10:51:43 +0200 Subject: [PATCH 06/20] Reduce CXXDependentScopeMemberExpr size: 88 -> 80 bytes --- clang/include/clang/AST/ExprCXX.h | 5 +---- clang/include/clang/AST/Stmt.h | 6 ++++-- clang/lib/AST/ExprCXX.cpp | 2 +- clang/lib/Serialization/ASTReaderStmt.cpp | 2 +- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/clang/include/clang/AST/ExprCXX.h b/clang/include/clang/AST/ExprCXX.h index 5deccb8e47630..9da74234658c8 100644 --- a/clang/include/clang/AST/ExprCXX.h +++ b/clang/include/clang/AST/ExprCXX.h @@ -3842,9 +3842,6 @@ class CXXDependentScopeMemberExpr final /// FIXME: could also be a template-id DeclarationNameInfo MemberNameInfo; - /// The location of the '->' or '.' operator. - SourceLocation OperatorLoc; - // CXXDependentScopeMemberExpr is followed by several trailing objects, // some of which optional. They are in order: // @@ -3924,7 +3921,7 @@ class CXXDependentScopeMemberExpr final /// Retrieve the location of the '->' or '.' operator. SourceLocation getOperatorLoc() const { - return OperatorLoc; + return SourceLocation::getFromRawEncoding(CXXDependentScopeMemberExprBits.OperatorLoc); } /// Retrieve the nested-name-specifier that qualifies the member name. diff --git a/clang/include/clang/AST/Stmt.h b/clang/include/clang/AST/Stmt.h index a935f7f64f931..e3d5bac743848 100644 --- a/clang/include/clang/AST/Stmt.h +++ b/clang/include/clang/AST/Stmt.h @@ -1054,8 +1054,10 @@ class alignas(void *) Stmt { /// the trailing objects. LLVM_PREFERRED_TYPE(bool) unsigned HasFirstQualifierFoundInScope : 1; - - + + /// The location of the '->' or '.' operator. + LLVM_PREFERRED_TYPE(SourceLocation) + unsigned long OperatorLoc : SourceLocation::Bits; }; class OverloadExprBitfields { diff --git a/clang/lib/AST/ExprCXX.cpp b/clang/lib/AST/ExprCXX.cpp index d65746c185c4f..f503b33d84047 100644 --- a/clang/lib/AST/ExprCXX.cpp +++ b/clang/lib/AST/ExprCXX.cpp @@ -1508,7 +1508,7 @@ CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr( (TemplateArgs != nullptr) || TemplateKWLoc.isValid(); CXXDependentScopeMemberExprBits.HasFirstQualifierFoundInScope = FirstQualifierFoundInScope != nullptr; - this->OperatorLoc = OperatorLoc; + CXXDependentScopeMemberExprBits.OperatorLoc = OperatorLoc.getRawEncoding(); if (TemplateArgs) { auto Deps = TemplateArgumentDependence::None; diff --git a/clang/lib/Serialization/ASTReaderStmt.cpp b/clang/lib/Serialization/ASTReaderStmt.cpp index bfb798c1604d8..e85ec09fd95f5 100644 --- a/clang/lib/Serialization/ASTReaderStmt.cpp +++ b/clang/lib/Serialization/ASTReaderStmt.cpp @@ -2040,7 +2040,7 @@ void ASTStmtReader::VisitCXXDependentScopeMemberExpr( else E->Base = nullptr; - E->OperatorLoc = readSourceLocation(); + E->CXXDependentScopeMemberExprBits.OperatorLoc = readSourceLocation().getRawEncoding(); if (HasFirstQualifierFoundInScope) *E->getTrailingObjects() = readDeclAs(); From 9dbf694a433ab09830e0fff8c4de69e7bdfce020 Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Thu, 26 Jun 2025 13:30:33 +0200 Subject: [PATCH 07/20] Reduce DeclRefExpr size: 48 -> 40 bytes. by moving out the two source locations for CXXOpName from DeclarationNameLoc --- clang/include/clang/AST/ASTContext.h | 2 + clang/include/clang/AST/DeclarationName.h | 52 +++++++++++------------ clang/lib/AST/ASTContext.cpp | 12 +++++- clang/lib/AST/ASTImporter.cpp | 3 +- clang/lib/AST/DeclarationName.cpp | 2 +- clang/lib/Sema/SemaDecl.cpp | 13 +++--- clang/lib/Sema/SemaLambda.cpp | 3 +- clang/lib/Sema/SemaOverload.cpp | 13 ++++-- clang/lib/Serialization/ASTReader.cpp | 3 +- 9 files changed, 63 insertions(+), 40 deletions(-) diff --git a/clang/include/clang/AST/ASTContext.h b/clang/include/clang/AST/ASTContext.h index 2b9cd035623cc..8ae212cc6cc94 100644 --- a/clang/include/clang/AST/ASTContext.h +++ b/clang/include/clang/AST/ASTContext.h @@ -3356,6 +3356,8 @@ class ASTContext : public RefCountedBase { getTrivialTypeSourceInfo(QualType T, SourceLocation Loc = SourceLocation()) const; + CXXOperatorSourceInfo *getCXXOperatorSourceInfo(SourceRange R) const; + /// Add a deallocation callback that will be invoked when the /// ASTContext is destroyed. /// diff --git a/clang/include/clang/AST/DeclarationName.h b/clang/include/clang/AST/DeclarationName.h index 9bf740b3bf7ce..10a0ce368b532 100644 --- a/clang/include/clang/AST/DeclarationName.h +++ b/clang/include/clang/AST/DeclarationName.h @@ -682,6 +682,11 @@ class DeclarationNameTable { DeclarationName getCXXLiteralOperatorName(const IdentifierInfo *II); }; +struct CXXOperatorSourceInfo { + SourceLocation::UIntTy BeginOpNameLoc; + SourceLocation::UIntTy EndOpNameLoc; +}; + /// DeclarationNameLoc - Additional source/type location info /// for a declaration name. Needs a DeclarationName in order /// to be interpreted correctly. @@ -698,8 +703,7 @@ class DeclarationNameLoc { // The location (if any) of the operator keyword is stored elsewhere. struct CXXOpName { - SourceLocation::UIntTy BeginOpNameLoc; - SourceLocation::UIntTy EndOpNameLoc; + CXXOperatorSourceInfo* OInfo; }; // The location (if any) of the operator keyword is stored elsewhere. @@ -719,11 +723,6 @@ class DeclarationNameLoc { void setNamedTypeLoc(TypeSourceInfo *TInfo) { NamedType.TInfo = TInfo; } - void setCXXOperatorNameRange(SourceRange Range) { - CXXOperatorName.BeginOpNameLoc = Range.getBegin().getRawEncoding(); - CXXOperatorName.EndOpNameLoc = Range.getEnd().getRawEncoding(); - } - void setCXXLiteralOperatorNameLoc(SourceLocation Loc) { CXXLiteralOperatorName.OpNameLoc = Loc.getRawEncoding(); } @@ -739,12 +738,18 @@ class DeclarationNameLoc { /// Return the beginning location of the getCXXOperatorNameRange() range. SourceLocation getCXXOperatorNameBeginLoc() const { - return SourceLocation::getFromRawEncoding(CXXOperatorName.BeginOpNameLoc); + if (!CXXOperatorName.OInfo) + return {}; + return SourceLocation::getFromRawEncoding( + CXXOperatorName.OInfo->BeginOpNameLoc); } /// Return the end location of the getCXXOperatorNameRange() range. SourceLocation getCXXOperatorNameEndLoc() const { - return SourceLocation::getFromRawEncoding(CXXOperatorName.EndOpNameLoc); + if (!CXXOperatorName.OInfo) + return {}; + return SourceLocation::getFromRawEncoding( + CXXOperatorName.OInfo->EndOpNameLoc); } /// Return the range of the operator name (without the operator keyword). @@ -769,17 +774,12 @@ class DeclarationNameLoc { DNL.setNamedTypeLoc(TInfo); return DNL; } - - /// Construct location information for a non-literal C++ operator. - static DeclarationNameLoc makeCXXOperatorNameLoc(SourceLocation BeginLoc, - SourceLocation EndLoc) { - return makeCXXOperatorNameLoc(SourceRange(BeginLoc, EndLoc)); - } - + /// Construct location information for a non-literal C++ operator. - static DeclarationNameLoc makeCXXOperatorNameLoc(SourceRange Range) { + static DeclarationNameLoc + makeCXXOperatorNameLoc(CXXOperatorSourceInfo *OInfo) { DeclarationNameLoc DNL; - DNL.setCXXOperatorNameRange(Range); + DNL.CXXOperatorName.OInfo = OInfo; return DNL; } @@ -839,7 +839,7 @@ struct DeclarationNameInfo { return nullptr; return LocInfo.getNamedTypeInfo(); } - + /// setNamedTypeInfo - Sets the source type info associated to /// the name. Assumes it is a constructor, destructor or conversion. void setNamedTypeInfo(TypeSourceInfo *TInfo) { @@ -849,6 +849,13 @@ struct DeclarationNameInfo { LocInfo = DeclarationNameLoc::makeNamedTypeLoc(TInfo); } + /// Sets the range of the operator name (without the operator keyword). + /// Assumes it is a C++ operator. + void setCXXOperatorNameInfo(CXXOperatorSourceInfo *OInfo) { + assert(Name.getNameKind() == DeclarationName::CXXOperatorName); + LocInfo = DeclarationNameLoc::makeCXXOperatorNameLoc(OInfo); + } + /// getCXXOperatorNameRange - Gets the range of the operator name /// (without the operator keyword). Assumes it is a (non-literal) operator. SourceRange getCXXOperatorNameRange() const { @@ -857,13 +864,6 @@ struct DeclarationNameInfo { return LocInfo.getCXXOperatorNameRange(); } - /// setCXXOperatorNameRange - Sets the range of the operator name - /// (without the operator keyword). Assumes it is a C++ operator. - void setCXXOperatorNameRange(SourceRange R) { - assert(Name.getNameKind() == DeclarationName::CXXOperatorName); - LocInfo = DeclarationNameLoc::makeCXXOperatorNameLoc(R); - } - /// getCXXLiteralOperatorNameLoc - Returns the location of the literal /// operator name (not the operator keyword). /// Assumes it is a literal operator. diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index b13bdd5642977..840469d7cace3 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -3200,6 +3200,15 @@ TypeSourceInfo *ASTContext::getTrivialTypeSourceInfo(QualType T, return DI; } +CXXOperatorSourceInfo * +ASTContext::getCXXOperatorSourceInfo(SourceRange R) const { + auto *TInfo = (CXXOperatorSourceInfo *)BumpAlloc.Allocate( + sizeof(CXXOperatorSourceInfo), 8); + TInfo->BeginOpNameLoc = R.getBegin().getRawEncoding(); + TInfo->EndOpNameLoc = R.getEnd().getRawEncoding(); + return TInfo; +} + const ASTRecordLayout & ASTContext::getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D) const { return getObjCLayout(D); @@ -7095,8 +7104,7 @@ ASTContext::getNameForTemplate(TemplateName Name, } else { DName = DeclarationNames.getCXXOperatorName(TN.getOperator()); // DNInfo work in progress: FIXME: source locations? - DeclarationNameLoc DNLoc = - DeclarationNameLoc::makeCXXOperatorNameLoc(SourceRange()); + DeclarationNameLoc DNLoc = DeclarationNameLoc::makeCXXOperatorNameLoc(nullptr); return DeclarationNameInfo(DName, NameLoc, DNLoc); } } diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp index c4d20554f09ef..a3ca9181aea07 100644 --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -2071,7 +2071,8 @@ ASTNodeImporter::ImportDeclarationNameLoc( case DeclarationName::CXXOperatorName: { if (auto ToRangeOrErr = import(From.getCXXOperatorNameRange())) - To.setCXXOperatorNameRange(*ToRangeOrErr); + To.setCXXOperatorNameInfo( + Importer.ToContext.getCXXOperatorSourceInfo(*ToRangeOrErr)); else return ToRangeOrErr.takeError(); return Error::success(); diff --git a/clang/lib/AST/DeclarationName.cpp b/clang/lib/AST/DeclarationName.cpp index ae5fcf6e86adf..430fa9372b3cf 100644 --- a/clang/lib/AST/DeclarationName.cpp +++ b/clang/lib/AST/DeclarationName.cpp @@ -387,7 +387,7 @@ DeclarationNameLoc::DeclarationNameLoc(DeclarationName Name) { setNamedTypeLoc(nullptr); break; case DeclarationName::CXXOperatorName: - setCXXOperatorNameRange(SourceRange()); + CXXOperatorName.OInfo = nullptr; break; case DeclarationName::CXXLiteralOperatorName: setCXXLiteralOperatorNameLoc(SourceLocation()); diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index a60a558155e69..cbb4f85f6e697 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -5914,11 +5914,14 @@ Sema::GetNameFromUnqualifiedId(const UnqualifiedId &Name) { } case UnqualifiedIdKind::IK_OperatorFunctionId: - NameInfo.setName(Context.DeclarationNames.getCXXOperatorName( - Name.OperatorFunctionId.Operator)); - NameInfo.setCXXOperatorNameRange(SourceRange( - Name.OperatorFunctionId.SymbolLocations[0], Name.EndLocation)); - return NameInfo; + return DeclarationNameInfo( + Context.DeclarationNames.getCXXOperatorName( + Name.OperatorFunctionId.Operator), + Name.StartLocation, + DeclarationNameLoc::makeCXXOperatorNameLoc( + Context.getCXXOperatorSourceInfo( + SourceRange(Name.OperatorFunctionId.SymbolLocations[0], + Name.EndLocation)))); case UnqualifiedIdKind::IK_LiteralOperatorId: NameInfo.setName(Context.DeclarationNames.getCXXLiteralOperatorName( diff --git a/clang/lib/Sema/SemaLambda.cpp b/clang/lib/Sema/SemaLambda.cpp index 2c00616bc62d7..e172a099f5893 100644 --- a/clang/lib/Sema/SemaLambda.cpp +++ b/clang/lib/Sema/SemaLambda.cpp @@ -1004,7 +1004,8 @@ CXXMethodDecl *Sema::CreateLambdaCallOperator(SourceRange IntroducerRange, DeclarationName MethodName = Context.DeclarationNames.getCXXOperatorName(OO_Call); DeclarationNameLoc MethodNameLoc = - DeclarationNameLoc::makeCXXOperatorNameLoc(IntroducerRange.getBegin()); + DeclarationNameLoc::makeCXXOperatorNameLoc( + Context.getCXXOperatorSourceInfo(IntroducerRange.getBegin())); CXXMethodDecl *Method = CXXMethodDecl::Create( Context, Class, SourceLocation(), DeclarationNameInfo(MethodName, IntroducerRange.getBegin(), diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index f5bdd903bcf5c..6e98d2af591c8 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -15829,8 +15829,13 @@ ExprResult Sema::CreateOverloadedArraySubscriptExpr(SourceLocation LLoc, CXXRecordDecl *NamingClass = nullptr; // lookup ignores member operators // CHECKME: no 'operator' keyword? + // DeclarationNameInfo OpNameInfo( + // OpName, LLoc, + // DeclarationNameLoc::makeCXXOperatorNameLoc( + // Context.getCXXOperatorSourceInfo(SourceRange(LLoc, RLoc)))); DeclarationNameInfo OpNameInfo(OpName, LLoc); - OpNameInfo.setCXXOperatorNameRange(SourceRange(LLoc, RLoc)); + OpNameInfo.setCXXOperatorNameInfo( + Context.getCXXOperatorSourceInfo(SourceRange(LLoc, RLoc))); ExprResult Fn = CreateUnresolvedLookupExpr( NamingClass, NestedNameSpecifierLoc(), OpNameInfo, UnresolvedSet<0>()); if (Fn.isInvalid()) @@ -15902,7 +15907,8 @@ ExprResult Sema::CreateOverloadedArraySubscriptExpr(SourceLocation LLoc, // Build the actual expression node. DeclarationNameInfo OpLocInfo(OpName, LLoc); - OpLocInfo.setCXXOperatorNameRange(SourceRange(LLoc, RLoc)); + OpLocInfo.setCXXOperatorNameInfo( + Context.getCXXOperatorSourceInfo(SourceRange(LLoc, RLoc))); ExprResult FnExpr = CreateFunctionRefExpr( *this, FnDecl, Best->FoundDecl, Base, HadMultipleCandidates, OpLocInfo.getLoc(), OpLocInfo.getInfo()); @@ -16532,7 +16538,8 @@ Sema::BuildCallToObjectOfClassType(Scope *S, Expr *Obj, DeclarationNameInfo OpLocInfo( Context.DeclarationNames.getCXXOperatorName(OO_Call), LParenLoc); - OpLocInfo.setCXXOperatorNameRange(SourceRange(LParenLoc, RParenLoc)); + OpLocInfo.setCXXOperatorNameInfo( + Context.getCXXOperatorSourceInfo(SourceRange(LParenLoc, RParenLoc))); ExprResult NewFn = CreateFunctionRefExpr(*this, Method, Best->FoundDecl, Obj, HadMultipleCandidates, OpLocInfo.getLoc(), diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 04c0a0e28fe7c..f75e7df1a393b 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -9792,7 +9792,8 @@ ASTRecordReader::readDeclarationNameLoc(DeclarationName Name) { return DeclarationNameLoc::makeNamedTypeLoc(readTypeSourceInfo()); case DeclarationName::CXXOperatorName: - return DeclarationNameLoc::makeCXXOperatorNameLoc(readSourceRange()); + return DeclarationNameLoc::makeCXXOperatorNameLoc( + getASTContext().getCXXOperatorSourceInfo(readSourceRange())); case DeclarationName::CXXLiteralOperatorName: return DeclarationNameLoc::makeCXXLiteralOperatorNameLoc( From da34ffe59f89bdbe74a9b8023c781f1e83af0275 Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Thu, 26 Jun 2025 15:17:25 +0200 Subject: [PATCH 08/20] Fix some merge conflicts. --- clang/include/clang/Basic/SourceManager.h | 2 +- clang/tools/libclang/CIndex.cpp | 26 ----------------------- 2 files changed, 1 insertion(+), 27 deletions(-) diff --git a/clang/include/clang/Basic/SourceManager.h b/clang/include/clang/Basic/SourceManager.h index 21a1eaaee1e3b..68b1c7b469ecf 100644 --- a/clang/include/clang/Basic/SourceManager.h +++ b/clang/include/clang/Basic/SourceManager.h @@ -1980,7 +1980,7 @@ class SourceManager : public RefCountedBase { FileIDAndOffset getDecomposedExpansionLocSlowCase(const SrcMgr::SLocEntry *E) const; FileIDAndOffset getDecomposedSpellingLocSlowCase(const SrcMgr::SLocEntry *E, - unsigned Offset) const; + SourceLocation::UIntTy Offset) const; void computeMacroArgsCache(MacroArgsMap &MacroArgsCache, FileID FID) const; void associateFileChunkWithMacroArgExp(MacroArgsMap &MacroArgsCache, FileID FID, diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index 01b5b8fb31ad6..0554e155e9380 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -276,15 +276,10 @@ bool CursorVisitor::visitFileRegion() { ASTUnit *Unit = cxtu::getASTUnit(TU); SourceManager &SM = Unit->getSourceManager(); -<<<<<<< HEAD FileIDAndOffset Begin = SM.getDecomposedLoc( SM.getFileLoc(RegionOfInterest.getBegin())), End = SM.getDecomposedLoc( SM.getFileLoc(RegionOfInterest.getEnd())); -======= - auto Begin = SM.getDecomposedLoc(SM.getFileLoc(RegionOfInterest.getBegin())), - End = SM.getDecomposedLoc(SM.getFileLoc(RegionOfInterest.getEnd())); ->>>>>>> 795e9705ad62 (64-bit source location) if (End.first != Begin.first) { // If the end does not reside in the same file, try to recover by @@ -7648,13 +7643,8 @@ CXString clang_getTokenSpelling(CXTranslationUnit TU, CXToken CXTok) { if (!CXXUnit) return cxstring::createEmpty(); -<<<<<<< HEAD - SourceLocation Loc = SourceLocation::getFromRawEncoding(CXTok.int_data[1]); - FileIDAndOffset LocInfo = -======= SourceLocation Loc = SourceLocation::getFromRawEncoding32(CXXUnit->getSourceManager(), CXTok.int_data[1]); auto LocInfo = ->>>>>>> 795e9705ad62 (64-bit source location) CXXUnit->getSourceManager().getDecomposedSpellingLoc(Loc); bool Invalid = false; StringRef Buffer = @@ -7698,15 +7688,9 @@ CXSourceRange clang_getTokenExtent(CXTranslationUnit TU, CXToken CXTok) { static bool getTokens(ASTUnit *CXXUnit, SourceRange Range, SmallVectorImpl &CXTokens) { SourceManager &SourceMgr = CXXUnit->getSourceManager(); -<<<<<<< HEAD FileIDAndOffset BeginLocInfo = SourceMgr.getDecomposedSpellingLoc(Range.getBegin()); FileIDAndOffset EndLocInfo = -======= - auto BeginLocInfo = - SourceMgr.getDecomposedSpellingLoc(Range.getBegin()); - auto EndLocInfo = ->>>>>>> 795e9705ad62 (64-bit source location) SourceMgr.getDecomposedSpellingLoc(Range.getEnd()); // Cannot tokenize across files. @@ -7792,11 +7776,7 @@ CXToken *clang_getToken(CXTranslationUnit TU, CXSourceLocation Location) { if (Begin.isInvalid()) return nullptr; SourceManager &SM = CXXUnit->getSourceManager(); -<<<<<<< HEAD FileIDAndOffset DecomposedEnd = SM.getDecomposedLoc(Begin); -======= - auto DecomposedEnd = SM.getDecomposedLoc(Begin); ->>>>>>> 795e9705ad62 (64-bit source location) DecomposedEnd.second += Lexer::MeasureTokenLength(Begin, SM, CXXUnit->getLangOpts()); @@ -8452,15 +8432,9 @@ static void annotatePreprocessorTokens(CXTranslationUnit TU, Preprocessor &PP = CXXUnit->getPreprocessor(); SourceManager &SourceMgr = CXXUnit->getSourceManager(); -<<<<<<< HEAD FileIDAndOffset BeginLocInfo = SourceMgr.getDecomposedSpellingLoc(RegionOfInterest.getBegin()); FileIDAndOffset EndLocInfo = -======= - auto BeginLocInfo = - SourceMgr.getDecomposedSpellingLoc(RegionOfInterest.getBegin()); - auto EndLocInfo = ->>>>>>> 795e9705ad62 (64-bit source location) SourceMgr.getDecomposedSpellingLoc(RegionOfInterest.getEnd()); if (BeginLocInfo.first != EndLocInfo.first) From 6be8784149b90abf25a7ed33c627d9e991c68aed Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Thu, 26 Jun 2025 16:18:48 +0200 Subject: [PATCH 09/20] Move the Loc back to the StmtBitFields if possible to save AST size. --- clang/include/clang/AST/Expr.h | 21 +-- clang/include/clang/AST/ExprCXX.h | 76 ++++---- clang/include/clang/AST/ExprConcepts.h | 5 +- clang/include/clang/AST/Stmt.h | 214 ++++++++++++++-------- clang/lib/AST/Expr.cpp | 8 +- clang/lib/AST/ExprCXX.cpp | 2 +- clang/lib/AST/ExprConcepts.cpp | 2 +- clang/lib/AST/Stmt.cpp | 2 +- clang/lib/Serialization/ASTReaderStmt.cpp | 17 +- clang/lib/Serialization/ASTWriterStmt.cpp | 2 +- 10 files changed, 214 insertions(+), 135 deletions(-) diff --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h index 994274d9eea0b..6d1c2df6bdc88 100644 --- a/clang/include/clang/AST/Expr.h +++ b/clang/include/clang/AST/Expr.h @@ -2723,7 +2723,6 @@ class UnaryExprOrTypeTraitExpr : public Expr { /// ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting. class ArraySubscriptExpr : public Expr { enum { LHS, RHS, END_EXPR }; - SourceLocation RBracketLoc; Stmt *SubExprs[END_EXPR]; bool lhsIsBase() const { return getRHS()->getType()->isIntegerType(); } @@ -2734,7 +2733,7 @@ class ArraySubscriptExpr : public Expr { : Expr(ArraySubscriptExprClass, t, VK, OK) { SubExprs[LHS] = lhs; SubExprs[RHS] = rhs; - this->RBracketLoc = rbracketloc; + ArrayOrMatrixSubscriptExprBits.RBracketLoc = rbracketloc.getRawEncoding(); setDependence(computeDependence(this)); } @@ -2771,10 +2770,11 @@ class ArraySubscriptExpr : public Expr { SourceLocation getEndLoc() const { return getRBracketLoc(); } SourceLocation getRBracketLoc() const { - return RBracketLoc; + return SourceLocation::getFromRawEncoding( + ArrayOrMatrixSubscriptExprBits.RBracketLoc); } void setRBracketLoc(SourceLocation L) { - RBracketLoc = L; + ArrayOrMatrixSubscriptExprBits.RBracketLoc = L.getRawEncoding(); } SourceLocation getExprLoc() const LLVM_READONLY { @@ -2802,7 +2802,6 @@ class ArraySubscriptExpr : public Expr { /// exist during the initial construction of the AST. class MatrixSubscriptExpr : public Expr { enum { BASE, ROW_IDX, COLUMN_IDX, END_EXPR }; - SourceLocation RBracketLoc; Stmt *SubExprs[END_EXPR]; public: @@ -2813,7 +2812,7 @@ class MatrixSubscriptExpr : public Expr { SubExprs[BASE] = Base; SubExprs[ROW_IDX] = RowIdx; SubExprs[COLUMN_IDX] = ColumnIdx; - this->RBracketLoc = RBracketLoc; + ArrayOrMatrixSubscriptExprBits.RBracketLoc = RBracketLoc.getRawEncoding(); setDependence(computeDependence(this)); } @@ -2854,10 +2853,11 @@ class MatrixSubscriptExpr : public Expr { } SourceLocation getRBracketLoc() const { - return RBracketLoc; + return SourceLocation::getFromRawEncoding( + ArrayOrMatrixSubscriptExprBits.RBracketLoc); } void setRBracketLoc(SourceLocation L) { - RBracketLoc = L; + ArrayOrMatrixSubscriptExprBits.RBracketLoc = L.getRawEncoding(); } static bool classof(const Stmt *T) { @@ -6106,8 +6106,6 @@ class GenericSelectionExpr final friend class ASTStmtReader; friend class ASTStmtWriter; friend TrailingObjects; - /// The location of the "_Generic". - SourceLocation GenericLoc; /// The number of association expressions and the index of the result /// expression in the case where the generic selection expression is not /// result-dependent. The result index is equal to ResultDependentIndex @@ -6457,7 +6455,8 @@ class GenericSelectionExpr final } SourceLocation getGenericLoc() const { - return GenericLoc; + return SourceLocation::getFromRawEncoding( + GenericSelectionExprBits.GenericLoc); } SourceLocation getDefaultLoc() const { return DefaultLoc; } SourceLocation getRParenLoc() const { return RParenLoc; } diff --git a/clang/include/clang/AST/ExprCXX.h b/clang/include/clang/AST/ExprCXX.h index 9da74234658c8..98f40b8a89bf6 100644 --- a/clang/include/clang/AST/ExprCXX.h +++ b/clang/include/clang/AST/ExprCXX.h @@ -720,13 +720,11 @@ class UserDefinedLiteral final : public CallExpr { /// A boolean literal, per ([C++ lex.bool] Boolean literals). class CXXBoolLiteralExpr : public Expr { - SourceLocation Loc; - public: CXXBoolLiteralExpr(bool Val, QualType Ty, SourceLocation Loc) : Expr(CXXBoolLiteralExprClass, Ty, VK_PRValue, OK_Ordinary) { CXXBoolLiteralExprBits.Value = Val; - this->Loc = Loc; + CXXBoolLiteralExprBits.Loc = Loc.getRawEncoding(); setDependence(ExprDependence::None); } @@ -744,8 +742,12 @@ class CXXBoolLiteralExpr : public Expr { SourceLocation getBeginLoc() const { return getLocation(); } SourceLocation getEndLoc() const { return getLocation(); } - SourceLocation getLocation() const { return Loc; } - void setLocation(SourceLocation L) { Loc = L; } + SourceLocation getLocation() const { + return SourceLocation::getFromRawEncoding(CXXBoolLiteralExprBits.Loc); + } + void setLocation(SourceLocation L) { + CXXBoolLiteralExprBits.Loc = L.getRawEncoding(); + } static bool classof(const Stmt *T) { return T->getStmtClass() == CXXBoolLiteralExprClass; @@ -767,11 +769,10 @@ class CXXBoolLiteralExpr : public Expr { /// This also implements the null pointer literal in C23 (C23 6.4.1) which is /// intended to have the same semantics as the feature in C++. class CXXNullPtrLiteralExpr : public Expr { - SourceLocation Loc; public: CXXNullPtrLiteralExpr(QualType Ty, SourceLocation Loc) : Expr(CXXNullPtrLiteralExprClass, Ty, VK_PRValue, OK_Ordinary) { - this->Loc = Loc; + CXXNullPtrLiteralExprBits.Loc = Loc.getRawEncoding(); setDependence(ExprDependence::None); } @@ -781,8 +782,12 @@ class CXXNullPtrLiteralExpr : public Expr { SourceLocation getBeginLoc() const { return getLocation(); } SourceLocation getEndLoc() const { return getLocation(); } - SourceLocation getLocation() const { return Loc; } - void setLocation(SourceLocation L) { Loc = L; } + SourceLocation getLocation() const { + return SourceLocation::getFromRawEncoding(CXXNullPtrLiteralExprBits.Loc); + } + void setLocation(SourceLocation L) { + CXXNullPtrLiteralExprBits.Loc = L.getRawEncoding(); + } static bool classof(const Stmt *T) { return T->getStmtClass() == CXXNullPtrLiteralExprClass; @@ -1155,14 +1160,12 @@ class CXXUuidofExpr : public Expr { /// }; /// \endcode class CXXThisExpr : public Expr { - /// The location of the "this". - SourceLocation Loc; CXXThisExpr(SourceLocation L, QualType Ty, bool IsImplicit, ExprValueKind VK) : Expr(CXXThisExprClass, Ty, VK, OK_Ordinary) { CXXThisExprBits.IsImplicit = IsImplicit; CXXThisExprBits.CapturedByCopyInLambdaWithExplicitObjectParameter = false; - Loc = L; + CXXThisExprBits.Loc = L.getRawEncoding(); setDependence(computeDependence(this)); } @@ -1174,8 +1177,12 @@ class CXXThisExpr : public Expr { static CXXThisExpr *CreateEmpty(const ASTContext &Ctx); - SourceLocation getLocation() const { return Loc; } - void setLocation(SourceLocation L) { Loc = L; } + SourceLocation getLocation() const { + return SourceLocation::getFromRawEncoding(CXXThisExprBits.Loc); + } + void setLocation(SourceLocation L) { + CXXThisExprBits.Loc = L.getRawEncoding(); + } SourceLocation getBeginLoc() const { return getLocation(); } SourceLocation getEndLoc() const { return getLocation(); } @@ -1216,8 +1223,6 @@ class CXXThrowExpr : public Expr { /// The optional expression in the throw statement. Stmt *Operand; - /// The location of the "throw". - SourceLocation ThrowLoc; public: // \p Ty is the void type which is used as the result type of the @@ -1227,7 +1232,7 @@ class CXXThrowExpr : public Expr { CXXThrowExpr(Expr *Operand, QualType Ty, SourceLocation Loc, bool IsThrownVariableInScope) : Expr(CXXThrowExprClass, Ty, VK_PRValue, OK_Ordinary), Operand(Operand) { - ThrowLoc = Loc; + CXXThrowExprBits.ThrowLoc = Loc.getRawEncoding(); CXXThrowExprBits.IsThrownVariableInScope = IsThrownVariableInScope; setDependence(computeDependence(this)); } @@ -1236,7 +1241,9 @@ class CXXThrowExpr : public Expr { const Expr *getSubExpr() const { return cast_or_null(Operand); } Expr *getSubExpr() { return cast_or_null(Operand); } - SourceLocation getThrowLoc() const { return ThrowLoc; } + SourceLocation getThrowLoc() const { + return SourceLocation::getFromRawEncoding(CXXThrowExprBits.ThrowLoc); + } /// Determines whether the variable thrown by this expression (if any!) /// is within the innermost try block. @@ -1285,9 +1292,7 @@ class CXXDefaultArgExpr final /// The context where the default argument expression was used. DeclContext *UsedContext; - - /// The location where the default argument expression was used. - SourceLocation Loc; + CXXDefaultArgExpr(StmtClass SC, SourceLocation Loc, ParmVarDecl *Param, Expr *RewrittenExpr, DeclContext *UsedContext) : Expr(SC, @@ -1297,7 +1302,7 @@ class CXXDefaultArgExpr final Param->getDefaultArg()->getValueKind(), Param->getDefaultArg()->getObjectKind()), Param(Param), UsedContext(UsedContext) { - this->Loc = Loc; + CXXDefaultArgExprBits.Loc = Loc.getRawEncoding(); CXXDefaultArgExprBits.HasRewrittenInit = RewrittenExpr != nullptr; if (RewrittenExpr) *getTrailingObjects() = RewrittenExpr; @@ -1351,7 +1356,9 @@ class CXXDefaultArgExpr final DeclContext *getUsedContext() { return UsedContext; } /// Retrieve the location where this default argument was actually used. - SourceLocation getUsedLocation() const { return Loc; } + SourceLocation getUsedLocation() const { + return SourceLocation::getFromRawEncoding(CXXDefaultArgExprBits.Loc); + } /// Default argument expressions have no representation in the /// source, so they have an empty source range. @@ -1394,8 +1401,6 @@ class CXXDefaultInitExpr final /// The context where the default initializer expression was used. DeclContext *UsedContext; - /// The location where the default initializer expression was used. - SourceLocation Loc; CXXDefaultInitExpr(const ASTContext &Ctx, SourceLocation Loc, FieldDecl *Field, QualType Ty, DeclContext *UsedContext, Expr *RewrittenInitExpr); @@ -1449,8 +1454,10 @@ class CXXDefaultInitExpr final /// actually used. SourceLocation getUsedLocation() const { return getBeginLoc(); } - SourceLocation getBeginLoc() const { return Loc; } - SourceLocation getEndLoc() const { return Loc; } + SourceLocation getBeginLoc() const { + return SourceLocation::getFromRawEncoding(CXXDefaultInitExprBits.Loc); + } + SourceLocation getEndLoc() const { return getBeginLoc(); } static bool classof(const Stmt *T) { return T->getStmtClass() == CXXDefaultInitExprClass; @@ -2196,7 +2203,6 @@ class CXXScalarValueInitExpr : public Expr { friend class ASTStmtReader; TypeSourceInfo *TypeInfo; - SourceLocation RParenLoc; public: /// Create an explicitly-written scalar-value initialization @@ -2205,7 +2211,7 @@ class CXXScalarValueInitExpr : public Expr { SourceLocation RParenLoc) : Expr(CXXScalarValueInitExprClass, Type, VK_PRValue, OK_Ordinary), TypeInfo(TypeInfo) { - this->RParenLoc = RParenLoc; + CXXScalarValueInitExprBits.RParenLoc = RParenLoc.getRawEncoding(); setDependence(computeDependence(this)); } @@ -2217,7 +2223,8 @@ class CXXScalarValueInitExpr : public Expr { } SourceLocation getRParenLoc() const { - return RParenLoc; + return SourceLocation::getFromRawEncoding( + CXXScalarValueInitExprBits.RParenLoc); } SourceLocation getBeginLoc() const LLVM_READONLY; @@ -2623,8 +2630,7 @@ class CXXDeleteExpr : public Expr { /// The pointer expression to be deleted. Stmt *Argument = nullptr; - /// Location of the expression. - SourceLocation Loc; + public: CXXDeleteExpr(QualType Ty, bool GlobalDelete, bool ArrayForm, bool ArrayFormAsWritten, bool UsualArrayDeleteWantsSize, @@ -2635,7 +2641,7 @@ class CXXDeleteExpr : public Expr { CXXDeleteExprBits.ArrayForm = ArrayForm; CXXDeleteExprBits.ArrayFormAsWritten = ArrayFormAsWritten; CXXDeleteExprBits.UsualArrayDeleteWantsSize = UsualArrayDeleteWantsSize; - this->Loc = Loc; + CXXDeleteExprBits.Loc = Loc.getRawEncoding(); setDependence(computeDependence(this)); } @@ -2666,7 +2672,9 @@ class CXXDeleteExpr : public Expr { /// be a pointer, return an invalid type. QualType getDestroyedType() const; - SourceLocation getBeginLoc() const { return Loc; } + SourceLocation getBeginLoc() const { + return SourceLocation::getFromRawEncoding(CXXDeleteExprBits.Loc); + } SourceLocation getEndLoc() const LLVM_READONLY { return Argument->getEndLoc(); } diff --git a/clang/include/clang/AST/ExprConcepts.h b/clang/include/clang/AST/ExprConcepts.h index 9d1fc29a2753e..c6724315194f9 100644 --- a/clang/include/clang/AST/ExprConcepts.h +++ b/clang/include/clang/AST/ExprConcepts.h @@ -503,7 +503,6 @@ class RequiresExpr final : public Expr, friend TrailingObjects; friend class ASTStmtReader; friend class ASTStmtWriter; - SourceLocation RequiresKWLoc; unsigned NumLocalParameters; unsigned NumRequirements; @@ -562,7 +561,7 @@ class RequiresExpr final : public Expr, } SourceLocation getRequiresKWLoc() const { - return RequiresKWLoc; + return SourceLocation::getFromRawEncoding(RequiresExprBits.RequiresKWLoc); } SourceLocation getLParenLoc() const { return LParenLoc; } @@ -574,7 +573,7 @@ class RequiresExpr final : public Expr, } SourceLocation getBeginLoc() const LLVM_READONLY { - return RequiresKWLoc; + return getRequiresKWLoc(); } SourceLocation getEndLoc() const LLVM_READONLY { return RBraceLoc; diff --git a/clang/include/clang/AST/Stmt.h b/clang/include/clang/AST/Stmt.h index e3d5bac743848..79991de6ed881 100644 --- a/clang/include/clang/AST/Stmt.h +++ b/clang/include/clang/AST/Stmt.h @@ -138,7 +138,9 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(bool) unsigned HasLeadingEmptyMacro : 1; - + /// The location of the semi-colon.Add commentMore actions + LLVM_PREFERRED_TYPE(SourceLocation) + unsigned long SemiLoc : SourceLocation::Bits; }; class CompoundStmtBitfields { @@ -162,7 +164,8 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(StmtBitfields) unsigned : NumStmtBits; - + LLVM_PREFERRED_TYPE(SourceLocation) + unsigned long IdentLoc : SourceLocation::Bits; }; class AttributedStmtBitfields { @@ -174,8 +177,6 @@ class alignas(void *) Stmt { /// Number of attributes. unsigned NumAttrs : 32 - NumStmtBits; - - }; class IfStmtBitfields { @@ -201,7 +202,9 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(bool) unsigned HasInit : 1; - + /// The location of the "if" + LLVM_PREFERRED_TYPE(SourceLocation) + unsigned long IfLoc : SourceLocation::Bits; }; class SwitchStmtBitfields { @@ -224,7 +227,9 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(bool) unsigned AllEnumCasesCovered : 1; - + /// The location of the "switch". + LLVM_PREFERRED_TYPE(SourceLocation) + unsigned long SwitchLoc : SourceLocation::Bits; }; class WhileStmtBitfields { @@ -238,7 +243,9 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(bool) unsigned HasVar : 1; - + /// The location of the "while" + LLVM_PREFERRED_TYPE(SourceLocation) + unsigned long WhileLoc : SourceLocation::Bits; }; class DoStmtBitfields { @@ -247,7 +254,9 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(StmtBitfields) unsigned : NumStmtBits; - + /// The location of the "do" + LLVM_PREFERRED_TYPE(SourceLocation) + unsigned long DoLoc : SourceLocation::Bits; }; class ForStmtBitfields { @@ -256,7 +265,9 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(StmtBitfields) unsigned : NumStmtBits; - + /// The location of the "for" + LLVM_PREFERRED_TYPE(SourceLocation) + unsigned long ForLoc : SourceLocation::Bits; }; class GotoStmtBitfields { @@ -266,7 +277,9 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(StmtBitfields) unsigned : NumStmtBits; - + /// The location of the "goto" + LLVM_PREFERRED_TYPE(SourceLocation) + unsigned long GotoLoc : SourceLocation::Bits; }; class ContinueStmtBitfields { @@ -275,7 +288,9 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(StmtBitfields) unsigned : NumStmtBits; - + /// The location of the "continue" + LLVM_PREFERRED_TYPE(SourceLocation) + unsigned long ContinueLoc : SourceLocation::Bits; }; class BreakStmtBitfields { @@ -284,7 +299,9 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(StmtBitfields) unsigned : NumStmtBits; - + /// The location of the "break" + LLVM_PREFERRED_TYPE(SourceLocation) + unsigned long BreakLoc : SourceLocation::Bits; }; class ReturnStmtBitfields { @@ -297,7 +314,9 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(bool) unsigned HasNRVOCandidate : 1; - + /// The location of the "return" + LLVM_PREFERRED_TYPE(SourceLocation) + unsigned long RetLoc : SourceLocation::Bits; }; class SwitchCaseBitfields { @@ -312,7 +331,9 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(bool) unsigned CaseStmtIsGNURange : 1; - + /// The location of the "case" or "default" keyword. + LLVM_PREFERRED_TYPE(SourceLocation) + unsigned long KeywordLoc : SourceLocation::Bits; }; //===--- Expression bitfields classes ---===// @@ -409,8 +430,6 @@ class alignas(void *) Stmt { /// MSVC compatibility). LLVM_PREFERRED_TYPE(bool) unsigned IsTransparent : 1; - - }; class DeclRefExprBitfields { @@ -530,7 +549,8 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(ExprBitfields) unsigned : NumExprBits; - + LLVM_PREFERRED_TYPE(SourceLocation) + unsigned long RBracketLoc : SourceLocation::Bits; }; class CallExprBitfields { @@ -683,7 +703,9 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(ExprBitfields) unsigned : NumExprBits; - + /// The location of the "_Generic" + LLVM_PREFERRED_TYPE(SourceLocation) + unsigned long GenericLoc : SourceLocation::Bits; }; class PseudoObjectExprBitfields { @@ -790,6 +812,10 @@ class alignas(void *) Stmt { /// The value of the boolean literal. LLVM_PREFERRED_TYPE(bool) unsigned Value : 1; + + /// The location of the boolean ligeral + LLVM_PREFERRED_TYPE(SourceLocation) + unsigned long Loc : SourceLocation::Bits; }; class CXXNullPtrLiteralExprBitfields { @@ -799,6 +825,8 @@ class alignas(void *) Stmt { unsigned : NumExprBits; /// The location of the null pointer literal. + LLVM_PREFERRED_TYPE(SourceLocation) + unsigned long Loc : SourceLocation::Bits; }; class CXXThisExprBitfields { @@ -816,6 +844,9 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(bool) unsigned CapturedByCopyInLambdaWithExplicitObjectParameter : 1; + /// The location of the "this" + LLVM_PREFERRED_TYPE(SourceLocation) + unsigned long Loc : SourceLocation::Bits; }; class CXXThrowExprBitfields { @@ -829,6 +860,9 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(bool) unsigned IsThrownVariableInScope : 1; + /// The location of the "throw" + LLVM_PREFERRED_TYPE(SourceLocation) + unsigned long ThrowLoc : SourceLocation::Bits; }; class CXXDefaultArgExprBitfields { @@ -842,7 +876,9 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(bool) unsigned HasRewrittenInit : 1; - + /// The location where the default argument expression was used. + LLVM_PREFERRED_TYPE(SourceLocation) + unsigned long Loc : SourceLocation::Bits; }; class CXXDefaultInitExprBitfields { @@ -857,7 +893,9 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(bool) unsigned HasRewrittenInit : 1; - + /// The location where the default initializer expression was used. + LLVM_PREFERRED_TYPE(SourceLocation) + unsigned long Loc : SourceLocation::Bits; }; class CXXScalarValueInitExprBitfields { @@ -867,6 +905,9 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(ExprBitfields) unsigned : NumExprBits; + /// The location where the default initializer expression was used. + LLVM_PREFERRED_TYPE(SourceLocation) + unsigned long RParenLoc : SourceLocation::Bits; }; class CXXNewExprBitfields { @@ -941,7 +982,9 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(bool) unsigned UsualArrayDeleteWantsSize : 1; - + /// Location of the expression + LLVM_PREFERRED_TYPE(SourceLocation) + unsigned long Loc : SourceLocation::Bits; }; class TypeTraitExprBitfields { @@ -1135,6 +1178,7 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(ExprBitfields) unsigned : NumExprBits; + /// The location of the non-type template parameter reference. LLVM_PREFERRED_TYPE(SourceLocation) unsigned long NameLoc : SourceLocation::Bits; @@ -1176,6 +1220,9 @@ class alignas(void *) Stmt { LLVM_PREFERRED_TYPE(bool) unsigned IsSatisfied : 1; + + LLVM_PREFERRED_TYPE(SourceLocation) + unsigned long RequiresKWLoc : SourceLocation::Bits; }; class ArrayTypeTraitExprBitfields { @@ -1667,8 +1714,6 @@ class DeclStmt : public Stmt { /// NullStmt - This is the null statement ";": C99 6.8.3p3. /// class NullStmt : public Stmt { - /// The location of the semi-colon. - SourceLocation SemiLoc; public: NullStmt(SourceLocation L, bool hasLeadingEmptyMacro = false) : Stmt(NullStmtClass) { @@ -1679,8 +1724,12 @@ class NullStmt : public Stmt { /// Build an empty null statement. explicit NullStmt(EmptyShell Empty) : Stmt(NullStmtClass, Empty) {} - SourceLocation getSemiLoc() const { return SemiLoc; } - void setSemiLoc(SourceLocation L) { SemiLoc = L; } + SourceLocation getSemiLoc() const { + return SourceLocation::getFromRawEncoding(NullStmtBits.SemiLoc); + } + void setSemiLoc(SourceLocation L) { + NullStmtBits.SemiLoc = L.getRawEncoding(); + } bool hasLeadingEmptyMacro() const { return NullStmtBits.HasLeadingEmptyMacro; @@ -1860,8 +1909,6 @@ class CompoundStmt final // SwitchCase is the base class for CaseStmt and DefaultStmt, class SwitchCase : public Stmt { protected: - /// The location of the "case" or "default" keyword. - SourceLocation KeywordLoc; /// The location of the ":". SourceLocation ColonLoc; @@ -1884,8 +1931,12 @@ class SwitchCase : public Stmt { SwitchCase *getNextSwitchCase() { return NextSwitchCase; } void setNextSwitchCase(SwitchCase *SC) { NextSwitchCase = SC; } - SourceLocation getKeywordLoc() const { return KeywordLoc; } - void setKeywordLoc(SourceLocation L) { KeywordLoc = L; } + SourceLocation getKeywordLoc() const { + return SourceLocation::getFromRawEncoding(SwitchCaseBits.KeywordLoc); + } + void setKeywordLoc(SourceLocation L) { + SwitchCaseBits.KeywordLoc = L.getRawEncoding(); + } SourceLocation getColonLoc() const { return ColonLoc; } void setColonLoc(SourceLocation L) { ColonLoc = L; } @@ -2135,7 +2186,6 @@ class ValueStmt : public Stmt { /// LabelStmt - Represents a label, which has a substatement. For example: /// foo: return; class LabelStmt : public ValueStmt { - SourceLocation IdentLoc; LabelDecl *TheDecl; Stmt *SubStmt; bool SideEntry = false; // FIXME: could improve @@ -2150,8 +2200,12 @@ class LabelStmt : public ValueStmt { /// Build an empty label statement. explicit LabelStmt(EmptyShell Empty) : ValueStmt(LabelStmtClass, Empty) {} - SourceLocation getIdentLoc() const { return IdentLoc; } - void setIdentLoc(SourceLocation L) { IdentLoc = L; } + SourceLocation getIdentLoc() const { + return SourceLocation::getFromRawEncoding(LabelStmtBits.IdentLoc); + } + void setIdentLoc(SourceLocation L) { + LabelStmtBits.IdentLoc = L.getRawEncoding(); + } LabelDecl *getDecl() const { return TheDecl; } void setDecl(LabelDecl *D) { TheDecl = D; } @@ -2268,8 +2322,6 @@ class IfStmt final // Present if and only if hasElseStorage(). enum { InitOffset = 0, ThenOffsetFromCond = 1, ElseOffsetFromCond = 2 }; enum { NumMandatoryStmtPtr = 2 }; - /// The location of the "if". - SourceLocation IfLoc; SourceLocation LParenLoc; SourceLocation RParenLoc; @@ -2409,8 +2461,12 @@ class IfStmt final getTrailingObjects()[initOffset()] = Init; } - SourceLocation getIfLoc() const { return IfLoc; } - void setIfLoc(SourceLocation IfLoc) { this->IfLoc = IfLoc; } + SourceLocation getIfLoc() const { + return SourceLocation::getFromRawEncoding(IfStmtBits.IfLoc); + } + void setIfLoc(SourceLocation IfLoc) { + IfStmtBits.IfLoc = IfLoc.getRawEncoding(); + } SourceLocation getElseLoc() const { return hasElseStorage() ? *getTrailingObjects() @@ -2495,8 +2551,6 @@ class IfStmt final class SwitchStmt final : public Stmt, private llvm::TrailingObjects { friend TrailingObjects; - /// The location of the "switch". - SourceLocation SwitchLoc; /// Points to a linked list of case and default statements. SwitchCase *FirstCase = nullptr; @@ -2629,8 +2683,12 @@ class SwitchStmt final : public Stmt, const SwitchCase *getSwitchCaseList() const { return FirstCase; } void setSwitchCaseList(SwitchCase *SC) { FirstCase = SC; } - SourceLocation getSwitchLoc() const { return SwitchLoc; } - void setSwitchLoc(SourceLocation L) { SwitchLoc = L; } + SourceLocation getSwitchLoc() const { + return SourceLocation::getFromRawEncoding(SwitchStmtBits.SwitchLoc); + } + void setSwitchLoc(SourceLocation L) { + SwitchStmtBits.SwitchLoc = L.getRawEncoding(); + } SourceLocation getLParenLoc() const { return LParenLoc; } void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; } SourceLocation getRParenLoc() const { return RParenLoc; } @@ -2702,8 +2760,6 @@ class WhileStmt final : public Stmt, // enum { VarOffset = 0, BodyOffsetFromCond = 1 }; enum { NumMandatoryStmtPtr = 2 }; - /// The location of the "while". - SourceLocation WhileLoc; SourceLocation LParenLoc, RParenLoc; unsigned varOffset() const { return VarOffset; } @@ -2788,8 +2844,12 @@ class WhileStmt final : public Stmt, getTrailingObjects()[varOffset()] = CondVar; } - SourceLocation getWhileLoc() const { return WhileLoc; } - void setWhileLoc(SourceLocation L) { WhileLoc = L; } + SourceLocation getWhileLoc() const { + return SourceLocation::getFromRawEncoding(WhileStmtBits.WhileLoc); + } + void setWhileLoc(SourceLocation L) { + WhileStmtBits.WhileLoc = L.getRawEncoding(); + } SourceLocation getLParenLoc() const { return LParenLoc; } void setLParenLoc(SourceLocation L) { LParenLoc = L; } @@ -2823,8 +2883,6 @@ class DoStmt : public Stmt { Stmt *SubExprs[END_EXPR]; SourceLocation WhileLoc; SourceLocation RParenLoc; // Location of final ')' in do stmt condition. - /// The location of the "do". - SourceLocation DoLoc; public: DoStmt(Stmt *Body, Expr *Cond, SourceLocation DL, SourceLocation WL, SourceLocation RP) @@ -2848,8 +2906,10 @@ class DoStmt : public Stmt { const Stmt *getBody() const { return SubExprs[BODY]; } void setBody(Stmt *Body) { SubExprs[BODY] = Body; } - SourceLocation getDoLoc() const { return DoLoc; } - void setDoLoc(SourceLocation L) { DoLoc = L; } + SourceLocation getDoLoc() const { + return SourceLocation::getFromRawEncoding(DoStmtBits.DoLoc); + } + void setDoLoc(SourceLocation L) { DoStmtBits.DoLoc = L.getRawEncoding(); } SourceLocation getWhileLoc() const { return WhileLoc; } void setWhileLoc(SourceLocation L) { WhileLoc = L; } SourceLocation getRParenLoc() const { return RParenLoc; } @@ -2879,8 +2939,6 @@ class ForStmt : public Stmt { friend class ASTStmtReader; enum { INIT, CONDVAR, COND, INC, BODY, END_EXPR }; - /// The location of the "for". - SourceLocation ForLoc; Stmt* SubExprs[END_EXPR]; // SubExprs[INIT] is an expression or declstmt. SourceLocation LParenLoc, RParenLoc; @@ -2933,8 +2991,10 @@ class ForStmt : public Stmt { void setInc(Expr *E) { SubExprs[INC] = reinterpret_cast(E); } void setBody(Stmt *S) { SubExprs[BODY] = S; } - SourceLocation getForLoc() const { return ForLoc; } - void setForLoc(SourceLocation L) { ForLoc = L; } + SourceLocation getForLoc() const { + return SourceLocation::getFromRawEncoding(ForStmtBits.ForLoc); + } + void setForLoc(SourceLocation L) { ForStmtBits.ForLoc = L.getRawEncoding(); } SourceLocation getLParenLoc() const { return LParenLoc; } void setLParenLoc(SourceLocation L) { LParenLoc = L; } SourceLocation getRParenLoc() const { return RParenLoc; } @@ -2960,8 +3020,6 @@ class ForStmt : public Stmt { /// GotoStmt - This represents a direct goto. class GotoStmt : public Stmt { LabelDecl *Label; - /// The location of the "goto". - SourceLocation GotoLoc; SourceLocation LabelLoc; public: @@ -2976,8 +3034,12 @@ class GotoStmt : public Stmt { LabelDecl *getLabel() const { return Label; } void setLabel(LabelDecl *D) { Label = D; } - SourceLocation getGotoLoc() const { return GotoLoc; } - void setGotoLoc(SourceLocation L) { GotoLoc = L; } + SourceLocation getGotoLoc() const { + return SourceLocation::getFromRawEncoding(GotoStmtBits.GotoLoc); + } + void setGotoLoc(SourceLocation L) { + GotoStmtBits.GotoLoc = L.getRawEncoding(); + } SourceLocation getLabelLoc() const { return LabelLoc; } void setLabelLoc(SourceLocation L) { LabelLoc = L; } @@ -3000,8 +3062,6 @@ class GotoStmt : public Stmt { /// IndirectGotoStmt - This represents an indirect goto. class IndirectGotoStmt : public Stmt { - /// The location of the "goto". - SourceLocation GotoLoc; SourceLocation StarLoc; Stmt *Target; @@ -3016,8 +3076,12 @@ class IndirectGotoStmt : public Stmt { explicit IndirectGotoStmt(EmptyShell Empty) : Stmt(IndirectGotoStmtClass, Empty) {} - void setGotoLoc(SourceLocation L) { GotoLoc = L; } - SourceLocation getGotoLoc() const { return GotoLoc; } + void setGotoLoc(SourceLocation L) { + GotoStmtBits.GotoLoc = L.getRawEncoding(); + } + SourceLocation getGotoLoc() const { + return SourceLocation::getFromRawEncoding(GotoStmtBits.GotoLoc); + } void setStarLoc(SourceLocation L) { StarLoc = L; } SourceLocation getStarLoc() const { return StarLoc; } @@ -3051,8 +3115,6 @@ class IndirectGotoStmt : public Stmt { /// ContinueStmt - This represents a continue. class ContinueStmt : public Stmt { - /// The location of the "continue". - SourceLocation ContinueLoc; public: ContinueStmt(SourceLocation CL) : Stmt(ContinueStmtClass) { @@ -3062,8 +3124,12 @@ class ContinueStmt : public Stmt { /// Build an empty continue statement. explicit ContinueStmt(EmptyShell Empty) : Stmt(ContinueStmtClass, Empty) {} - SourceLocation getContinueLoc() const { return ContinueLoc; } - void setContinueLoc(SourceLocation L) { ContinueLoc = L; } + SourceLocation getContinueLoc() const { + return SourceLocation::getFromRawEncoding(ContinueStmtBits.ContinueLoc); + } + void setContinueLoc(SourceLocation L) { + ContinueStmtBits.ContinueLoc = L.getRawEncoding(); + } SourceLocation getBeginLoc() const { return getContinueLoc(); } SourceLocation getEndLoc() const { return getContinueLoc(); } @@ -3084,8 +3150,6 @@ class ContinueStmt : public Stmt { /// BreakStmt - This represents a break. class BreakStmt : public Stmt { - /// The location of the "break". - SourceLocation BreakLoc; public: BreakStmt(SourceLocation BL) : Stmt(BreakStmtClass) { setBreakLoc(BL); @@ -3094,8 +3158,12 @@ class BreakStmt : public Stmt { /// Build an empty break statement. explicit BreakStmt(EmptyShell Empty) : Stmt(BreakStmtClass, Empty) {} - SourceLocation getBreakLoc() const { return BreakLoc; } - void setBreakLoc(SourceLocation L) { BreakLoc = L; } + SourceLocation getBreakLoc() const { + return SourceLocation::getFromRawEncoding(BreakStmtBits.BreakLoc); + } + void setBreakLoc(SourceLocation L) { + BreakStmtBits.BreakLoc = L.getRawEncoding(); + } SourceLocation getBeginLoc() const { return getBreakLoc(); } SourceLocation getEndLoc() const { return getBreakLoc(); } @@ -3126,8 +3194,6 @@ class ReturnStmt final : public Stmt, private llvm::TrailingObjects { friend TrailingObjects; - /// The location of the "return". - SourceLocation RetLoc; /// The return expression. Stmt *RetExpr; @@ -3174,8 +3240,12 @@ class ReturnStmt final *getTrailingObjects() = Var; } - SourceLocation getReturnLoc() const { return RetLoc; } - void setReturnLoc(SourceLocation L) { RetLoc = L; } + SourceLocation getReturnLoc() const { + return SourceLocation::getFromRawEncoding(ReturnStmtBits.RetLoc); + } + void setReturnLoc(SourceLocation L) { + ReturnStmtBits.RetLoc = L.getRawEncoding(); + } SourceLocation getBeginLoc() const { return getReturnLoc(); } SourceLocation getEndLoc() const LLVM_READONLY { diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 3258ac2195aab..d2c72294e0289 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -4421,7 +4421,7 @@ GenericSelectionExpr::GenericSelectionExpr( " and TypeSourceInfo!"); assert(ResultIndex < NumAssocs && "ResultIndex is out-of-bounds!"); - this->GenericLoc = GenericLoc; + GenericSelectionExprBits.GenericLoc = GenericLoc.getRawEncoding(); getTrailingObjects()[getIndexOfControllingExpression()] = ControllingExpr; llvm::copy(AssocExprs, @@ -4448,7 +4448,7 @@ GenericSelectionExpr::GenericSelectionExpr( " and TypeSourceInfo!"); assert(ResultIndex < NumAssocs && "ResultIndex is out-of-bounds!"); - this->GenericLoc = GenericLoc; + GenericSelectionExprBits.GenericLoc = GenericLoc.getRawEncoding(); getTrailingObjects()[getIndexOfControllingType()] = ControllingType; llvm::copy(AssocExprs, @@ -4472,7 +4472,7 @@ GenericSelectionExpr::GenericSelectionExpr( "Must have the same number of association expressions" " and TypeSourceInfo!"); - this->GenericLoc = GenericLoc; + GenericSelectionExprBits.GenericLoc = GenericLoc.getRawEncoding(); getTrailingObjects()[getIndexOfControllingExpression()] = ControllingExpr; llvm::copy(AssocExprs, @@ -4496,7 +4496,7 @@ GenericSelectionExpr::GenericSelectionExpr( "Must have the same number of association expressions" " and TypeSourceInfo!"); - this->GenericLoc = GenericLoc; + GenericSelectionExprBits.GenericLoc = GenericLoc.getRawEncoding(); getTrailingObjects()[getIndexOfControllingType()] = ControllingType; llvm::copy(AssocExprs, diff --git a/clang/lib/AST/ExprCXX.cpp b/clang/lib/AST/ExprCXX.cpp index f503b33d84047..07bef9e568ce9 100644 --- a/clang/lib/AST/ExprCXX.cpp +++ b/clang/lib/AST/ExprCXX.cpp @@ -1060,7 +1060,7 @@ CXXDefaultInitExpr::CXXDefaultInitExpr(const ASTContext &Ctx, : VK_PRValue, /*FIXME*/ OK_Ordinary), Field(Field), UsedContext(UsedContext) { - this->Loc = Loc; + CXXDefaultInitExprBits.Loc = Loc.getRawEncoding(); CXXDefaultInitExprBits.HasRewrittenInit = RewrittenInitExpr != nullptr; if (CXXDefaultInitExprBits.HasRewrittenInit) diff --git a/clang/lib/AST/ExprConcepts.cpp b/clang/lib/AST/ExprConcepts.cpp index 4dce391116729..df818922825cf 100644 --- a/clang/lib/AST/ExprConcepts.cpp +++ b/clang/lib/AST/ExprConcepts.cpp @@ -123,7 +123,7 @@ RequiresExpr::RequiresExpr(ASTContext &C, SourceLocation RequiresKWLoc, NumRequirements(Requirements.size()), Body(Body), LParenLoc(LParenLoc), RParenLoc(RParenLoc), RBraceLoc(RBraceLoc) { RequiresExprBits.IsSatisfied = false; - this->RequiresKWLoc = RequiresKWLoc; + RequiresExprBits.RequiresKWLoc = RequiresKWLoc.getRawEncoding(); bool Dependent = false; bool ContainsUnexpandedParameterPack = false; for (ParmVarDecl *P : LocalParameters) { diff --git a/clang/lib/AST/Stmt.cpp b/clang/lib/AST/Stmt.cpp index e0bfcb93313cc..41c53f9be6027 100644 --- a/clang/lib/AST/Stmt.cpp +++ b/clang/lib/AST/Stmt.cpp @@ -1072,7 +1072,7 @@ ForStmt::ForStmt(const ASTContext &C, Stmt *Init, Expr *Cond, VarDecl *condVar, SubExprs[COND] = Cond; SubExprs[INC] = Inc; SubExprs[BODY] = Body; - ForLoc = FL; + ForStmtBits.ForLoc = FL.getRawEncoding(); } VarDecl *ForStmt::getConditionVariable() const { diff --git a/clang/lib/Serialization/ASTReaderStmt.cpp b/clang/lib/Serialization/ASTReaderStmt.cpp index e85ec09fd95f5..51115ac3796de 100644 --- a/clang/lib/Serialization/ASTReaderStmt.cpp +++ b/clang/lib/Serialization/ASTReaderStmt.cpp @@ -843,7 +843,8 @@ void ASTStmtReader::VisitRequiresExpr(RequiresExpr *E) { VisitExpr(E); unsigned NumLocalParameters = Record.readInt(); unsigned NumRequirements = Record.readInt(); - E->RequiresKWLoc = Record.readSourceLocation(); + E->RequiresExprBits.RequiresKWLoc = + Record.readSourceLocation().getRawEncoding(); E->RequiresExprBits.IsSatisfied = Record.readInt(); E->Body = Record.readDeclAs(); llvm::SmallVector LocalParameters; @@ -1410,7 +1411,8 @@ void ASTStmtReader::VisitGenericSelectionExpr(GenericSelectionExpr *E) { assert(NumAssocs == E->getNumAssocs() && "Wrong NumAssocs!"); E->IsExprPredicate = Record.readInt(); E->ResultIndex = Record.readInt(); - E->GenericLoc = readSourceLocation(); + E->GenericSelectionExprBits.GenericLoc = + readSourceLocation().getRawEncoding(); E->DefaultLoc = readSourceLocation(); E->RParenLoc = readSourceLocation(); @@ -1880,7 +1882,7 @@ void ASTStmtReader::VisitCXXThisExpr(CXXThisExpr *E) { void ASTStmtReader::VisitCXXThrowExpr(CXXThrowExpr *E) { VisitExpr(E); - E->ThrowLoc = readSourceLocation(); + E->CXXThrowExprBits.ThrowLoc = readSourceLocation().getRawEncoding(); E->Operand = Record.readSubExpr(); E->CXXThrowExprBits.IsThrownVariableInScope = Record.readInt(); } @@ -1889,7 +1891,7 @@ void ASTStmtReader::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) { VisitExpr(E); E->Param = readDeclAs(); E->UsedContext = readDeclAs(); - E->Loc = readSourceLocation(); + E->CXXDefaultArgExprBits.Loc = readSourceLocation().getRawEncoding(); E->CXXDefaultArgExprBits.HasRewrittenInit = Record.readInt(); if (E->CXXDefaultArgExprBits.HasRewrittenInit) *E->getTrailingObjects() = Record.readSubExpr(); @@ -1900,7 +1902,7 @@ void ASTStmtReader::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E) { E->CXXDefaultInitExprBits.HasRewrittenInit = Record.readInt(); E->Field = readDeclAs(); E->UsedContext = readDeclAs(); - E->Loc = readSourceLocation(); + E->CXXDefaultInitExprBits.Loc = readSourceLocation().getRawEncoding(); if (E->CXXDefaultInitExprBits.HasRewrittenInit) *E->getTrailingObjects() = Record.readSubExpr(); } @@ -1914,7 +1916,8 @@ void ASTStmtReader::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { void ASTStmtReader::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) { VisitExpr(E); E->TypeInfo = readTypeSourceInfo(); - E->RParenLoc = readSourceLocation(); + E->CXXScalarValueInitExprBits.RParenLoc = + readSourceLocation().getRawEncoding(); } void ASTStmtReader::VisitCXXNewExpr(CXXNewExpr *E) { @@ -1964,7 +1967,7 @@ void ASTStmtReader::VisitCXXDeleteExpr(CXXDeleteExpr *E) { E->CXXDeleteExprBits.UsualArrayDeleteWantsSize = Record.readInt(); E->OperatorDelete = readDeclAs(); E->Argument = Record.readSubExpr(); - E->Loc = readSourceLocation(); + E->CXXDeleteExprBits.Loc = readSourceLocation().getRawEncoding(); } void ASTStmtReader::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) { diff --git a/clang/lib/Serialization/ASTWriterStmt.cpp b/clang/lib/Serialization/ASTWriterStmt.cpp index edbd4f6c7fc41..4fab00cc1c3e5 100644 --- a/clang/lib/Serialization/ASTWriterStmt.cpp +++ b/clang/lib/Serialization/ASTWriterStmt.cpp @@ -514,7 +514,7 @@ void ASTStmtWriter::VisitRequiresExpr(RequiresExpr *E) { VisitExpr(E); Record.push_back(E->getLocalParameters().size()); Record.push_back(E->getRequirements().size()); - Record.AddSourceLocation(E->RequiresKWLoc); + Record.AddSourceLocation(E->getRequiresKWLoc()); Record.push_back(E->RequiresExprBits.IsSatisfied); Record.AddDeclRef(E->getBody()); for (ParmVarDecl *P : E->getLocalParameters()) From c5a21c5da18a04dfe9ded3625cba0a900187c5d1 Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Thu, 26 Jun 2025 20:50:42 +0200 Subject: [PATCH 10/20] Improve getFildIDLocal binary search. --- clang/lib/Basic/SourceManager.cpp | 37 +++++++++++-------------------- 1 file changed, 13 insertions(+), 24 deletions(-) diff --git a/clang/lib/Basic/SourceManager.cpp b/clang/lib/Basic/SourceManager.cpp index defba0a351498..76e9340d1c067 100644 --- a/clang/lib/Basic/SourceManager.cpp +++ b/clang/lib/Basic/SourceManager.cpp @@ -855,35 +855,24 @@ FileID SourceManager::getFileIDLocal(SourceLocation::UIntTy SLocOffset) const { break; } - NumProbes = 0; - while (true) { - unsigned MiddleIndex = (GreaterIndex-LessIndex)/2+LessIndex; + while (LessIndex < GreaterIndex) { + ++NumBinaryProbes; + + unsigned MiddleIndex = LessIndex + (GreaterIndex - LessIndex) / 2; + SourceLocation::UIntTy MidOffset = getLocalSLocEntry(MiddleIndex).getOffset(); - ++NumProbes; - - // If the offset of the midpoint is too large, chop the high side of the - // range to the midpoint. - if (MidOffset > SLocOffset) { + if (MidOffset <= SLocOffset) + LessIndex = MiddleIndex + 1; + else GreaterIndex = MiddleIndex; - continue; - } - - // If the middle index contains the value, succeed and return. - if (MiddleIndex + 1 == LocalSLocEntryTable.size() || - SLocOffset < getLocalSLocEntry(MiddleIndex + 1).getOffset()) { - FileID Res = FileID::get(MiddleIndex); - - // Remember it. We have good locality across FileID lookups. - LastFileIDLookup = Res; - NumBinaryProbes += NumProbes; - return Res; - } - - // Otherwise, move the low-side up to the middle index. - LessIndex = MiddleIndex; } + + // The loop terminates when LessIndex == GreaterIndex. At this point, + // `LessIndex` is the index of the *first element greater than* SLocOffset. + // The element we are actually looking for is the one immediately before it. + return LastFileIDLookup = FileID::get(LessIndex - 1); } /// Return the FileID for a SourceLocation with a high offset. From 7f125a0c5f0fbcfbb920d223628dc1c48607d400 Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Thu, 26 Jun 2025 21:03:11 +0200 Subject: [PATCH 11/20] Optimize binary search by using a dedicate offset table improve the cache performance --- clang/include/clang/Basic/SourceManager.h | 2 ++ clang/lib/Basic/SourceManager.cpp | 15 ++++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/clang/include/clang/Basic/SourceManager.h b/clang/include/clang/Basic/SourceManager.h index 68b1c7b469ecf..930e48d6c6d84 100644 --- a/clang/include/clang/Basic/SourceManager.h +++ b/clang/include/clang/Basic/SourceManager.h @@ -720,6 +720,8 @@ class SourceManager : public RefCountedBase { /// expansion. SmallVector LocalSLocEntryTable; + SmallVector LocalLocOffsetTable; + /// The table of SLocEntries that are loaded from other modules. /// /// Negative FileIDs are indexes into this table. To get from ID to an index, diff --git a/clang/lib/Basic/SourceManager.cpp b/clang/lib/Basic/SourceManager.cpp index 76e9340d1c067..b3aeebab16d27 100644 --- a/clang/lib/Basic/SourceManager.cpp +++ b/clang/lib/Basic/SourceManager.cpp @@ -330,6 +330,7 @@ void SourceManager::clearIDTables() { MainFileID = FileID(); LocalSLocEntryTable.clear(); LoadedSLocEntryTable.clear(); + LocalLocOffsetTable.clear(); SLocEntryLoaded.clear(); SLocEntryOffsetLoaded.clear(); LastLineNoFileIDQuery = FileID(); @@ -637,9 +638,11 @@ FileID SourceManager::createFileIDImpl(ContentCache &File, StringRef Filename, noteSLocAddressSpaceUsage(Diag); return FileID(); } + assert(LocalSLocEntryTable.size() == LocalLocOffsetTable.size()); LocalSLocEntryTable.push_back( SLocEntry::get(NextLocalOffset, FileInfo::get(IncludePos, File, FileCharacter, Filename))); + LocalLocOffsetTable.push_back(NextLocalOffset); // We do a +1 here because we want a SourceLocation that means "the end of the // file", e.g. for the "no newline at the end of the file" diagnostic. NextLocalOffset += FileSize + 1; @@ -691,7 +694,9 @@ SourceManager::createExpansionLocImpl(const ExpansionInfo &Info, SLocEntryLoaded[Index] = SLocEntryOffsetLoaded[Index] = true; return SourceLocation::getMacroLoc(LoadedOffset); } + assert(LocalSLocEntryTable.size() == LocalLocOffsetTable.size()); LocalSLocEntryTable.push_back(SLocEntry::get(NextLocalOffset, Info)); + LocalLocOffsetTable.push_back(NextLocalOffset); if (NextLocalOffset + Length + 1 <= NextLocalOffset || NextLocalOffset + Length + 1 > CurrentLoadedOffset) { Diag.Report(diag::err_sloc_space_too_large); @@ -830,10 +835,11 @@ FileID SourceManager::getFileIDLocal(SourceLocation::UIntTy SLocOffset) const { // SLocOffset. unsigned LessIndex = 0; // upper bound of the search range. - unsigned GreaterIndex = LocalSLocEntryTable.size(); + assert(LocalSLocEntryTable.size() == LocalLocOffsetTable.size()); + unsigned GreaterIndex = LocalLocOffsetTable.size(); if (LastFileIDLookup.ID >= 0) { // Use the LastFileIDLookup to prune the search space. - if (LocalSLocEntryTable[LastFileIDLookup.ID].getOffset() < SLocOffset) + if (LocalLocOffsetTable[LastFileIDLookup.ID] < SLocOffset) LessIndex = LastFileIDLookup.ID; else GreaterIndex = LastFileIDLookup.ID; @@ -844,7 +850,7 @@ FileID SourceManager::getFileIDLocal(SourceLocation::UIntTy SLocOffset) const { while (true) { --GreaterIndex; assert(GreaterIndex < LocalSLocEntryTable.size()); - if (LocalSLocEntryTable[GreaterIndex].getOffset() <= SLocOffset) { + if (LocalLocOffsetTable[GreaterIndex] <= SLocOffset) { FileID Res = FileID::get(int(GreaterIndex)); // Remember it. We have good locality across FileID lookups. LastFileIDLookup = Res; @@ -860,8 +866,7 @@ FileID SourceManager::getFileIDLocal(SourceLocation::UIntTy SLocOffset) const { unsigned MiddleIndex = LessIndex + (GreaterIndex - LessIndex) / 2; - SourceLocation::UIntTy MidOffset = - getLocalSLocEntry(MiddleIndex).getOffset(); + SourceLocation::UIntTy MidOffset = LocalLocOffsetTable[MiddleIndex]; if (MidOffset <= SLocOffset) LessIndex = MiddleIndex + 1; From 98455475971a5f2d9ef6a2bc1945e05e7f12520c Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Mon, 30 Jun 2025 08:58:50 +0200 Subject: [PATCH 12/20] Revert the static_assert change for ObjCContainerDeclBitfields. --- clang/include/clang/AST/DeclBase.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/include/clang/AST/DeclBase.h b/clang/include/clang/AST/DeclBase.h index b136329fce15a..bdc92760ba092 100644 --- a/clang/include/clang/AST/DeclBase.h +++ b/clang/include/clang/AST/DeclBase.h @@ -2064,7 +2064,7 @@ class DeclContext { "CXXConstructorDeclBitfields is larger than 8 bytes!"); static_assert(sizeof(ObjCMethodDeclBitfields) <= 8, "ObjCMethodDeclBitfields is larger than 8 bytes!"); - static_assert(sizeof(ObjCContainerDeclBitfields) <= 16, + static_assert(sizeof(ObjCContainerDeclBitfields) <= 8, "ObjCContainerDeclBitfields is larger than 8 bytes!"); static_assert(sizeof(LinkageSpecDeclBitfields) <= 8, "LinkageSpecDeclBitfields is larger than 8 bytes!"); From 47940626b57b9d8e4c7f1677266d3729becc1d6d Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Mon, 30 Jun 2025 13:38:20 +0200 Subject: [PATCH 13/20] Fix the compile failures for include-cleaner. --- clang-tools-extra/include-cleaner/lib/HTMLReport.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang-tools-extra/include-cleaner/lib/HTMLReport.cpp b/clang-tools-extra/include-cleaner/lib/HTMLReport.cpp index b0a6c9565befd..1cc2db7031819 100644 --- a/clang-tools-extra/include-cleaner/lib/HTMLReport.cpp +++ b/clang-tools-extra/include-cleaner/lib/HTMLReport.cpp @@ -145,7 +145,7 @@ class Reporter { // Points within the main file that reference a Symbol. // Implicit refs will be marked with a symbol just before the token. struct Ref { - unsigned Offset; + uint64_t Offset; RefType Type; Symbol Sym; SmallVector Locations = {}; From 25aa128032a2ca725da1e5b55f66a0e5684e0882 Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Mon, 30 Jun 2025 14:27:38 +0200 Subject: [PATCH 14/20] Fix clang-tidy build. --- .../readability/FunctionCognitiveComplexityCheck.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang-tools-extra/clang-tidy/readability/FunctionCognitiveComplexityCheck.cpp b/clang-tools-extra/clang-tidy/readability/FunctionCognitiveComplexityCheck.cpp index e1fb42b8210e2..ecde1f7c90080 100644 --- a/clang-tools-extra/clang-tidy/readability/FunctionCognitiveComplexityCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/FunctionCognitiveComplexityCheck.cpp @@ -127,12 +127,12 @@ struct CognitiveComplexity final { // https://sonarcloud.io/projects?languages=c%2Ccpp&size=5 we can estimate: // value ~20 would result in no allocs for 98% of functions, ~12 for 96%, ~10 // for 91%, ~8 for 88%, ~6 for 84%, ~4 for 77%, ~2 for 64%, and ~1 for 37%. - static_assert(sizeof(Detail) <= 8, + static_assert(sizeof(Detail) <= 16, "Since we use SmallVector to minimize the amount of " "allocations, we also need to consider the price we pay for " "that in terms of stack usage. " "Thus, it is good to minimize the size of the Detail struct."); - SmallVector Details; // 25 elements is 200 bytes. + SmallVector Details; // 25 elements is 400 bytes. // Yes, 25 is a magic number. This is the seemingly-sane default for the // upper limit for function cognitive complexity. Thus it would make sense // to avoid allocations for any function that does not violate the limit. From 3527a02c2ba199acf17d4dd257e6a18696ffd941 Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Mon, 30 Jun 2025 15:05:56 +0200 Subject: [PATCH 15/20] Fix clangd unittest --- clang-tools-extra/clangd/unittests/SourceCodeTests.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/clang-tools-extra/clangd/unittests/SourceCodeTests.cpp b/clang-tools-extra/clangd/unittests/SourceCodeTests.cpp index 801d535c1b9d0..931241845c54a 100644 --- a/clang-tools-extra/clangd/unittests/SourceCodeTests.cpp +++ b/clang-tools-extra/clangd/unittests/SourceCodeTests.cpp @@ -829,7 +829,9 @@ TEST(SourceCodeTests, isSpelledInSource) { // FIXME: Should it return false on SourceLocation()? Does it matter? EXPECT_TRUE(isSpelledInSource(SourceLocation(), SM)); EXPECT_FALSE(isSpelledInSource( - SourceLocation::getFromRawEncoding(SourceLocation::UIntTy(1 << 31)), SM)); + SourceLocation::getFromRawEncoding( + SourceLocation::UIntTy(1ULL << (SourceLocation::Bits - 1))), + SM)); } struct IncrementalTestStep { From 31c773f18b968fec89ed1bc1542d8dabbdfaa192 Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Mon, 30 Jun 2025 23:07:29 +0200 Subject: [PATCH 16/20] Fix windows build failures. unsigned long is 32 bits on MSVC --- clang/include/clang/AST/Stmt.h | 52 +++++++++++++++++----------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/clang/include/clang/AST/Stmt.h b/clang/include/clang/AST/Stmt.h index 79991de6ed881..c99acde93f4a7 100644 --- a/clang/include/clang/AST/Stmt.h +++ b/clang/include/clang/AST/Stmt.h @@ -140,7 +140,7 @@ class alignas(void *) Stmt { /// The location of the semi-colon.Add commentMore actions LLVM_PREFERRED_TYPE(SourceLocation) - unsigned long SemiLoc : SourceLocation::Bits; + uint64_t SemiLoc : SourceLocation::Bits; }; class CompoundStmtBitfields { @@ -165,7 +165,7 @@ class alignas(void *) Stmt { unsigned : NumStmtBits; LLVM_PREFERRED_TYPE(SourceLocation) - unsigned long IdentLoc : SourceLocation::Bits; + uint64_t IdentLoc : SourceLocation::Bits; }; class AttributedStmtBitfields { @@ -204,7 +204,7 @@ class alignas(void *) Stmt { /// The location of the "if" LLVM_PREFERRED_TYPE(SourceLocation) - unsigned long IfLoc : SourceLocation::Bits; + uint64_t IfLoc : SourceLocation::Bits; }; class SwitchStmtBitfields { @@ -229,7 +229,7 @@ class alignas(void *) Stmt { /// The location of the "switch". LLVM_PREFERRED_TYPE(SourceLocation) - unsigned long SwitchLoc : SourceLocation::Bits; + uint64_t SwitchLoc : SourceLocation::Bits; }; class WhileStmtBitfields { @@ -245,7 +245,7 @@ class alignas(void *) Stmt { /// The location of the "while" LLVM_PREFERRED_TYPE(SourceLocation) - unsigned long WhileLoc : SourceLocation::Bits; + uint64_t WhileLoc : SourceLocation::Bits; }; class DoStmtBitfields { @@ -256,7 +256,7 @@ class alignas(void *) Stmt { /// The location of the "do" LLVM_PREFERRED_TYPE(SourceLocation) - unsigned long DoLoc : SourceLocation::Bits; + uint64_t DoLoc : SourceLocation::Bits; }; class ForStmtBitfields { @@ -267,7 +267,7 @@ class alignas(void *) Stmt { /// The location of the "for" LLVM_PREFERRED_TYPE(SourceLocation) - unsigned long ForLoc : SourceLocation::Bits; + uint64_t ForLoc : SourceLocation::Bits; }; class GotoStmtBitfields { @@ -279,7 +279,7 @@ class alignas(void *) Stmt { /// The location of the "goto" LLVM_PREFERRED_TYPE(SourceLocation) - unsigned long GotoLoc : SourceLocation::Bits; + uint64_t GotoLoc : SourceLocation::Bits; }; class ContinueStmtBitfields { @@ -290,7 +290,7 @@ class alignas(void *) Stmt { /// The location of the "continue" LLVM_PREFERRED_TYPE(SourceLocation) - unsigned long ContinueLoc : SourceLocation::Bits; + uint64_t ContinueLoc : SourceLocation::Bits; }; class BreakStmtBitfields { @@ -301,7 +301,7 @@ class alignas(void *) Stmt { /// The location of the "break" LLVM_PREFERRED_TYPE(SourceLocation) - unsigned long BreakLoc : SourceLocation::Bits; + uint64_t BreakLoc : SourceLocation::Bits; }; class ReturnStmtBitfields { @@ -316,7 +316,7 @@ class alignas(void *) Stmt { /// The location of the "return" LLVM_PREFERRED_TYPE(SourceLocation) - unsigned long RetLoc : SourceLocation::Bits; + uint64_t RetLoc : SourceLocation::Bits; }; class SwitchCaseBitfields { @@ -333,7 +333,7 @@ class alignas(void *) Stmt { /// The location of the "case" or "default" keyword. LLVM_PREFERRED_TYPE(SourceLocation) - unsigned long KeywordLoc : SourceLocation::Bits; + uint64_t KeywordLoc : SourceLocation::Bits; }; //===--- Expression bitfields classes ---===// @@ -550,7 +550,7 @@ class alignas(void *) Stmt { unsigned : NumExprBits; LLVM_PREFERRED_TYPE(SourceLocation) - unsigned long RBracketLoc : SourceLocation::Bits; + uint64_t RBracketLoc : SourceLocation::Bits; }; class CallExprBitfields { @@ -705,7 +705,7 @@ class alignas(void *) Stmt { /// The location of the "_Generic" LLVM_PREFERRED_TYPE(SourceLocation) - unsigned long GenericLoc : SourceLocation::Bits; + uint64_t GenericLoc : SourceLocation::Bits; }; class PseudoObjectExprBitfields { @@ -815,7 +815,7 @@ class alignas(void *) Stmt { /// The location of the boolean ligeral LLVM_PREFERRED_TYPE(SourceLocation) - unsigned long Loc : SourceLocation::Bits; + uint64_t Loc : SourceLocation::Bits; }; class CXXNullPtrLiteralExprBitfields { @@ -826,7 +826,7 @@ class alignas(void *) Stmt { /// The location of the null pointer literal. LLVM_PREFERRED_TYPE(SourceLocation) - unsigned long Loc : SourceLocation::Bits; + uint64_t Loc : SourceLocation::Bits; }; class CXXThisExprBitfields { @@ -846,7 +846,7 @@ class alignas(void *) Stmt { /// The location of the "this" LLVM_PREFERRED_TYPE(SourceLocation) - unsigned long Loc : SourceLocation::Bits; + uint64_t Loc : SourceLocation::Bits; }; class CXXThrowExprBitfields { @@ -862,7 +862,7 @@ class alignas(void *) Stmt { /// The location of the "throw" LLVM_PREFERRED_TYPE(SourceLocation) - unsigned long ThrowLoc : SourceLocation::Bits; + uint64_t ThrowLoc : SourceLocation::Bits; }; class CXXDefaultArgExprBitfields { @@ -878,7 +878,7 @@ class alignas(void *) Stmt { /// The location where the default argument expression was used. LLVM_PREFERRED_TYPE(SourceLocation) - unsigned long Loc : SourceLocation::Bits; + uint64_t Loc : SourceLocation::Bits; }; class CXXDefaultInitExprBitfields { @@ -895,7 +895,7 @@ class alignas(void *) Stmt { /// The location where the default initializer expression was used. LLVM_PREFERRED_TYPE(SourceLocation) - unsigned long Loc : SourceLocation::Bits; + uint64_t Loc : SourceLocation::Bits; }; class CXXScalarValueInitExprBitfields { @@ -907,7 +907,7 @@ class alignas(void *) Stmt { /// The location where the default initializer expression was used. LLVM_PREFERRED_TYPE(SourceLocation) - unsigned long RParenLoc : SourceLocation::Bits; + uint64_t RParenLoc : SourceLocation::Bits; }; class CXXNewExprBitfields { @@ -984,7 +984,7 @@ class alignas(void *) Stmt { /// Location of the expression LLVM_PREFERRED_TYPE(SourceLocation) - unsigned long Loc : SourceLocation::Bits; + uint64_t Loc : SourceLocation::Bits; }; class TypeTraitExprBitfields { @@ -1100,7 +1100,7 @@ class alignas(void *) Stmt { /// The location of the '->' or '.' operator. LLVM_PREFERRED_TYPE(SourceLocation) - unsigned long OperatorLoc : SourceLocation::Bits; + uint64_t OperatorLoc : SourceLocation::Bits; }; class OverloadExprBitfields { @@ -1181,7 +1181,7 @@ class alignas(void *) Stmt { /// The location of the non-type template parameter reference. LLVM_PREFERRED_TYPE(SourceLocation) - unsigned long NameLoc : SourceLocation::Bits; + uint64_t NameLoc : SourceLocation::Bits; }; class LambdaExprBitfields { @@ -1222,7 +1222,7 @@ class alignas(void *) Stmt { unsigned IsSatisfied : 1; LLVM_PREFERRED_TYPE(SourceLocation) - unsigned long RequiresKWLoc : SourceLocation::Bits; + uint64_t RequiresKWLoc : SourceLocation::Bits; }; class ArrayTypeTraitExprBitfields { @@ -1316,7 +1316,7 @@ class alignas(void *) Stmt { /// The location of the non-type template parameter reference. LLVM_PREFERRED_TYPE(SourceLocation) - unsigned long Loc : SourceLocation::Bits; + uint64_t Loc : SourceLocation::Bits; }; class ConvertVectorExprBitfields { From e63c9888ab1b803c0b8b97dc38f7e6d27be9bc8c Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Tue, 1 Jul 2025 08:17:50 +0200 Subject: [PATCH 17/20] More windows fix --- clang/include/clang/AST/Stmt.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/include/clang/AST/Stmt.h b/clang/include/clang/AST/Stmt.h index c99acde93f4a7..33430ce1a4a62 100644 --- a/clang/include/clang/AST/Stmt.h +++ b/clang/include/clang/AST/Stmt.h @@ -784,7 +784,7 @@ class alignas(void *) Stmt { friend class CXXOperatorCallExpr; LLVM_PREFERRED_TYPE(CallExprBitfields) - unsigned : NumCallExprBits; + uint64_t : NumCallExprBits; /// The kind of this overloaded operator. One of the enumerator /// value of OverloadedOperatorKind. @@ -797,7 +797,7 @@ class alignas(void *) Stmt { friend class CXXRewrittenBinaryOperator; LLVM_PREFERRED_TYPE(CallExprBitfields) - unsigned : NumCallExprBits; + uint64_t : NumCallExprBits; LLVM_PREFERRED_TYPE(bool) unsigned IsReversed : 1; From 9dd6cdfe522ec4dfeadb784a25b67fa3860173c5 Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Tue, 1 Jul 2025 09:23:32 +0200 Subject: [PATCH 18/20] Change the underlying StmtBitField type to uint64_t, fix windows failures. So that the sizeof(Stmt) can stay with 8 bytes. --- clang/include/clang/AST/Stmt.h | 106 ++++++++++++++++----------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/clang/include/clang/AST/Stmt.h b/clang/include/clang/AST/Stmt.h index 33430ce1a4a62..513f2269f2fed 100644 --- a/clang/include/clang/AST/Stmt.h +++ b/clang/include/clang/AST/Stmt.h @@ -128,7 +128,7 @@ class alignas(void *) Stmt { friend class NullStmt; LLVM_PREFERRED_TYPE(StmtBitfields) - unsigned : NumStmtBits; + uint64_t : NumStmtBits; /// True if the null statement was preceded by an empty macro, e.g: /// @code @@ -136,7 +136,7 @@ class alignas(void *) Stmt { /// CALL(0); /// @endcode LLVM_PREFERRED_TYPE(bool) - unsigned HasLeadingEmptyMacro : 1; + uint64_t HasLeadingEmptyMacro : 1; /// The location of the semi-colon.Add commentMore actions LLVM_PREFERRED_TYPE(SourceLocation) @@ -154,7 +154,7 @@ class alignas(void *) Stmt { /// floating-point features. LLVM_PREFERRED_TYPE(bool) unsigned HasFPFeatures : 1; - + unsigned NumStmts; }; @@ -162,7 +162,7 @@ class alignas(void *) Stmt { friend class LabelStmt; LLVM_PREFERRED_TYPE(StmtBitfields) - unsigned : NumStmtBits; + uint64_t : NumStmtBits; LLVM_PREFERRED_TYPE(SourceLocation) uint64_t IdentLoc : SourceLocation::Bits; @@ -184,23 +184,23 @@ class alignas(void *) Stmt { friend class IfStmt; LLVM_PREFERRED_TYPE(StmtBitfields) - unsigned : NumStmtBits; + uint64_t : NumStmtBits; /// Whether this is a constexpr if, or a consteval if, or neither. LLVM_PREFERRED_TYPE(IfStatementKind) - unsigned Kind : 3; + uint64_t Kind : 3; /// True if this if statement has storage for an else statement. LLVM_PREFERRED_TYPE(bool) - unsigned HasElse : 1; + uint64_t HasElse : 1; /// True if this if statement has storage for a variable declaration. LLVM_PREFERRED_TYPE(bool) - unsigned HasVar : 1; + uint64_t HasVar : 1; /// True if this if statement has storage for an init statement. LLVM_PREFERRED_TYPE(bool) - unsigned HasInit : 1; + uint64_t HasInit : 1; /// The location of the "if" LLVM_PREFERRED_TYPE(SourceLocation) @@ -211,21 +211,21 @@ class alignas(void *) Stmt { friend class SwitchStmt; LLVM_PREFERRED_TYPE(StmtBitfields) - unsigned : NumStmtBits; + uint64_t : NumStmtBits; /// True if the SwitchStmt has storage for an init statement. LLVM_PREFERRED_TYPE(bool) - unsigned HasInit : 1; + uint64_t HasInit : 1; /// True if the SwitchStmt has storage for a condition variable. LLVM_PREFERRED_TYPE(bool) - unsigned HasVar : 1; + uint64_t HasVar : 1; /// If the SwitchStmt is a switch on an enum value, records whether all /// the enum values were covered by CaseStmts. The coverage information /// value is meant to be a hint for possible clients. LLVM_PREFERRED_TYPE(bool) - unsigned AllEnumCasesCovered : 1; + uint64_t AllEnumCasesCovered : 1; /// The location of the "switch". LLVM_PREFERRED_TYPE(SourceLocation) @@ -237,11 +237,11 @@ class alignas(void *) Stmt { friend class WhileStmt; LLVM_PREFERRED_TYPE(StmtBitfields) - unsigned : NumStmtBits; + uint64_t : NumStmtBits; /// True if the WhileStmt has storage for a condition variable. LLVM_PREFERRED_TYPE(bool) - unsigned HasVar : 1; + uint64_t HasVar : 1; /// The location of the "while" LLVM_PREFERRED_TYPE(SourceLocation) @@ -252,7 +252,7 @@ class alignas(void *) Stmt { friend class DoStmt; LLVM_PREFERRED_TYPE(StmtBitfields) - unsigned : NumStmtBits; + uint64_t : NumStmtBits; /// The location of the "do" LLVM_PREFERRED_TYPE(SourceLocation) @@ -263,7 +263,7 @@ class alignas(void *) Stmt { friend class ForStmt; LLVM_PREFERRED_TYPE(StmtBitfields) - unsigned : NumStmtBits; + uint64_t : NumStmtBits; /// The location of the "for" LLVM_PREFERRED_TYPE(SourceLocation) @@ -275,7 +275,7 @@ class alignas(void *) Stmt { friend class IndirectGotoStmt; LLVM_PREFERRED_TYPE(StmtBitfields) - unsigned : NumStmtBits; + uint64_t : NumStmtBits; /// The location of the "goto" LLVM_PREFERRED_TYPE(SourceLocation) @@ -286,7 +286,7 @@ class alignas(void *) Stmt { friend class ContinueStmt; LLVM_PREFERRED_TYPE(StmtBitfields) - unsigned : NumStmtBits; + uint64_t : NumStmtBits; /// The location of the "continue" LLVM_PREFERRED_TYPE(SourceLocation) @@ -297,7 +297,7 @@ class alignas(void *) Stmt { friend class BreakStmt; LLVM_PREFERRED_TYPE(StmtBitfields) - unsigned : NumStmtBits; + uint64_t : NumStmtBits; /// The location of the "break" LLVM_PREFERRED_TYPE(SourceLocation) @@ -308,11 +308,11 @@ class alignas(void *) Stmt { friend class ReturnStmt; LLVM_PREFERRED_TYPE(StmtBitfields) - unsigned : NumStmtBits; + uint64_t : NumStmtBits; /// True if this ReturnStmt has storage for an NRVO candidate. LLVM_PREFERRED_TYPE(bool) - unsigned HasNRVOCandidate : 1; + uint64_t HasNRVOCandidate : 1; /// The location of the "return" LLVM_PREFERRED_TYPE(SourceLocation) @@ -324,12 +324,12 @@ class alignas(void *) Stmt { friend class CaseStmt; LLVM_PREFERRED_TYPE(StmtBitfields) - unsigned : NumStmtBits; + uint64_t : NumStmtBits; /// Used by CaseStmt to store whether it is a case statement /// of the form case LHS ... RHS (a GNU extension). LLVM_PREFERRED_TYPE(bool) - unsigned CaseStmtIsGNURange : 1; + uint64_t CaseStmtIsGNURange : 1; /// The location of the "case" or "default" keyword. LLVM_PREFERRED_TYPE(SourceLocation) @@ -547,7 +547,7 @@ class alignas(void *) Stmt { friend class MatrixSubscriptExpr; LLVM_PREFERRED_TYPE(ExprBitfields) - unsigned : NumExprBits; + uint64_t : NumExprBits; LLVM_PREFERRED_TYPE(SourceLocation) uint64_t RBracketLoc : SourceLocation::Bits; @@ -701,7 +701,7 @@ class alignas(void *) Stmt { friend class GenericSelectionExpr; LLVM_PREFERRED_TYPE(ExprBitfields) - unsigned : NumExprBits; + uint64_t : NumExprBits; /// The location of the "_Generic" LLVM_PREFERRED_TYPE(SourceLocation) @@ -807,11 +807,11 @@ class alignas(void *) Stmt { friend class CXXBoolLiteralExpr; LLVM_PREFERRED_TYPE(ExprBitfields) - unsigned : NumExprBits; + uint64_t : NumExprBits; /// The value of the boolean literal. LLVM_PREFERRED_TYPE(bool) - unsigned Value : 1; + uint64_t Value : 1; /// The location of the boolean ligeral LLVM_PREFERRED_TYPE(SourceLocation) @@ -822,7 +822,7 @@ class alignas(void *) Stmt { friend class CXXNullPtrLiteralExpr; LLVM_PREFERRED_TYPE(ExprBitfields) - unsigned : NumExprBits; + uint64_t : NumExprBits; /// The location of the null pointer literal. LLVM_PREFERRED_TYPE(SourceLocation) @@ -833,16 +833,16 @@ class alignas(void *) Stmt { friend class CXXThisExpr; LLVM_PREFERRED_TYPE(ExprBitfields) - unsigned : NumExprBits; + uint64_t : NumExprBits; /// Whether this is an implicit "this". LLVM_PREFERRED_TYPE(bool) - unsigned IsImplicit : 1; + uint64_t IsImplicit : 1; /// Whether there is a lambda with an explicit object parameter that /// captures this "this" by copy. LLVM_PREFERRED_TYPE(bool) - unsigned CapturedByCopyInLambdaWithExplicitObjectParameter : 1; + uint64_t CapturedByCopyInLambdaWithExplicitObjectParameter : 1; /// The location of the "this" LLVM_PREFERRED_TYPE(SourceLocation) @@ -854,11 +854,11 @@ class alignas(void *) Stmt { friend class CXXThrowExpr; LLVM_PREFERRED_TYPE(ExprBitfields) - unsigned : NumExprBits; + uint64_t : NumExprBits; /// Whether the thrown variable (if any) is in scope. LLVM_PREFERRED_TYPE(bool) - unsigned IsThrownVariableInScope : 1; + uint64_t IsThrownVariableInScope : 1; /// The location of the "throw" LLVM_PREFERRED_TYPE(SourceLocation) @@ -870,11 +870,11 @@ class alignas(void *) Stmt { friend class CXXDefaultArgExpr; LLVM_PREFERRED_TYPE(ExprBitfields) - unsigned : NumExprBits; + uint64_t : NumExprBits; /// Whether this CXXDefaultArgExpr rewrote its argument and stores a copy. LLVM_PREFERRED_TYPE(bool) - unsigned HasRewrittenInit : 1; + uint64_t HasRewrittenInit : 1; /// The location where the default argument expression was used. LLVM_PREFERRED_TYPE(SourceLocation) @@ -886,12 +886,12 @@ class alignas(void *) Stmt { friend class CXXDefaultInitExpr; LLVM_PREFERRED_TYPE(ExprBitfields) - unsigned : NumExprBits; + uint64_t : NumExprBits; /// Whether this CXXDefaultInitExprBitfields rewrote its argument and stores /// a copy. LLVM_PREFERRED_TYPE(bool) - unsigned HasRewrittenInit : 1; + uint64_t HasRewrittenInit : 1; /// The location where the default initializer expression was used. LLVM_PREFERRED_TYPE(SourceLocation) @@ -903,7 +903,7 @@ class alignas(void *) Stmt { friend class CXXScalarValueInitExpr; LLVM_PREFERRED_TYPE(ExprBitfields) - unsigned : NumExprBits; + uint64_t : NumExprBits; /// The location where the default initializer expression was used. LLVM_PREFERRED_TYPE(SourceLocation) @@ -961,26 +961,26 @@ class alignas(void *) Stmt { friend class CXXDeleteExpr; LLVM_PREFERRED_TYPE(ExprBitfields) - unsigned : NumExprBits; + uint64_t : NumExprBits; /// Is this a forced global delete, i.e. "::delete"? LLVM_PREFERRED_TYPE(bool) - unsigned GlobalDelete : 1; + uint64_t GlobalDelete : 1; /// Is this the array form of delete, i.e. "delete[]"? LLVM_PREFERRED_TYPE(bool) - unsigned ArrayForm : 1; + uint64_t ArrayForm : 1; /// ArrayFormAsWritten can be different from ArrayForm if 'delete' is /// applied to pointer-to-array type (ArrayFormAsWritten will be false /// while ArrayForm will be true). LLVM_PREFERRED_TYPE(bool) - unsigned ArrayFormAsWritten : 1; + uint64_t ArrayFormAsWritten : 1; /// Does the usual deallocation function for the element type require /// a size_t argument? LLVM_PREFERRED_TYPE(bool) - unsigned UsualArrayDeleteWantsSize : 1; + uint64_t UsualArrayDeleteWantsSize : 1; /// Location of the expression LLVM_PREFERRED_TYPE(SourceLocation) @@ -1081,22 +1081,22 @@ class alignas(void *) Stmt { friend class CXXDependentScopeMemberExpr; LLVM_PREFERRED_TYPE(ExprBitfields) - unsigned : NumExprBits; + uint64_t : NumExprBits; /// Whether this member expression used the '->' operator or /// the '.' operator. LLVM_PREFERRED_TYPE(bool) - unsigned IsArrow : 1; + uint64_t IsArrow : 1; /// Whether this member expression has info for explicit template /// keyword and arguments. LLVM_PREFERRED_TYPE(bool) - unsigned HasTemplateKWAndArgsInfo : 1; + uint64_t HasTemplateKWAndArgsInfo : 1; /// See getFirstQualifierFoundInScope() and the comment listing /// the trailing objects. LLVM_PREFERRED_TYPE(bool) - unsigned HasFirstQualifierFoundInScope : 1; + uint64_t HasFirstQualifierFoundInScope : 1; /// The location of the '->' or '.' operator. LLVM_PREFERRED_TYPE(SourceLocation) @@ -1177,7 +1177,7 @@ class alignas(void *) Stmt { friend class SubstNonTypeTemplateParmExpr; LLVM_PREFERRED_TYPE(ExprBitfields) - unsigned : NumExprBits; + uint64_t : NumExprBits; /// The location of the non-type template parameter reference. LLVM_PREFERRED_TYPE(SourceLocation) @@ -1216,10 +1216,10 @@ class alignas(void *) Stmt { friend class RequiresExpr; LLVM_PREFERRED_TYPE(ExprBitfields) - unsigned : NumExprBits; + uint64_t : NumExprBits; LLVM_PREFERRED_TYPE(bool) - unsigned IsSatisfied : 1; + uint64_t IsSatisfied : 1; LLVM_PREFERRED_TYPE(SourceLocation) uint64_t RequiresKWLoc : SourceLocation::Bits; @@ -1307,12 +1307,12 @@ class alignas(void *) Stmt { friend class OpaqueValueExpr; LLVM_PREFERRED_TYPE(ExprBitfields) - unsigned : NumExprBits; + uint64_t : NumExprBits; /// The OVE is a unique semantic reference to its source expression if this /// bit is set to true. LLVM_PREFERRED_TYPE(bool) - unsigned IsUnique : 1; + uint64_t IsUnique : 1; /// The location of the non-type template parameter reference. LLVM_PREFERRED_TYPE(SourceLocation) From 181420a8b0ce15c2d42def4a49f5f705276d45d0 Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Tue, 1 Jul 2025 11:02:23 +0200 Subject: [PATCH 19/20] More window fix --- clang/include/clang/AST/Stmt.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/include/clang/AST/Stmt.h b/clang/include/clang/AST/Stmt.h index 513f2269f2fed..9a363f25fc989 100644 --- a/clang/include/clang/AST/Stmt.h +++ b/clang/include/clang/AST/Stmt.h @@ -789,7 +789,7 @@ class alignas(void *) Stmt { /// The kind of this overloaded operator. One of the enumerator /// value of OverloadedOperatorKind. LLVM_PREFERRED_TYPE(OverloadedOperatorKind) - unsigned OperatorKind : 6; + uint64_t OperatorKind : 6; }; class CXXRewrittenBinaryOperatorBitfields { @@ -800,7 +800,7 @@ class alignas(void *) Stmt { uint64_t : NumCallExprBits; LLVM_PREFERRED_TYPE(bool) - unsigned IsReversed : 1; + uint64_t IsReversed : 1; }; class CXXBoolLiteralExprBitfields { From 4379826b1ae28a775166b8481c87f04a8187ca60 Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Tue, 1 Jul 2025 12:19:54 +0200 Subject: [PATCH 20/20] Fix merge failures --- clang/include/clang/AST/DeclarationName.h | 11 ++--------- clang/lib/AST/ASTContext.cpp | 4 ++-- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/clang/include/clang/AST/DeclarationName.h b/clang/include/clang/AST/DeclarationName.h index 20e504222c495..db7973bcc5bb7 100644 --- a/clang/include/clang/AST/DeclarationName.h +++ b/clang/include/clang/AST/DeclarationName.h @@ -703,8 +703,7 @@ class DeclarationNameLoc { // The location (if any) of the operator keyword is stored elsewhere. struct CXXOpName { - SourceLocation BeginOpNameLoc; - SourceLocation EndOpNameLoc; + CXXOperatorSourceInfo* OInfo; }; // The location (if any) of the operator keyword is stored elsewhere. @@ -724,12 +723,6 @@ class DeclarationNameLoc { void setNamedTypeLoc(TypeSourceInfo *TInfo) { NamedType.TInfo = TInfo; } - void setCXXOperatorNameRange(SourceRange Range) { - CXXOperatorName.BeginOpNameLoc = Range.getBegin(); - CXXOperatorName.EndOpNameLoc = Range.getEnd(); - } - - void setCXXLiteralOperatorNameLoc(SourceLocation Loc) { CXXLiteralOperatorName.OpNameLoc = Loc; } @@ -755,7 +748,7 @@ class DeclarationNameLoc { SourceLocation getCXXOperatorNameEndLoc() const { if (!CXXOperatorName.OInfo) return {}; - return CXXOperatorName.OInfo->EndOpNameLoc); + return CXXOperatorName.OInfo->EndOpNameLoc; } /// Return the range of the operator name (without the operator keyword). diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index 840469d7cace3..689def9c6c38f 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -3204,8 +3204,8 @@ CXXOperatorSourceInfo * ASTContext::getCXXOperatorSourceInfo(SourceRange R) const { auto *TInfo = (CXXOperatorSourceInfo *)BumpAlloc.Allocate( sizeof(CXXOperatorSourceInfo), 8); - TInfo->BeginOpNameLoc = R.getBegin().getRawEncoding(); - TInfo->EndOpNameLoc = R.getEnd().getRawEncoding(); + TInfo->BeginOpNameLoc = R.getBegin(); + TInfo->EndOpNameLoc = R.getEnd(); return TInfo; }