@@ -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,42 @@ 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
+ default :
767
+ llvm_unreachable (" Unknwon Template Kind!" );
768
+ }
769
+ }
770
+ unsigned getDeclTemplateTypeParmAbbrev () const {
771
+ return DeclTemplateTypeParmAbbrev;
772
+ }
773
+ unsigned getDeclUsingShadowAbbrev () const { return DeclUsingShadowAbbrev; }
739
774
740
775
unsigned getDeclRefExprAbbrev () const { return DeclRefExprAbbrev; }
741
776
unsigned getCharacterLiteralAbbrev () const { return CharacterLiteralAbbrev; }
742
777
unsigned getIntegerLiteralAbbrev () const { return IntegerLiteralAbbrev; }
743
778
unsigned getExprImplicitCastAbbrev () const { return ExprImplicitCastAbbrev; }
779
+ unsigned getBinaryOperatorAbbrev () const { return BinaryOperatorAbbrev; }
780
+ unsigned getCompoundAssignOperatorAbbrev () const {
781
+ return CompoundAssignOperatorAbbrev;
782
+ }
783
+ unsigned getCallExprAbbrev () const { return CallExprAbbrev; }
784
+ unsigned getCXXOperatorCallExprAbbrev () { return CXXOperatorCallExprAbbrev; }
785
+ unsigned getCXXMemberCallExprAbbrev () { return CXXMemberCallExprAbbrev; }
786
+
787
+ unsigned getCompoundStmtAbbrev () const { return CompoundStmtAbbrev; }
744
788
745
789
bool hasChain () const { return Chain; }
746
790
ASTReader *getChain () const { return Chain; }
@@ -841,46 +885,33 @@ class BitsPacker {
841
885
BitsPacker (BitsPacker &&) = delete ;
842
886
BitsPacker operator =(const BitsPacker &) = delete ;
843
887
BitsPacker operator =(BitsPacker &&) = delete ;
844
- ~BitsPacker () {
845
- assert (!hasUnconsumedValues () && " There are unprocessed bits!" );
888
+ ~BitsPacker () = default ;
889
+
890
+ bool canWriteNextNBits (uint32_t BitsWidth) const {
891
+ return CurrentBitIndex + BitsWidth < BitIndexUpbound;
892
+ }
893
+
894
+ void reset (uint32_t Value) {
895
+ UnderlyingValue = Value;
896
+ CurrentBitIndex = 0 ;
846
897
}
847
898
848
899
void addBit (bool Value) { addBits (Value, 1 ); }
849
900
void addBits (uint32_t Value, uint32_t BitsWidth) {
850
901
assert (BitsWidth < BitIndexUpbound);
851
902
assert ((Value < (1u << BitsWidth)) && " Passing narrower bit width!" );
903
+ assert (canWriteNextNBits (BitsWidth) &&
904
+ " Inserting too much bits into a value!" );
852
905
853
- if (CurrentBitIndex + BitsWidth >= BitIndexUpbound) {
854
- Values.push_back (0 );
855
- CurrentBitIndex = 0 ;
856
- }
857
-
858
- assert (CurrentBitIndex < BitIndexUpbound);
859
- Values.back () |= Value << CurrentBitIndex;
906
+ UnderlyingValue |= Value << CurrentBitIndex;
860
907
CurrentBitIndex += BitsWidth;
861
908
}
862
909
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
- }
910
+ operator uint32_t () { return UnderlyingValue; }
876
911
877
912
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;
913
+ uint32_t UnderlyingValue = 0 ;
914
+ uint32_t CurrentBitIndex = 0 ;
884
915
};
885
916
886
917
} // namespace clang
0 commit comments