mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-28 04:33:05 +00:00
Use std::map<K, V> rather than std::map<K, std::unique_ptr<V>>
Pointers and references to map elements are never invalidated (except on removal, which isn't used here) so there's no need for the indirection unless there's polymorphism at work. A little const correctness had to be fixed, since the indirection allowed some benign const violations. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@222937 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
54786a0936
commit
5a94a64542
@ -423,7 +423,7 @@ struct MatchableInfo {
|
||||
SmallVector<AsmOperand, 8> AsmOperands;
|
||||
|
||||
/// Predicates - The required subtarget features to match this instruction.
|
||||
SmallVector<SubtargetFeatureInfo*, 4> RequiredFeatures;
|
||||
SmallVector<const SubtargetFeatureInfo *, 4> RequiredFeatures;
|
||||
|
||||
/// ConversionFnKind - The enum value which is passed to the generated
|
||||
/// convertToMCInst to convert parsed operands into an MCInst for this
|
||||
@ -626,8 +626,7 @@ public:
|
||||
RegisterClassesTy RegisterClasses;
|
||||
|
||||
/// Map of Predicate records to their subtarget information.
|
||||
std::map<Record*, std::unique_ptr<SubtargetFeatureInfo>,
|
||||
LessRecordByID> SubtargetFeatures;
|
||||
std::map<Record *, SubtargetFeatureInfo, LessRecordByID> SubtargetFeatures;
|
||||
|
||||
/// Map of AsmOperandClass records to their class information.
|
||||
std::map<Record*, ClassInfo*> AsmOperandClasses;
|
||||
@ -675,10 +674,10 @@ public:
|
||||
|
||||
/// getSubtargetFeature - Lookup or create the subtarget feature info for the
|
||||
/// given operand.
|
||||
SubtargetFeatureInfo *getSubtargetFeature(Record *Def) const {
|
||||
const SubtargetFeatureInfo *getSubtargetFeature(Record *Def) const {
|
||||
assert(Def->isSubClassOf("Predicate") && "Invalid predicate type!");
|
||||
const auto &I = SubtargetFeatures.find(Def);
|
||||
return I == SubtargetFeatures.end() ? nullptr : I->second.get();
|
||||
return I == SubtargetFeatures.end() ? nullptr : &I->second;
|
||||
}
|
||||
|
||||
RecordKeeper &getRecords() const {
|
||||
@ -782,8 +781,8 @@ void MatchableInfo::initialize(const AsmMatcherInfo &Info,
|
||||
// Compute the require features.
|
||||
std::vector<Record*> Predicates =TheDef->getValueAsListOfDefs("Predicates");
|
||||
for (unsigned i = 0, e = Predicates.size(); i != e; ++i)
|
||||
if (SubtargetFeatureInfo *Feature =
|
||||
Info.getSubtargetFeature(Predicates[i]))
|
||||
if (const SubtargetFeatureInfo *Feature =
|
||||
Info.getSubtargetFeature(Predicates[i]))
|
||||
RequiredFeatures.push_back(Feature);
|
||||
|
||||
// Collect singleton registers, if used.
|
||||
@ -1315,11 +1314,11 @@ void AsmMatcherInfo::buildInfo() {
|
||||
if (Pred->getName().empty())
|
||||
PrintFatalError(Pred->getLoc(), "Predicate has no name!");
|
||||
|
||||
uint64_t FeatureNo = SubtargetFeatures.size();
|
||||
SubtargetFeatures[Pred] =
|
||||
llvm::make_unique<SubtargetFeatureInfo>(Pred, FeatureNo);
|
||||
DEBUG(SubtargetFeatures[Pred]->dump());
|
||||
assert(FeatureNo < 64 && "Too many subtarget features!");
|
||||
SubtargetFeatures.emplace(
|
||||
std::piecewise_construct, std::forward_as_tuple(Pred),
|
||||
std::forward_as_tuple(Pred, SubtargetFeatures.size()));
|
||||
DEBUG(SubtargetFeatures.find(Pred)->second.dump());
|
||||
assert(SubtargetFeatures.size() <= 64 && "Too many subtarget features!");
|
||||
}
|
||||
|
||||
// Parse the instructions; we need to do this first so that we can gather the
|
||||
@ -2182,7 +2181,7 @@ static void emitSubtargetFeatureFlagEnumeration(AsmMatcherInfo &Info,
|
||||
OS << "enum SubtargetFeatureFlag : " << getMinimalRequiredFeaturesType(Info)
|
||||
<< " {\n";
|
||||
for (const auto &SF : Info.SubtargetFeatures) {
|
||||
SubtargetFeatureInfo &SFI = *SF.second;
|
||||
const SubtargetFeatureInfo &SFI = SF.second;
|
||||
OS << " " << SFI.getEnumName() << " = (1ULL << " << SFI.Index << "),\n";
|
||||
}
|
||||
OS << " Feature_None = 0\n";
|
||||
@ -2218,7 +2217,7 @@ static void emitGetSubtargetFeatureName(AsmMatcherInfo &Info, raw_ostream &OS) {
|
||||
if (!Info.SubtargetFeatures.empty()) {
|
||||
OS << " switch(Val) {\n";
|
||||
for (const auto &SF : Info.SubtargetFeatures) {
|
||||
SubtargetFeatureInfo &SFI = *SF.second;
|
||||
const SubtargetFeatureInfo &SFI = SF.second;
|
||||
// FIXME: Totally just a placeholder name to get the algorithm working.
|
||||
OS << " case " << SFI.getEnumName() << ": return \""
|
||||
<< SFI.TheDef->getValueAsString("PredicateName") << "\";\n";
|
||||
@ -2243,7 +2242,7 @@ static void emitComputeAvailableFeatures(AsmMatcherInfo &Info,
|
||||
<< "ComputeAvailableFeatures(uint64_t FB) const {\n";
|
||||
OS << " uint64_t Features = 0;\n";
|
||||
for (const auto &SF : Info.SubtargetFeatures) {
|
||||
SubtargetFeatureInfo &SFI = *SF.second;
|
||||
const SubtargetFeatureInfo &SFI = SF.second;
|
||||
|
||||
OS << " if (";
|
||||
std::string CondStorage =
|
||||
@ -2289,7 +2288,7 @@ static std::string GetAliasRequiredFeatures(Record *R,
|
||||
std::string Result;
|
||||
unsigned NumFeatures = 0;
|
||||
for (unsigned i = 0, e = ReqFeatures.size(); i != e; ++i) {
|
||||
SubtargetFeatureInfo *F = Info.getSubtargetFeature(ReqFeatures[i]);
|
||||
const SubtargetFeatureInfo *F = Info.getSubtargetFeature(ReqFeatures[i]);
|
||||
|
||||
if (!F)
|
||||
PrintFatalError(R->getLoc(), "Predicate '" + ReqFeatures[i]->getName() +
|
||||
|
Loading…
Reference in New Issue
Block a user