diff --git a/llvm/utils/TableGen/CodeGenDAGPatterns.cpp b/llvm/utils/TableGen/CodeGenDAGPatterns.cpp index d4c81c327abb..393076aa06a1 100644 --- a/llvm/utils/TableGen/CodeGenDAGPatterns.cpp +++ b/llvm/utils/TableGen/CodeGenDAGPatterns.cpp @@ -238,10 +238,14 @@ bool TypeSetByHwMode::operator==(const TypeSetByHwMode &VTS) const { return true; } +raw_ostream &operator<<(raw_ostream &OS, const TypeSetByHwMode &T) { + T.writeToStream(OS); + return OS; +} + LLVM_DUMP_METHOD void TypeSetByHwMode::dump() const { - writeToStream(dbgs()); - dbgs() << '\n'; + dbgs() << *this << '\n'; } bool TypeSetByHwMode::intersect(SetType &Out, const SetType &In) { diff --git a/llvm/utils/TableGen/CodeGenDAGPatterns.h b/llvm/utils/TableGen/CodeGenDAGPatterns.h index 37bfe022b4d1..f75e49a38218 100644 --- a/llvm/utils/TableGen/CodeGenDAGPatterns.h +++ b/llvm/utils/TableGen/CodeGenDAGPatterns.h @@ -240,6 +240,8 @@ private: bool intersect(SetType &Out, const SetType &In); }; +raw_ostream &operator<<(raw_ostream &OS, const TypeSetByHwMode &T); + struct TypeInfer { TypeInfer(TreePattern &T) : TP(T), ForceMode(0) {} diff --git a/llvm/utils/TableGen/CodeGenRegisters.cpp b/llvm/utils/TableGen/CodeGenRegisters.cpp index f3b01eb5a946..a6b0a4beb8ea 100644 --- a/llvm/utils/TableGen/CodeGenRegisters.cpp +++ b/llvm/utils/TableGen/CodeGenRegisters.cpp @@ -836,7 +836,7 @@ bool CodeGenRegisterClass::contains(const CodeGenRegister *Reg) const { namespace llvm { raw_ostream &operator<<(raw_ostream &OS, const CodeGenRegisterClass::Key &K) { - OS << "{ " << K.RSI.getAsString(); + OS << "{ " << K.RSI; for (const auto R : *K.Members) OS << ", " << R->getName(); return OS << " }"; diff --git a/llvm/utils/TableGen/InfoByHwMode.cpp b/llvm/utils/TableGen/InfoByHwMode.cpp index aee0dd6fa6a2..d4de490feeb2 100644 --- a/llvm/utils/TableGen/InfoByHwMode.cpp +++ b/llvm/utils/TableGen/InfoByHwMode.cpp @@ -76,34 +76,31 @@ StringRef ValueTypeByHwMode::getMVTName(MVT T) { return N; } -std::string ValueTypeByHwMode::getAsString() const { - if (isSimple()) - return getMVTName(getSimple()); +void ValueTypeByHwMode::writeToStream(raw_ostream &OS) const { + if (isSimple()) { + OS << getMVTName(getSimple()); + return; + } std::vector<const PairType*> Pairs; for (const auto &P : Map) Pairs.push_back(&P); std::sort(Pairs.begin(), Pairs.end(), deref<std::less<PairType>>()); - std::stringstream str; - str << '{'; + OS << '{'; for (unsigned i = 0, e = Pairs.size(); i != e; ++i) { const PairType *P = Pairs[i]; - str << '(' << getModeName(P->first) - << ':' << getMVTName(P->second).str() << ')'; + OS << '(' << getModeName(P->first) + << ':' << getMVTName(P->second).str() << ')'; if (i != e-1) - str << ','; + OS << ','; } - str << '}'; - return str.str(); + OS << '}'; } LLVM_DUMP_METHOD void ValueTypeByHwMode::dump() const { - dbgs() << "size=" << Map.size() << '\n'; - for (const auto &P : Map) - dbgs() << " " << P.first << " -> " - << llvm::getEnumName(P.second.SimpleTy) << '\n'; + dbgs() << *this << '\n'; } ValueTypeByHwMode llvm::getValueTypeByHwMode(Record *Rec, @@ -136,11 +133,9 @@ bool RegSizeInfo::isSubClassOf(const RegSizeInfo &I) const { SpillSize <= I.SpillSize; } -std::string RegSizeInfo::getAsString() const { - std::stringstream str; - str << "[R=" << RegSize << ",S=" << SpillSize - << ",A=" << SpillAlignment << ']'; - return str.str(); +void RegSizeInfo::writeToStream(raw_ostream &OS) const { + OS << "[R=" << RegSize << ",S=" << SpillSize + << ",A=" << SpillAlignment << ']'; } RegSizeInfoByHwMode::RegSizeInfoByHwMode(Record *R, @@ -177,22 +172,35 @@ bool RegSizeInfoByHwMode::hasStricterSpillThan(const RegSizeInfoByHwMode &I) std::tie(B0.SpillSize, B0.SpillAlignment); } -std::string RegSizeInfoByHwMode::getAsString() const { +void RegSizeInfoByHwMode::writeToStream(raw_ostream &OS) const { typedef typename decltype(Map)::value_type PairType; std::vector<const PairType*> Pairs; for (const auto &P : Map) Pairs.push_back(&P); std::sort(Pairs.begin(), Pairs.end(), deref<std::less<PairType>>()); - std::stringstream str; - str << '{'; + OS << '{'; for (unsigned i = 0, e = Pairs.size(); i != e; ++i) { const PairType *P = Pairs[i]; - str << '(' << getModeName(P->first) - << ':' << P->second.getAsString() << ')'; + OS << '(' << getModeName(P->first) << ':' << P->second << ')'; if (i != e-1) - str << ','; + OS << ','; } - str << '}'; - return str.str(); + OS << '}'; } + +raw_ostream &operator<<(raw_ostream &OS, const ValueTypeByHwMode &T) { + T.writeToStream(OS); + return OS; +} + +raw_ostream &operator<<(raw_ostream &OS, const RegSizeInfo &T) { + T.writeToStream(OS); + return OS; +} + +raw_ostream &operator<<(raw_ostream &OS, const RegSizeInfoByHwMode &T) { + T.writeToStream(OS); + return OS; +} + diff --git a/llvm/utils/TableGen/InfoByHwMode.h b/llvm/utils/TableGen/InfoByHwMode.h index 57640fc3025b..b2e217498888 100644 --- a/llvm/utils/TableGen/InfoByHwMode.h +++ b/llvm/utils/TableGen/InfoByHwMode.h @@ -27,6 +27,7 @@ namespace llvm { struct CodeGenHwModes; class Record; +class raw_ostream; template <typename InfoT> struct InfoByHwMode; @@ -130,7 +131,7 @@ struct ValueTypeByHwMode : public InfoByHwMode<MVT> { MVT &getOrCreateTypeForMode(unsigned Mode, MVT Type); static StringRef getMVTName(MVT T); - std::string getAsString() const; + void writeToStream(raw_ostream &OS) const; void dump() const; }; @@ -154,7 +155,7 @@ struct RegSizeInfo { } bool isSubClassOf(const RegSizeInfo &I) const; - std::string getAsString() const; + void writeToStream(raw_ostream &OS) const; }; struct RegSizeInfoByHwMode : public InfoByHwMode<RegSizeInfo> { @@ -169,8 +170,13 @@ struct RegSizeInfoByHwMode : public InfoByHwMode<RegSizeInfo> { bool isSubClassOf(const RegSizeInfoByHwMode &I) const; bool hasStricterSpillThan(const RegSizeInfoByHwMode &I) const; - std::string getAsString() const; + void writeToStream(raw_ostream &OS) const; }; + +raw_ostream &operator<<(raw_ostream &OS, const ValueTypeByHwMode &T); +raw_ostream &operator<<(raw_ostream &OS, const RegSizeInfo &T); +raw_ostream &operator<<(raw_ostream &OS, const RegSizeInfoByHwMode &T); + } // namespace llvm #endif // LLVM_UTILS_TABLEGEN_INFOBYHWMODE_H