@@ -47,28 +47,30 @@ using namespace llvm;
47
47
namespace {
48
48
49
49
class CodeEmitterGen {
50
- RecordKeeper &Records;
50
+ const RecordKeeper &Records;
51
51
52
52
public:
53
- CodeEmitterGen (RecordKeeper &R) : Records(R) {}
53
+ CodeEmitterGen (const RecordKeeper &R) : Records(R) {}
54
54
55
55
void run (raw_ostream &o);
56
56
57
57
private:
58
- int getVariableBit (const std::string &VarName, BitsInit *BI, int bit);
58
+ int getVariableBit (const std::string &VarName, const BitsInit *BI, int bit);
59
59
std::pair<std::string, std::string>
60
- getInstructionCases (Record *R, CodeGenTarget &Target);
61
- void addInstructionCasesForEncoding (Record *R, const Record *EncodingDef,
62
- CodeGenTarget &Target, std::string &Case,
60
+ getInstructionCases (const Record *R, const CodeGenTarget &Target);
61
+ void addInstructionCasesForEncoding (const Record *R,
62
+ const Record *EncodingDef,
63
+ const CodeGenTarget &Target,
64
+ std::string &Case,
63
65
std::string &BitOffsetCase);
64
- bool addCodeToMergeInOperand (Record *R, BitsInit *BI,
66
+ bool addCodeToMergeInOperand (const Record *R, const BitsInit *BI,
65
67
const std::string &VarName, std::string &Case,
66
68
std::string &BitOffsetCase,
67
- CodeGenTarget &Target);
69
+ const CodeGenTarget &Target);
68
70
69
71
void emitInstructionBaseValues (
70
72
raw_ostream &o, ArrayRef<const CodeGenInstruction *> NumberedInstructions,
71
- CodeGenTarget &Target, unsigned HwMode = DefaultMode);
73
+ const CodeGenTarget &Target, unsigned HwMode = DefaultMode);
72
74
void
73
75
emitCaseMap (raw_ostream &o,
74
76
const std::map<std::string, std::vector<std::string>> &CaseMap);
@@ -78,13 +80,13 @@ class CodeEmitterGen {
78
80
79
81
// If the VarBitInit at position 'bit' matches the specified variable then
80
82
// return the variable bit position. Otherwise return -1.
81
- int CodeEmitterGen::getVariableBit (const std::string &VarName, BitsInit *BI,
82
- int bit) {
83
- if (VarBitInit *VBI = dyn_cast<VarBitInit>(BI->getBit (bit))) {
84
- if (VarInit *VI = dyn_cast<VarInit>(VBI->getBitVar ()))
83
+ int CodeEmitterGen::getVariableBit (const std::string &VarName,
84
+ const BitsInit *BI, int bit) {
85
+ if (const VarBitInit *VBI = dyn_cast<VarBitInit>(BI->getBit (bit))) {
86
+ if (const VarInit *VI = dyn_cast<VarInit>(VBI->getBitVar ()))
85
87
if (VI->getName () == VarName)
86
88
return VBI->getBitNum ();
87
- } else if (VarInit *VI = dyn_cast<VarInit>(BI->getBit (bit))) {
89
+ } else if (const VarInit *VI = dyn_cast<VarInit>(BI->getBit (bit))) {
88
90
if (VI->getName () == VarName)
89
91
return 0 ;
90
92
}
@@ -93,11 +95,12 @@ int CodeEmitterGen::getVariableBit(const std::string &VarName, BitsInit *BI,
93
95
}
94
96
95
97
// Returns true if it succeeds, false if an error.
96
- bool CodeEmitterGen::addCodeToMergeInOperand (Record *R, BitsInit *BI,
98
+ bool CodeEmitterGen::addCodeToMergeInOperand (const Record *R,
99
+ const BitsInit *BI,
97
100
const std::string &VarName,
98
101
std::string &Case,
99
102
std::string &BitOffsetCase,
100
- CodeGenTarget &Target) {
103
+ const CodeGenTarget &Target) {
101
104
CodeGenInstruction &CGI = Target.getInstruction (R);
102
105
103
106
// Determine if VarName actually contributes to the Inst encoding.
@@ -278,7 +281,8 @@ bool CodeEmitterGen::addCodeToMergeInOperand(Record *R, BitsInit *BI,
278
281
}
279
282
280
283
std::pair<std::string, std::string>
281
- CodeEmitterGen::getInstructionCases (Record *R, CodeGenTarget &Target) {
284
+ CodeEmitterGen::getInstructionCases (const Record *R,
285
+ const CodeGenTarget &Target) {
282
286
std::string Case, BitOffsetCase;
283
287
284
288
auto append = [&](const std::string &S) {
@@ -287,7 +291,7 @@ CodeEmitterGen::getInstructionCases(Record *R, CodeGenTarget &Target) {
287
291
};
288
292
289
293
if (const RecordVal *RV = R->getValue (" EncodingInfos" )) {
290
- if (auto *DI = dyn_cast_or_null<DefInit>(RV->getValue ())) {
294
+ if (const auto *DI = dyn_cast_or_null<DefInit>(RV->getValue ())) {
291
295
const CodeGenHwModes &HWM = Target.getHwModes ();
292
296
EncodingInfoByHwMode EBM (DI->getDef (), HWM);
293
297
@@ -342,7 +346,7 @@ CodeEmitterGen::getInstructionCases(Record *R, CodeGenTarget &Target) {
342
346
}
343
347
344
348
void CodeEmitterGen::addInstructionCasesForEncoding (
345
- Record *R, const Record *EncodingDef, CodeGenTarget &Target,
349
+ const Record *R, const Record *EncodingDef, const CodeGenTarget &Target,
346
350
std::string &Case, std::string &BitOffsetCase) {
347
351
BitsInit *BI = EncodingDef->getValueAsBitsInit (" Inst" );
348
352
@@ -394,7 +398,7 @@ static void emitInstBits(raw_ostream &OS, const APInt &Bits) {
394
398
395
399
void CodeEmitterGen::emitInstructionBaseValues (
396
400
raw_ostream &o, ArrayRef<const CodeGenInstruction *> NumberedInstructions,
397
- CodeGenTarget &Target, unsigned HwMode) {
401
+ const CodeGenTarget &Target, unsigned HwMode) {
398
402
const CodeGenHwModes &HWM = Target.getHwModes ();
399
403
if (HwMode == DefaultMode)
400
404
o << " static const uint64_t InstBits[] = {\n " ;
@@ -430,12 +434,12 @@ void CodeEmitterGen::emitInstructionBaseValues(
430
434
}
431
435
}
432
436
}
433
- BitsInit *BI = EncodingDef->getValueAsBitsInit (" Inst" );
437
+ const BitsInit *BI = EncodingDef->getValueAsBitsInit (" Inst" );
434
438
435
439
// Start by filling in fixed values.
436
440
APInt Value (BitWidth, 0 );
437
441
for (unsigned i = 0 , e = BI->getNumBits (); i != e; ++i) {
438
- if (auto *B = dyn_cast<BitInit>(BI->getBit (i)); B && B->getValue ())
442
+ if (const auto *B = dyn_cast<BitInit>(BI->getBit (i)); B && B->getValue ())
439
443
Value.setBit (i);
440
444
}
441
445
o << " " ;
@@ -448,15 +452,13 @@ void CodeEmitterGen::emitInstructionBaseValues(
448
452
void CodeEmitterGen::emitCaseMap (
449
453
raw_ostream &o,
450
454
const std::map<std::string, std::vector<std::string>> &CaseMap) {
451
- std::map<std::string, std::vector<std::string>>::const_iterator IE, EE;
452
- for (IE = CaseMap.begin (), EE = CaseMap.end (); IE != EE; ++IE) {
453
- const std::string &Case = IE->first ;
454
- const std::vector<std::string> &InstList = IE->second ;
455
-
456
- for (int i = 0 , N = InstList.size (); i < N; i++) {
457
- if (i)
455
+ for (const auto &[Case, InstList] : CaseMap) {
456
+ bool First = true ;
457
+ for (const auto &Inst : InstList) {
458
+ if (!First)
458
459
o << " \n " ;
459
- o << " case " << InstList[i] << " :" ;
460
+ o << " case " << Inst << " :" ;
461
+ First = false ;
460
462
}
461
463
o << " {\n " ;
462
464
o << Case;
@@ -469,7 +471,6 @@ void CodeEmitterGen::run(raw_ostream &o) {
469
471
emitSourceFileHeader (" Machine Code Emitter" , o);
470
472
471
473
CodeGenTarget Target (Records);
472
- std::vector<Record *> Insts = Records.getAllDerivedDefinitions (" Instruction" );
473
474
474
475
// For little-endian instruction bit encodings, reverse the bit order
475
476
Target.reverseBitsForLittleEndianEncoding ();
@@ -491,17 +492,17 @@ void CodeEmitterGen::run(raw_ostream &o) {
491
492
continue ;
492
493
493
494
if (const RecordVal *RV = R->getValue (" EncodingInfos" )) {
494
- if (DefInit *DI = dyn_cast_or_null<DefInit>(RV->getValue ())) {
495
+ if (const DefInit *DI = dyn_cast_or_null<DefInit>(RV->getValue ())) {
495
496
EncodingInfoByHwMode EBM (DI->getDef (), HWM);
496
- for (auto &KV : EBM) {
497
- BitsInit *BI = KV. second ->getValueAsBitsInit (" Inst" );
497
+ for (const auto &[Key, Value] : EBM) {
498
+ const BitsInit *BI = Value ->getValueAsBitsInit (" Inst" );
498
499
BitWidth = std::max (BitWidth, BI->getNumBits ());
499
- HwModes.insert (KV. first );
500
+ HwModes.insert (Key );
500
501
}
501
502
continue ;
502
503
}
503
504
}
504
- BitsInit *BI = R->getValueAsBitsInit (" Inst" );
505
+ const BitsInit *BI = R->getValueAsBitsInit (" Inst" );
505
506
BitWidth = std::max (BitWidth, BI->getNumBits ());
506
507
}
507
508
UseAPInt = BitWidth > 64 ;
@@ -540,7 +541,7 @@ void CodeEmitterGen::run(raw_ostream &o) {
540
541
std::map<std::string, std::vector<std::string>> BitOffsetCaseMap;
541
542
542
543
// Construct all cases statement for each opcode
543
- for (Record *R : Insts ) {
544
+ for (const Record *R : Records. getAllDerivedDefinitions ( " Instruction " ) ) {
544
545
if (R->getValueAsString (" Namespace" ) == " TargetOpcode" ||
545
546
R->getValueAsBit (" isPseudo" ))
546
547
continue ;
0 commit comments