diff --git a/include/Adt/AdtDialect.h b/include/Adt/AdtDialect.h index c3857c6ecc68feadbb1323dafea3a4c8e175bd90..4a3b5767110544b2f32fb302d3970753edbdef75 100644 --- a/include/Adt/AdtDialect.h +++ b/include/Adt/AdtDialect.h @@ -3,9 +3,9 @@ #include <mlir/IR/Types.h> #include <mlir/IR/DialectImplementation.h> -#include "mlir/IR/BuiltinOps.h" -#include "mlir/IR/BuiltinDialect.h" -#include "mlir/IR/BuiltinTypes.h" +#include <mlir/IR/BuiltinOps.h> +#include <mlir/IR/BuiltinDialect.h> +#include <mlir/IR/BuiltinTypes.h> namespace mlir::adt{ @@ -19,16 +19,13 @@ namespace mlir::adt{ /// register attributes, operations, types, and more within the Toy dialect. void initialize(); - mlir::Type parseType(mlir::DialectAsmParser &parser) const; + mlir::Type parseType(mlir::DialectAsmParser &parser) const override; /// Cette fonction nous permet de print en format mlir une instance des types sources - void printType(mlir::Type type, mlir::DialectAsmPrinter &printer) const; + void printType(mlir::Type type, mlir::DialectAsmPrinter &printer) const override; }; struct AdtTypeStorage; -/// This class defines the adt source types. - - class Tag; class TypeSource{ public: static TypeSource parseType(::mlir::DialectAsmParser &parser); @@ -51,9 +48,6 @@ namespace mlir::adt{ typeSource(srcTy), typeMem(memTy) { llvm::errs() << "building an over-engineered AdtType\n"; } - // Creating an instance of a 'TypeSource' with the geven element types. - //static AdtType getTag(llvm::ArrayRef<Tag> elementTypes); - //static AdtType getType(llvm::ArrayRef<Type> elementTypes); // cf. https://mlir.llvm.org/docs/Tutorials/Toy/Ch-7/ static AdtType get(MLIRContext* ctx, TypeSource srcTy, TypeMem memTy) { //mlir::MLIRContext* ctx = srcTy.getMLIRContext(); @@ -62,20 +56,6 @@ namespace mlir::adt{ return AdtType(ctx, srcTy, memTy); } }; - - class Tag{ - private: mlir::Type srcType; - private: StringRef constructor; - public: void setConstructor(StringRef* name){ - constructor = *name; - } - public: void setTypeSource(mlir::Type* newSrcType){ - srcType = *newSrcType; - } - public: mlir::Type getTypeSource() const{ - return srcType; - } - }; } #endif // ADT_DIALECT_H_ diff --git a/lib/Adt/AdtDialect.cpp b/lib/Adt/AdtDialect.cpp index fe3efeefe4b9a2bb1304b44e63f55fb1d4532872..c19f6960b3403b8c90539611e7869e15665fb1c9 100644 --- a/lib/Adt/AdtDialect.cpp +++ b/lib/Adt/AdtDialect.cpp @@ -1,51 +1,11 @@ +#include <cstdint> #include "Adt/AdtDialect.h" +#include "Adt/AdtOps.h" #include "mlir/IR/DialectImplementation.h" #include "Adt/MemorySpecification.h" -#include <cstdint> -using namespace std; -using namespace mlir; -using namespace mlir::adt; - -/*namespace mlir::adt { - /// Cette classe represente le stockage interne des types sources - struct AdtTypeStorage : public mlir::TypeStorage { - using KeyTy = llvm::ArrayRef<mlir::Type>; - explicit AdtTypeStorage(llvm::ArrayRef<mlir::Type> elementTypes) : elementTypes(elementTypes) {} - llvm::ArrayRef<mlir::Type> elementTypes; - static llvm::hash_code hashKey(const KeyTy &key) { - return llvm::hash_value(key); - } - bool operator==(const KeyTy &key) const { return key == elementTypes; } - - static KeyTy getKey(llvm::ArrayRef<mlir::Type> elementTypes) { - return KeyTy(elementTypes); - } - static AdtTypeStorage *construct(mlir::TypeStorageAllocator &allocator, const KeyTy &key) { - llvm::ArrayRef<mlir::Type> elementTypes = allocator.copyInto(key); - return new (allocator.allocate<AdtTypeStorage>())AdtTypeStorage(elementTypes); - } - }; - /// On doit implémenter ici une instance du type type source (donc cette instance est un type aussi) -} -/// - -AdtType AdtType::getType(llvm::ArrayRef<mlir::Type> elementTypes) { - assert(!elementTypes.empty() && "expected at least 1 element type"); - mlir::MLIRContext *ctx = elementTypes.front().getContext(); - return Base::get(ctx,elementTypes); -} - - -AdtType AdtType::getTag(llvm::ArrayRef<Tag> elementTypes){ - assert(!elementTypes.empty() && "expected at least 1 element type"); - SmallVector<Type,1> newElementTypes; - for (int i = 0; i < (int)elementTypes.size();i++){ - Type newElementType = (Type) (elementTypes[i].getTypeSource()); - newElementTypes.push_back(newElementType); - } - mlir::MLIRContext *ctx = newElementTypes.front().getContext(); - return Base::get(ctx,newElementTypes); -};*/ +//using namespace std; +//using namespace mlir; +//using namespace mlir::adt; // cf. https://mlir.llvm.org/docs/Tutorials/Toy/Ch-7/ namespace mlir::adt { @@ -80,7 +40,7 @@ namespace mlir::adt { class ErrorSrcType : public TypeSource { public: - mlir::MLIRContext* getMLIRContext() { + mlir::MLIRContext* getMLIRContext() override { return NULL; // YAY! segfaults incoming! } }; @@ -92,7 +52,7 @@ class ProductSrcType : public TypeSource { public: ProductSrcType(SmallVector<TypeSource> fieldTys) : _fieldTys(fieldTys) {} - mlir::MLIRContext* getMLIRContext() { + mlir::MLIRContext* getMLIRContext() override { if (_fieldTys.empty()) // too bad, let's hope someone else has a context return NULL; else @@ -127,11 +87,11 @@ class BasicSrcType : public TypeSource{ public: BasicSrcType(mlir::Type baseTy) : _baseTy(baseTy) {} - mlir::MLIRContext* getMLIRContext() { + mlir::MLIRContext* getMLIRContext() override { return _baseTy.getContext(); } - static TypeSource parseType(::mlir::DialectAsmParser &parser){ + static TypeSource parseType(::mlir::DialectAsmParser &parser) { SMLoc typeLoc = parser.getCurrentLocation(); mlir::Type baseTy; if (parser.parseLess() || parser.parseType(baseTy) || parser.parseGreater()) { @@ -151,7 +111,7 @@ class SumSrcType : public TypeSource{ public: SumSrcType(SmallVector<Variant> variants) : _variants(variants) {} - mlir::MLIRContext* getMLIRContext() { + mlir::MLIRContext* getMLIRContext() override { if (_variants.empty()) // too bad, let's hope someone else has a context return NULL; else @@ -212,7 +172,6 @@ TypeSource TypeSource::parseType(::mlir::DialectAsmParser &parser) { TypeMem TypeMem::parseType(::mlir::DialectAsmParser &parser){ SMLoc typeLoc = parser.getCurrentLocation(); - TypeMem typeMem; StringRef keyword; if (parser.parseKeyword(&keyword)) { parser.emitError(typeLoc, "error "); @@ -262,8 +221,6 @@ TypeMem PtrMemType::parseType(::mlir::DialectAsmParser &parser) { mlir::Type AdtDialect::parseType(::mlir::DialectAsmParser &parser) const { StringRef keyword; SMLoc typeLoc = parser.getCurrentLocation(); - TypeSource adtTypeSrc; - TypeMem adtTypeMem; llvm::errs() << "I am parsing a type!\n"; if (parser.parseKeyword(&keyword) || parser.parseLess()) { parser.emitError(typeLoc, "error "); @@ -271,7 +228,7 @@ mlir::Type AdtDialect::parseType(::mlir::DialectAsmParser &parser) const { } else if (keyword == "type") { llvm::errs() << "I saw the keyword 'type'.\n"; - adtTypeSrc = TypeSource::parseType(parser); + TypeSource adtTypeSrc = TypeSource::parseType(parser); llvm::errs() << "I parsed a source type and didn't die.\n"; if(parser.parseKeyword(&keyword) || keyword != "representedAs") { parser.emitError(typeLoc, "error "); @@ -279,7 +236,7 @@ mlir::Type AdtDialect::parseType(::mlir::DialectAsmParser &parser) const { } else { llvm::errs() << "I am not complaining so far.\n"; - adtTypeMem = TypeMem::parseType(parser); + TypeMem adtTypeMem = TypeMem::parseType(parser); llvm::errs() << "I parsed a memory type and didn't die.\n"; AdtType ty = AdtType::get(parser.getContext(), adtTypeSrc, adtTypeMem); llvm::errs() << "I built an AdtType.\n"; @@ -305,7 +262,7 @@ void AdtDialect::printType(::mlir::Type type, ::mlir::DialectAsmPrinter &printer } void AdtDialect::initialize() { - //addOperations<>(); - //addTypes<AdtType>(); + addOperations<DummyOp>(); + addTypes<AdtType>(); llvm::errs() << "Initialized ADT dialect.\n"; }