@@ -564,11 +564,25 @@ class ASTWriter : public ASTDeserializationListener,
564
564
unsigned DeclEnumAbbrev = 0 ;
565
565
unsigned DeclObjCIvarAbbrev = 0 ;
566
566
unsigned DeclCXXMethodAbbrev = 0 ;
567
+ unsigned DeclDependentNonTemplateCXXMethodAbbrev = 0 ;
568
+ unsigned DeclTemplateCXXMethodAbbrev = 0 ;
569
+ unsigned DeclMemberSpecializedCXXMethodAbbrev = 0 ;
570
+ unsigned DeclTemplateSpecializedCXXMethodAbbrev = 0 ;
571
+ unsigned DeclDependentSpecializationCXXMethodAbbrev = 0 ;
572
+ unsigned DeclTemplateTypeParmAbbrev = 0 ;
573
+ unsigned DeclUsingShadowAbbrev = 0 ;
567
574
568
575
unsigned DeclRefExprAbbrev = 0 ;
569
576
unsigned CharacterLiteralAbbrev = 0 ;
570
577
unsigned IntegerLiteralAbbrev = 0 ;
571
578
unsigned ExprImplicitCastAbbrev = 0 ;
579
+ unsigned BinaryOperatorAbbrev = 0 ;
580
+ unsigned CompoundAssignOperatorAbbrev = 0 ;
581
+ unsigned CallExprAbbrev = 0 ;
582
+ unsigned CXXOperatorCallExprAbbrev = 0 ;
583
+ unsigned CXXMemberCallExprAbbrev = 0 ;
584
+
585
+ unsigned CompoundStmtAbbrev = 0 ;
572
586
573
587
void WriteDeclAbbrevs ();
574
588
void WriteDecl (ASTContext &Context, Decl *D);
@@ -735,12 +749,41 @@ class ASTWriter : public ASTDeserializationListener,
735
749
unsigned getDeclFieldAbbrev () const { return DeclFieldAbbrev; }
736
750
unsigned getDeclEnumAbbrev () const { return DeclEnumAbbrev; }
737
751
unsigned getDeclObjCIvarAbbrev () const { return DeclObjCIvarAbbrev; }
738
- unsigned getDeclCXXMethodAbbrev () const { return DeclCXXMethodAbbrev; }
752
+ unsigned getDeclCXXMethodAbbrev (FunctionDecl::TemplatedKind Kind) const {
753
+ switch (Kind) {
754
+ case FunctionDecl::TK_NonTemplate:
755
+ return DeclCXXMethodAbbrev;
756
+ case FunctionDecl::TK_FunctionTemplate:
757
+ return DeclTemplateCXXMethodAbbrev;
758
+ case FunctionDecl::TK_MemberSpecialization:
759
+ return DeclMemberSpecializedCXXMethodAbbrev;
760
+ case FunctionDecl::TK_FunctionTemplateSpecialization:
761
+ return DeclTemplateSpecializedCXXMethodAbbrev;
762
+ case FunctionDecl::TK_DependentNonTemplate:
763
+ return DeclDependentNonTemplateCXXMethodAbbrev;
764
+ case FunctionDecl::TK_DependentFunctionTemplateSpecialization:
765
+ return DeclDependentSpecializationCXXMethodAbbrev;
766
+ }
767
+ llvm_unreachable (" Unknwon Template Kind!" );
768
+ }
769
+ unsigned getDeclTemplateTypeParmAbbrev () const {
770
+ return DeclTemplateTypeParmAbbrev;
771
+ }
772
+ unsigned getDeclUsingShadowAbbrev () const { return DeclUsingShadowAbbrev; }
739
773
740
774
unsigned getDeclRefExprAbbrev () const { return DeclRefExprAbbrev; }
741
775
unsigned getCharacterLiteralAbbrev () const { return CharacterLiteralAbbrev; }
742
776
unsigned getIntegerLiteralAbbrev () const { return IntegerLiteralAbbrev; }
743
777
unsigned getExprImplicitCastAbbrev () const { return ExprImplicitCastAbbrev; }
778
+ unsigned getBinaryOperatorAbbrev () const { return BinaryOperatorAbbrev; }
779
+ unsigned getCompoundAssignOperatorAbbrev () const {
780
+ return CompoundAssignOperatorAbbrev;
781
+ }
782
+ unsigned getCallExprAbbrev () const { return CallExprAbbrev; }
783
+ unsigned getCXXOperatorCallExprAbbrev () { return CXXOperatorCallExprAbbrev; }
784
+ unsigned getCXXMemberCallExprAbbrev () { return CXXMemberCallExprAbbrev; }
785
+
786
+ unsigned getCompoundStmtAbbrev () const { return CompoundStmtAbbrev; }
744
787
745
788
bool hasChain () const { return Chain; }
746
789
ASTReader *getChain () const { return Chain; }
@@ -841,46 +884,33 @@ class BitsPacker {
841
884
BitsPacker (BitsPacker &&) = delete ;
842
885
BitsPacker operator =(const BitsPacker &) = delete ;
843
886
BitsPacker operator =(BitsPacker &&) = delete ;
844
- ~BitsPacker () {
845
- assert (!hasUnconsumedValues () && " There are unprocessed bits!" );
887
+ ~BitsPacker () = default ;
888
+
889
+ bool canWriteNextNBits (uint32_t BitsWidth) const {
890
+ return CurrentBitIndex + BitsWidth < BitIndexUpbound;
891
+ }
892
+
893
+ void reset (uint32_t Value) {
894
+ UnderlyingValue = Value;
895
+ CurrentBitIndex = 0 ;
846
896
}
847
897
848
898
void addBit (bool Value) { addBits (Value, 1 ); }
849
899
void addBits (uint32_t Value, uint32_t BitsWidth) {
850
900
assert (BitsWidth < BitIndexUpbound);
851
901
assert ((Value < (1u << BitsWidth)) && " Passing narrower bit width!" );
902
+ assert (canWriteNextNBits (BitsWidth) &&
903
+ " Inserting too much bits into a value!" );
852
904
853
- if (CurrentBitIndex + BitsWidth >= BitIndexUpbound) {
854
- Values.push_back (0 );
855
- CurrentBitIndex = 0 ;
856
- }
857
-
858
- assert (CurrentBitIndex < BitIndexUpbound);
859
- Values.back () |= Value << CurrentBitIndex;
905
+ UnderlyingValue |= Value << CurrentBitIndex;
860
906
CurrentBitIndex += BitsWidth;
861
907
}
862
908
863
- bool hasUnconsumedValues () const {
864
- return ConsumingValueIndex < Values.size ();
865
- }
866
- uint32_t getNextValue () {
867
- assert (hasUnconsumedValues ());
868
- return Values[ConsumingValueIndex++];
869
- }
870
-
871
- // We can convert the packer to an uint32_t if there is only one values.
872
- operator uint32_t () {
873
- assert (Values.size () == 1 );
874
- return getNextValue ();
875
- }
909
+ operator uint32_t () { return UnderlyingValue; }
876
910
877
911
private:
878
- SmallVector<uint64_t , 4 > Values;
879
- uint16_t ConsumingValueIndex = 0 ;
880
- // Initialize CurrentBitIndex with an invalid value
881
- // to make it easier to update Values. See the implementation
882
- // of `addBits` to see the details.
883
- uint16_t CurrentBitIndex = BitIndexUpbound;
912
+ uint32_t UnderlyingValue = 0 ;
913
+ uint32_t CurrentBitIndex = 0 ;
884
914
};
885
915
886
916
} // namespace clang
0 commit comments