Sketch out parser/IR support for OperationInst, and a new Instruction base
class.
Introduce an Identifier class to MLIRContext to represent uniqued identifiers,
introduce string literal support to the lexer, introducing parser and printer
support etc.
PiperOrigin-RevId: 202592007
diff --git a/lib/IR/MLIRContext.cpp b/lib/IR/MLIRContext.cpp
index 8a035b6..5f2bd8e 100644
--- a/lib/IR/MLIRContext.cpp
+++ b/lib/IR/MLIRContext.cpp
@@ -16,9 +16,11 @@
// =============================================================================
#include "mlir/IR/MLIRContext.h"
+#include "mlir/IR/Identifier.h"
#include "mlir/IR/Types.h"
#include "mlir/Support/LLVM.h"
#include "llvm/ADT/DenseSet.h"
+#include "llvm/ADT/StringMap.h"
#include "llvm/Support/Allocator.h"
using namespace mlir;
using namespace llvm;
@@ -89,6 +91,9 @@
/// We put immortal objects into this allocator.
llvm::BumpPtrAllocator allocator;
+ /// These are identifiers uniqued into this MLIRContext.
+ llvm::StringMap<char, llvm::BumpPtrAllocator&> identifiers;
+
// Primitive type uniquing.
PrimitiveType *primitives[int(TypeKind::LAST_PRIMITIVE_TYPE)+1] = { nullptr };
@@ -110,6 +115,8 @@
public:
+ MLIRContextImpl() : identifiers(allocator) {}
+
/// Copy the specified array of elements into memory managed by our bump
/// pointer allocator. This assumes the elements are all PODs.
template<typename T>
@@ -128,9 +135,28 @@
}
+//===----------------------------------------------------------------------===//
+// Identifier
+//===----------------------------------------------------------------------===//
+
+/// Return an identifier for the specified string.
+Identifier Identifier::get(StringRef str, const MLIRContext *context) {
+ assert(!str.empty() && "Cannot create an empty identifier");
+ assert(str.find('\0') == StringRef::npos &&
+ "Cannot create an identifier with a nul character");
+
+ auto &impl = context->getImpl();
+ auto it = impl.identifiers.insert({str, char()}).first;
+ return Identifier(it->getKeyData());
+}
+
+
+//===----------------------------------------------------------------------===//
+// Types
+//===----------------------------------------------------------------------===//
+
PrimitiveType::PrimitiveType(TypeKind kind, MLIRContext *context)
: Type(kind, context) {
-
}
PrimitiveType *PrimitiveType::get(TypeKind kind, MLIRContext *context) {