@@ -204,6 +204,8 @@ class AArch64Operand : public MCParsedAsmOperand {
204
204
205
205
struct BarrierOp {
206
206
unsigned Val; // Not the enum since not all values have names.
207
+ const char *Data;
208
+ unsigned Length;
207
209
};
208
210
209
211
struct SysRegOp {
@@ -220,6 +222,8 @@ class AArch64Operand : public MCParsedAsmOperand {
220
222
221
223
struct PrefetchOp {
222
224
unsigned Val;
225
+ const char *Data;
226
+ unsigned Length;
223
227
};
224
228
225
229
struct ShiftExtendOp {
@@ -347,6 +351,11 @@ class AArch64Operand : public MCParsedAsmOperand {
347
351
return Barrier.Val ;
348
352
}
349
353
354
+ StringRef getBarrierName () const {
355
+ assert (Kind == k_Barrier && " Invalid access!" );
356
+ return StringRef (Barrier.Data , Barrier.Length );
357
+ }
358
+
350
359
unsigned getReg () const override {
351
360
assert (Kind == k_Register && " Invalid access!" );
352
361
return Reg.RegNum ;
@@ -382,6 +391,11 @@ class AArch64Operand : public MCParsedAsmOperand {
382
391
return Prefetch.Val ;
383
392
}
384
393
394
+ StringRef getPrefetchName () const {
395
+ assert (Kind == k_Prefetch && " Invalid access!" );
396
+ return StringRef (Prefetch.Data , Prefetch.Length );
397
+ }
398
+
385
399
AArch64_AM::ShiftExtendType getShiftExtendType () const {
386
400
assert (Kind == k_ShiftExtend && " Invalid access!" );
387
401
return ShiftExtend.Type ;
@@ -1595,10 +1609,14 @@ class AArch64Operand : public MCParsedAsmOperand {
1595
1609
return Op;
1596
1610
}
1597
1611
1598
- static std::unique_ptr<AArch64Operand> CreateBarrier (unsigned Val, SMLoc S,
1612
+ static std::unique_ptr<AArch64Operand> CreateBarrier (unsigned Val,
1613
+ StringRef Str,
1614
+ SMLoc S,
1599
1615
MCContext &Ctx) {
1600
1616
auto Op = make_unique<AArch64Operand>(k_Barrier, Ctx);
1601
1617
Op->Barrier .Val = Val;
1618
+ Op->Barrier .Data = Str.data ();
1619
+ Op->Barrier .Length = Str.size ();
1602
1620
Op->StartLoc = S;
1603
1621
Op->EndLoc = S;
1604
1622
return Op;
@@ -1629,10 +1647,14 @@ class AArch64Operand : public MCParsedAsmOperand {
1629
1647
return Op;
1630
1648
}
1631
1649
1632
- static std::unique_ptr<AArch64Operand> CreatePrefetch (unsigned Val, SMLoc S,
1650
+ static std::unique_ptr<AArch64Operand> CreatePrefetch (unsigned Val,
1651
+ StringRef Str,
1652
+ SMLoc S,
1633
1653
MCContext &Ctx) {
1634
1654
auto Op = make_unique<AArch64Operand>(k_Prefetch, Ctx);
1635
1655
Op->Prefetch .Val = Val;
1656
+ Op->Barrier .Data = Str.data ();
1657
+ Op->Barrier .Length = Str.size ();
1636
1658
Op->StartLoc = S;
1637
1659
Op->EndLoc = S;
1638
1660
return Op;
@@ -1660,9 +1682,8 @@ void AArch64Operand::print(raw_ostream &OS) const {
1660
1682
<< AArch64_AM::getFPImmFloat (getFPImm ()) << " ) >" ;
1661
1683
break ;
1662
1684
case k_Barrier: {
1663
- bool Valid;
1664
- StringRef Name = AArch64DB::DBarrierMapper ().toString (getBarrier (), Valid);
1665
- if (Valid)
1685
+ StringRef Name = getBarrierName ();
1686
+ if (!Name.empty ())
1666
1687
OS << " <barrier " << Name << " >" ;
1667
1688
else
1668
1689
OS << " <barrier invalid #" << getBarrier () << " >" ;
@@ -1705,9 +1726,8 @@ void AArch64Operand::print(raw_ostream &OS) const {
1705
1726
OS << " c" << getSysCR ();
1706
1727
break ;
1707
1728
case k_Prefetch: {
1708
- bool Valid;
1709
- StringRef Name = AArch64PRFM::PRFMMapper ().toString (getPrefetch (), Valid);
1710
- if (Valid)
1729
+ StringRef Name = getPrefetchName ();
1730
+ if (!Name.empty ())
1711
1731
OS << " <prfop " << Name << " >" ;
1712
1732
else
1713
1733
OS << " <prfop invalid #" << getPrefetch () << " >" ;
@@ -1950,7 +1970,11 @@ AArch64AsmParser::tryParsePrefetch(OperandVector &Operands) {
1950
1970
return MatchOperand_ParseFail;
1951
1971
}
1952
1972
1953
- Operands.push_back (AArch64Operand::CreatePrefetch (prfop, S, getContext ()));
1973
+ bool Valid;
1974
+ auto Mapper = AArch64PRFM::PRFMMapper ();
1975
+ StringRef Name = Mapper.toString (MCE->getValue (), Valid);
1976
+ Operands.push_back (AArch64Operand::CreatePrefetch (prfop, Name,
1977
+ S, getContext ()));
1954
1978
return MatchOperand_Success;
1955
1979
}
1956
1980
@@ -1960,14 +1984,16 @@ AArch64AsmParser::tryParsePrefetch(OperandVector &Operands) {
1960
1984
}
1961
1985
1962
1986
bool Valid;
1963
- unsigned prfop = AArch64PRFM::PRFMMapper ().fromString (Tok.getString (), Valid);
1987
+ auto Mapper = AArch64PRFM::PRFMMapper ();
1988
+ unsigned prfop = Mapper.fromString (Tok.getString (), Valid);
1964
1989
if (!Valid) {
1965
1990
TokError (" pre-fetch hint expected" );
1966
1991
return MatchOperand_ParseFail;
1967
1992
}
1968
1993
1969
1994
Parser.Lex (); // Eat identifier token.
1970
- Operands.push_back (AArch64Operand::CreatePrefetch (prfop, S, getContext ()));
1995
+ Operands.push_back (AArch64Operand::CreatePrefetch (prfop, Tok.getString (),
1996
+ S, getContext ()));
1971
1997
return MatchOperand_Success;
1972
1998
}
1973
1999
@@ -2569,8 +2595,11 @@ AArch64AsmParser::tryParseBarrierOperand(OperandVector &Operands) {
2569
2595
Error (ExprLoc, " barrier operand out of range" );
2570
2596
return MatchOperand_ParseFail;
2571
2597
}
2572
- Operands.push_back (
2573
- AArch64Operand::CreateBarrier (MCE->getValue (), ExprLoc, getContext ()));
2598
+ bool Valid;
2599
+ auto Mapper = AArch64DB::DBarrierMapper ();
2600
+ StringRef Name = Mapper.toString (MCE->getValue (), Valid);
2601
+ Operands.push_back ( AArch64Operand::CreateBarrier (MCE->getValue (), Name,
2602
+ ExprLoc, getContext ()));
2574
2603
return MatchOperand_Success;
2575
2604
}
2576
2605
@@ -2580,7 +2609,8 @@ AArch64AsmParser::tryParseBarrierOperand(OperandVector &Operands) {
2580
2609
}
2581
2610
2582
2611
bool Valid;
2583
- unsigned Opt = AArch64DB::DBarrierMapper ().fromString (Tok.getString (), Valid);
2612
+ auto Mapper = AArch64DB::DBarrierMapper ();
2613
+ unsigned Opt = Mapper.fromString (Tok.getString (), Valid);
2584
2614
if (!Valid) {
2585
2615
TokError (" invalid barrier option name" );
2586
2616
return MatchOperand_ParseFail;
@@ -2592,8 +2622,8 @@ AArch64AsmParser::tryParseBarrierOperand(OperandVector &Operands) {
2592
2622
return MatchOperand_ParseFail;
2593
2623
}
2594
2624
2595
- Operands.push_back (
2596
- AArch64Operand::CreateBarrier (Opt, getLoc (), getContext ()));
2625
+ Operands.push_back ( AArch64Operand::CreateBarrier (Opt, Tok. getString (),
2626
+ getLoc (), getContext ()));
2597
2627
Parser.Lex (); // Consume the option
2598
2628
2599
2629
return MatchOperand_Success;
@@ -2618,8 +2648,8 @@ AArch64AsmParser::tryParseSysReg(OperandVector &Operands) {
2618
2648
assert (IsKnown == (MSRReg != -1U ) &&
2619
2649
" register should be -1 if and only if it's unknown" );
2620
2650
2621
- uint32_t PStateField =
2622
- AArch64PState:: PStateMapper() .fromString (Tok.getString (), IsKnown);
2651
+ auto PStateMapper = AArch64PState::PStateMapper ();
2652
+ uint32_t PStateField = PStateMapper.fromString (Tok.getString (), IsKnown);
2623
2653
assert (IsKnown == (PStateField != -1U ) &&
2624
2654
" register should be -1 if and only if it's unknown" );
2625
2655
0 commit comments