@@ -524,6 +524,19 @@ class AsmParser : public MCAsmParser {
524
524
// / directives parsed by this class.
525
525
StringMap<DirectiveKind> DirectiveKindMap;
526
526
527
+ // Codeview def_range type parsing.
528
+ enum CVDefRangeType {
529
+ CVDR_DEFRANGE = 0 , // Placeholder
530
+ CVDR_DEFRANGE_REGISTER,
531
+ CVDR_DEFRANGE_FRAMEPOINTER_REL,
532
+ CVDR_DEFRANGE_SUBFIELD_REGISTER,
533
+ CVDR_DEFRANGE_REGISTER_REL
534
+ };
535
+
536
+ // / Maps Codeview def_range types --> CVDefRangeType enum, for
537
+ // / Codeview def_range types parsed by this class.
538
+ StringMap<CVDefRangeType> CVDefRangeTypeMap;
539
+
527
540
// ".ascii", ".asciz", ".string"
528
541
bool parseDirectiveAscii (StringRef IDVal, bool ZeroTerminated);
529
542
bool parseDirectiveReloc (SMLoc DirectiveLoc); // ".reloc"
@@ -671,6 +684,7 @@ class AsmParser : public MCAsmParser {
671
684
bool parseDirectiveAddrsigSym ();
672
685
673
686
void initializeDirectiveKindMap ();
687
+ void initializeCVDefRangeTypeMap ();
674
688
};
675
689
676
690
} // end anonymous namespace
@@ -720,6 +734,7 @@ AsmParser::AsmParser(SourceMgr &SM, MCContext &Ctx, MCStreamer &Out,
720
734
721
735
PlatformParser->Initialize (*this );
722
736
initializeDirectiveKindMap ();
737
+ initializeCVDefRangeTypeMap ();
723
738
724
739
NumOfMacroInstantiations = 0 ;
725
740
}
@@ -1737,6 +1752,7 @@ bool AsmParser::parseStatement(ParseStatementInfo &Info,
1737
1752
StringMap<DirectiveKind>::const_iterator DirKindIt =
1738
1753
DirectiveKindMap.find (IDVal);
1739
1754
DirectiveKind DirKind = (DirKindIt == DirectiveKindMap.end ())
1755
+
1740
1756
? DK_NO_DIRECTIVE
1741
1757
: DirKindIt->getValue ();
1742
1758
switch (DirKind) {
@@ -3825,6 +3841,13 @@ bool AsmParser::parseDirectiveCVInlineLinetable() {
3825
3841
return false ;
3826
3842
}
3827
3843
3844
+ void AsmParser::initializeCVDefRangeTypeMap () {
3845
+ CVDefRangeTypeMap[" reg" ] = CVDR_DEFRANGE_REGISTER;
3846
+ CVDefRangeTypeMap[" frame_ptr_rel" ] = CVDR_DEFRANGE_FRAMEPOINTER_REL;
3847
+ CVDefRangeTypeMap[" subfield_reg" ] = CVDR_DEFRANGE_SUBFIELD_REGISTER;
3848
+ CVDefRangeTypeMap[" reg_rel" ] = CVDR_DEFRANGE_REGISTER_REL;
3849
+ }
3850
+
3828
3851
// / parseDirectiveCVDefRange
3829
3852
// / ::= .cv_def_range RangeStart RangeEnd (GapStart GapEnd)*, bytes*
3830
3853
bool AsmParser::parseDirectiveCVDefRange () {
@@ -3846,13 +3869,92 @@ bool AsmParser::parseDirectiveCVDefRange() {
3846
3869
Ranges.push_back ({GapStartSym, GapEndSym});
3847
3870
}
3848
3871
3849
- std::string FixedSizePortion;
3850
- if (parseToken (AsmToken::Comma, " unexpected token in directive" ) ||
3851
- parseEscapedString (FixedSizePortion))
3852
- return true ;
3853
-
3854
- getStreamer ().EmitCVDefRangeDirective (Ranges, FixedSizePortion);
3855
- return false ;
3872
+ StringRef CVDefRangeTypeStr;
3873
+ if (parseToken (
3874
+ AsmToken::Comma,
3875
+ " expected comma before def_range type in .cv_def_range directive" ) ||
3876
+ parseIdentifier (CVDefRangeTypeStr))
3877
+ return Error (Loc, " expected def_range type in directive" );
3878
+
3879
+ StringMap<CVDefRangeType>::const_iterator CVTypeIt =
3880
+ CVDefRangeTypeMap.find (CVDefRangeTypeStr);
3881
+ CVDefRangeType CVDRType = (CVTypeIt == CVDefRangeTypeMap.end ())
3882
+ ? CVDR_DEFRANGE
3883
+ : CVTypeIt->getValue ();
3884
+ switch (CVDRType) {
3885
+ case CVDR_DEFRANGE_REGISTER: {
3886
+ int64_t DRRegister;
3887
+ if (parseToken (AsmToken::Comma, " expected comma before register number in "
3888
+ " .cv_def_range directive" ) ||
3889
+ parseAbsoluteExpression (DRRegister))
3890
+ return Error (Loc, " expected register number" );
3891
+
3892
+ codeview::DefRangeRegisterSym::Header DRHdr;
3893
+ DRHdr.Register = DRRegister;
3894
+ DRHdr.MayHaveNoName = 0 ;
3895
+ getStreamer ().EmitCVDefRangeDirective (Ranges, DRHdr);
3896
+ break ;
3897
+ }
3898
+ case CVDR_DEFRANGE_FRAMEPOINTER_REL: {
3899
+ int64_t DROffset;
3900
+ if (parseToken (AsmToken::Comma,
3901
+ " expected comma before offset in .cv_def_range directive" ) ||
3902
+ parseAbsoluteExpression (DROffset))
3903
+ return Error (Loc, " expected offset value" );
3904
+
3905
+ codeview::DefRangeFramePointerRelSym::Header DRHdr;
3906
+ DRHdr.Offset = DROffset;
3907
+ getStreamer ().EmitCVDefRangeDirective (Ranges, DRHdr);
3908
+ break ;
3909
+ }
3910
+ case CVDR_DEFRANGE_SUBFIELD_REGISTER: {
3911
+ int64_t DRRegister;
3912
+ int64_t DROffsetInParent;
3913
+ if (parseToken (AsmToken::Comma, " expected comma before register number in "
3914
+ " .cv_def_range directive" ) ||
3915
+ parseAbsoluteExpression (DRRegister))
3916
+ return Error (Loc, " expected register number" );
3917
+ if (parseToken (AsmToken::Comma,
3918
+ " expected comma before offset in .cv_def_range directive" ) ||
3919
+ parseAbsoluteExpression (DROffsetInParent))
3920
+ return Error (Loc, " expected offset value" );
3921
+
3922
+ codeview::DefRangeSubfieldRegisterSym::Header DRHdr;
3923
+ DRHdr.Register = DRRegister;
3924
+ DRHdr.MayHaveNoName = 0 ;
3925
+ DRHdr.OffsetInParent = DROffsetInParent;
3926
+ getStreamer ().EmitCVDefRangeDirective (Ranges, DRHdr);
3927
+ break ;
3928
+ }
3929
+ case CVDR_DEFRANGE_REGISTER_REL: {
3930
+ int64_t DRRegister;
3931
+ int64_t DRFlags;
3932
+ int64_t DRBasePointerOffset;
3933
+ if (parseToken (AsmToken::Comma, " expected comma before register number in "
3934
+ " .cv_def_range directive" ) ||
3935
+ parseAbsoluteExpression (DRRegister))
3936
+ return Error (Loc, " expected register value" );
3937
+ if (parseToken (
3938
+ AsmToken::Comma,
3939
+ " expected comma before flag value in .cv_def_range directive" ) ||
3940
+ parseAbsoluteExpression (DRFlags))
3941
+ return Error (Loc, " expected flag value" );
3942
+ if (parseToken (AsmToken::Comma, " expected comma before base pointer offset "
3943
+ " in .cv_def_range directive" ) ||
3944
+ parseAbsoluteExpression (DRBasePointerOffset))
3945
+ return Error (Loc, " expected base pointer offset value" );
3946
+
3947
+ codeview::DefRangeRegisterRelSym::Header DRHdr;
3948
+ DRHdr.Register = DRRegister;
3949
+ DRHdr.Flags = DRFlags;
3950
+ DRHdr.BasePointerOffset = DRBasePointerOffset;
3951
+ getStreamer ().EmitCVDefRangeDirective (Ranges, DRHdr);
3952
+ break ;
3953
+ }
3954
+ default :
3955
+ return Error (Loc, " unexpected def_range type in .cv_def_range directive" );
3956
+ }
3957
+ return true ;
3856
3958
}
3857
3959
3858
3960
// / parseDirectiveCVString
0 commit comments