diff --git a/llvm/include/llvm/ADT/Hashing.h b/llvm/include/llvm/ADT/Hashing.h --- a/llvm/include/llvm/ADT/Hashing.h +++ b/llvm/include/llvm/ADT/Hashing.h @@ -104,6 +104,9 @@ template std::enable_if_t::value, hash_code> hash_value(T value); +hash_code hash_value(float value); +hash_code hash_value(double value); + /// Compute a hash_code for a pointer's address. /// /// N.B.: This hashes the *address*. Not the value and not the type. diff --git a/llvm/lib/Support/Hashing.cpp b/llvm/lib/Support/Hashing.cpp --- a/llvm/lib/Support/Hashing.cpp +++ b/llvm/lib/Support/Hashing.cpp @@ -26,3 +26,10 @@ void llvm::set_fixed_execution_hash_seed(uint64_t fixed_value) { hashing::detail::fixed_seed_override = fixed_value; } + +hash_code llvm::hash_value(float value) { + return hash_value(*(uint32_t *)&value); +} +hash_code llvm::hash_value(double value) { + return hash_value(*(uint64_t *)&value); +} diff --git a/mlir/include/mlir/TableGen/TypeDefGenHelpers.h b/mlir/include/mlir/TableGen/TypeDefGenHelpers.h --- a/mlir/include/mlir/TableGen/TypeDefGenHelpers.h +++ b/mlir/include/mlir/TableGen/TypeDefGenHelpers.h @@ -19,16 +19,6 @@ #include "mlir/IR/DialectImplementation.h" #include -//===----------------------------------------------------------------------===// -// -// Extra hash functions -// -//===----------------------------------------------------------------------===// -namespace llvm { -// TODO: Replace this with something better -hash_code hash_value(float f) { return *(uint32_t *)&f; } -} // namespace llvm - namespace mlir { namespace tblgen { namespace parser_helpers { @@ -69,7 +59,7 @@ //===----------------------------------------------------------------------===// template -struct parse { +struct Parse { ParseResult go(MLIRContext *ctxt, // The context, should it be needed DialectAsmParser &parser, // The parser StringRef memberName, // Type member name, for error printing @@ -83,7 +73,7 @@ typename std::enable_if::value && is_not_type::value>::type; template -struct parse> { +struct Parse> { ParseResult go(MLIRContext *ctxt, DialectAsmParser &parser, StringRef memberName, T &result) { return parser.parseInteger(result); @@ -92,7 +82,7 @@ // Bool specialization -- 'true' / 'false' instead of 0/1 template -struct parse> { +struct Parse> { ParseResult go(MLIRContext *ctxt, DialectAsmParser &parser, StringRef memberName, bool &result) { StringRef boolStr; @@ -116,7 +106,7 @@ using enable_if_float_type = typename std::enable_if::value>::type; template -struct parse> { +struct Parse> { ParseResult go(MLIRContext *ctxt, DialectAsmParser &parser, StringRef memberName, T &result) { double d; @@ -132,7 +122,7 @@ using enable_if_mlir_type = typename std::enable_if::value>::type; template -struct parse> { +struct Parse> { ParseResult go(MLIRContext *ctxt, DialectAsmParser &parser, StringRef memberName, T &result) { Type type; @@ -149,7 +139,7 @@ // StringRef specialization template -struct parse> { +struct Parse> { ParseResult go(MLIRContext *ctxt, DialectAsmParser &parser, StringRef memberName, StringRef &result) { StringAttr a; @@ -162,9 +152,9 @@ // ArrayRef specialization template -struct parse> { +struct Parse> { using inner_t = get_indexable_type; - parse innerParser; + Parse innerParser; llvm::SmallVector members; ParseResult go(MLIRContext *ctxt, DialectAsmParser &parser, @@ -192,7 +182,7 @@ //===----------------------------------------------------------------------===// template -struct print { +struct Print { static void go(DialectAsmPrinter &printer, const T &obj); }; @@ -204,13 +194,13 @@ is_not_type::value) || std::is_floating_point::value>::type; template -struct print>> { +struct Print>> { static void go(DialectAsmPrinter &printer, const T &obj) { printer << obj; } }; // StringRef has to be quoted to match the parse specialization above template -struct print> { +struct Print> { static void go(DialectAsmPrinter &printer, const T &obj) { printer << "\"" << obj << "\""; } @@ -218,7 +208,7 @@ // bool specialization template -struct print> { +struct Print> { static void go(DialectAsmPrinter &printer, const bool &obj) { if (obj) printer << "true"; @@ -229,12 +219,12 @@ // ArrayRef specialization template -struct print> { +struct Print> { static void go(DialectAsmPrinter &printer, const ArrayRef> &obj) { printer << "["; for (size_t i = 0; i < obj.size(); i++) { - print>::go(printer, obj[i]); + Print>::go(printer, obj[i]); if (i < obj.size() - 1) printer << ", "; } diff --git a/mlir/lib/TableGen/TypeDef.cpp b/mlir/lib/TableGen/TypeDef.cpp --- a/mlir/lib/TableGen/TypeDef.cpp +++ b/mlir/lib/TableGen/TypeDef.cpp @@ -43,21 +43,21 @@ return def->getValueAsBit("hasStorageCustomConstructor"); } void TypeDef::getMembers(SmallVectorImpl &members) const { - auto membersDag = def->getValueAsDag("members"); + auto *membersDag = def->getValueAsDag("members"); if (membersDag != nullptr) for (unsigned i = 0; i < membersDag->getNumArgs(); i++) members.push_back(TypeMember(membersDag, i)); } unsigned TypeDef::getNumMembers() const { - auto membersDag = def->getValueAsDag("members"); + auto *membersDag = def->getValueAsDag("members"); if (membersDag == nullptr) return 0; return membersDag->getNumArgs(); } llvm::Optional TypeDef::getMnemonic() const { - auto code = def->getValue("mnemonic"); - if (llvm::StringInit *CI = dyn_cast(code->getValue())) - return CI->getValue(); + const auto *code = def->getValue("mnemonic"); + if (llvm::StringInit *ci = dyn_cast(code->getValue())) + return ci->getValue(); if (isa(code->getValue())) return llvm::Optional(); @@ -67,9 +67,9 @@ "', field `printer' does not have a code initializer!"); } llvm::Optional TypeDef::getPrinterCode() const { - auto code = def->getValue("printer"); - if (llvm::CodeInit *CI = dyn_cast(code->getValue())) - return CI->getValue(); + const auto *code = def->getValue("printer"); + if (llvm::CodeInit *ci = dyn_cast(code->getValue())) + return ci->getValue(); if (isa(code->getValue())) return llvm::Optional(); @@ -105,13 +105,13 @@ return def->getArgName(num)->getValue(); } llvm::Optional TypeMember::getAllocator() const { - auto memberType = def->getArg(num); - if (auto stringType = dyn_cast(memberType)) { + auto *memberType = def->getArg(num); + if (auto *stringType = dyn_cast(memberType)) { return llvm::Optional(); - } else if (auto typeMember = dyn_cast(memberType)) { - auto code = typeMember->getDef()->getValue("allocator"); - if (llvm::CodeInit *CI = dyn_cast(code->getValue())) - return CI->getValue(); + } else if (auto *typeMember = dyn_cast(memberType)) { + auto *code = typeMember->getDef()->getValue("allocator"); + if (llvm::CodeInit *ci = dyn_cast(code->getValue())) + return ci->getValue(); if (isa(code->getValue())) return llvm::Optional(); @@ -126,10 +126,10 @@ } } StringRef TypeMember::getCppType() const { - auto memberType = def->getArg(num); - if (auto stringType = dyn_cast(memberType)) { + auto *memberType = def->getArg(num); + if (auto *stringType = dyn_cast(memberType)) { return stringType->getValue(); - } else if (auto typeMember = dyn_cast(memberType)) { + } else if (auto *typeMember = dyn_cast(memberType)) { return typeMember->getDef()->getValueAsString("cppType"); } else { llvm::errs() << "Members DAG arguments must be either strings or defs " diff --git a/mlir/test/lib/Dialect/Test/TestTypes.cpp b/mlir/test/lib/Dialect/Test/TestTypes.cpp --- a/mlir/test/lib/Dialect/Test/TestTypes.cpp +++ b/mlir/test/lib/Dialect/Test/TestTypes.cpp @@ -1,5 +1,4 @@ -//===- TestTypes.cpp - MLIR Test Dialect Types --------------------*- C++ -//-*-===// +//===- TestTypes.cpp - MLIR Test Dialect Types ----------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -12,13 +11,6 @@ // //===----------------------------------------------------------------------===// -// TODO: What is the right way to add a hash function? I got compile issues -// which this solved. -namespace llvm { -class hash_code; -hash_code hash_value(float f); -} // namespace llvm - #include "TestTypes.h" #include "mlir/IR/DialectImplementation.h" #include "mlir/IR/Types.h" @@ -27,13 +19,12 @@ #include "llvm/ADT/TypeSwitch.h" namespace mlir { - namespace tblgen { namespace parser_helpers { // Custom parser for SignednessSemantics template <> -struct parse { +struct Parse { static ParseResult go(MLIRContext *ctxt, DialectAsmParser &parser, StringRef memberName, TestIntegerType::SignednessSemantics &result) { @@ -57,7 +48,7 @@ // Custom printer for SignednessSemantics template <> -struct print { +struct Print { static void go(DialectAsmPrinter &printer, const TestIntegerType::SignednessSemantics &ss) { switch (ss) { diff --git a/mlir/tools/mlir-tblgen/CMakeLists.txt b/mlir/tools/mlir-tblgen/CMakeLists.txt --- a/mlir/tools/mlir-tblgen/CMakeLists.txt +++ b/mlir/tools/mlir-tblgen/CMakeLists.txt @@ -7,7 +7,6 @@ add_tablegen(mlir-tblgen MLIR DialectGen.cpp EnumsGen.cpp - GenUtilities.cpp LLVMIRConversionGen.cpp LLVMIRIntrinsicGen.cpp mlir-tblgen.cpp diff --git a/mlir/tools/mlir-tblgen/GenUtilities.h b/mlir/tools/mlir-tblgen/GenUtilities.h --- a/mlir/tools/mlir-tblgen/GenUtilities.h +++ b/mlir/tools/mlir-tblgen/GenUtilities.h @@ -1,4 +1,4 @@ -//===- DocGenUtilities.h - MLIR doc gen utilities ---------------*- C++ -*-===// +//===- GenUtilities.h - MLIR doc gen utilities ---------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// // -// This file defines common utilities for generating documents from tablegen +// This file defines common utilities for generating C++ from tablegen // structures. // //===----------------------------------------------------------------------===// @@ -22,8 +22,12 @@ // Simple RAII helper for defining ifdef-undef-endif scopes. class IfDefScope { public: - IfDefScope(llvm::StringRef name, llvm::raw_ostream &os); - ~IfDefScope(); + inline IfDefScope(llvm::StringRef name, llvm::raw_ostream &os) + : name(name), os(os) { + os << "#ifdef " << name << "\n" + << "#undef " << name << "\n\n"; + } + inline ~IfDefScope() { os << "\n#endif // " << name << "\n\n"; } private: llvm::StringRef name; diff --git a/mlir/tools/mlir-tblgen/GenUtilities.cpp b/mlir/tools/mlir-tblgen/GenUtilities.cpp deleted file mode 100644 --- a/mlir/tools/mlir-tblgen/GenUtilities.cpp +++ /dev/null @@ -1,29 +0,0 @@ -//===- DocGenUtilities.h - MLIR doc gen utilities ---------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -// -// This file defines common utilities for generating documents from tablegen -// structures. -// -//===----------------------------------------------------------------------===// - -#include "GenUtilities.h" -#include "llvm/ADT/StringExtras.h" - -namespace mlir { -namespace tblgen { - -IfDefScope::IfDefScope(llvm::StringRef name, llvm::raw_ostream &os) - : name(name), os(os) { - os << "#ifdef " << name << "\n" - << "#undef " << name << "\n\n"; -} - -IfDefScope::~IfDefScope() { os << "\n#endif // " << name << "\n\n"; } - -} // namespace tblgen -} // namespace mlir diff --git a/mlir/tools/mlir-tblgen/TypeDefGen.cpp b/mlir/tools/mlir-tblgen/TypeDefGen.cpp --- a/mlir/tools/mlir-tblgen/TypeDefGen.cpp +++ b/mlir/tools/mlir-tblgen/TypeDefGen.cpp @@ -249,7 +249,7 @@ static mlir::LogicalResult emitTypeDefList(SmallVectorImpl &typeDefs, raw_ostream &os) { IfDefScope scope("GET_TYPEDEF_LIST", os); - for (auto i = typeDefs.begin(); i != typeDefs.end(); i++) { + for (auto *i = typeDefs.begin(); i != typeDefs.end(); i++) { os << " " << i->getCppClassName(); if (i < typeDefs.end() - 1) os << ",\n"; @@ -351,7 +351,7 @@ // then combine them all. this requires all the members types to have a // hash_value defined os << " return llvm::hash_combine(\n"; - for (auto memberIter = members.begin(); memberIter < members.end(); + for (auto *memberIter = members.begin(); memberIter < members.end(); memberIter++) { os << " " << memberIter->getName(); if (memberIter < members.end() - 1) { @@ -408,10 +408,10 @@ // emit a printer for each member separated by ','. // printer structs for common C++ types are defined in // TypeDefGenHelpers.h, which must be #included by the consuming code. - for (auto memberIter = members.begin(); memberIter < members.end(); + for (auto *memberIter = members.begin(); memberIter < members.end(); memberIter++) { // Each printer struct must be put on the stack then 'go' called - os << " ::mlir::tblgen::parser_helpers::print<" + os << " ::mlir::tblgen::parser_helpers::Print<" << memberIter->getCppType() << ">::go(printer, getImpl()->" << memberIter->getName() << ");\n"; @@ -438,12 +438,12 @@ // emit a parser for each member separated by ','. // parse structs for common C++ types are defined in // TypeDefGenHelpers.h, which must be #included by the consuming code. - for (auto memberIter = members.begin(); memberIter < members.end(); + for (auto *memberIter = members.begin(); memberIter < members.end(); memberIter++) { os << " " << memberIter->getCppType() << " " << memberIter->getName() << ";\n"; os << llvm::formatv( - " ::mlir::tblgen::parser_helpers::parse<{0}> {1}Parser;\n", + " ::mlir::tblgen::parser_helpers::Parse<{0}> {1}Parser;\n", memberIter->getCppType(), memberIter->getName()); os << llvm::formatv( " if ({0}Parser.go(ctxt, parser, \"{1}\", {0})) return Type();\n",